Kestrel Interface
Loading...
Searching...
No Matches
kest_fpga_comms.c
Go to the documentation of this file.
1#include "kest_int.h"
2
3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 0
5#endif
6
7static const char *FNAME = "kest_fpga_comms.c";
8
9#define KEST_FPGA_MSG_TYPE_BATCH 0
10#define KEST_FPGA_MSG_TYPE_PROGRAM_BATCH 1
11#define KEST_FPGA_MSG_TYPE_SET_INPUT_GAIN 2
12#define KEST_FPGA_MSG_TYPE_SET_OUTPUT_GAIN 3
13#define KEST_FPGA_MSG_TYPE_COMMAND 4
14
15#define FPGA_BOOT_MS 2000
16
17typedef struct {
18 int type;
19
20 union {
21 float level;
22 uint8_t command;
24 } data;
26
27static QueueHandle_t fpga_msg_queue;
28static int initialised = 0;
29
30#define PROGRAM_RETRIES 3
31
32void kest_fpga_comms_task(void *param)
33{
35
36 fpga_msg_queue = xQueueCreate(32, sizeof(kest_fpga_msg));
37 initialised = 1;
38
39 vTaskDelay(pdMS_TO_TICKS(FPGA_BOOT_MS));
40
41 uint8_t byte;
42 byte = kest_fpga_read_byte();
43
44 KEST_PRINTF("Starting FPGA comms. FPGA reports status code %d\n", byte);
45
46 kest_fpga_set_input_gain(global_cxt.input_gain.value);
47 kest_fpga_set_output_gain(global_cxt.output_gain.value);
48
49 int program_check_ms = 5;
50 int program_check_ticks = 5 / portTICK_PERIOD_MS;
51 int program_check_delay = (program_check_ticks == 0) ? 1 : program_check_ticks;
52
53
54 kest_fpga_msg msg;
55
56 while (1)
57 {
58 xQueueReceive(fpga_msg_queue, &msg, portMAX_DELAY);
59
60 switch (msg.type)
61 {
63 #ifdef PRINT_TRANSFER_BATCHES
65 #endif
66 #ifndef KEST_FPGA_SIMULATED
67 for (int i = 0; i < PROGRAM_RETRIES; i++)
68 {
70 vTaskDelay(program_check_delay);
71 byte = kest_fpga_read_byte();
72
73 if (byte != SPI_RESPONSE_OK)
74 {
75 KEST_PRINTF("FPGA responded with code %d after programming. Retrying...\n", byte);
76 }
77 else
78 {
79 KEST_PRINTF("FPGA accepted the new pipeline :)\n");
80 break;
81 }
82 }
83 #endif
84
86 break;
87
89 #ifdef PRINT_TRANSFER_BATCHES
91 #endif
94 break;
95
98 break;
99
102 break;
103
105 #ifdef PRINT_COMMANDS
106 KEST_PRINTF("send FPGA command %s\n", kest_fpga_command_to_string(msg.data.command));
107 #endif
109 break;
110 }
111 }
112
113 vTaskDelete(NULL);
114}
115
116static inline int kest_fpga_queue_msg(kest_fpga_msg msg)
117{
118 while (!initialised);
119
120 if (xQueueSend(fpga_msg_queue, (void*)&msg, (TickType_t)1) != pdPASS)
121 {
123 }
124 return NO_ERROR;
125}
126
128{
129 kest_fpga_msg msg;
130
132 msg.data.batch = batch;
133
134 int ret_val = kest_fpga_queue_msg(msg);
135
136 return ret_val;
137}
138
140{
141 kest_fpga_msg msg;
142
143 KEST_PRINTF("QUEUEING PROGRAM BATCH\n");
145 msg.data.batch = batch;
146
147 int ret_val = kest_fpga_queue_msg(msg);
148
149 return ret_val;
150}
151
153{
154 kest_fpga_msg msg;
155
157 msg.data.level = gain_db;
158
159 return kest_fpga_queue_msg(msg);
160}
161
163{
164 kest_fpga_msg msg;
165
167 msg.data.level = gain_db;
168
169 return kest_fpga_queue_msg(msg);
170}
171
173{
174 kest_fpga_msg msg;
175
178
179 return kest_fpga_queue_msg(msg);
180}
#define NO_ERROR
#define ERR_QUEUE_SEND_FAILED
int kest_fpga_queue_input_gain_set(float gain_db)
#define KEST_FPGA_MSG_TYPE_SET_INPUT_GAIN
#define KEST_FPGA_MSG_TYPE_PROGRAM_BATCH
int kest_fpga_queue_transfer_batch(kest_fpga_transfer_batch batch)
int kest_fpga_queue_register_commit()
#define KEST_FPGA_MSG_TYPE_COMMAND
#define KEST_FPGA_MSG_TYPE_BATCH
void kest_fpga_comms_task(void *param)
int kest_fpga_queue_program_batch(kest_fpga_transfer_batch batch)
#define PROGRAM_RETRIES
int kest_fpga_queue_output_gain_set(float gain_db)
#define KEST_FPGA_MSG_TYPE_SET_OUTPUT_GAIN
#define FPGA_BOOT_MS
int kest_fpga_batch_print(kest_fpga_transfer_batch seq)
void kest_fpga_set_input_gain(float gain_db)
char * kest_fpga_command_to_string(int command)
int kest_fpga_send_byte(uint8_t byte)
void kest_fpga_set_output_gain(float gain_db)
int kest_fpga_spi_init()
void kest_free_fpga_transfer_batch(kest_fpga_transfer_batch batch)
uint8_t kest_fpga_read_byte()
int kest_fpga_transfer_batch_send(kest_fpga_transfer_batch batch)
#define SPI_RESPONSE_OK
#define COMMAND_COMMIT_REG_UPDATES
kest_context global_cxt
Definition kest_int.c:12
#define KEST_PRINTF(...)
Definition kest_printf.h:10
kest_fpga_transfer_batch batch
union kest_fpga_msg::@213017006217226057222213157222053127064260276366 data