diff --git a/FSW-qt/Makefile b/FSW-qt/Makefile --- a/FSW-qt/Makefile +++ b/FSW-qt/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: bin/fsw-vhdl-dev -# Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Feb 6 09:29:25 2014 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Feb 13 07:43:27 2014 # Project: fsw-qt.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro @@ -10,10 +10,10 @@ CC = sparc-rtems-gcc CXX = sparc-rtems-g++ -DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -DDEBUG_MESSAGES -DVHDL_DEV +DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -DDEBUG_MESSAGES -DPRINT_TASK_STATISTICS -DVHDL_DEV CFLAGS = -pipe -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) -INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header +INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../../LFR_basic-parameters LINK = sparc-rtems-g++ LFLAGS = LIBS = $(SUBLIBS) @@ -52,7 +52,8 @@ SOURCES = ../src/wf_handler.c \ ../src/fsw_spacewire.c \ ../src/tc_load_dump_parameters.c \ ../src/tm_lfr_tc_exe.c \ - ../src/tc_acceptance.c + ../src/tc_acceptance.c \ + ../../LFR_basic-parameters/basic_parameters.c OBJECTS = obj/wf_handler.o \ obj/tc_handler.o \ obj/fsw_processing.o \ @@ -62,7 +63,8 @@ OBJECTS = obj/wf_handler.o \ obj/fsw_spacewire.o \ obj/tc_load_dump_parameters.o \ obj/tm_lfr_tc_exe.o \ - obj/tc_acceptance.o + obj/tc_acceptance.o \ + obj/basic_parameters.o DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \ /usr/lib64/qt4/mkspecs/common/linux.conf \ /usr/lib64/qt4/mkspecs/common/gcc-base.conf \ @@ -238,6 +240,9 @@ obj/tm_lfr_tc_exe.o: ../src/tm_lfr_tc_ex obj/tc_acceptance.o: ../src/tc_acceptance.c $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_acceptance.o ../src/tc_acceptance.c +obj/basic_parameters.o: ../../LFR_basic-parameters/basic_parameters.c ../../LFR_basic-parameters/basic_parameters.h + $(CC) -c $(CFLAGS) $(INCPATH) -o obj/basic_parameters.o ../../LFR_basic-parameters/basic_parameters.c + ####### Install install: FORCE diff --git a/FSW-qt/fsw-qt.pro b/FSW-qt/fsw-qt.pro --- a/FSW-qt/fsw-qt.pro +++ b/FSW-qt/fsw-qt.pro @@ -1,7 +1,7 @@ TEMPLATE = app # CONFIG += console v8 sim # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** gsa *** vhdl_dev -CONFIG += console verbose debug_messages vhdl_dev +CONFIG += console verbose debug_messages vhdl_dev cpu_usage_report CONFIG -= qt include(./sparc.pri) @@ -51,7 +51,8 @@ contains( CONFIG, vhdl_dev ) { INCLUDEPATH += \ ../src \ - ../header + ../header \ + ../../LFR_basic-parameters SOURCES += \ ../src/wf_handler.c \ @@ -63,7 +64,8 @@ SOURCES += \ ../src/fsw_spacewire.c \ ../src/tc_load_dump_parameters.c \ ../src/tm_lfr_tc_exe.c \ - ../src/tc_acceptance.c + ../src/tc_acceptance.c \ + ../../LFR_basic-parameters/basic_parameters.c HEADERS += \ @@ -81,5 +83,6 @@ HEADERS += \ ../header/tc_load_dump_parameters.h \ ../header/tm_lfr_tc_exe.h \ ../header/tc_acceptance.h \ - ../header/fsw_params_nb_bytes.h + ../header/fsw_params_nb_bytes.h \ + ../../LFR_basic-parameters/basic_parameters.h diff --git a/FSW-qt/fsw-qt.pro.user b/FSW-qt/fsw-qt.pro.user --- a/FSW-qt/fsw-qt.pro.user +++ b/FSW-qt/fsw-qt.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget diff --git a/header/fsw_params.h b/header/fsw_params.h --- a/header/fsw_params.h +++ b/header/fsw_params.h @@ -17,6 +17,14 @@ typedef struct ring_node unsigned int status; } ring_node; +typedef struct ring_node_sm +{ + struct ring_node *previous; + volatile int *buffer_address; + struct ring_node *next; + unsigned int status; +} ring_node_sm; + //************************ // flight software version // this parameters is handled by the Qt project options @@ -33,7 +41,7 @@ typedef struct ring_node #define NB_RING_NODES_F0 3 // AT LEAST 3 #define NB_RING_NODES_F1 5 // AT LEAST 3 #define NB_RING_NODES_F2 5 // AT LEAST 3 -#define NB_RING_NODES_ASM_F0 8 // AT LEAST 3 +#define NB_RING_NODES_ASM_F0 12 // AT LEAST 3 #define NB_RING_NODES_ASM_F1 2 // AT LEAST 3 #define NB_RING_NODES_ASM_F2 2 // AT LEAST 3 diff --git a/header/fsw_processing.h b/header/fsw_processing.h --- a/header/fsw_processing.h +++ b/header/fsw_processing.h @@ -10,6 +10,7 @@ #include "fsw_params.h" #include "fsw_spacewire.h" +#include "basic_parameters.h" extern volatile int sm_f0[ ][ SM_HEADER + TOTAL_SIZE_SM ]; extern volatile int sm_f1[ ][ SM_HEADER + TOTAL_SIZE_SM ]; @@ -26,7 +27,8 @@ extern rtems_name misc_name[5]; extern rtems_id Task_id[20]; /* array of task ids */ // -void init_asm_rings( void ); +void init_sm_rings( void ); +void reset_current_sm_ring_nodes( void ); // ISR rtems_isr spectral_matrices_isr( rtems_vector_number vector ); @@ -41,8 +43,8 @@ rtems_task matr_task(rtems_task_argument void matrix_compression(volatile float *averaged_spec_mat, unsigned char fChannel, float *compressed_spec_mat); void matrix_reset(volatile float *averaged_spec_mat); -void BP1_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat, unsigned char * LFR_BP1); -void BP2_set(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat); +void BP1_set_old(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat, unsigned char * LFR_BP1); +void BP2_set_old(float * compressed_spec_mat, unsigned char nb_bins_compressed_spec_mat); // void init_header_asm( Header_TM_LFR_SCIENCE_ASM_t *header); void send_spectral_matrix(Header_TM_LFR_SCIENCE_ASM_t *header, char *spectral_matrix, diff --git a/header/tc_handler.h b/header/tc_handler.h --- a/header/tc_handler.h +++ b/header/tc_handler.h @@ -8,6 +8,7 @@ #include "tc_acceptance.h" #include "tm_lfr_tc_exe.h" #include "wf_handler.h" +#include "fsw_processing.h" // MODE PARAMETERS extern unsigned int maxCount; @@ -42,6 +43,7 @@ int enter_sbm2_mode(); int restart_science_tasks(); int suspend_science_tasks(); void launch_waveform_picker( unsigned char mode ); +void launch_spectral_matrix( unsigned char mode ); // other functions void updateLFRCurrentMode(); diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -45,6 +45,7 @@ extern rtems_id Task_id[20]; extern unsigned char lfrCurrentMode; rtems_isr waveforms_isr( rtems_vector_number vector ); +rtems_isr waveforms_isr_alt( rtems_vector_number vector ); rtems_task wfrm_task( rtems_task_argument argument ); rtems_task cwf3_task( rtems_task_argument argument ); rtems_task cwf2_task( rtems_task_argument argument ); @@ -76,6 +77,9 @@ char set_wfp_delta_snapshot(); void set_wfp_burst_enable_register( unsigned char mode ); void reset_wfp_burst_enable(); void reset_wfp_status(); +void reset_waveform_picker_regs_vhdl_dev(); +void reset_waveform_picker_regs_vhdl_dev_debug(); +void reset_waveform_picker_regs_vhdl_dev_debug_64(); void reset_waveform_picker_regs(); void reset_new_waveform_picker_regs(); diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -76,8 +76,8 @@ rtems_task Init( rtems_task_argument ign rtems_isr_entry old_isr_handler; // UART settings + send_console_outputs_on_apbuart_port(); set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE); - send_console_outputs_on_apbuart_port(); enable_apbuart_transmitter(); PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n") @@ -92,6 +92,7 @@ rtems_task Init( rtems_task_argument ign reset_wfp_burst_enable(); // stop the waveform picker if it was running init_waveform_rings(); // initialize the waveform rings + init_sm_rings(); init_parameter_dump(); init_local_mode_parameters(); diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -81,7 +81,7 @@ int send_console_outputs_on_apbuart_port { struct apbuart_regs_str *apbuart_regs = (struct apbuart_regs_str *) REGS_ADDR_APBUART; - apbuart_regs->ctrl = apbuart_regs->ctrl & APBUART_CTRL_REG_MASK_DB; + apbuart_regs->ctrl = APBUART_CTRL_REG_MASK_TE; return 0; } diff --git a/src/fsw_processing.c b/src/fsw_processing.c --- a/src/fsw_processing.c +++ b/src/fsw_processing.c @@ -17,6 +17,7 @@ ring_node sm_ring_f0[NB_RING_NODES_ASM_F ring_node sm_ring_f1[NB_RING_NODES_ASM_F1]; ring_node sm_ring_f2[NB_RING_NODES_ASM_F2]; ring_node *current_ring_node_sm_f0; +ring_node *ring_node_for_averaging_sm_f0; ring_node *current_ring_node_sm_f1; ring_node *current_ring_node_sm_f2; @@ -25,7 +26,7 @@ float averaged_sm_f0[ TOTAL_SIZE_SM ]; char averaged_sm_f0_char[ TOTAL_SIZE_SM * 2 ]; float compressed_sm_f0[ TOTAL_SIZE_COMPRESSED_MATRIX_f0 ]; -void init_asm_rings( void ) +void init_sm_rings( void ) { unsigned char i; @@ -51,7 +52,8 @@ void init_asm_rings( void ) void reset_current_sm_ring_nodes( void ) { - current_ring_node_sm_f0 = sm_ring_f0; + current_ring_node_sm_f0 = sm_ring_f0; + ring_node_for_averaging_sm_f0 = sm_ring_f0; } //*********************************************************** @@ -60,6 +62,7 @@ rtems_isr spectral_matrices_isr( rtems_v { unsigned char status; unsigned char i; + static unsigned int nb_interrupt_f0 = 0; status = spectral_matrix_regs->status; //[f2 f1 f0_1 f0_0] for (i=0; i<4; i++) @@ -72,6 +75,15 @@ rtems_isr spectral_matrices_isr( rtems_v current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->matrixF0_Address0 = current_ring_node_sm_f0->buffer_address; spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffe; + nb_interrupt_f0 = nb_interrupt_f0 + 1; + if (nb_interrupt_f0 == NB_SM_TO_RECEIVE_BEFORE_AVF0 ){ + ring_node_for_averaging_sm_f0 = current_ring_node_sm_f0; + if (rtems_event_send( Task_id[TASKID_AVF0], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) + { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); + } + nb_interrupt_f0 = 0; + } break; case 1: break; @@ -85,16 +97,24 @@ rtems_isr spectral_matrices_isr( rtems_v // reset error codes to 0 spectral_matrix_regs->status = spectral_matrix_regs->status & 0xffffffcf; // [1100 1111] - - if (rtems_event_send( Task_id[TASKID_SMIQ], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_4 ); - } } rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector ) { - if (rtems_event_send( Task_id[TASKID_SMIQ], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_4 ); + static unsigned int nb_interrupt_f0 = 0; + + current_ring_node_sm_f0 = current_ring_node_sm_f0->next; + spectral_matrix_regs->matrixF0_Address0 = current_ring_node_sm_f0->buffer_address; + spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffe; + nb_interrupt_f0 = nb_interrupt_f0 + 1; + if (nb_interrupt_f0 == NB_SM_TO_RECEIVE_BEFORE_AVF0 ) + { + ring_node_for_averaging_sm_f0 = current_ring_node_sm_f0; + if (rtems_event_send( Task_id[TASKID_AVF0], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) + { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); + } + nb_interrupt_f0 = 0; } } @@ -104,20 +124,11 @@ rtems_isr spectral_matrices_isr_simu( rt rtems_task smiq_task(rtems_task_argument argument) // process the Spectral Matrices IRQ { rtems_event_set event_out; - unsigned int nb_interrupt_f0 = 0; BOOT_PRINTF("in SMIQ *** \n") while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 - nb_interrupt_f0 = nb_interrupt_f0 + 1; - if (nb_interrupt_f0 == NB_SM_TO_RECEIVE_BEFORE_AVF0 ){ - if (rtems_event_send( Task_id[TASKID_AVF0], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) - { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); - } - nb_interrupt_f0 = 0; - } } } @@ -146,15 +157,19 @@ rtems_task avf0_task(rtems_task_argument while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 + for (i=0; iprevious; + } for(i=0; imatrixF0_Address0 = current_ring_node_sm_f0->buffer_address; spectral_matrix_regs->matrixFO_Address1 = current_ring_node_sm_f0->buffer_address; spectral_matrix_regs->matrixF1_Address = current_ring_node_sm_f1->buffer_address; spectral_matrix_regs->matrixF2_Address = current_ring_node_sm_f2->buffer_address; -#endif } //****************** diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -495,13 +495,8 @@ int enter_normal_mode() status = restart_science_tasks(); - // Spectral Matrices simulator -// timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR ); -// set_local_nb_interrupt_f0_MAX(); -// LEON_Clear_interrupt( IRQ_SM ); -// LEON_Unmask_interrupt( IRQ_SM ); - launch_waveform_picker( LFR_MODE_NORMAL ); +// launch_spectral_matrix( LFR_MODE_NORMAL ); return status; } @@ -705,15 +700,24 @@ void launch_waveform_picker( unsigned ch int startDate; reset_current_ring_nodes(); - reset_waveform_picker_regs(); + reset_waveform_picker_regs_vhdl_dev_debug_64(); set_wfp_burst_enable_register( mode ); LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER ); -#ifdef VHDL_DEV startDate = time_management_regs->coarse_time + 2; waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x80; // [1000 0000] waveform_picker_regs->start_date = startDate; -#endif +} + +void launch_spectral_matrix( unsigned char mode ) +{ + reset_current_sm_ring_nodes(); + reset_spectral_matrix_regs(); + // Spectral Matrices simulator + timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR ); + set_local_nb_interrupt_f0_MAX(); + LEON_Clear_interrupt( IRQ_SM ); + LEON_Unmask_interrupt( IRQ_SM ); } //**************** diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -46,6 +46,8 @@ rtems_isr waveforms_isr( rtems_vector_nu * */ + static unsigned char nb_swf = 0; + if ( (lfrCurrentMode == LFR_MODE_NORMAL) || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) { // in modes other than STANDBY and BURST, send the CWF_F3 data @@ -94,12 +96,174 @@ rtems_isr waveforms_isr( rtems_vector_nu current_ring_node_f2 = current_ring_node_f2->next; waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // + if (nb_swf < 2) +// if (true) + { + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] + nb_swf = nb_swf + 1; + } + else + { + reset_wfp_burst_enable(); + nb_swf = 0; + } + + } + + break; + + //****** + // BURST + case(LFR_MODE_BURST): + if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit + // (1) change the receiving buffer for the waveform picker + ring_node_to_send_cwf_f2 = current_ring_node_f2; + current_ring_node_f2 = current_ring_node_f2->next; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; + // (2) send an event for the waveforms transmission + if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 + } + break; + + //***** + // SBM1 + case(LFR_MODE_SBM1): + if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit + // (1) change the receiving buffer for the waveform picker + ring_node_to_send_cwf_f1 = current_ring_node_f1; + current_ring_node_f1 = current_ring_node_f1->next; + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; + // (2) send an event for the waveforms transmission + if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1111 1101 1101 1101] f1 bit = 0 + } + if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit + ring_node_to_send_swf_f1 = current_ring_node_f1->previous; + } + if ( (waveform_picker_regs->status & 0x04) == 0x04 ) { // [0100] check the f2 full bit + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0 + } + break; + + //***** + // SBM2 + case(LFR_MODE_SBM2): + if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit + // (1) change the receiving buffer for the waveform picker + ring_node_to_send_cwf_f2 = current_ring_node_f2; + current_ring_node_f2 = current_ring_node_f2->next; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; + // (2) send an event for the waveforms transmission + if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 + } + if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit + ring_node_to_send_swf_f2 = current_ring_node_f2->previous; + } + if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } - waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0 + } + break; + + //******** + // DEFAULT + default: + break; + } +} + +rtems_isr waveforms_isr_alt( rtems_vector_number vector ) +{ + /** This is the interrupt sub routine called by the waveform picker core. + * + * This ISR launch different actions depending mainly on two pieces of information: + * 1. the values read in the registers of the waveform picker. + * 2. the current LFR mode. + * + */ + + if ( (lfrCurrentMode == LFR_MODE_NORMAL) + || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) + { // in modes other than STANDBY and BURST, send the CWF_F3 data + if ((waveform_picker_regs->status & 0x08) == 0x08){ // [1000] f3 is full + // (1) change the receiving buffer for the waveform picker + if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3_a) { + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_b); + } + else { + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_a); + } + // (2) send an event for the waveforms transmission + if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111] } + } + switch(lfrCurrentMode) + { + //******** + // STANDBY + case(LFR_MODE_STANDBY): + break; + + //****** + // NORMAL + case(LFR_MODE_NORMAL): + if ( (waveform_picker_regs->status & 0xff8) != 0x00) // [1000] check the error bits + { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + if ( (waveform_picker_regs->status & 0x01) == 0x01) // [0001] check the f0 full bit + { + // change F0 ring node + ring_node_to_send_swf_f0 = current_ring_node_f0; + current_ring_node_f0 = current_ring_node_f0->next; + waveform_picker_regs->addr_data_f0 = current_ring_node_f0->buffer_address; + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffeee; // [1110 1110 1110] + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL_SWF_F0 ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + } + if ( (waveform_picker_regs->status & 0x02) == 0x02) // [0010] check the f1 full bit + { + // change F1 ring node + ring_node_to_send_swf_f1 = current_ring_node_f1; + current_ring_node_f1 = current_ring_node_f1->next; + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffddd; // [1101 1101 1101] + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL_SWF_F1 ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + } + if ( (waveform_picker_regs->status & 0x04) == 0x04) // [0100] check the f2 full bit + { + // change F2 ring node + ring_node_to_send_swf_f2 = current_ring_node_f2; + current_ring_node_f2 = current_ring_node_f2->next; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1011 1011 1011] + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL_SWF_F2 ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + } break; //****** @@ -682,7 +846,7 @@ int send_waveform_SWF( volatile int *wav printf("%d-%d, ERR %d\n", sid, i, (int) status); ret = LFR_DEFAULT; } - rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds +// rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds } return ret; @@ -1098,8 +1262,7 @@ void reset_wfp_status() #endif } -#ifdef VHDL_DEV -void reset_waveform_picker_regs() +void reset_waveform_picker_regs_vhdl_dev() { /** This function resets the waveform picker module registers. * @@ -1154,12 +1317,105 @@ void reset_waveform_picker_regs() // waveform_picker_regs->start_date = 0x00; // 0x38 // waveform_picker_regs->nb_word_in_buffer = 0x1802; // 0x3c *** 2048 * 3 + 2 = 6146 // 2352 = 7 * 336 - waveform_picker_regs->nb_data_by_buffer = 0x92f; // 0x30 *** 2352 - 1 => nb samples -1 - waveform_picker_regs->snapshot_param = 0x930; // 0x34 *** 2352 => nb samples +// waveform_picker_regs->nb_data_by_buffer = 0x92f; // 0x30 *** 2352 - 1 => nb samples -1 +// waveform_picker_regs->snapshot_param = 0x930; // 0x34 *** 2352 => nb samples +// waveform_picker_regs->start_date = 0x00; // 0x38 +// waveform_picker_regs->nb_word_in_buffer = 0x1b92; // 0x3c *** 2352 * 3 + 2 = 7058 + // 128 + waveform_picker_regs->nb_data_by_buffer = 0x7f; // 0x30 *** 128 - 1 => nb samples -1 + waveform_picker_regs->snapshot_param = 0x80; // 0x34 *** 128 => nb samples waveform_picker_regs->start_date = 0x00; // 0x38 - waveform_picker_regs->nb_word_in_buffer = 0x1b92; // 0x3c *** 2352 * 3 + 2 = 7058 + waveform_picker_regs->nb_word_in_buffer = 0x182; // 0x3c *** 128 * 3 + 2 = 386 +} + +void reset_waveform_picker_regs_vhdl_dev_debug() +{ + /** This function resets the waveform picker module registers. + * + * The registers affected by this function are located at the following offset addresses: + * - 0x00 data_shaping + * - 0x04 run_burst_enable + * - 0x08 addr_data_f0 + * - 0x0C addr_data_f1 + * - 0x10 addr_data_f2 + * - 0x14 addr_data_f3 + * - 0x18 status + * - 0x1C delta_snapshot + * - 0x20 delta_f0 + * - 0x24 delta_f0_2 + * - 0x28 delta_f1 + * - 0x2c delta_f2 + * - 0x30 nb_data_by_buffer + * - 0x34 nb_snapshot_param + * - 0x38 start_date + * - 0x3c nb_word_in_buffer + * + */ + waveform_picker_regs->data_shaping = 0x01; // 0x00 *** R1 R0 SP1 SP0 BW + waveform_picker_regs->run_burst_enable = 0x00; // 0x04 *** [run *** burst f2, f1, f0 *** enable f3, f2, f1, f0 ] + //waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); // 0x08 + waveform_picker_regs->addr_data_f0 = current_ring_node_f0->buffer_address; // 0x08 + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; // 0x0c + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // 0x10 + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_a); // 0x14 + waveform_picker_regs->status = 0x00; // 0x18 + // + waveform_picker_regs->delta_snapshot = 0x100; // 0x1c *** 256 + waveform_picker_regs->delta_f0 = 0xc1; // 0x20 *** 256 - 63 + waveform_picker_regs->delta_f0_2 = 0x7; // 0x24 *** 7 [7 bits] + waveform_picker_regs->delta_f1 = 0xc4; // 0x28 *** 256 - 60 + waveform_picker_regs->delta_f2 = 0xc0; // 0x2c *** 192 + // 128 + waveform_picker_regs->nb_data_by_buffer = 0x7f; // 0x30 *** 128 - 1 => nb samples -1 + waveform_picker_regs->snapshot_param = 0x80; // 0x34 *** 128 => nb samples + waveform_picker_regs->start_date = 0x00; // 0x38 + waveform_picker_regs->nb_word_in_buffer = 0x182; // 0x3c *** 128 * 3 + 2 = 386 } -#else + +void reset_waveform_picker_regs_vhdl_dev_debug_64() +{ + /** This function resets the waveform picker module registers. + * + * The registers affected by this function are located at the following offset addresses: + * - 0x00 data_shaping + * - 0x04 run_burst_enable + * - 0x08 addr_data_f0 + * - 0x0C addr_data_f1 + * - 0x10 addr_data_f2 + * - 0x14 addr_data_f3 + * - 0x18 status + * - 0x1C delta_snapshot + * - 0x20 delta_f0 + * - 0x24 delta_f0_2 + * - 0x28 delta_f1 + * - 0x2c delta_f2 + * - 0x30 nb_data_by_buffer + * - 0x34 nb_snapshot_param + * - 0x38 start_date + * - 0x3c nb_word_in_buffer + * + */ + waveform_picker_regs->data_shaping = 0x01; // 0x00 *** R1 R0 SP1 SP0 BW + waveform_picker_regs->run_burst_enable = 0x00; // 0x04 *** [run *** burst f2, f1, f0 *** enable f3, f2, f1, f0 ] + //waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); // 0x08 + waveform_picker_regs->addr_data_f0 = current_ring_node_f0->buffer_address; // 0x08 + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; // 0x0c + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // 0x10 + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_a); // 0x14 + waveform_picker_regs->status = 0x00; // 0x18 + // + waveform_picker_regs->delta_snapshot = 0x80; // 0x1c *** 128 + waveform_picker_regs->delta_f0 = 0x60; // 0x20 *** 128 - 32 = 96 + waveform_picker_regs->delta_f0_2 = 0x7; // 0x24 *** 7 [7 bits] + waveform_picker_regs->delta_f1 = 0x62; // 0x28 *** 128 - 30 = 90 + waveform_picker_regs->delta_f2 = 0x60; // 0x2c *** 192 + // 128 + waveform_picker_regs->nb_data_by_buffer = 0x3f; // 0x30 *** 64 - 1 => nb samples -1 + waveform_picker_regs->snapshot_param = 0x40; // 0x34 *** 64 => nb samples + waveform_picker_regs->start_date = 0x00; // 0x38 + waveform_picker_regs->nb_word_in_buffer = 0xc2; // 0x3c *** 64 * 3 + 2 = 194 +} + void reset_waveform_picker_regs() { /** This function resets the waveform picker module registers. @@ -1180,6 +1436,8 @@ void reset_waveform_picker_regs() * */ +#ifdef VHDL_DEV +#else reset_wfp_burst_enable(); reset_wfp_status(); // set buffer addresses @@ -1198,8 +1456,8 @@ void reset_waveform_picker_regs() waveform_picker_regs->nb_burst_available = 0x1b9; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets) // 3 * 2352 / 16 = 441 waveform_picker_regs->nb_snapshot_param = 0x944; // max 3 octets, 2372 - 1 +#endif } -#endif //***************** // local parameters