# HG changeset patch # User paul # Date 2015-12-16 07:41:04 # Node ID 3412b0dcc87a04990c516bed5cdb59cc6a980fc9 # Parent b287f3b429ddc3637fdcb21c68d6e53e57f35aa6 Modification of the launch of NORMAL, SBM1 and SBM2 modes diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,2 +1,2 @@ 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters -07e22c5c44daa84954a10db557a74b8c8dd2d014 header/lfr_common_headers +e1bf35e31e3c8c1d1448d2e485c71f5f1259615c header/lfr_common_headers 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 @@ -12,7 +12,7 @@ SWVERSION=-1-0 DEFINES += SW_VERSION_N1=3 # major DEFINES += SW_VERSION_N2=0 # minor DEFINES += SW_VERSION_N3=0 # patch -DEFINES += SW_VERSION_N4=12 # internal +DEFINES += SW_VERSION_N4=13 # internal # #QMAKE_CFLAGS_RELEASE += -fprofile-arcs -ftest-coverage diff --git a/header/tc_handler.h b/header/tc_handler.h --- a/header/tc_handler.h +++ b/header/tc_handler.h @@ -34,6 +34,7 @@ int action_update_time( ccsdsTelecommand int check_mode_value( unsigned char requestedMode ); int check_mode_transition( unsigned char requestedMode ); int check_transition_date( unsigned int transitionCoarseTime ); +int stop_spectral_matrices( void ); int stop_current_mode( void ); int enter_mode_standby( void ); int enter_mode_normal( unsigned int transitionCoarseTime ); @@ -41,10 +42,11 @@ int enter_mode_burst( unsigned int trans int enter_mode_sbm1( unsigned int transitionCoarseTime ); int enter_mode_sbm2( unsigned int transitionCoarseTime ); int restart_science_tasks( unsigned char lfrRequestedMode ); -int suspend_science_tasks(); +int restart_asm_tasks(unsigned char lfrRequestedMode ); +int suspend_science_tasks(void); +int suspend_asm_tasks( void ); void launch_waveform_picker( unsigned char mode , unsigned int transitionCoarseTime ); void launch_spectral_matrix( void ); -void launch_spectral_matrix_simu( void ); void set_sm_irq_onNewMatrix( unsigned char value ); void set_sm_irq_onError( unsigned char value ); diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -59,7 +59,8 @@ int send_waveform_CWF3_light(ring_node * // void compute_acquisition_time(unsigned int coarseTime, unsigned int fineTime, unsigned int sid, unsigned char pa_lfr_pkt_nr, unsigned char *acquisitionTime ); -void build_snapshot_from_ring(ring_node *ring_node_to_send, unsigned char frequencyChannel , unsigned long long acquisitionTimeF0_asLong); +void build_snapshot_from_ring(ring_node *ring_node_to_send, unsigned char frequencyChannel , + unsigned long long acquisitionTimeF0_asLong, ring_node *ring_node_swf_extracted, int *swf_extracted); void snapshot_resynchronization( unsigned char *timePtr ); // rtems_id get_pkts_queue_id( void ); diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -121,7 +121,7 @@ rtems_task Init( rtems_task_argument ign PRINTF1("** %d.", SW_VERSION_N1) PRINTF1("%d." , SW_VERSION_N2) PRINTF1("%d." , SW_VERSION_N3) - PRINTF1("%d **\n", SW_VERSION_N4) + PRINTF1("%d **\n", SW_VERSION_N4) vhdlVersion = (unsigned char *) (REGS_ADDR_VHDL_VERSION); PRINTF("** VHDL **\n") diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -479,6 +479,57 @@ int check_transition_date( unsigned int return status; } +int restart_asm_activities( unsigned char lfrRequestedMode ) +{ + rtems_status_code status; + + status = stop_spectral_matrices(); + + status = restart_asm_tasks( lfrRequestedMode ); + + launch_spectral_matrix(); + + return status; +} + +int stop_spectral_matrices( void ) +{ + /** This function stops and restarts the current mode average spectral matrices activities. + * + * @return RTEMS directive status codes: + * - RTEMS_SUCCESSFUL - task restarted successfully + * - RTEMS_INVALID_ID - task id invalid + * - RTEMS_ALREADY_SUSPENDED - task already suspended + * + */ + + rtems_status_code status; + + status = RTEMS_SUCCESSFUL; + + // (1) mask interruptions + LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt + + // (2) reset spectral matrices registers + set_sm_irq_onNewMatrix( 0 ); // stop the spectral matrices + reset_sm_status(); + + // (3) clear interruptions + LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt + + // suspend several tasks + if (lfrCurrentMode != LFR_MODE_STANDBY) { + status = suspend_asm_tasks(); + } + + if (status != RTEMS_SUCCESSFUL) + { + PRINTF1("in stop_current_mode *** in suspend_science_tasks *** ERR code: %d\n", status) + } + + return status; +} + int stop_current_mode( void ) { /** This function stops the current mode by masking interrupt lines and suspending science tasks. @@ -496,14 +547,14 @@ int stop_current_mode( void ) // (1) mask interruptions LEON_Mask_interrupt( IRQ_WAVEFORM_PICKER ); // mask waveform picker interrupt - LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt + LEON_Mask_interrupt( IRQ_SPECTRAL_MATRIX ); // clear spectral matrix interrupt // (2) reset waveform picker registers reset_wfp_burst_enable(); // reset burst and enable bits reset_wfp_status(); // reset all the status bits // (3) reset spectral matrices registers - set_sm_irq_onNewMatrix( 0 ); // stop the spectral matrices + set_sm_irq_onNewMatrix( 0 ); // stop the spectral matrices reset_sm_status(); // reset lfr VHDL module @@ -582,9 +633,11 @@ int enter_mode_normal( unsigned int tran } break; case LFR_MODE_SBM1: + restart_asm_activities( LFR_MODE_NORMAL ); status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action break; case LFR_MODE_SBM2: + restart_asm_activities( LFR_MODE_NORMAL ); status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action break; default: @@ -646,6 +699,7 @@ int enter_mode_sbm1( unsigned int transi } break; case LFR_MODE_NORMAL: // lfrCurrentMode will be updated after the execution of close_action + restart_asm_activities( LFR_MODE_SBM1 ); status = LFR_SUCCESSFUL; break; case LFR_MODE_BURST: @@ -658,6 +712,7 @@ int enter_mode_sbm1( unsigned int transi } break; case LFR_MODE_SBM2: + restart_asm_activities( LFR_MODE_SBM1 ); status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action break; default: @@ -694,6 +749,7 @@ int enter_mode_sbm2( unsigned int transi } break; case LFR_MODE_NORMAL: + restart_asm_activities( LFR_MODE_SBM2 ); status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action break; case LFR_MODE_BURST: @@ -706,6 +762,7 @@ int enter_mode_sbm2( unsigned int transi } break; case LFR_MODE_SBM1: + restart_asm_activities( LFR_MODE_SBM2 ); status = LFR_SUCCESSFUL; // lfrCurrentMode will be updated after the execution of close_action break; default: @@ -721,7 +778,7 @@ int enter_mode_sbm2( unsigned int transi return status; } -int restart_science_tasks(unsigned char lfrRequestedMode ) +int restart_science_tasks( unsigned char lfrRequestedMode ) { /** This function is used to restart all science tasks. * @@ -812,7 +869,72 @@ int restart_science_tasks(unsigned char return ret; } -int suspend_science_tasks() +int restart_asm_tasks( unsigned char lfrRequestedMode ) +{ + /** This function is used to restart average spectral matrices tasks. + * + * @return RTEMS directive status codes: + * - RTEMS_SUCCESSFUL - task restarted successfully + * - RTEMS_INVALID_ID - task id invalid + * - RTEMS_INCORRECT_STATE - task never started + * - RTEMS_ILLEGAL_ON_REMOTE_OBJECT - cannot restart remote task + * + * ASM tasks are AVF0, PRC0, AVF1, PRC1, AVF2 and PRC2 + * + */ + + rtems_status_code status[6]; + rtems_status_code ret; + + ret = RTEMS_SUCCESSFUL; + + status[0] = rtems_task_restart( Task_id[TASKID_AVF0], lfrRequestedMode ); + if (status[0] != RTEMS_SUCCESSFUL) + { + PRINTF1("in restart_science_task *** AVF0 ERR %d\n", status[0]) + } + + status[1] = rtems_task_restart( Task_id[TASKID_PRC0], lfrRequestedMode ); + if (status[1] != RTEMS_SUCCESSFUL) + { + PRINTF1("in restart_science_task *** PRC0 ERR %d\n", status[1]) + } + + status[2] = rtems_task_restart( Task_id[TASKID_AVF1], lfrRequestedMode ); + if (status[2] != RTEMS_SUCCESSFUL) + { + PRINTF1("in restart_science_task *** AVF1 ERR %d\n", status[2]) + } + + status[3] = rtems_task_restart( Task_id[TASKID_PRC1],lfrRequestedMode ); + if (status[3] != RTEMS_SUCCESSFUL) + { + PRINTF1("in restart_science_task *** PRC1 ERR %d\n", status[3]) + } + + status[4] = rtems_task_restart( Task_id[TASKID_AVF2], 1 ); + if (status[4] != RTEMS_SUCCESSFUL) + { + PRINTF1("in restart_science_task *** AVF2 ERR %d\n", status[4]) + } + + status[5] = rtems_task_restart( Task_id[TASKID_PRC2], 1 ); + if (status[5] != RTEMS_SUCCESSFUL) + { + PRINTF1("in restart_science_task *** PRC2 ERR %d\n", status[5]) + } + + if ( (status[0] != RTEMS_SUCCESSFUL) || (status[1] != RTEMS_SUCCESSFUL) || + (status[2] != RTEMS_SUCCESSFUL) || (status[3] != RTEMS_SUCCESSFUL) || + (status[4] != RTEMS_SUCCESSFUL) || (status[5] != RTEMS_SUCCESSFUL) ) + { + ret = RTEMS_UNSATISFIED; + } + + return ret; +} + +int suspend_science_tasks( void ) { /** This function suspends the science tasks. * @@ -948,6 +1070,99 @@ int suspend_science_tasks() return status; } +int suspend_asm_tasks( void ) +{ + /** This function suspends the science tasks. + * + * @return RTEMS directive status codes: + * - RTEMS_SUCCESSFUL - task restarted successfully + * - RTEMS_INVALID_ID - task id invalid + * - RTEMS_ALREADY_SUSPENDED - task already suspended + * + */ + + rtems_status_code status; + + PRINTF("in suspend_science_tasks\n") + + status = rtems_task_suspend( Task_id[TASKID_AVF0] ); // suspend AVF0 + if ((status != RTEMS_SUCCESSFUL) && (status != RTEMS_ALREADY_SUSPENDED)) + { + PRINTF1("in suspend_science_task *** AVF0 ERR %d\n", status) + } + else + { + status = RTEMS_SUCCESSFUL; + } + + if (status == RTEMS_SUCCESSFUL) // suspend PRC0 + { + status = rtems_task_suspend( Task_id[TASKID_PRC0] ); + if ((status != RTEMS_SUCCESSFUL) && (status != RTEMS_ALREADY_SUSPENDED)) + { + PRINTF1("in suspend_science_task *** PRC0 ERR %d\n", status) + } + else + { + status = RTEMS_SUCCESSFUL; + } + } + + if (status == RTEMS_SUCCESSFUL) // suspend AVF1 + { + status = rtems_task_suspend( Task_id[TASKID_AVF1] ); + if ((status != RTEMS_SUCCESSFUL) && (status != RTEMS_ALREADY_SUSPENDED)) + { + PRINTF1("in suspend_science_task *** AVF1 ERR %d\n", status) + } + else + { + status = RTEMS_SUCCESSFUL; + } + } + + if (status == RTEMS_SUCCESSFUL) // suspend PRC1 + { + status = rtems_task_suspend( Task_id[TASKID_PRC1] ); + if ((status != RTEMS_SUCCESSFUL) && (status != RTEMS_ALREADY_SUSPENDED)) + { + PRINTF1("in suspend_science_task *** PRC1 ERR %d\n", status) + } + else + { + status = RTEMS_SUCCESSFUL; + } + } + + if (status == RTEMS_SUCCESSFUL) // suspend AVF2 + { + status = rtems_task_suspend( Task_id[TASKID_AVF2] ); + if ((status != RTEMS_SUCCESSFUL) && (status != RTEMS_ALREADY_SUSPENDED)) + { + PRINTF1("in suspend_science_task *** AVF2 ERR %d\n", status) + } + else + { + status = RTEMS_SUCCESSFUL; + } + } + + if (status == RTEMS_SUCCESSFUL) // suspend PRC2 + { + status = rtems_task_suspend( Task_id[TASKID_PRC2] ); + if ((status != RTEMS_SUCCESSFUL) && (status != RTEMS_ALREADY_SUSPENDED)) + { + PRINTF1("in suspend_science_task *** PRC2 ERR %d\n", status) + } + else + { + status = RTEMS_SUCCESSFUL; + } + } + + return status; +} + void launch_waveform_picker( unsigned char mode, unsigned int transitionCoarseTime ) { WFP_reset_current_ring_nodes(); @@ -985,18 +1200,6 @@ void launch_spectral_matrix( void ) } -void launch_spectral_matrix_simu( void ) -{ - SM_reset_current_ring_nodes(); - reset_spectral_matrix_regs(); - reset_nb_sm(); - - // Spectral Matrices simulator - timer_start( (gptimer_regs_t*) REGS_ADDR_GPTIMER, TIMER_SM_SIMULATOR ); - LEON_Clear_interrupt( IRQ_SM_SIMULATOR ); - LEON_Unmask_interrupt( IRQ_SM_SIMULATOR ); -} - void set_sm_irq_onNewMatrix( unsigned char value ) { if (value == 1) diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -31,13 +31,17 @@ ring_node *current_ring_node_f3; ring_node *ring_node_to_send_cwf_f3; char wf_cont_f3_light[ (NB_SAMPLES_PER_SNAPSHOT) * NB_BYTES_CWF3_LIGHT_BLK ]; -bool extractSWF = false; -bool swf_f0_ready = false; -bool swf_f1_ready = false; -bool swf_f2_ready = false; +bool extractSWF1 = false; +bool extractSWF2 = false; +bool swf0_ready_flag_f1 = false; +bool swf0_ready_flag_f2 = false; +bool swf1_ready = false; +bool swf2_ready = false; -int wf_snap_extracted[ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) ]; -ring_node ring_node_wf_snap_extracted; +int swf1_extracted[ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) ]; +int swf2_extracted[ (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK) ]; +ring_node ring_node_swf1_extracted; +ring_node ring_node_swf2_extracted; //********************* // Interrupt SubRoutine @@ -88,10 +92,12 @@ ring_node * getRingNodeToSendSWF( unsign void reset_extractSWF( void ) { - extractSWF = false; - swf_f0_ready = false; - swf_f1_ready = false; - swf_f2_ready = false; + extractSWF1 = false; + extractSWF2 = false; + swf0_ready_flag_f1 = false; + swf0_ready_flag_f2 = false; + swf1_ready = false; + swf2_ready = false; } inline void waveforms_isr_f3( void ) @@ -125,80 +131,6 @@ inline void waveforms_isr_f3( void ) } } -inline void waveforms_isr_normal( void ) -{ - rtems_status_code status; - - if ( ( (waveform_picker_regs->status & 0x30) != 0x00 ) // [0011 0000] check the f2 full bits - && ( (waveform_picker_regs->status & 0x0c) != 0x00 ) // [0000 1100] check the f1 full bits - && ( (waveform_picker_regs->status & 0x03) != 0x00 )) // [0000 0011] check the f0 full bits - { - //*** - // F0 - ring_node_to_send_swf_f0 = current_ring_node_f0->previous; - current_ring_node_f0 = current_ring_node_f0->next; - if ( (waveform_picker_regs->status & 0x01) == 0x01) - { - - ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_0_coarse_time; - ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_0_fine_time; - waveform_picker_regs->addr_data_f0_0 = current_ring_node_f0->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00001101; // [0001 0001 0000 0001] - } - else if ( (waveform_picker_regs->status & 0x02) == 0x02) - { - ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_1_coarse_time; - ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_1_fine_time; - waveform_picker_regs->addr_data_f0_1 = current_ring_node_f0->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00001102; // [0001 0001 0000 0010] - } - - //*** - // F1 - ring_node_to_send_swf_f1 = current_ring_node_f1->previous; - current_ring_node_f1 = current_ring_node_f1->next; - if ( (waveform_picker_regs->status & 0x04) == 0x04) - { - ring_node_to_send_swf_f1->coarseTime = waveform_picker_regs->f1_0_coarse_time; - ring_node_to_send_swf_f1->fineTime = waveform_picker_regs->f1_0_fine_time; - waveform_picker_regs->addr_data_f1_0 = current_ring_node_f1->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00002204; // [0010 0010 0000 0100] f1 bits = 0 - } - else if ( (waveform_picker_regs->status & 0x08) == 0x08) - { - ring_node_to_send_swf_f1->coarseTime = waveform_picker_regs->f1_1_coarse_time; - ring_node_to_send_swf_f1->fineTime = waveform_picker_regs->f1_1_fine_time; - waveform_picker_regs->addr_data_f1_1 = current_ring_node_f1->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00002208; // [0010 0010 0000 1000] f1 bits = 0 - } - - //*** - // F2 - ring_node_to_send_swf_f2 = current_ring_node_f2->previous; - current_ring_node_f2 = current_ring_node_f2->next; - if ( (waveform_picker_regs->status & 0x10) == 0x10) - { - ring_node_to_send_swf_f2->coarseTime = waveform_picker_regs->f2_0_coarse_time; - ring_node_to_send_swf_f2->fineTime = waveform_picker_regs->f2_0_fine_time; - waveform_picker_regs->addr_data_f2_0 = current_ring_node_f2->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00004410; // [0100 0100 0001 0000] - } - else if ( (waveform_picker_regs->status & 0x20) == 0x20) - { - ring_node_to_send_swf_f2->coarseTime = waveform_picker_regs->f2_1_coarse_time; - ring_node_to_send_swf_f2->fineTime = waveform_picker_regs->f2_1_fine_time; - waveform_picker_regs->addr_data_f2_1 = current_ring_node_f2->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00004420; // [0100 0100 0010 0000] - } - // - status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ); - if ( status != RTEMS_SUCCESSFUL) - { - status = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ); - } - } -} - inline void waveforms_isr_burst( void ) { unsigned char status; @@ -238,11 +170,36 @@ inline void waveforms_isr_burst( void ) } } -inline void waveforms_isr_sbm1( void ) +inline void waveform_isr_normal_sbm1_sbm2( void ) { rtems_status_code status; //*** + // F0 + if ( (waveform_picker_regs->status & 0x03) != 0x00 ) // [0000 0011] check the f0 full bits + { + swf0_ready_flag_f1 = true; + swf0_ready_flag_f2 = true; + ring_node_to_send_swf_f0 = current_ring_node_f0->previous; + current_ring_node_f0 = current_ring_node_f0->next; + if ( (waveform_picker_regs->status & 0x01) == 0x01) + { + + ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_0_coarse_time; + ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_0_fine_time; + waveform_picker_regs->addr_data_f0_0 = current_ring_node_f0->buffer_address; + waveform_picker_regs->status = waveform_picker_regs->status & 0x00001101; // [0001 0001 0000 0001] + } + else if ( (waveform_picker_regs->status & 0x02) == 0x02) + { + ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_1_coarse_time; + ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_1_fine_time; + waveform_picker_regs->addr_data_f0_1 = current_ring_node_f0->buffer_address; + waveform_picker_regs->status = waveform_picker_regs->status & 0x00001102; // [0001 0001 0000 0010] + } + } + + //*** // F1 if ( (waveform_picker_regs->status & 0x0c) != 0x00 ) { // [0000 1100] check the f1 full bits // (1) change the receiving buffer for the waveform picker @@ -263,63 +220,11 @@ inline void waveforms_isr_sbm1( void ) waveform_picker_regs->status = waveform_picker_regs->status & 0x00002208; // [0010 0010 0000 1000] f1 bits = 0 } // (2) send an event for the the CWF1 task for transmission (and snapshot extraction if needed) - status = rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM1 ); - } - - //*** - // F0 - if ( (waveform_picker_regs->status & 0x03) != 0x00 ) { // [0000 0011] check the f0 full bits - swf_f0_ready = true; - // change f0 buffer - ring_node_to_send_swf_f0 = current_ring_node_f0->previous; - current_ring_node_f0 = current_ring_node_f0->next; - if ( (waveform_picker_regs->status & 0x01) == 0x01) - { - - ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_0_coarse_time; - ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_0_fine_time; - waveform_picker_regs->addr_data_f0_0 = current_ring_node_f0->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00001101; // [0001 0001 0000 0001] - } - else if ( (waveform_picker_regs->status & 0x02) == 0x02) - { - ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_1_coarse_time; - ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_1_fine_time; - waveform_picker_regs->addr_data_f0_1 = current_ring_node_f0->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00001102; // [0001 0001 0000 0010] - } + status = rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_NORM_S1_S2 ); } //*** // F2 - if ( (waveform_picker_regs->status & 0x30) != 0x00 ) { // [0011 0000] check the f2 full bits - swf_f2_ready = true; - // change f2 buffer - ring_node_to_send_swf_f2 = current_ring_node_f2->previous; - current_ring_node_f2 = current_ring_node_f2->next; - if ( (waveform_picker_regs->status & 0x10) == 0x10) - { - ring_node_to_send_swf_f2->coarseTime = waveform_picker_regs->f2_0_coarse_time; - ring_node_to_send_swf_f2->fineTime = waveform_picker_regs->f2_0_fine_time; - waveform_picker_regs->addr_data_f2_0 = current_ring_node_f2->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00004410; // [0100 0100 0001 0000] - } - else if ( (waveform_picker_regs->status & 0x20) == 0x20) - { - ring_node_to_send_swf_f2->coarseTime = waveform_picker_regs->f2_1_coarse_time; - ring_node_to_send_swf_f2->fineTime = waveform_picker_regs->f2_1_fine_time; - waveform_picker_regs->addr_data_f2_1 = current_ring_node_f2->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00004420; // [0100 0100 0010 0000] - } - } -} - -inline void waveforms_isr_sbm2( void ) -{ - rtems_status_code status; - - //*** - // F2 if ( (waveform_picker_regs->status & 0x30) != 0x00 ) { // [0011 0000] check the f2 full bit // (1) change the receiving buffer for the waveform picker ring_node_to_send_cwf_f2 = current_ring_node_f2->previous; @@ -340,53 +245,7 @@ inline void waveforms_isr_sbm2( void ) waveform_picker_regs->status = waveform_picker_regs->status & 0x00004420; // [0100 0100 0010 0000] } // (2) send an event for the waveforms transmission - status = rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ); - } - - //*** - // F0 - if ( (waveform_picker_regs->status & 0x03) != 0x00 ) { // [0000 0011] check the f0 full bit - swf_f0_ready = true; - // change f0 buffer - ring_node_to_send_swf_f0 = current_ring_node_f0->previous; - current_ring_node_f0 = current_ring_node_f0->next; - if ( (waveform_picker_regs->status & 0x01) == 0x01) - { - - ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_0_coarse_time; - ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_0_fine_time; - waveform_picker_regs->addr_data_f0_0 = current_ring_node_f0->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00001101; // [0001 0001 0000 0001] - } - else if ( (waveform_picker_regs->status & 0x02) == 0x02) - { - ring_node_to_send_swf_f0->coarseTime = waveform_picker_regs->f0_1_coarse_time; - ring_node_to_send_swf_f0->fineTime = waveform_picker_regs->f0_1_fine_time; - waveform_picker_regs->addr_data_f0_1 = current_ring_node_f0->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00001102; // [0001 0001 0000 0010] - } - } - - //*** - // F1 - if ( (waveform_picker_regs->status & 0x0c) != 0x00 ) { // [0000 1100] check the f1 full bit - swf_f1_ready = true; - ring_node_to_send_swf_f1 = current_ring_node_f1->previous; - current_ring_node_f1 = current_ring_node_f1->next; - if ( (waveform_picker_regs->status & 0x04) == 0x04) - { - ring_node_to_send_swf_f1->coarseTime = waveform_picker_regs->f1_0_coarse_time; - ring_node_to_send_swf_f1->fineTime = waveform_picker_regs->f1_0_fine_time; - waveform_picker_regs->addr_data_f1_0 = current_ring_node_f1->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00002204; // [0010 0010 0000 0100] f1 bits = 0 - } - else if ( (waveform_picker_regs->status & 0x08) == 0x08) - { - ring_node_to_send_swf_f1->coarseTime = waveform_picker_regs->f1_1_coarse_time; - ring_node_to_send_swf_f1->fineTime = waveform_picker_regs->f1_1_fine_time; - waveform_picker_regs->addr_data_f1_1 = current_ring_node_f1->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00002208; // [0010 0010 0000 1000] f1 bits = 0 - } + status = rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_NORM_S1_S2 ); } } @@ -420,38 +279,25 @@ rtems_isr waveforms_isr( rtems_vector_nu switch(lfrCurrentMode) { - //******** - // STANDBY - case(LFR_MODE_STANDBY): + //******** + // STANDBY + case LFR_MODE_STANDBY: break; - - //****** - // NORMAL - case(LFR_MODE_NORMAL): - waveforms_isr_normal(); + //************************** + // LFR NORMAL, SBM1 and SBM2 + case LFR_MODE_NORMAL: + case LFR_MODE_SBM1: + case LFR_MODE_SBM2: + waveform_isr_normal_sbm1_sbm2(); break; - - //****** - // BURST - case(LFR_MODE_BURST): + //****** + // BURST + case LFR_MODE_BURST: waveforms_isr_burst(); break; - - //***** - // SBM1 - case(LFR_MODE_SBM1): - waveforms_isr_sbm1(); - break; - - //***** - // SBM2 - case(LFR_MODE_SBM2): - waveforms_isr_sbm2(); - break; - - //******** - // DEFAULT - default: + //******** + // DEFAULT + default: break; } } @@ -476,9 +322,11 @@ rtems_task wfrm_task(rtems_task_argument rtems_id queue_id; rtems_status_code status; bool resynchronisationEngaged; - ring_node *ring_node_wf_snap_extracted_ptr; + ring_node *ring_node_swf1_extracted_ptr; + ring_node *ring_node_swf2_extracted_ptr; - ring_node_wf_snap_extracted_ptr = (ring_node *) &ring_node_wf_snap_extracted; + ring_node_swf1_extracted_ptr = (ring_node *) &ring_node_swf1_extracted; + ring_node_swf2_extracted_ptr = (ring_node *) &ring_node_swf2_extracted; resynchronisationEngaged = false; @@ -490,10 +338,9 @@ rtems_task wfrm_task(rtems_task_argument BOOT_PRINTF("in WFRM ***\n") - while(1){ + while(1){ // wait for an RTEMS_EVENT - rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1 - | RTEMS_EVENT_MODE_SBM2 | RTEMS_EVENT_MODE_SBM2_WFRM, + rtems_event_receive(RTEMS_EVENT_MODE_NORMAL, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); if(resynchronisationEngaged == false) { // engage resynchronisation @@ -503,40 +350,19 @@ rtems_task wfrm_task(rtems_task_argument else { // reset delta_snapshot to the nominal value PRINTF("no resynchronisation, reset delta_snapshot to the nominal value\n") - set_wfp_delta_snapshot(); + set_wfp_delta_snapshot(); resynchronisationEngaged = false; } // - if (event_out == RTEMS_EVENT_MODE_NORMAL) { - DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_NORMAL\n") - ring_node_to_send_swf_f0->sid = SID_NORM_SWF_F0; - ring_node_to_send_swf_f1->sid = SID_NORM_SWF_F1; - ring_node_to_send_swf_f2->sid = SID_NORM_SWF_F2; - status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f0, sizeof( ring_node* ) ); - status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f1, sizeof( ring_node* ) ); - status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f2, sizeof( ring_node* ) ); - } - if (event_out == RTEMS_EVENT_MODE_SBM1) - { - DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_SBM1\n") - ring_node_to_send_swf_f0->sid = SID_NORM_SWF_F0; - ring_node_wf_snap_extracted_ptr->sid = SID_NORM_SWF_F1; - ring_node_to_send_swf_f2->sid = SID_NORM_SWF_F2; - status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f0, sizeof( ring_node* ) ); - status = rtems_message_queue_send( queue_id, &ring_node_wf_snap_extracted_ptr, sizeof( ring_node* ) ); - status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f2, sizeof( ring_node* ) ); - } - if (event_out == RTEMS_EVENT_MODE_SBM2) - { DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_SBM2\n") - ring_node_to_send_swf_f0->sid = SID_NORM_SWF_F0; - ring_node_to_send_swf_f1->sid = SID_NORM_SWF_F1; - ring_node_wf_snap_extracted_ptr->sid = SID_NORM_SWF_F2; - status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f0, sizeof( ring_node* ) ); - status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f1, sizeof( ring_node* ) ); - status = rtems_message_queue_send( queue_id, &ring_node_wf_snap_extracted_ptr, sizeof( ring_node* ) ); + ring_node_to_send_swf_f0->sid = SID_NORM_SWF_F0; + ring_node_swf1_extracted_ptr->sid = SID_NORM_SWF_F1; + ring_node_swf2_extracted_ptr->sid = SID_NORM_SWF_F2; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f0, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_swf1_extracted_ptr, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_swf2_extracted_ptr, sizeof( ring_node* ) ); } } } @@ -577,10 +403,10 @@ rtems_task cwf3_task(rtems_task_argument BOOT_PRINTF("in CWF3 ***\n") - while(1){ + while(1){ // wait for an RTEMS_EVENT rtems_event_receive( RTEMS_EVENT_0, - RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); + RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); if ( (lfrCurrentMode == LFR_MODE_NORMAL) || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode==LFR_MODE_SBM2) ) { @@ -588,13 +414,13 @@ rtems_task cwf3_task(rtems_task_argument if ( (parameter_dump_packet.sy_lfr_n_cwf_long_f3 & 0x01) == 0x01) { PRINTF("send CWF_LONG_F3\n") - ring_node_to_send_cwf_f3->sid = SID_NORM_CWF_LONG_F3; + ring_node_to_send_cwf_f3->sid = SID_NORM_CWF_LONG_F3; status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf, sizeof( ring_node* ) ); } else { PRINTF("send CWF_F3 (light)\n") - send_waveform_CWF3_light( ring_node_to_send_cwf, &ring_node_cwf3_light, queue_id ); + send_waveform_CWF3_light( ring_node_to_send_cwf, &ring_node_cwf3_light, queue_id ); } } @@ -635,33 +461,37 @@ rtems_task cwf2_task(rtems_task_argument while(1){ // wait for an RTEMS_EVENT - rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2, - RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); + rtems_event_receive( RTEMS_EVENT_MODE_NORM_S1_S2 | RTEMS_EVENT_MODE_BURST, + RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); ring_node_to_send = getRingNodeToSendCWF( 2 ); if (event_out == RTEMS_EVENT_MODE_BURST) { status = rtems_message_queue_send( queue_id, &ring_node_to_send, sizeof( ring_node* ) ); } - if (event_out == RTEMS_EVENT_MODE_SBM2) + else if (event_out == RTEMS_EVENT_MODE_NORM_S1_S2) { - status = rtems_message_queue_send( queue_id, &ring_node_to_send, sizeof( ring_node* ) ); + if ( lfrCurrentMode == LFR_MODE_SBM2 ) + { + status = rtems_message_queue_send( queue_id, &ring_node_to_send, sizeof( ring_node* ) ); + } // launch snapshot extraction if needed - if (extractSWF == true) + if (extractSWF2 == true) { ring_node_to_send_swf_f2 = ring_node_to_send_cwf_f2; // extract the snapshot - build_snapshot_from_ring( ring_node_to_send_swf_f2, 2, acquisitionTimeF0_asLong ); + build_snapshot_from_ring( ring_node_to_send_swf_f2, 2, acquisitionTimeF0_asLong, + &ring_node_swf2_extracted, swf2_extracted ); // send the snapshot when built status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ); - extractSWF = false; + extractSWF2 = false; + swf2_ready = true; } - if (swf_f0_ready && swf_f1_ready) + if (swf0_ready_flag_f2 == true) { - extractSWF = true; - // record the acquition time of the fà snapshot to use to build the snapshot at f2 + extractSWF2 = true; + // record the acquition time of the f0 snapshot to use to build the snapshot at f2 acquisitionTimeF0_asLong = get_acquisition_time( (unsigned char *) &ring_node_to_send_swf_f0->coarseTime ); - swf_f0_ready = false; - swf_f1_ready = false; + swf0_ready_flag_f2 = false; } } } @@ -692,35 +522,38 @@ rtems_task cwf1_task(rtems_task_argument BOOT_PRINTF("in CWF1 ***\n") - while(1){ + while(1){ // wait for an RTEMS_EVENT - rtems_event_receive( RTEMS_EVENT_MODE_SBM1, - RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); + rtems_event_receive( RTEMS_EVENT_MODE_NORM_S1_S2, + RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); ring_node_to_send_cwf = getRingNodeToSendCWF( 1 ); ring_node_to_send_cwf_f1->sid = SID_SBM1_CWF_F1; - status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf, sizeof( ring_node* ) ); - if (status != 0) + if (lfrCurrentMode == LFR_MODE_SBM1) { - PRINTF("cwf sending failed\n") + status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf, sizeof( ring_node* ) ); + if (status != 0) + { + PRINTF("cwf sending failed\n") + } } // launch snapshot extraction if needed - if (extractSWF == true) + if (extractSWF1 == true) { ring_node_to_send_swf_f1 = ring_node_to_send_cwf; // launch the snapshot extraction - status = rtems_event_send( Task_id[TASKID_SWBD], RTEMS_EVENT_MODE_SBM1 ); - extractSWF = false; + status = rtems_event_send( Task_id[TASKID_SWBD], RTEMS_EVENT_MODE_NORM_S1_S2 ); + extractSWF1 = false; } - if (swf_f0_ready == true) + if (swf0_ready_flag_f1 == true) { - extractSWF = true; - swf_f0_ready = false; // this step shall be executed only one time + extractSWF1 = true; + swf0_ready_flag_f1 = false; // this step shall be executed only one time } - if ((swf_f1_ready == true) && (swf_f2_ready == true)) // swf_f1 is ready after the extraction + if ((swf1_ready == true) && (swf2_ready == true)) // swf_f1 is ready after the extraction { - status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM1 ); - swf_f1_ready = false; - swf_f2_ready = false; + status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ); + swf1_ready = false; + swf2_ready = false; } } } @@ -740,15 +573,16 @@ rtems_task swbd_task(rtems_task_argument BOOT_PRINTF("in SWBD ***\n") - while(1){ + while(1){ // wait for an RTEMS_EVENT - rtems_event_receive( RTEMS_EVENT_MODE_SBM1 | RTEMS_EVENT_MODE_SBM2, - RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); - if (event_out == RTEMS_EVENT_MODE_SBM1) + rtems_event_receive( RTEMS_EVENT_MODE_NORM_S1_S2, + RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); + if (event_out == RTEMS_EVENT_MODE_NORM_S1_S2) { acquisitionTimeF0_asLong = get_acquisition_time( (unsigned char *) &ring_node_to_send_swf_f0->coarseTime ); - build_snapshot_from_ring( ring_node_to_send_swf_f1, 1, acquisitionTimeF0_asLong ); - swf_f1_ready = true; // the snapshot has been extracted and is ready to be sent + build_snapshot_from_ring( ring_node_to_send_swf_f1, 1, acquisitionTimeF0_asLong, + &ring_node_swf1_extracted, swf1_extracted ); + swf1_ready = true; // the snapshot has been extracted and is ready to be sent } else { @@ -771,16 +605,17 @@ void WFP_init_rings( void ) // F3 RING init_ring( waveform_ring_f3, NB_RING_NODES_F3, wf_buffer_f3, WFRM_BUFFER ); - ring_node_wf_snap_extracted.buffer_address = (int) wf_snap_extracted; + ring_node_swf1_extracted.buffer_address = (int) swf1_extracted; + ring_node_swf2_extracted.buffer_address = (int) swf2_extracted; DEBUG_PRINTF1("waveform_ring_f0 @%x\n", (unsigned int) waveform_ring_f0) - DEBUG_PRINTF1("waveform_ring_f1 @%x\n", (unsigned int) waveform_ring_f1) - DEBUG_PRINTF1("waveform_ring_f2 @%x\n", (unsigned int) waveform_ring_f2) - DEBUG_PRINTF1("waveform_ring_f3 @%x\n", (unsigned int) waveform_ring_f3) - DEBUG_PRINTF1("wf_buffer_f0 @%x\n", (unsigned int) wf_buffer_f0) - DEBUG_PRINTF1("wf_buffer_f1 @%x\n", (unsigned int) wf_buffer_f1) - DEBUG_PRINTF1("wf_buffer_f2 @%x\n", (unsigned int) wf_buffer_f2) - DEBUG_PRINTF1("wf_buffer_f3 @%x\n", (unsigned int) wf_buffer_f3) + DEBUG_PRINTF1("waveform_ring_f1 @%x\n", (unsigned int) waveform_ring_f1) + DEBUG_PRINTF1("waveform_ring_f2 @%x\n", (unsigned int) waveform_ring_f2) + DEBUG_PRINTF1("waveform_ring_f3 @%x\n", (unsigned int) waveform_ring_f3) + DEBUG_PRINTF1("wf_buffer_f0 @%x\n", (unsigned int) wf_buffer_f0) + DEBUG_PRINTF1("wf_buffer_f1 @%x\n", (unsigned int) wf_buffer_f1) + DEBUG_PRINTF1("wf_buffer_f2 @%x\n", (unsigned int) wf_buffer_f2) + DEBUG_PRINTF1("wf_buffer_f3 @%x\n", (unsigned int) wf_buffer_f3) } @@ -909,7 +744,7 @@ void compute_acquisition_time( unsigned default: PRINTF1("in compute_acquisition_time *** ERR unexpected sid %d\n", sid) - deltaT = 0.; + deltaT = 0.; break; } @@ -924,7 +759,11 @@ void compute_acquisition_time( unsigned } -void build_snapshot_from_ring( ring_node *ring_node_to_send, unsigned char frequencyChannel, unsigned long long int acquisitionTimeF0_asLong ) +void build_snapshot_from_ring( ring_node *ring_node_to_send, + unsigned char frequencyChannel, + unsigned long long int acquisitionTimeF0_asLong, + ring_node *ring_node_swf_extracted, + int *swf_extracted) { unsigned int i; unsigned long long int centerTime_asLong; @@ -980,11 +819,11 @@ void build_snapshot_from_ring( ring_node for (i=0; icoarseTime ); + bufferAcquisitionTime_asLong = get_acquisition_time( (unsigned char *) &ring_node_to_send->coarseTime ); if (bufferAcquisitionTime_asLong <= acquisitionTime_asLong) { PRINTF1("buffer found with acquisition time = %llx\n", bufferAcquisitionTime_asLong) - break; + break; } ring_node_to_send = ring_node_to_send->previous; } @@ -994,18 +833,18 @@ void build_snapshot_from_ring( ring_node nbSamplesPart1_asLong = NB_SAMPLES_PER_SNAPSHOT - sampleOffset_asLong; PRINTF2("sampleOffset_asLong = %lld, nbSamplesPart1_asLong = %lld\n", sampleOffset_asLong, nbSamplesPart1_asLong) - // (6) compute the final acquisition time - acquisitionTime_asLong = bufferAcquisitionTime_asLong + + // (6) compute the final acquisition time + acquisitionTime_asLong = bufferAcquisitionTime_asLong + sampleOffset_asLong * nbTicksPerSample_asLong; // (7) copy the acquisition time at the beginning of the extrated snapshot ptr1 = (unsigned char*) &acquisitionTime_asLong; // fine time - ptr2 = (unsigned char*) &ring_node_wf_snap_extracted.fineTime; + ptr2 = (unsigned char*) &ring_node_swf_extracted->fineTime; ptr2[2] = ptr1[ 4 + 2 ]; ptr2[3] = ptr1[ 5 + 2 ]; // coarse time - ptr2 = (unsigned char*) &ring_node_wf_snap_extracted.coarseTime; + ptr2 = (unsigned char*) &ring_node_swf_extracted->coarseTime; ptr2[0] = ptr1[ 0 + 2 ]; ptr2[1] = ptr1[ 1 + 2 ]; ptr2[2] = ptr1[ 2 + 2 ]; @@ -1022,14 +861,14 @@ void build_snapshot_from_ring( ring_node // copy the part 1 of the snapshot in the extracted buffer for ( i = 0; i < (nbSamplesPart1_asLong * NB_WORDS_SWF_BLK); i++ ) { - wf_snap_extracted[i] = + swf_extracted[i] = ((int*) ring_node_to_send->buffer_address)[ i + (sampleOffset_asLong * NB_WORDS_SWF_BLK) ]; } // copy the part 2 of the snapshot in the extracted buffer ring_node_to_send = ring_node_to_send->next; for ( i = (nbSamplesPart1_asLong * NB_WORDS_SWF_BLK); i < (NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK); i++ ) { - wf_snap_extracted[i] = + swf_extracted[i] = ((int*) ring_node_to_send->buffer_address)[ (i-(nbSamplesPart1_asLong * NB_WORDS_SWF_BLK)) ]; } } @@ -1060,10 +899,10 @@ void snapshot_resynchronization( unsigne deltaNext = ((double) deltaNextTick) / 65536. * 1000.; PRINTF2("delta previous = %f ms, delta next = %f ms\n", deltaPrevious, deltaNext) - PRINTF2("delta previous = %llu, delta next = %llu\n", deltaPreviousTick, deltaNextTick) + PRINTF2("delta previous = %llu, delta next = %llu\n", deltaPreviousTick, deltaNextTick) - // which tick is the closest - if (deltaPreviousTick > deltaNextTick) + // which tick is the closest + if (deltaPreviousTick > deltaNextTick) { deltaTickInF2 = floor( (deltaNext * 256. / 1000.) ); // the division by 2 is important here waveform_picker_regs->delta_snapshot = waveform_picker_regs->delta_snapshot + deltaTickInF2; @@ -1159,12 +998,12 @@ void reset_waveform_picker_regs( void ) set_wfp_delta_f2(); // 0x2c DEBUG_PRINTF1("delta_snapshot %x\n", waveform_picker_regs->delta_snapshot) - DEBUG_PRINTF1("delta_f0 %x\n", waveform_picker_regs->delta_f0) - DEBUG_PRINTF1("delta_f0_2 %x\n", waveform_picker_regs->delta_f0_2) - DEBUG_PRINTF1("delta_f1 %x\n", waveform_picker_regs->delta_f1) - DEBUG_PRINTF1("delta_f2 %x\n", waveform_picker_regs->delta_f2) - // 2688 = 8 * 336 - waveform_picker_regs->nb_data_by_buffer = 0xa7f; // 0x30 *** 2688 - 1 => nb samples -1 + DEBUG_PRINTF1("delta_f0 %x\n", waveform_picker_regs->delta_f0) + DEBUG_PRINTF1("delta_f0_2 %x\n", waveform_picker_regs->delta_f0_2) + DEBUG_PRINTF1("delta_f1 %x\n", waveform_picker_regs->delta_f1) + DEBUG_PRINTF1("delta_f2 %x\n", waveform_picker_regs->delta_f2) + // 2688 = 8 * 336 + waveform_picker_regs->nb_data_by_buffer = 0xa7f; // 0x30 *** 2688 - 1 => nb samples -1 waveform_picker_regs->snapshot_param = 0xa80; // 0x34 *** 2688 => nb samples waveform_picker_regs->start_date = 0x7fffffff; // 0x38 // @@ -1190,7 +1029,7 @@ void set_wfp_data_shaping( void ) data_shaping = parameter_dump_packet.sy_lfr_common_parameters; waveform_picker_regs->data_shaping = - ( (data_shaping & 0x20) >> 5 ) // BW + ( (data_shaping & 0x20) >> 5 ) // BW + ( (data_shaping & 0x10) >> 3 ) // SP0 + ( (data_shaping & 0x08) >> 1 ) // SP1 + ( (data_shaping & 0x04) << 1 ) // R0 @@ -1211,21 +1050,15 @@ void set_wfp_burst_enable_register( unsi // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0 // the burst bits shall be set first, before the enable bits switch(mode) { - case(LFR_MODE_NORMAL): - waveform_picker_regs->run_burst_enable = 0x60; // [0110 0000] enable f2 AND f1 burst - waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0c; // [1111] enable f3 f2 f1 f0 - break; - case(LFR_MODE_BURST): - waveform_picker_regs->run_burst_enable = 0x40; // [0100 0000] f2 burst enabled - waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0c; // [1100] enable f3 AND f2 + case LFR_MODE_NORMAL: + case LFR_MODE_SBM1: + case LFR_MODE_SBM2: + waveform_picker_regs->run_burst_enable = 0x60; // [0110 0000] enable f2 and f1 burst + waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0 break; - case(LFR_MODE_SBM1): - waveform_picker_regs->run_burst_enable = 0x20; // [0010 0000] f1 burst enabled - waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0 - break; - case(LFR_MODE_SBM2): + case LFR_MODE_BURST: waveform_picker_regs->run_burst_enable = 0x40; // [0100 0000] f2 burst enabled - waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0 + waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0c; // [1100] enable f3 and f2 break; default: waveform_picker_regs->run_burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled