# HG changeset patch # User paul # Date 2014-06-16 13:54:41 # Node ID 035669d03c8105a325a9a20c4aaea0a3e5a10a82 # Parent 60ce8c978d3fe7a8f654dee6282e729738c62d89 updates for the compliance with the spectral matrix VHDL design 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 -# Generated by qmake (2.01a) (Qt 4.8.6) on: Mon Jun 16 09:16:01 2014 +# Generated by qmake (2.01a) (Qt 4.8.6) on: Mon Jun 16 15:44:22 2014 # Project: fsw-qt.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro 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/grlib_regs.h b/header/grlib_regs.h --- a/header/grlib_regs.h +++ b/header/grlib_regs.h @@ -90,20 +90,20 @@ typedef struct { volatile int f2_0_address; // 0x18 volatile int f2_1_address; // 0x1C // - volatile int f0_0_coarse_time; // 0x20 - volatile int f0_0_fine_time; // 0x24 - volatile int f0_1_coarse_time; // 0x28 - volatile int f0_1_fine_time; // 0x2C + volatile unsigned int f0_0_coarse_time; // 0x20 + volatile unsigned int f0_0_fine_time; // 0x24 + volatile unsigned int f0_1_coarse_time; // 0x28 + volatile unsigned int f0_1_fine_time; // 0x2C // - volatile int f1_0_coarse_time; // 0x30 - volatile int f1_0_fine_time; // 0x34 - volatile int f1_1_coarse_time; // 0x38 - volatile int f1_1_time_time; // 0x3C + volatile unsigned int f1_0_coarse_time; // 0x30 + volatile unsigned int f1_0_fine_time; // 0x34 + volatile unsigned int f1_1_coarse_time; // 0x38 + volatile unsigned int f1_1_time_time; // 0x3C // - volatile int f2_0_coarse_time; // 0x40 - volatile int f2_0_fine_time; // 0x44 - volatile int f2_1_coarse_time; // 0x48 - volatile int f2_1_time_time; // 0x4C + volatile unsigned int f2_0_coarse_time; // 0x40 + volatile unsigned int f2_0_fine_time; // 0x44 + volatile unsigned int f2_1_coarse_time; // 0x48 + volatile unsigned int f2_1_fine_time; // 0x4C } spectral_matrix_regs_t; #endif // GRLIB_REGS_H_INCLUDED diff --git a/header/processing/avf0_prc0.h b/header/processing/avf0_prc0.h --- a/header/processing/avf0_prc0.h +++ b/header/processing/avf0_prc0.h @@ -30,7 +30,7 @@ void reset_nb_sm_f0( unsigned char lfrMo //******* // EXTERN -extern struct ring_node_sm *ring_node_for_averaging_sm_f0; +extern ring_node_sm *ring_node_for_averaging_sm_f0; extern rtems_status_code get_message_queue_id_prc0( rtems_id *queue_id ); #endif // AVF0_PRC0_H_INCLUDED diff --git a/header/processing/fsw_processing.h b/header/processing/fsw_processing.h --- a/header/processing/fsw_processing.h +++ b/header/processing/fsw_processing.h @@ -100,7 +100,7 @@ void reset_spectral_matrix_regs( void ); void set_time(unsigned char *time, unsigned char *timeInBuffer ); unsigned long long int get_acquisition_time( unsigned char *timePtr ); void close_matrix_actions(unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id task_id, - ring_node_sm *node_for_averaging, ring_node_sm *ringNode); + ring_node_sm *node_for_averaging, ring_node_sm *ringNode, unsigned long long int time); unsigned char getSID( rtems_event_set event ); extern rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id ); @@ -108,9 +108,9 @@ extern rtems_status_code get_message_que //*************************************** // DEFINITIONS OF STATIC INLINE FUNCTIONS -static inline void SM_average( float *averaged_spec_mat_f0, float *averaged_spec_mat_f1, +static inline void SM_average( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, ring_node_sm *ring_node_tab[], - unsigned int nbAverageNormF0, unsigned int nbAverageSBM1F0 ); + unsigned int nbAverageNORM, unsigned int nbAverageSBM ); static inline void ASM_reorganize_and_divide(float *averaged_spec_mat, float *averaged_spec_mat_reorganized, float divider ); static inline void ASM_compress_reorganize_and_divide(float *averaged_spec_mat, float *compressed_spec_mat, @@ -118,9 +118,9 @@ static inline void ASM_compress_reorgani unsigned char nbBinsCompressedMatrix, unsigned char nbBinsToAverage , unsigned char ASMIndexStart); static inline void ASM_convert(volatile float *input_matrix, char *output_matrix); -void SM_average( float *averaged_spec_mat_f0, float *averaged_spec_mat_f1, +void SM_average( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, ring_node_sm *ring_node_tab[], - unsigned int nbAverageNormF0, unsigned int nbAverageSBM1F0 ) + unsigned int nbAverageNORM, unsigned int nbAverageSBM ) { float sum; unsigned int i; @@ -136,24 +136,24 @@ void SM_average( float *averaged_spec_ma + ( (int *) (ring_node_tab[6]->buffer_address) ) [ i ] + ( (int *) (ring_node_tab[7]->buffer_address) ) [ i ]; - if ( (nbAverageNormF0 == 0) && (nbAverageSBM1F0 == 0) ) + if ( (nbAverageNORM == 0) && (nbAverageSBM == 0) ) { - averaged_spec_mat_f0[ i ] = sum; - averaged_spec_mat_f1[ i ] = sum; + averaged_spec_mat_NORM[ i ] = sum; + averaged_spec_mat_SBM[ i ] = sum; } - else if ( (nbAverageNormF0 != 0) && (nbAverageSBM1F0 != 0) ) + else if ( (nbAverageNORM != 0) && (nbAverageSBM != 0) ) { - averaged_spec_mat_f0[ i ] = ( averaged_spec_mat_f0[ i ] + sum ); - averaged_spec_mat_f1[ i ] = ( averaged_spec_mat_f1[ i ] + sum ); + averaged_spec_mat_NORM[ i ] = ( averaged_spec_mat_NORM[ i ] + sum ); + averaged_spec_mat_SBM[ i ] = ( averaged_spec_mat_SBM[ i ] + sum ); } - else if ( (nbAverageNormF0 != 0) && (nbAverageSBM1F0 == 0) ) + else if ( (nbAverageNORM != 0) && (nbAverageSBM == 0) ) { - averaged_spec_mat_f0[ i ] = ( averaged_spec_mat_f0[ i ] + sum ); - averaged_spec_mat_f1[ i ] = sum; + averaged_spec_mat_NORM[ i ] = ( averaged_spec_mat_NORM[ i ] + sum ); + averaged_spec_mat_SBM[ i ] = sum; } else { - PRINTF2("ERR *** in SM_average *** unexpected parameters %d %d\n", nbAverageNormF0, nbAverageSBM1F0) + PRINTF2("ERR *** in SM_average *** unexpected parameters %d %d\n", nbAverageNORM, nbAverageSBM) } } } diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -259,16 +259,18 @@ rtems_task dumb_task( rtems_task_argumen unsigned int fine_time = 0; rtems_event_set event_out; - char *DumbMessages[10] = {"in DUMB *** default", // RTEMS_EVENT_0 + char *DumbMessages[12] = {"in DUMB *** default", // RTEMS_EVENT_0 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1 - "in DUMB *** f3 buffer changed", // RTEMS_EVENT_2 + "in DUMB *** f3 buffer changed", // RTEMS_EVENT_2 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4 "in DUMB *** waveforms_simulator_isr", // RTEMS_EVENT_5 "ERR HK", // RTEMS_EVENT_6 "ready for dump", // RTEMS_EVENT_7 - "in DUMB *** spectral_matrices_isr", // RTEMS_EVENT_8 - "tick" // RTEMS_EVENT_9 + "VHDL ERR *** spectral matrix", // RTEMS_EVENT_8 + "tick", // RTEMS_EVENT_9 + "VHDL ERR *** waveform picker", // RTEMS_EVENT_10 + "VHDL ERR *** unexpected ready matrix values" // RTEMS_EVENT_11 }; BOOT_PRINTF("in DUMB *** \n") @@ -288,7 +290,11 @@ rtems_task dumb_task( rtems_task_argumen printf("in DUMB *** coarse: %x, fine: %x, %s\n", coarse_time, fine_time, DumbMessages[i]); if (i==8) { - PRINTF1("status = %x\n", spectral_matrix_regs->status) + PRINTF1("spectral_matrix_regs->status = %x\n", spectral_matrix_regs->status) + } + if (i==10) + { + PRINTF1("waveform_picker_regs->status = %x\n", waveform_picker_regs->status) } } } diff --git a/src/processing/avf0_prc0.c b/src/processing/avf0_prc0.c --- a/src/processing/avf0_prc0.c +++ b/src/processing/avf0_prc0.c @@ -67,6 +67,17 @@ rtems_task avf0_task( rtems_task_argumen while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 + + //**************************************** + // initialize the mesage for the MATR task + msgForMATR.norm = current_ring_node_asm_norm_f0; + msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f0; + msgForMATR.event = 0x00; // this composite event will be sent to the MATR task + msgForMATR.coarseTime = ring_node_for_averaging_sm_f0->coarseTime; + msgForMATR.fineTime = ring_node_for_averaging_sm_f0->fineTime; + // + //**************************************** + ring_node_tab[NB_SM_BEFORE_AVF0-1] = ring_node_for_averaging_sm_f0; for ( i = 2; i < (NB_SM_BEFORE_AVF0+1); i++ ) { @@ -87,16 +98,6 @@ rtems_task avf0_task( rtems_task_argumen nb_sbm_bp1 = nb_sbm_bp1 + NB_SM_BEFORE_AVF0; nb_sbm_bp2 = nb_sbm_bp2 + NB_SM_BEFORE_AVF0; - //**************************************** - // initialize the mesage for the MATR task - msgForMATR.event = 0x00; // this composite event will be sent to the MATR task - msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f0; - msgForMATR.norm = current_ring_node_asm_norm_f0; -// msgForMATR.coarseTime = ( (unsigned int *) (ring_node_tab[0]->buffer_address) )[0]; -// msgForMATR.fineTime = ( (unsigned int *) (ring_node_tab[0]->buffer_address) )[1]; - msgForMATR.coarseTime = time_management_regs->coarse_time; - msgForMATR.fineTime = time_management_regs->fine_time; - if (nb_sbm_bp1 == nb_sm_before_f0.burst_sbm_bp1) { nb_sbm_bp1 = 0; @@ -349,7 +350,7 @@ void reset_nb_sm_f0( unsigned char lfrMo nb_sm_before_f0.norm_bp1 = parameter_dump_packet.sy_lfr_n_bp_p0 * 96; nb_sm_before_f0.norm_bp2 = parameter_dump_packet.sy_lfr_n_bp_p1 * 96; nb_sm_before_f0.norm_asm = (parameter_dump_packet.sy_lfr_n_asm_p[0] * 256 + parameter_dump_packet.sy_lfr_n_asm_p[1]) * 96; - nb_sm_before_f0.sbm1_bp1 = parameter_dump_packet.sy_lfr_s1_bp_p0 * 24; + nb_sm_before_f0.sbm1_bp1 = parameter_dump_packet.sy_lfr_s1_bp_p0 * 24; // 0.25 s per digit nb_sm_before_f0.sbm1_bp2 = parameter_dump_packet.sy_lfr_s1_bp_p1 * 96; nb_sm_before_f0.sbm2_bp1 = parameter_dump_packet.sy_lfr_s2_bp_p0 * 96; nb_sm_before_f0.sbm2_bp2 = parameter_dump_packet.sy_lfr_s2_bp_p1 * 96; diff --git a/src/processing/avf1_prc1.c b/src/processing/avf1_prc1.c --- a/src/processing/avf1_prc1.c +++ b/src/processing/avf1_prc1.c @@ -64,6 +64,17 @@ rtems_task avf1_task( rtems_task_argumen while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 + + //**************************************** + // initialize the mesage for the MATR task + msgForMATR.event = 0x00; // this composite event will be sent to the PRC1 task + msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f1; + msgForMATR.norm = current_ring_node_asm_norm_f1; + msgForMATR.coarseTime = ring_node_for_averaging_sm_f1->coarseTime; + msgForMATR.fineTime = ring_node_for_averaging_sm_f1->fineTime; + // + //**************************************** + ring_node_tab[NB_SM_BEFORE_AVF1-1] = ring_node_for_averaging_sm_f1; for ( i = 2; i < (NB_SM_BEFORE_AVF1+1); i++ ) { @@ -84,16 +95,6 @@ rtems_task avf1_task( rtems_task_argumen nb_sbm_bp1 = nb_sbm_bp1 + NB_SM_BEFORE_AVF1; nb_sbm_bp2 = nb_sbm_bp2 + NB_SM_BEFORE_AVF1; - //**************************************** - // initialize the mesage for the MATR task - msgForMATR.event = 0x00; // this composite event will be sent to the PRC1 task - msgForMATR.burst_sbm = current_ring_node_asm_burst_sbm_f1; - msgForMATR.norm = current_ring_node_asm_norm_f1; -// msgForMATR.coarseTime = ( (unsigned int *) (ring_node_tab[0]->buffer_address) )[0]; -// msgForMATR.fineTime = ( (unsigned int *) (ring_node_tab[0]->buffer_address) )[1]; - msgForMATR.coarseTime = time_management_regs->coarse_time; - msgForMATR.fineTime = time_management_regs->fine_time; - if (nb_sbm_bp1 == nb_sm_before_f1.burst_sbm_bp1) { nb_sbm_bp1 = 0; diff --git a/src/processing/avf2_prc2.c b/src/processing/avf2_prc2.c --- a/src/processing/avf2_prc2.c +++ b/src/processing/avf2_prc2.c @@ -57,6 +57,16 @@ rtems_task avf2_task( rtems_task_argumen while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 + //**************************************** + // initialize the mesage for the MATR task + msgForMATR.event = 0x00; // this composite event will be sent to the MATR task + msgForMATR.burst_sbm = NULL; + msgForMATR.norm = current_ring_node_asm_norm_f2; + msgForMATR.coarseTime = ring_node_for_averaging_sm_f2->coarseTime; + msgForMATR.fineTime = ring_node_for_averaging_sm_f2->fineTime; + // + //**************************************** + // compute the average and store it in the averaged_sm_f2 buffer SM_average_f2( current_ring_node_asm_norm_f2->matrix, ring_node_for_averaging_sm_f2, @@ -67,16 +77,6 @@ rtems_task avf2_task( rtems_task_argumen nb_norm_bp2 = nb_norm_bp2 + NB_SM_BEFORE_AVF2; nb_norm_asm = nb_norm_asm + NB_SM_BEFORE_AVF2; - //**************************************** - // initialize the mesage for the MATR task - msgForMATR.event = 0x00; // this composite event will be sent to the MATR task - msgForMATR.burst_sbm = NULL; - msgForMATR.norm = current_ring_node_asm_norm_f2; -// msgForMATR.coarseTime = ( (unsigned int *) (ring_node_tab[0]->buffer_address) )[0]; -// msgForMATR.fineTime = ( (unsigned int *) (ring_node_tab[0]->buffer_address) )[1]; - msgForMATR.coarseTime = time_management_regs->coarse_time; - msgForMATR.fineTime = time_management_regs->fine_time; - if (nb_norm_bp1 == nb_sm_before_f2.norm_bp1) { nb_norm_bp1 = 0; diff --git a/src/processing/fsw_processing.c b/src/processing/fsw_processing.c --- a/src/processing/fsw_processing.c +++ b/src/processing/fsw_processing.c @@ -35,44 +35,55 @@ void spectral_matrices_isr_f0( void ) unsigned char status; unsigned long long int time_0; unsigned long long int time_1; + unsigned long long int syncBit0; + unsigned long long int syncBit1; status = spectral_matrix_regs->status & 0x03; // [0011] get the status_ready_matrix_f0_x bits + time_0 = get_acquisition_time( (unsigned char *) &spectral_matrix_regs->f0_0_coarse_time ); + time_1 = get_acquisition_time( (unsigned char *) &spectral_matrix_regs->f0_1_coarse_time ); + syncBit0 = ( (unsigned long long int) (spectral_matrix_regs->f0_0_coarse_time & 0x80000000) ) << 16; + syncBit1 = ( (unsigned long long int) (spectral_matrix_regs->f0_1_coarse_time & 0x80000000) ) << 16; + switch(status) { case 0: break; case 3: - time_0 = get_acquisition_time( (unsigned char *) spectral_matrix_regs->f0_0_coarse_time ); - time_1 = get_acquisition_time( (unsigned char *) spectral_matrix_regs->f0_1_coarse_time ); if ( time_0 < time_1 ) { - close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], ring_node_for_averaging_sm_f0, current_ring_node_sm_f0->previous); + close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], + ring_node_for_averaging_sm_f0, current_ring_node_sm_f0, time_0 | syncBit0); current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_0_address = current_ring_node_sm_f0->buffer_address; - close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], ring_node_for_averaging_sm_f0, current_ring_node_sm_f0->previous); + close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], + ring_node_for_averaging_sm_f0, current_ring_node_sm_f0, time_1 | syncBit1); current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_1_address = current_ring_node_sm_f0->buffer_address; } else { - close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], ring_node_for_averaging_sm_f0, current_ring_node_sm_f0->previous); + close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], + ring_node_for_averaging_sm_f0, current_ring_node_sm_f0, time_1 | syncBit1); current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_1_address = current_ring_node_sm_f0->buffer_address; - close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], ring_node_for_averaging_sm_f0, current_ring_node_sm_f0->previous); + close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], + ring_node_for_averaging_sm_f0, current_ring_node_sm_f0, time_0 | syncBit0); current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_0_address = current_ring_node_sm_f0->buffer_address; } spectral_matrix_regs->status = 0x03; // [0011] break; case 1: - close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], ring_node_for_averaging_sm_f0, current_ring_node_sm_f0->previous); + close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], + ring_node_for_averaging_sm_f0, current_ring_node_sm_f0, time_0 | syncBit0); current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_0_address = current_ring_node_sm_f0->buffer_address; spectral_matrix_regs->status = 0x01; // [0001] break; case 2: - close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], ring_node_for_averaging_sm_f0, current_ring_node_sm_f0->previous); + close_matrix_actions( &nb_sm_f0, NB_SM_BEFORE_AVF0, Task_id[TASKID_AVF0], + ring_node_for_averaging_sm_f0, current_ring_node_sm_f0, time_1 | syncBit1); current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_1_address = current_ring_node_sm_f0->buffer_address; spectral_matrix_regs->status = 0x02; // [0010] @@ -83,8 +94,8 @@ void spectral_matrices_isr_f0( void ) void spectral_matrices_isr_f1( void ) { unsigned char status; - unsigned long long int time_0; - unsigned long long int time_1; + unsigned long long int time; + unsigned long long int syncBit; status = (spectral_matrix_regs->status & 0x0c) >> 2; // [1100] get the status_ready_matrix_f0_x bits @@ -93,36 +104,24 @@ void spectral_matrices_isr_f1( void ) case 0: break; case 3: - time_0 = get_acquisition_time( (unsigned char *) spectral_matrix_regs->f1_0_coarse_time ); - time_1 = get_acquisition_time( (unsigned char *) spectral_matrix_regs->f1_1_coarse_time ); - if ( time_0 < time_1 ) - { - close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], ring_node_for_averaging_sm_f1, current_ring_node_sm_f1->previous); - current_ring_node_sm_f1 = current_ring_node_sm_f1->next; - spectral_matrix_regs->f1_0_address = current_ring_node_sm_f1->buffer_address; - close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], ring_node_for_averaging_sm_f1, current_ring_node_sm_f1->previous); - current_ring_node_sm_f1 = current_ring_node_sm_f1->next; - spectral_matrix_regs->f1_1_address = current_ring_node_sm_f1->buffer_address; - } - else - { - close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], ring_node_for_averaging_sm_f1, current_ring_node_sm_f1->previous); - current_ring_node_sm_f1 = current_ring_node_sm_f1->next; - spectral_matrix_regs->f1_1_address = current_ring_node_sm_f1->buffer_address; - close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], ring_node_for_averaging_sm_f1, current_ring_node_sm_f1->previous); - current_ring_node_sm_f1 = current_ring_node_sm_f1->next; - spectral_matrix_regs->f1_0_address = current_ring_node_sm_f1->buffer_address; - } - spectral_matrix_regs->status = 0x0c; // [1100] + // UNEXPECTED VALUE + spectral_matrix_regs->status = 0xc0; // [1100] + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_11 ); break; case 1: - close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], ring_node_for_averaging_sm_f1, current_ring_node_sm_f1->previous); + time = get_acquisition_time( (unsigned char *) &spectral_matrix_regs->f1_0_coarse_time ); + syncBit = ( (unsigned long long int) (spectral_matrix_regs->f1_0_coarse_time & 0x80000000) ) << 16; + close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], + ring_node_for_averaging_sm_f1, current_ring_node_sm_f1, time | syncBit); current_ring_node_sm_f1 = current_ring_node_sm_f1->next; spectral_matrix_regs->f1_0_address = current_ring_node_sm_f1->buffer_address; spectral_matrix_regs->status = 0x04; // [0100] break; case 2: - close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], ring_node_for_averaging_sm_f1, current_ring_node_sm_f1->previous); + time = get_acquisition_time( (unsigned char *) &spectral_matrix_regs->f1_1_coarse_time ); + syncBit = ( (unsigned long long int) (spectral_matrix_regs->f1_1_coarse_time & 0x80000000) ) << 16; + close_matrix_actions( &nb_sm_f1, NB_SM_BEFORE_AVF1, Task_id[TASKID_AVF1], + ring_node_for_averaging_sm_f1, current_ring_node_sm_f1, time | syncBit); current_ring_node_sm_f1 = current_ring_node_sm_f1->next; spectral_matrix_regs->f1_1_address = current_ring_node_sm_f1->buffer_address; spectral_matrix_regs->status = 0x08; // [1000] @@ -136,7 +135,7 @@ void spectral_matrices_isr_f2( void ) status = (spectral_matrix_regs->status & 0x30) >> 4; // [0011 0000] get the status_ready_matrix_f0_x bits - ring_node_for_averaging_sm_f2 = current_ring_node_sm_f2->previous; + ring_node_for_averaging_sm_f2 = current_ring_node_sm_f2; current_ring_node_sm_f2 = current_ring_node_sm_f2->next; @@ -145,14 +144,13 @@ void spectral_matrices_isr_f2( void ) case 0: break; case 3: - spectral_matrix_regs->f2_0_address = current_ring_node_sm_f2->buffer_address; + // UNEXPECTED VALUE spectral_matrix_regs->status = 0x30; // [0011 0000] - if (rtems_event_send( Task_id[TASKID_AVF2], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) - { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); - } + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_11 ); break; case 1: + ring_node_for_averaging_sm_f2->coarseTime = spectral_matrix_regs->f2_0_coarse_time; + ring_node_for_averaging_sm_f2->fineTime = spectral_matrix_regs->f2_0_fine_time; spectral_matrix_regs->f2_0_address = current_ring_node_sm_f2->buffer_address; spectral_matrix_regs->status = 0x10; // [0001 0000] if (rtems_event_send( Task_id[TASKID_AVF2], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) @@ -161,6 +159,8 @@ void spectral_matrices_isr_f2( void ) } break; case 2: + ring_node_for_averaging_sm_f2->coarseTime = spectral_matrix_regs->f2_1_coarse_time; + ring_node_for_averaging_sm_f2->fineTime = spectral_matrix_regs->f2_1_fine_time; spectral_matrix_regs->f2_1_address = current_ring_node_sm_f2->buffer_address; spectral_matrix_regs->status = 0x20; // [0010 0000] if (rtems_event_send( Task_id[TASKID_AVF2], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) @@ -173,7 +173,10 @@ void spectral_matrices_isr_f2( void ) void spectral_matrix_isr_error_handler( void ) { - spectral_matrix_regs->status = 0x7c0; // [0111 1100 0000] + if (spectral_matrix_regs->status & 0x7c0) // [0111 1100 0000] + { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); + } } rtems_isr spectral_matrices_isr( rtems_vector_number vector ) @@ -596,13 +599,6 @@ void reset_spectral_matrix_regs( void ) void set_time( unsigned char *time, unsigned char * timeInBuffer ) { -// time[0] = timeInBuffer[2]; -// time[1] = timeInBuffer[3]; -// time[2] = timeInBuffer[0]; -// time[3] = timeInBuffer[1]; -// time[4] = timeInBuffer[6]; -// time[5] = timeInBuffer[7]; - time[0] = timeInBuffer[0]; time[1] = timeInBuffer[1]; time[2] = timeInBuffer[2]; @@ -619,18 +615,33 @@ unsigned long long int get_acquisition_t + ( (unsigned long long int) timePtr[1] << 32 ) + ( timePtr[2] << 24 ) + ( timePtr[3] << 16 ) - + ( timePtr[4] << 8 ) - + ( timePtr[5] ); + + ( timePtr[6] << 8 ) + + ( timePtr[7] ); return acquisitionTimeAslong; } -void close_matrix_actions( unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id task_id, - ring_node_sm *node_for_averaging, ring_node_sm *ringNode ) +void close_matrix_actions(unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id task_id, + ring_node_sm *node_for_averaging, ring_node_sm *ringNode, + unsigned long long int time ) { + unsigned char *timePtr; + unsigned char *coarseTimePtr; + unsigned char *fineTimePtr; + + timePtr = (unsigned char *) &time; + coarseTimePtr = (unsigned char *) &node_for_averaging->coarseTime; + fineTimePtr = (unsigned char *) &node_for_averaging->fineTime; + *nb_sm = *nb_sm + 1; if (*nb_sm == nb_sm_before_avf) { node_for_averaging = ringNode; + coarseTimePtr[0] = timePtr[2]; + coarseTimePtr[1] = timePtr[3]; + coarseTimePtr[2] = timePtr[4]; + coarseTimePtr[3] = timePtr[5]; + fineTimePtr[2] = timePtr[6]; + fineTimePtr[3] = timePtr[7]; if (rtems_event_send( task_id, RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -532,8 +532,8 @@ int enter_mode( unsigned char mode, unsi #endif status = restart_science_tasks( mode ); launch_waveform_picker( mode, transitionCoarseTime ); -// launch_spectral_matrix( ); - launch_spectral_matrix_simu( ); + launch_spectral_matrix( ); +// launch_spectral_matrix_simu( ); } else if ( mode == LFR_MODE_STANDBY ) {