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 0000000..cd163f6 Binary files /dev/null and b/l502-BFfirmware0.ldr differ diff --git a/long_trace_AVG_RPI.cmd b/long_trace_AVG_RPI.cmd new file mode 100644 index 0000000..d49ab03 --- /dev/null +++ b/long_trace_AVG_RPI.cmd @@ -0,0 +1,11 @@ + +// Default configuration for BF_companion main_state +// Format: field value // optional comment + +run_mode INF_RUN // TEST | FINITE_RUN | INF_RUN +BF_mode FFT // TRANSPARENT | AVG | FFT +run_length 50 // milliseconds +runs_N 1000 // total runs (used in FINITE_RUN) +run_I 0 // starting run index +//data_path /home/feda/MIPT/RadioPhotonic_Subserface_radar/Receiver_GUI/data // base directory for output files +data_path /home/awe/Documents/E502_ADC_BF_PC_companion/tmp diff --git a/main.c b/main.c index f97cf7f..0500095 100644 --- a/main.c +++ b/main.c @@ -68,21 +68,21 @@ #include "l502_fpga_regs.h" -/* Remove unused enums/structs and constants that are not referenced anywhere */ +/* Remove unused enums/structs and constants that are not referenced anywhere */ // количество используемых логических каналов // #define ADC_LCH_CNT 1 -/* Unused frequency/timing defines removed */ +/* Unused frequency/timing defines removed */ // сколько отсчетов считываем за блок // -#define READ_BLOCK_SIZE 4096*200 +#define READ_BLOCK_SIZE 4096*200 // таймаут на прием блока (мс) // -#define READ_TIMEOUT 2000 +#define READ_TIMEOUT 2000 -/* Unused BF user command define removed */ +/* Unused BF user command define removed */ // номера используемых физических каналов // @@ -125,7 +125,7 @@ static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_02, X502_ADC_RANGE_5, // признак необходимости завершить сбор данных // -static int f_out = 0; +static int f_out = 0; #ifndef _WIN32 // Обработчик сигнала завершения для Linux // @@ -143,123 +143,123 @@ typedef struct { } ip_dev_list_t; -typedef enum { - RUN_MODE_TEST = 0, - RUN_MODE_FINITE = 1, - RUN_MODE_INF = 2 -} run_mode_t; - -typedef enum { - BF_MODE_TRANSPARENT = 0, +typedef enum { + RUN_MODE_TEST = 0, + RUN_MODE_FINITE = 1, + RUN_MODE_INF = 2 +} run_mode_t; + +typedef enum { + BF_MODE_TRANSPARENT = 0, BF_MODE_AVG = 1, - 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) { + 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