From c8dd8553ba8300e03df9ec968db7859d4f2df121 Mon Sep 17 00:00:00 2001 From: awe Date: Thu, 4 Dec 2025 16:21:24 +0300 Subject: [PATCH] add firmware file --- l502-BFfirmware0.ldr | Bin 54 -> 49968 bytes long_trace_AVG_RPI.cmd | 11 ++ main.c | 347 +++++++++++++++++++++-------------------- pipe_reader_test.py | 66 ++++++++ run_cyclic | 5 +- 5 files changed, 253 insertions(+), 176 deletions(-) mode change 120000 => 100644 l502-BFfirmware0.ldr create mode 100644 long_trace_AVG_RPI.cmd create mode 100755 pipe_reader_test.py diff --git a/l502-BFfirmware0.ldr b/l502-BFfirmware0.ldr deleted file mode 120000 index 519975b..0000000 --- a/l502-BFfirmware0.ldr +++ /dev/null @@ -1 +0,0 @@ -../BFfirmware_0/build/release/bin/l502-BFfirmware0.ldr \ No newline at end of file diff --git a/l502-BFfirmware0.ldr b/l502-BFfirmware0.ldr new file mode 100644 index 0000000000000000000000000000000000000000..cd163f6e70d39ff8037ab0e2d226ddceb9464739 GIT binary patch literal 49968 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 = RUN_MODE_TEST; - st->BF_mode = BF_MODE_TRANSPARENT; - st->BlackFin_mode = BFMODE_TRANSPARENT; - st->run_length = 1000; - st->run_I = 0; - st->runs_N = 1; - strncpy(st->data_path, "data", sizeof(st->data_path)); - st->data_path[sizeof(st->data_path)-1] = '\0'; -} - -static char* f_trim(char* s) { - char* end; - while (*s==' ' || *s=='\t' || *s=='\r' || *s=='\n') s++; - if (*s == 0) return s; - end = s + strlen(s) - 1; - while (end > s && (*end==' ' || *end=='\t' || *end=='\r' || *end=='\n')) end--; - end[1] = '\0'; - return s; -} - -static void parse_cmd_file(const char* filename, main_state* st) { - FILE* f = fopen(filename, "r"); - if (f == NULL) { - printf("Command file '%s' not found. Using defaults.\n", filename); - return; - } - char line[512]; - while (fgets(line, sizeof(line), f)) { - char* p = line; - char* comment = strstr(p, "//"); - if (comment) *comment = '\0'; - p = f_trim(p); - if (*p == '\0') continue; - char* field = strtok(p, "\t \r\n"); - char* value = strtok(NULL, "\t \r\n"); - if (!field || !value) continue; - - if (strcmp(field, "run_mode") == 0) { - if (strcmp(value, "FINITE_RUN") == 0) { - st->run_mode = RUN_MODE_FINITE; - } else if (strcmp(value, "INF_RUN") == 0) { - st->run_mode = RUN_MODE_INF; - } else if (strcmp(value, "TEST") == 0) { - st->run_mode = RUN_MODE_TEST; - } else { - st->run_mode = RUN_MODE_TEST; // default on mismatch - } - } else if (strcmp(field, "BF_mode") == 0) { - if (strcmp(value, "TRANSPARENT") == 0) { - st->BF_mode = BF_MODE_TRANSPARENT; - } else if (strcmp(value, "AVG") == 0) { + BF_MODE_FFT = 2 +} bf_mode_t; + +typedef enum { + BFMODE_TRANSPARENT = 0, + BFMODE_AVG = 1, + BFMODE_FFT = 2 +} blackfin_mode_t; + +typedef struct main_state_typedef{ + run_mode_t run_mode; // TEST, FINITE_RUN, INF_RUN + bf_mode_t BF_mode; // TRANSPARENT, AVG + blackfin_mode_t BlackFin_mode; // TRANSPARENT, AVG, FFT + uint32_t run_length; // in ms. Used as timeout for receive_to_file + uint32_t run_I; // № current run + uint32_t runs_N; // total number of runs + char data_path[200]; // base directory for data files +} main_state; + +static void main_state_set_defaults(main_state* st) { + st->run_mode = RUN_MODE_TEST; + st->BF_mode = BF_MODE_TRANSPARENT; + st->BlackFin_mode = BFMODE_TRANSPARENT; + st->run_length = 1000; + st->run_I = 0; + st->runs_N = 1; + strncpy(st->data_path, "data", sizeof(st->data_path)); + st->data_path[sizeof(st->data_path)-1] = '\0'; +} + +static char* f_trim(char* s) { + char* end; + while (*s==' ' || *s=='\t' || *s=='\r' || *s=='\n') s++; + if (*s == 0) return s; + end = s + strlen(s) - 1; + while (end > s && (*end==' ' || *end=='\t' || *end=='\r' || *end=='\n')) end--; + end[1] = '\0'; + return s; +} + +static void parse_cmd_file(const char* filename, main_state* st) { + FILE* f = fopen(filename, "r"); + if (f == NULL) { + printf("Command file '%s' not found. Using defaults.\n", filename); + return; + } + char line[512]; + while (fgets(line, sizeof(line), f)) { + char* p = line; + char* comment = strstr(p, "//"); + if (comment) *comment = '\0'; + p = f_trim(p); + if (*p == '\0') continue; + char* field = strtok(p, "\t \r\n"); + char* value = strtok(NULL, "\t \r\n"); + if (!field || !value) continue; + + if (strcmp(field, "run_mode") == 0) { + if (strcmp(value, "FINITE_RUN") == 0) { + st->run_mode = RUN_MODE_FINITE; + } else if (strcmp(value, "INF_RUN") == 0) { + st->run_mode = RUN_MODE_INF; + } else if (strcmp(value, "TEST") == 0) { + st->run_mode = RUN_MODE_TEST; + } else { + st->run_mode = RUN_MODE_TEST; // default on mismatch + } + } else if (strcmp(field, "BF_mode") == 0) { + if (strcmp(value, "TRANSPARENT") == 0) { + st->BF_mode = BF_MODE_TRANSPARENT; + } else if (strcmp(value, "AVG") == 0) { st->BF_mode = BF_MODE_AVG; } else if (strcmp(value, "FFT") == 0) { - st->BF_mode = BF_MODE_FFT; - } else { - st->BF_mode = BF_MODE_TRANSPARENT; // default on mismatch - } - } else if (strcmp(field, "BlackFin_mode") == 0) { - if (strcmp(value, "TRANSPARENT") == 0) { - st->BlackFin_mode = BFMODE_TRANSPARENT; - } else if (strcmp(value, "AVG") == 0) { - st->BlackFin_mode = BFMODE_AVG; - } else if (strcmp(value, "FFT") == 0) { - st->BlackFin_mode = BFMODE_FFT; - } else { - st->BlackFin_mode = BFMODE_TRANSPARENT; // default on mismatch - } - } else if (strcmp(field, "run_length") == 0) { - char* endp = NULL; - unsigned long v = strtoul(value, &endp, 0); - if (endp != value) st->run_length = (uint32_t)v; - } else if (strcmp(field, "runs_N") == 0) { - char* endp = NULL; - unsigned long v = strtoul(value, &endp, 0); - if (endp != value) st->runs_N = (uint32_t)v; - } else if (strcmp(field, "run_I") == 0) { - char* endp = NULL; - unsigned long v = strtoul(value, &endp, 0); - if (endp != value) st->run_I = (uint32_t)v; - } else if (strcmp(field, "data_path") == 0) { - strncpy(st->data_path, value, sizeof(st->data_path)); - st->data_path[sizeof(st->data_path)-1] = '\0'; - } - } - fclose(f); -} + st->BF_mode = BF_MODE_FFT; + } else { + st->BF_mode = BF_MODE_TRANSPARENT; // default on mismatch + } + } else if (strcmp(field, "BlackFin_mode") == 0) { + if (strcmp(value, "TRANSPARENT") == 0) { + st->BlackFin_mode = BFMODE_TRANSPARENT; + } else if (strcmp(value, "AVG") == 0) { + st->BlackFin_mode = BFMODE_AVG; + } else if (strcmp(value, "FFT") == 0) { + st->BlackFin_mode = BFMODE_FFT; + } else { + st->BlackFin_mode = BFMODE_TRANSPARENT; // default on mismatch + } + } else if (strcmp(field, "run_length") == 0) { + char* endp = NULL; + unsigned long v = strtoul(value, &endp, 0); + if (endp != value) st->run_length = (uint32_t)v; + } else if (strcmp(field, "runs_N") == 0) { + char* endp = NULL; + unsigned long v = strtoul(value, &endp, 0); + if (endp != value) st->runs_N = (uint32_t)v; + } else if (strcmp(field, "run_I") == 0) { + char* endp = NULL; + unsigned long v = strtoul(value, &endp, 0); + if (endp != value) st->run_I = (uint32_t)v; + } else if (strcmp(field, "data_path") == 0) { + strncpy(st->data_path, value, sizeof(st->data_path)); + st->data_path[sizeof(st->data_path)-1] = '\0'; + } + } + fclose(f); +} -/* Unused SIGINT handler and flag removed */ +/* Unused SIGINT handler and flag removed */ /* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и @@ -705,7 +705,7 @@ void receive_to_file(t_x502_hnd hnd, char* logfilename, uint32_t* inp_buff, uint // fprintf(logfile_ptr, "0xFF00000 \n"); // uint32_t timeout = 100; - uint32_t recv_Err_code = X502_Recv(hnd, inp_buff, max_total_words, timeout); + int32_t recv_Err_code = X502_Recv(hnd, inp_buff, max_total_words, timeout); printf("receive code: %d\n", recv_Err_code); if (recv_Err_code > 0){ @@ -726,6 +726,7 @@ void receive_to_file(t_x502_hnd hnd, char* logfilename, uint32_t* inp_buff, uint }else if (recv_Err_code == 0){ printf("no data received. timeout\n"); }else{ + sleep(1); printf("receive error: %d\n======================\n", recv_Err_code); } } @@ -767,33 +768,33 @@ void receive_to_file(t_x502_hnd hnd, char* logfilename, uint32_t* inp_buff, uint -int main(int argc, char** argv) { +int main(int argc, char** argv) { int32_t err = X502_ERR_OK; uint32_t ver; t_x502_hnd hnd = NULL; - // читаем имя командного файла из аргументов CLI - const char* cmd_filename = "default.cmd"; - if (argc > 1 && argv[1] != NULL && argv[1][0] != '\0') { - cmd_filename = argv[1]; - } - - // получаем версию библиотеки // - ver = X502_GetLibraryVersion(); - printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF); - printf("Command file: %s\n", cmd_filename); - - // загружаем состояние из командного файла - main_state state; - main_state_set_defaults(&state); - parse_cmd_file(cmd_filename, &state); - // отладочный вывод принятых значений - printf("Parsed state: run_mode=%d, BF_mode=%d, BlackFin_mode=%d, run_length=%u, runs_N=%u, run_I=%u, data_path=%s\n", - (int)state.run_mode, (int)state.BF_mode, (int)state.BlackFin_mode, - state.run_length, state.runs_N, state.run_I, state.data_path); + // читаем имя командного файла из аргументов CLI + const char* cmd_filename = "default.cmd"; + if (argc > 1 && argv[1] != NULL && argv[1][0] != '\0') { + cmd_filename = argv[1]; + } -/* Removed unused temporary buffers and FFT/LFSM placeholders */ + // получаем версию библиотеки // + ver = X502_GetLibraryVersion(); + printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF); + printf("Command file: %s\n", cmd_filename); + + // загружаем состояние из командного файла + main_state state; + main_state_set_defaults(&state); + parse_cmd_file(cmd_filename, &state); + // отладочный вывод принятых значений + printf("Parsed state: run_mode=%d, BF_mode=%d, BlackFin_mode=%d, run_length=%u, runs_N=%u, run_I=%u, data_path=%s\n", + (int)state.run_mode, (int)state.BF_mode, (int)state.BlackFin_mode, + state.run_length, state.runs_N, state.run_I, state.data_path); + +/* Removed unused temporary buffers and FFT/LFSM placeholders */ @@ -863,8 +864,8 @@ int main(int argc, char** argv) { } - printf("\n\n\n"); - + printf("\n\n\n"); + //setup ADC: @@ -895,21 +896,21 @@ int main(int argc, char** argv) { // for(uint32_t wait_i = 1e6; wait_i; --wait_i){;} printf("\nFlushed from receiving buff: %d\n", X502_FlushRcv_buff(hnd)); - - state.run_I = 0; - char tmp_data_filename[256]; - struct timespec ts; - uint32_t max_total_words = 1000000; + + state.run_I = 0; + char tmp_data_filename[256]; + struct timespec ts; + uint32_t max_total_words = 1000000; uint32_t *inp_buff = malloc(1024*100*1024*2*4); - uint32_t runs_since_streams_clean = 0; - while(state.run_I < state.runs_N){ - max_total_words = 10000000; - timespec_get(&ts, TIME_UTC); + uint32_t runs_since_streams_clean = 0; + while(state.run_I < state.runs_N){ + max_total_words = 10000000; + timespec_get(&ts, TIME_UTC); // sprintf(&tmp_data_filename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec); // sprintf(&logfilename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec); //sprintf(&logfilename, "data/received_data_%ld.csv", seconds); - snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec); - printf("%u/%u dumping to file: %s\n", (unsigned)state.run_I, (unsigned)state.runs_N, tmp_data_filename); + snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec); + printf("%u/%u dumping to file: %s\n", (unsigned)state.run_I, (unsigned)state.runs_N, tmp_data_filename); receive_to_file(hnd, tmp_data_filename, inp_buff, max_total_words, state.run_length); if (runs_since_streams_clean >= 10){ runs_since_streams_clean = 0; @@ -917,13 +918,13 @@ int main(int argc, char** argv) { X502_StreamsStart(hnd); } state.run_I++; - runs_since_streams_clean++; } - free(inp_buff); - X502_Close(hnd); - // освобождаем описатель - X502_Free(hnd); - return 0; - + runs_since_streams_clean++; } + free(inp_buff); + X502_Close(hnd); + // освобождаем описатель + X502_Free(hnd); + return 0; + }else if (state.run_mode == RUN_MODE_INF){ if (state.BF_mode == BF_MODE_TRANSPARENT){ printf("\nStart transparent mode\n"); @@ -945,20 +946,20 @@ int main(int argc, char** argv) { state.run_I = 0; - char tmp_data_filename[256]; + char tmp_data_filename[256]; struct timespec ts; uint32_t max_total_words = 10000000; uint32_t *inp_buff = malloc(1024*100*1024*2*4); uint32_t runs_since_streams_clean = 0; while (1){ //should be infinite. because it is RUN_MODE_INF - //while(state.run_I < state.runs_N){ + //while(state.run_I < state.runs_N){ max_total_words = 10000000; timespec_get(&ts, TIME_UTC); // sprintf(&tmp_data_filename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec); // sprintf(&logfilename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec); //sprintf(&logfilename, "data/received_data_%ld.csv", seconds); - snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec); - printf("%u dumping to file: %s\n", (unsigned)state.run_I, tmp_data_filename); + snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec); + printf("%u dumping to file: %s\n", (unsigned)state.run_I, tmp_data_filename); receive_to_file(hnd, tmp_data_filename, inp_buff, max_total_words, state.run_length); if (runs_since_streams_clean >= 10){ runs_since_streams_clean = 0; @@ -974,15 +975,15 @@ int main(int argc, char** argv) { X502_Free(hnd); return 0; - }else{ //TEST mode as default + }else{ //TEST mode as default time_t seconds; time(&seconds); - char logfilename[256]; - snprintf(logfilename, sizeof(logfilename), "%s/received_data_%ld.csv", state.data_path, (long)seconds); + char logfilename[256]; + snprintf(logfilename, sizeof(logfilename), "%s/received_data_%ld.csv", state.data_path, (long)seconds); //logfile_ptr = fopen(logfilename, "w"); FILE *logfile_ptr; logfile_ptr = fopen(logfilename, "a"); @@ -1022,7 +1023,7 @@ int main(int argc, char** argv) { uint32_t *inp_buff = malloc(1024*100*1024*2*4); double *adc_data = malloc(1024*1024*sizeof(double)); //uint32_t inp_buff[1024*2048] = {0,}; - /* Removed unused counters */ + /* Removed unused counters */ insert_marker_to_file(logfilename, "start transparent"); @@ -1035,10 +1036,10 @@ int main(int argc, char** argv) { printf("receiving data...\n"); - /* Removed unused readiness checks */ + /* Removed unused readiness checks */ - uint32_t max_total_words = 100000; - /* Removed unused data_receive_trys_counter */ + uint32_t max_total_words = 100000; + /* Removed unused data_receive_trys_counter */ // printf("\nflush TX buff. \n Number of free TX descriptors before flushing:"); // BF_exec_cmd_simple(hnd, 0x8010, 10, 1); @@ -1092,7 +1093,7 @@ int main(int argc, char** argv) { //fprintf(logfile_ptr, "value number; time, sec; adc_value, V\n"); - max_total_words = 100000; + max_total_words = 100000; //printf("\n dbg value: "); //BF_exec_cmd_simple(hnd, 0x800A, 10, 1); diff --git a/pipe_reader_test.py b/pipe_reader_test.py new file mode 100755 index 0000000..e08fb81 --- /dev/null +++ b/pipe_reader_test.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +""" +Test script to read radar data from named pipe (FIFO) + +This script demonstrates how to read binary data from the named pipe +created by the radar acquisition program. +""" + +import struct +import sys +import os + +def read_from_pipe(pipe_path="/tmp/radar_data_pipe"): + """ + Read uint32_t data from named pipe + + Args: + pipe_path: Path to the named pipe (FIFO) + """ + print(f"Opening pipe: {pipe_path}") + print("Waiting for radar data...") + + try: + # Open pipe for reading (this will block until writer connects) + with open(pipe_path, 'rb') as pipe: + print("Connected to pipe! Reading data...") + + word_count = 0 + while True: + # Read 4 bytes (one uint32_t) + data = pipe.read(4) + + if not data: + print("\nEnd of stream or pipe closed") + break + + if len(data) < 4: + print(f"\nWarning: incomplete data read ({len(data)} bytes)") + break + + # Unpack as uint32_t (little-endian) + value = struct.unpack(' 1 else "/tmp/radar_data_pipe" + read_from_pipe(pipe_path) \ No newline at end of file diff --git a/run_cyclic b/run_cyclic index bc38f54..bf8f4a9 100755 --- a/run_cyclic +++ b/run_cyclic @@ -1,4 +1,3 @@ #!/usr/bin/bash -sudo mount -t tmpfs -o size=1G tmpfs tmp -./BF_companion 100 #should generate approx 500 MB of data by running 10 secs -rm tmp/* +# sudo mount -t tmpfs -o size=1G tmpfs tmp +./BF_companion long_trace_AVG_RPI.cmd \ No newline at end of file