# HG changeset patch # User paul # Date 2014-04-16 08:45:17 # Node ID 7b69e91ff96bb76584605b5596a87395eca01647 # Parent 7ccc2641c5074dd088c4ef98956f4fc8da96ab7f There is a message queue between AVFO and MATR several load TCs are implemented now 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.5) on: Thu Apr 3 13:43:01 2014 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Tue Apr 15 07:45:50 2014 # Project: fsw-qt.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro @@ -13,7 +13,7 @@ CXX = sparc-rtems-g++ DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=6 -DPRINT_MESSAGES_ON_CONSOLE -DPRINT_TASK_STATISTICS CFLAGS = -pipe -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) -INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../../LFR_basic-parameters +INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../src/basic_parameters LINK = sparc-rtems-g++ LFLAGS = LIBS = $(SUBLIBS) @@ -53,7 +53,7 @@ SOURCES = ../src/wf_handler.c \ ../src/tc_load_dump_parameters.c \ ../src/tm_lfr_tc_exe.c \ ../src/tc_acceptance.c \ - ../../LFR_basic-parameters/basic_parameters.c + ../src/basic_parameters/basic_parameters.c OBJECTS = obj/wf_handler.o \ obj/tc_handler.o \ obj/fsw_processing.o \ @@ -240,8 +240,8 @@ 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 +obj/basic_parameters.o: ../src/basic_parameters/basic_parameters.c ../src/basic_parameters/basic_parameters.h + $(CC) -c $(CFLAGS) $(INCPATH) -o obj/basic_parameters.o ../src/basic_parameters/basic_parameters.c ####### Install 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 @@ -50,7 +50,7 @@ TARGET = fsw INCLUDEPATH += \ ../src \ ../header \ - ../../LFR_basic-parameters + ../src/basic_parameters SOURCES += \ ../src/wf_handler.c \ @@ -63,7 +63,7 @@ SOURCES += \ ../src/tc_load_dump_parameters.c \ ../src/tm_lfr_tc_exe.c \ ../src/tc_acceptance.c \ - ../../LFR_basic-parameters/basic_parameters.c + ../src/basic_parameters/basic_parameters.c HEADERS += \ @@ -81,5 +81,5 @@ HEADERS += \ ../header/tm_lfr_tc_exe.h \ ../header/tc_acceptance.h \ ../header/fsw_params_nb_bytes.h \ - ../../LFR_basic-parameters/basic_parameters.h + ../src/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_init.h b/header/fsw_init.h --- a/header/fsw_init.h +++ b/header/fsw_init.h @@ -26,6 +26,7 @@ int start_all_tasks( void ); rtems_status_code create_message_queues( void ); rtems_status_code get_message_queue_id_send( rtems_id *queue_id ); rtems_status_code get_message_queue_id_recv( rtems_id *queue_id ); +rtems_status_code get_message_queue_id_matr( rtems_id *queue_id ); // int start_recv_send_tasks( void ); // diff --git a/header/fsw_misc.h b/header/fsw_misc.h --- a/header/fsw_misc.h +++ b/header/fsw_misc.h @@ -37,4 +37,6 @@ void getTime( unsigned char *time); unsigned long long int getTimeAsUnsignedLongLongInt( ); void send_dumb_hk( void ); +extern int sched_yield( void ); + #endif // FSW_MISC_H_INCLUDED diff --git a/header/fsw_params.h b/header/fsw_params.h --- a/header/fsw_params.h +++ b/header/fsw_params.h @@ -198,14 +198,17 @@ typedef struct { #define TASK_PRIORITY_STAT 200 #define TASK_PRIORITY_DUMB 200 -#define ACTION_MSG_QUEUE_COUNT 10 -#define ACTION_MSG_PKTS_COUNT 50 -//#define ACTION_MSG_PKTS_MAX_SIZE (PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES) -#define ACTION_MSG_PKTS_MAX_SIZE 810 // 806 + 4 => TM_LFR_SCIENCE_BURST_BP2_F1 +#define MSG_QUEUE_COUNT_RECV 10 +#define MSG_QUEUE_COUNT_SEND 50 +#define MSG_QUEUE_COUNT_MATR 10 +//#define MSG_QUEUE_SIZE_SEND (PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES) +#define MSG_QUEUE_SIZE_SEND 810 // 806 + 4 => TM_LFR_SCIENCE_BURST_BP2_F1 #define ACTION_MSG_SPW_IOCTL_SEND_SIZE 24 // hlen *hdr dlen *data sent options +#define MSG_QUEUE_SIZE_MATR 20 // two pointers and one rtems_event + 2 integers #define QUEUE_RECV 0 #define QUEUE_SEND 1 +#define QUEUE_MATR 2 //******* // MACROS diff --git a/header/fsw_params_processing.h b/header/fsw_params_processing.h --- a/header/fsw_params_processing.h +++ b/header/fsw_params_processing.h @@ -13,6 +13,7 @@ #define NB_RING_NODES_SM_F1 3 // AT LEAST 3 #define NB_RING_NODES_SM_F2 3 // AT LEAST 3 #define NB_RING_NODES_ASM_BURST_SBM_F0 10 // AT LEAST 3 +#define NB_RING_NODES_ASM_NORM_F0 10 // AT LEAST 3 // #define NB_BINS_PER_ASM_F0 88 #define NB_BINS_PER_PKT_ASM_F0 44 diff --git a/header/fsw_processing.h b/header/fsw_processing.h --- a/header/fsw_processing.h +++ b/header/fsw_processing.h @@ -25,7 +25,7 @@ typedef struct ring_node_asm { struct ring_node_asm *previous; struct ring_node_asm *next; - float asm_burst_sbm_f0[ TIME_OFFSET + TOTAL_SIZE_SM ]; + float matrix[ TOTAL_SIZE_SM ]; unsigned int status; } ring_node_asm; @@ -41,6 +41,15 @@ typedef struct bp_packet_with_spare unsigned char data[ 9 * 13 ]; // only for TM_LFR_SCIENCE_NORMAL_BP1_F0 and F1 } bp_packet_with_spare; +typedef struct asm_msg +{ + ring_node_asm *norm_f0; + ring_node_asm *burst_sbmf0; + rtems_event_set event; + unsigned int coarseTime; + unsigned int fineTime; +} asm_msg; + extern nb_sm_t nb_sm; extern nb_sm_before_bp_t nb_sm_before_bp; @@ -71,7 +80,7 @@ rtems_task matr_task( rtems_task_argumen //****************** // Spectral Matrices void SM_init_rings( void ); -void ASM_init_ring( void ); +void ASM_init_rings( void ); void SM_reset_current_ring_nodes( void ); void ASM_reset_current_ring_node( void ); void ASM_init_header( Header_TM_LFR_SCIENCE_ASM_t *header); @@ -106,4 +115,6 @@ void BP_send(char *data, void reset_spectral_matrix_regs( void ); void set_time(unsigned char *time, unsigned char *timeInBuffer ); +extern rtems_status_code get_message_queue_id_matr( rtems_id *queue_id ); + #endif // FSW_PROCESSING_H_INCLUDED diff --git a/header/tc_handler.h b/header/tc_handler.h --- a/header/tc_handler.h +++ b/header/tc_handler.h @@ -40,10 +40,10 @@ int enter_mode( unsigned char mode , uns int restart_science_tasks(unsigned char lfrRequestedMode ); int suspend_science_tasks(); void launch_waveform_picker(unsigned char mode , unsigned int transitionCoarseTime); -void launch_spectral_matrix( unsigned char mode ); +void launch_spectral_matrix( void ); +void launch_spectral_matrix_simu( void ); void set_irq_on_new_ready_matrix(unsigned char value ); void set_run_matrix_spectral( unsigned char value ); -void launch_spectral_matrix_simu( unsigned char mode ); // other functions void updateLFRCurrentMode(); diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -35,7 +35,7 @@ #define CONFIGURE_MAXIMUM_DRIVERS 16 #define CONFIGURE_MAXIMUM_PERIODS 5 #define CONFIGURE_MAXIMUM_TIMERS 5 // STAT (1s), send SWF (0.3s), send CWF3 (1s) -#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 2 +#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 3 #ifdef PRINT_STACK_REPORT #define CONFIGURE_STACK_CHECKER_ENABLED #endif @@ -98,7 +98,7 @@ rtems_task Init( rtems_task_argument ign init_waveform_rings(); // initialize the waveform rings SM_init_rings(); // initialize spectral matrices rings - ASM_init_ring(); // initialize the average spectral matrix ring (just for burst, sbm1 and sbm2 asm @ f0 storage) + ASM_init_rings(); // initialize the average spectral matrix ring (just for burst, sbm1 and sbm2 asm @ f0 storage) reset_wfp_burst_enable(); reset_wfp_status(); @@ -268,6 +268,7 @@ void create_names( void ) // create all misc_name[QUEUE_RECV] = rtems_build_name( 'Q', '_', 'R', 'V' ); misc_name[QUEUE_SEND] = rtems_build_name( 'Q', '_', 'S', 'D' ); + misc_name[QUEUE_MATR] = rtems_build_name( 'Q', '_', 'M', 'R' ); } int create_all_tasks( void ) // create all tasks which run in the software @@ -350,7 +351,7 @@ int create_all_tasks( void ) // create a if (status == RTEMS_SUCCESSFUL) // MATR { status = rtems_task_create( - Task_name[TASKID_MATR], TASK_PRIORITY_MATR, RTEMS_MINIMUM_STACK_SIZE, + Task_name[TASKID_MATR], TASK_PRIORITY_MATR, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR] ); @@ -589,32 +590,48 @@ rtems_status_code create_message_queues( { rtems_status_code status_recv; rtems_status_code status_send; + rtems_status_code status_matr; rtems_status_code ret; rtems_id queue_id; + //**************************************** // create the queue for handling valid TCs status_recv = rtems_message_queue_create( misc_name[QUEUE_RECV], - ACTION_MSG_QUEUE_COUNT, CCSDS_TC_PKT_MAX_SIZE, + MSG_QUEUE_COUNT_RECV, CCSDS_TC_PKT_MAX_SIZE, RTEMS_FIFO | RTEMS_LOCAL, &queue_id ); if ( status_recv != RTEMS_SUCCESSFUL ) { PRINTF1("in create_message_queues *** ERR creating QUEU queue, %d\n", status_recv) } + //************************************************ // create the queue for handling TM packet sending status_send = rtems_message_queue_create( misc_name[QUEUE_SEND], - ACTION_MSG_PKTS_COUNT, ACTION_MSG_PKTS_MAX_SIZE, + MSG_QUEUE_COUNT_SEND, MSG_QUEUE_SIZE_SEND, RTEMS_FIFO | RTEMS_LOCAL, &queue_id ); if ( status_send != RTEMS_SUCCESSFUL ) { PRINTF1("in create_message_queues *** ERR creating PKTS queue, %d\n", status_send) } + //************************************************************************ + // create the queue for handling averaged spectral matrices for processing + status_matr = rtems_message_queue_create( misc_name[QUEUE_MATR], + MSG_QUEUE_COUNT_MATR, MSG_QUEUE_SIZE_MATR, + RTEMS_FIFO | RTEMS_LOCAL, &queue_id ); + if ( status_send != RTEMS_SUCCESSFUL ) { + PRINTF1("in create_message_queues *** ERR creating MATR queue, %d\n", status_matr) + } + if ( status_recv != RTEMS_SUCCESSFUL ) { ret = status_recv; } + else if( status_send != RTEMS_SUCCESSFUL ) + { + ret = status_send; + } else { - ret = status_send; + ret = status_matr; } return ret; @@ -643,3 +660,15 @@ rtems_status_code get_message_queue_id_r return status; } + +rtems_status_code get_message_queue_id_matr( rtems_id *queue_id ) +{ + rtems_status_code status; + rtems_name queue_name; + + queue_name = rtems_build_name( 'Q', '_', 'M', 'R' ); + + status = rtems_message_queue_ident( queue_name, 0, queue_id ); + + return status; +} diff --git a/src/fsw_processing.c b/src/fsw_processing.c --- a/src/fsw_processing.c +++ b/src/fsw_processing.c @@ -22,25 +22,15 @@ ring_node_sm *current_ring_node_sm_f1; ring_node_sm *current_ring_node_sm_f2; ring_node_asm asm_ring_burst_sbm_f0[ NB_RING_NODES_ASM_BURST_SBM_F0 ]; +ring_node_asm asm_ring_norm_f0 [ NB_RING_NODES_ASM_BURST_SBM_F0 ]; ring_node_asm *current_ring_node_asm_burst_sbm_f0; -ring_node_asm *ring_node_for_processing_asm_burst_sbm_f0; +ring_node_asm *current_ring_node_asm_norm_f0; -//***** -// NORM -// F0 -float asm_norm_f0 [ TIME_OFFSET + TOTAL_SIZE_SM ]; -float asm_f0_reorganized [ TIME_OFFSET + TOTAL_SIZE_SM ]; +float asm_norm_f0 [ TOTAL_SIZE_SM ]; +float asm_f0_reorganized [ TOTAL_SIZE_SM ]; char asm_f0_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ]; -float compressed_sm_norm_f0[ TIME_OFFSET + TOTAL_SIZE_COMPRESSED_ASM_F0 ]; - -//***** -// SBM1 -float asm_sbm_f0 [ TIME_OFFSET + TOTAL_SIZE_SM ]; -float compressed_sm_sbm[ TIME_OFFSET + TOTAL_SIZE_COMPRESSED_ASM_SBM1 ]; - -unsigned char LFR_BP1_F0[ TIME_OFFSET_IN_BYTES + TOTAL_SIZE_NORM_BP1_F0 * 2 ]; -unsigned char LFR_BP1_F1[ TIME_OFFSET_IN_BYTES + TOTAL_SIZE_NORM_BP1_F1 ]; -unsigned char LFR_BP1_F2[ TIME_OFFSET_IN_BYTES + TOTAL_SIZE_NORM_BP1_F2 ]; +float compressed_sm_norm_f0[ TOTAL_SIZE_COMPRESSED_ASM_F0 ]; +float compressed_sm_sbm [ TOTAL_SIZE_COMPRESSED_ASM_SBM1 ]; //*********************************************************** // Interrupt Service Routine for spectral matrices processing @@ -87,44 +77,42 @@ void reset_nb_sm_f0( unsigned char lfrMo rtems_isr spectral_matrices_isr( rtems_vector_number vector ) { + ring_node_sm *previous_ring_node_sm_f0; + // rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); -// if ( (spectral_matrix_regs->status & 0x1) == 0x01) -// { -// 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; // 1110 -// nb_sm_f0 = nb_sm_f0 + 1; -// } -// else if ( (spectral_matrix_regs->status & 0x2) == 0x02) -// { -// current_ring_node_sm_f0 = current_ring_node_sm_f0->next; -// spectral_matrix_regs->matrixFO_Address1 = current_ring_node_sm_f0->buffer_address; -// spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffffd; // 1101 -// nb_sm_f0 = nb_sm_f0 + 1; -// } + previous_ring_node_sm_f0 = current_ring_node_sm_f0; + + if ( (spectral_matrix_regs->status & 0x2) == 0x02) // check ready matrix bit f0_1 + { + 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 & 0xfffffffd; // 1101 + nb_sm.f0 = nb_sm.f0 + 1; + } -// if ( (spectral_matrix_regs->status & 0x30) != 0x00) -// { -// rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); -// spectral_matrix_regs->status = spectral_matrix_regs->status & 0xffffffcf; // 1100 1111 -// } - -// spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffff3; // 0011 + //************************ + // reset status error bits + if ( (spectral_matrix_regs->status & 0x30) != 0x00) + { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); + spectral_matrix_regs->status = spectral_matrix_regs->status & 0xffffffcf; // 1100 1111 + } -// if (nb_sm_f0 == (NB_SM_BEFORE_AVF0-1) ) -// { -// 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_sm_f0 = 0; -// } -// else -// { -// nb_sm.nb_sm_f0 = nb_sm.nb_sm_f0 + 1; -// } + //************************************** + // reset ready matrix bits for f0_0, f1 and f2 + spectral_matrix_regs->status = spectral_matrix_regs->status & 0xfffffff2; // 0010 + + if (nb_sm.f0 == NB_SM_BEFORE_AVF0) + { + ring_node_for_averaging_sm_f0 = previous_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_sm.f0 = 0; + } + } rtems_isr spectral_matrices_isr_simu( rtems_vector_number vector ) @@ -163,15 +151,21 @@ rtems_task avf0_task( rtems_task_argumen int i; rtems_event_set event_out; - rtems_event_set event_for_matr; rtems_status_code status; + rtems_id queue_id_matr; + asm_msg msgForMATR; ring_node_sm *ring_node_tab[8]; - unsigned long long int localTime; reset_nb_sm_f0( lfrRequestedMode ); // reset the sm counters that drive the BP and ASM computations / transmissions BOOT_PRINTF1("in AVFO *** lfrRequestedMode = %d\n", lfrRequestedMode) + status = get_message_queue_id_matr( &queue_id_matr ); + if (status != RTEMS_SUCCESSFUL) + { + PRINTF1("in MATR *** ERR get_message_queue_id_matr %d\n", status) + } + while(1){ rtems_event_receive(RTEMS_EVENT_0, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT0 ring_node_tab[NB_SM_BEFORE_AVF0-1] = ring_node_for_averaging_sm_f0; @@ -181,14 +175,11 @@ rtems_task avf0_task( rtems_task_argumen ring_node_tab[NB_SM_BEFORE_AVF0-i] = ring_node_for_averaging_sm_f0; } - localTime = getTimeAsUnsignedLongLongInt( ); - // compute the average and store it in the averaged_sm_f1 buffer - SM_average( asm_norm_f0, current_ring_node_asm_burst_sbm_f0->asm_burst_sbm_f0, - ring_node_tab, - nb_sm.norm_bp1_f0, nb_sm.sbm_bp1_f0 ); - - localTime = getTimeAsUnsignedLongLongInt( ) - localTime; + SM_average( current_ring_node_asm_norm_f0->matrix, + current_ring_node_asm_burst_sbm_f0->matrix, + ring_node_tab, + nb_sm.norm_bp1_f0, nb_sm.sbm_bp1_f0 ); // update nb_average nb_sm.norm_bp1_f0 = nb_sm.norm_bp1_f0 + NB_SM_BEFORE_AVF0; @@ -197,21 +188,23 @@ rtems_task avf0_task( rtems_task_argumen nb_sm.sbm_bp1_f0 = nb_sm.sbm_bp1_f0 + NB_SM_BEFORE_AVF0; nb_sm.sbm_bp2_f0 = nb_sm.sbm_bp2_f0 + NB_SM_BEFORE_AVF0; - //*********************************************************** - // build a composite event that will be sent to the MATR task - event_for_matr = 0x00; + //**************************************** + // initialize the mesage for the MATR task + msgForMATR.event = 0x00; // this composite event will be sent to the MATR task + msgForMATR.burst_sbmf0 = current_ring_node_asm_burst_sbm_f0; + msgForMATR.norm_f0 = 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]; if (nb_sm.sbm_bp1_f0 == nb_sm_before_bp.burst_sbm_bp1_f0) { nb_sm.sbm_bp1_f0 = 0; - // the ring node is ready for BP calculations - ring_node_for_processing_asm_burst_sbm_f0 = current_ring_node_asm_burst_sbm_f0; // set another ring for the ASM storage current_ring_node_asm_burst_sbm_f0 = current_ring_node_asm_burst_sbm_f0->next; if ( (lfrCurrentMode == LFR_MODE_BURST) || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) { - event_for_matr = event_for_matr | RTEMS_EVENT_BURST_SBM_BP1_F0; + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_BURST_SBM_BP1_F0; } } @@ -221,16 +214,18 @@ rtems_task avf0_task( rtems_task_argumen if ( (lfrCurrentMode == LFR_MODE_BURST) || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) { - event_for_matr = event_for_matr | RTEMS_EVENT_BURST_SBM_BP2_F0; + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_BURST_SBM_BP2_F0; } } if (nb_sm.norm_bp1_f0 == nb_sm_before_bp.norm_bp1_f0) { nb_sm.norm_bp1_f0 = 0; + // set another ring for the ASM storage + current_ring_node_asm_norm_f0 = current_ring_node_asm_norm_f0->next; if (lfrCurrentMode == LFR_MODE_NORMAL) { - event_for_matr = event_for_matr | RTEMS_EVENT_NORM_BP1_F0; + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_NORM_BP1_F0; } } @@ -240,7 +235,7 @@ rtems_task avf0_task( rtems_task_argumen if ( (lfrCurrentMode == LFR_MODE_NORMAL) || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) { - event_for_matr = event_for_matr | RTEMS_EVENT_NORM_BP2_F0; + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_NORM_BP2_F0; } } @@ -251,30 +246,39 @@ rtems_task avf0_task( rtems_task_argumen || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) { // PRINTF1("%lld\n", localTime) - event_for_matr = event_for_matr | RTEMS_EVENT_NORM_ASM_F0; + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_NORM_ASM_F0; } } - //********************************* - // send the composite event to MATR - status = rtems_event_send( Task_id[TASKID_MATR], event_for_matr ); + //************************* + // send the message to MATR + if (msgForMATR.event != 0x00) + { + status = rtems_message_queue_send( queue_id_matr, (char *) & msgForMATR, MSG_QUEUE_SIZE_MATR); + } + if (status != RTEMS_SUCCESSFUL) { - printf("in AVF0 *** Error sending RTEMS_EVENT_0, code %d\n", status); + printf("in AVF0 *** Error sending message to MATR, code %d\n", status); } } } rtems_task matr_task( rtems_task_argument lfrRequestedMode ) { + char incomingData[MSG_QUEUE_SIZE_SEND]; // incoming data buffer + size_t size; // size of the incoming TC packet + asm_msg *incomingMsg; + // spw_ioctl_pkt_send spw_ioctl_send_ASM; - rtems_event_set event_out; rtems_status_code status; rtems_id queue_id; + rtems_id queue_id_matr; Header_TM_LFR_SCIENCE_ASM_t headerASM; bp_packet_with_spare current_node_norm_bp1_f0; bp_packet current_node_norm_bp2_f0; bp_packet current_node_sbm_bp1_f0; bp_packet current_node_sbm_bp2_f0; + unsigned long long int localTime; ASM_init_header( &headerASM ); @@ -328,41 +332,48 @@ rtems_task matr_task( rtems_task_argumen { PRINTF1("in MATR *** ERR get_message_queue_id_send %d\n", status) } + status = get_message_queue_id_matr( &queue_id_matr); + if (status != RTEMS_SUCCESSFUL) + { + PRINTF1("in MATR *** ERR get_message_queue_id_matr %d\n", status) + } BOOT_PRINTF1("in MATR *** lfrRequestedMode = %d\n", lfrRequestedMode) while(1){ - rtems_event_receive( RTEMS_EVENT_NORM_BP1_F0 | RTEMS_EVENT_NORM_BP2_F0 | RTEMS_EVENT_NORM_ASM_F0 - | RTEMS_EVENT_BURST_SBM_BP1_F0 | RTEMS_EVENT_BURST_SBM_BP2_F0, - RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); + status = rtems_message_queue_receive( queue_id_matr, incomingData, &size, //************************************ + RTEMS_WAIT, RTEMS_NO_TIMEOUT ); // wait for a message coming from AVF0 + + incomingMsg = (asm_msg*) incomingData; + localTime = getTimeAsUnsignedLongLongInt( ); //**************** //**************** // BURST SBM1 SBM2 //**************** //**************** - if ( event_out & RTEMS_EVENT_BURST_SBM_BP1_F0 ) + if (incomingMsg->event & RTEMS_EVENT_BURST_SBM_BP1_F0 ) { // 1) compress the matrix for Basic Parameters calculation - ASM_compress_reorganize_and_divide( current_ring_node_asm_burst_sbm_f0->asm_burst_sbm_f0, compressed_sm_sbm, + ASM_compress_reorganize_and_divide( incomingMsg->burst_sbmf0->matrix, compressed_sm_sbm, nb_sm_before_bp.burst_sbm_bp1_f0, NB_BINS_COMPRESSED_SM_SBM_F0, NB_BINS_TO_AVERAGE_ASM_SBM_F0, ASM_F0_INDICE_START); // 2) compute the BP1 set // 3) send the BP1 set - set_time( current_node_sbm_bp1_f0.header.time, (unsigned char *) &compressed_sm_sbm ); - set_time( current_node_sbm_bp1_f0.header.acquisitionTime, (unsigned char *) &compressed_sm_sbm ); + set_time( current_node_sbm_bp1_f0.header.time, (unsigned char *) &incomingMsg->coarseTime ); + set_time( current_node_sbm_bp1_f0.header.acquisitionTime, (unsigned char *) &incomingMsg->fineTime ); BP_send( (char *) ¤t_node_sbm_bp1_f0.header, queue_id, PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP1_F0 + PACKET_LENGTH_DELTA); // 4) compute the BP2 set if needed - if ( event_out & RTEMS_EVENT_BURST_SBM_BP2_F0 ) + if ( incomingMsg->event & RTEMS_EVENT_BURST_SBM_BP2_F0 ) { // 1) compute the BP2 set // 2) send the BP2 set - set_time( current_node_sbm_bp2_f0.header.time, (unsigned char *) &compressed_sm_sbm ); - set_time( current_node_sbm_bp2_f0.header.acquisitionTime, (unsigned char *) &compressed_sm_sbm ); + set_time( current_node_sbm_bp2_f0.header.time, (unsigned char *) &incomingMsg->coarseTime ); + set_time( current_node_sbm_bp2_f0.header.acquisitionTime, (unsigned char *) &incomingMsg->fineTime ); BP_send( (char *) ¤t_node_sbm_bp2_f0.header, queue_id, PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP2_F0 + PACKET_LENGTH_DELTA); } @@ -373,42 +384,42 @@ rtems_task matr_task( rtems_task_argumen // NORM //***** //***** - if (event_out & RTEMS_EVENT_NORM_BP1_F0) + if (incomingMsg->event & RTEMS_EVENT_NORM_BP1_F0) { // 1) compress the matrix for Basic Parameters calculation - ASM_compress_reorganize_and_divide( asm_norm_f0, compressed_sm_norm_f0, + ASM_compress_reorganize_and_divide( incomingMsg->norm_f0->matrix, compressed_sm_norm_f0, nb_sm_before_bp.norm_bp1_f0, NB_BINS_COMPRESSED_SM_F0, NB_BINS_TO_AVERAGE_ASM_F0, ASM_F0_INDICE_START ); // 2) compute the BP1 set // 3) send the BP1 set - set_time( current_node_norm_bp1_f0.header.time, (unsigned char *) &compressed_sm_norm_f0 ); - set_time( current_node_norm_bp1_f0.header.acquisitionTime, (unsigned char *) &compressed_sm_norm_f0 ); + set_time( current_node_norm_bp1_f0.header.time, (unsigned char *) &incomingMsg->coarseTime ); + set_time( current_node_norm_bp1_f0.header.acquisitionTime, (unsigned char *) &incomingMsg->fineTime ); BP_send( (char *) ¤t_node_norm_bp1_f0.header, queue_id, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP1_F0 + PACKET_LENGTH_DELTA); - if (event_out & RTEMS_EVENT_NORM_BP2_F0) + if (incomingMsg->event & RTEMS_EVENT_NORM_BP2_F0) { // 1) compute the BP2 set // 2) send the BP2 set - set_time( current_node_norm_bp2_f0.header.time, (unsigned char *) &compressed_sm_norm_f0 ); - set_time( current_node_norm_bp2_f0.header.acquisitionTime, (unsigned char *) &compressed_sm_norm_f0 ); + set_time( current_node_norm_bp2_f0.header.time, (unsigned char *) &incomingMsg->coarseTime ); + set_time( current_node_norm_bp2_f0.header.acquisitionTime, (unsigned char *) &incomingMsg->fineTime ); BP_send( (char *) ¤t_node_norm_bp2_f0.header, queue_id, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP2_F0 + PACKET_LENGTH_DELTA); } } - if (event_out & RTEMS_EVENT_NORM_ASM_F0) + if (incomingMsg->event & RTEMS_EVENT_NORM_ASM_F0) { // 1) reorganize the ASM and divide - ASM_reorganize_and_divide( asm_norm_f0, asm_f0_reorganized, NB_SM_BEFORE_NORM_BP1_F0 ); + ASM_reorganize_and_divide( incomingMsg->norm_f0->matrix, asm_f0_reorganized, NB_SM_BEFORE_NORM_BP1_F0 ); // 2) convert the float array in a char array ASM_convert( asm_f0_reorganized, asm_f0_char); // 3) send the spectral matrix packets + set_time( headerASM.time , (unsigned char *) &incomingMsg->coarseTime ); + set_time( headerASM.acquisitionTime, (unsigned char *) &incomingMsg->coarseTime ); ASM_send( &headerASM, asm_f0_char, SID_NORM_ASM_F0, &spw_ioctl_send_ASM, queue_id); -// localTime = getTimeAsUnsignedLongLongInt( ) - localTime; -// PRINTF1("in MATR *** %lld\n", localTime) } } @@ -486,10 +497,12 @@ void SM_init_rings( void ) DEBUG_PRINTF1("spectral_matrix_regs->matrixF0_Address0 @%x\n", spectral_matrix_regs->matrixF0_Address0) } -void ASM_init_ring( void ) +void ASM_init_rings( void ) { unsigned char i; + //************* + // BURST_SBM_F0 asm_ring_burst_sbm_f0[0].next = (ring_node_asm*) &asm_ring_burst_sbm_f0[1]; asm_ring_burst_sbm_f0[0].previous = (ring_node_asm*) &asm_ring_burst_sbm_f0[NB_RING_NODES_ASM_BURST_SBM_F0-1]; @@ -503,6 +516,22 @@ void ASM_init_ring( void ) asm_ring_burst_sbm_f0[i].next = (ring_node_asm*) &asm_ring_burst_sbm_f0[i+1]; asm_ring_burst_sbm_f0[i].previous = (ring_node_asm*) &asm_ring_burst_sbm_f0[i-1]; } + + //************* + // NORM_F0 + asm_ring_norm_f0[0].next = (ring_node_asm*) &asm_ring_norm_f0[1]; + asm_ring_norm_f0[0].previous = (ring_node_asm*) &asm_ring_norm_f0[NB_RING_NODES_ASM_BURST_SBM_F0-1]; + + asm_ring_norm_f0[NB_RING_NODES_ASM_NORM_F0-1].next + = (ring_node_asm*) &asm_ring_norm_f0[0]; + asm_ring_norm_f0[NB_RING_NODES_ASM_NORM_F0-1].previous + = (ring_node_asm*) &asm_ring_norm_f0[NB_RING_NODES_ASM_NORM_F0-2]; + + for(i=1; icoarse_time >> 24); - ptr[1] = (unsigned char) (time_management_regs->coarse_time >> 16); - ptr[2] = (unsigned char) (time_management_regs->coarse_time >> 8 ); - ptr[3] = (unsigned char) (time_management_regs->coarse_time ); - ptr[4] = (unsigned char) (time_management_regs->fine_time >> 24); - ptr[5] = (unsigned char) (time_management_regs->fine_time >> 16); - ptr[6] = (unsigned char) (time_management_regs->fine_time >> 8 ); - ptr[7] = (unsigned char) (time_management_regs->fine_time ); - ptr = (unsigned char *) averaged_spec_mat_f1; - ptr[0] = (unsigned char) (time_management_regs->coarse_time >> 24); - ptr[1] = (unsigned char) (time_management_regs->coarse_time >> 16); - ptr[2] = (unsigned char) (time_management_regs->coarse_time >> 8 ); - ptr[3] = (unsigned char) (time_management_regs->coarse_time ); - ptr[4] = (unsigned char) (time_management_regs->fine_time >> 24); - ptr[5] = (unsigned char) (time_management_regs->fine_time >> 16); - ptr[6] = (unsigned char) (time_management_regs->fine_time >> 8 ); - ptr[7] = (unsigned char) (time_management_regs->fine_time ); - } } void ASM_reorganize_and_divide( float *averaged_spec_mat, float *averaged_spec_mat_reorganized, float divider ) { int frequencyBin; int asmComponent; - - // copy the time information - averaged_spec_mat_reorganized[ 0 ] = averaged_spec_mat[ 0 ]; - averaged_spec_mat_reorganized[ 1 ] = averaged_spec_mat[ 1 ]; + unsigned int offsetAveragedSpecMatReorganized; + unsigned int offsetAveragedSpecMat; for (asmComponent = 0; asmComponent < NB_VALUES_PER_SM; asmComponent++) { for( frequencyBin = 0; frequencyBin < NB_BINS_PER_SM; frequencyBin++ ) { - averaged_spec_mat_reorganized[ TIME_OFFSET + frequencyBin * NB_VALUES_PER_SM + asmComponent ] = - averaged_spec_mat[ TIME_OFFSET + asmComponent * NB_BINS_PER_SM + frequencyBin ] / divider; + offsetAveragedSpecMatReorganized = + frequencyBin * NB_VALUES_PER_SM + + asmComponent; + offsetAveragedSpecMat = + asmComponent * NB_BINS_PER_SM + + frequencyBin; + averaged_spec_mat_reorganized[offsetAveragedSpecMatReorganized ] = + averaged_spec_mat[ offsetAveragedSpecMat ] / divider; } } } @@ -642,20 +653,16 @@ void ASM_compress_reorganize_and_divide( int offsetCompressed; int k; - // copy the time information - compressed_spec_mat[ 0 ] = averaged_spec_mat[ 0 ]; - compressed_spec_mat[ 1 ] = averaged_spec_mat[ 1 ]; - // build data for (asmComponent = 0; asmComponent < NB_VALUES_PER_SM; asmComponent++) { for( frequencyBin = 0; frequencyBin < nbBinsCompressedMatrix; frequencyBin++ ) { - offsetCompressed = TIME_OFFSET - + frequencyBin * NB_VALUES_PER_SM + offsetCompressed = // NO TIME OFFSET + frequencyBin * NB_VALUES_PER_SM + asmComponent; - offsetASM = TIME_OFFSET - + asmComponent * NB_BINS_PER_SM + offsetASM = // NO TIME OFFSET + asmComponent * NB_BINS_PER_SM + ASMIndexStart + frequencyBin * nbBinsToAverage; compressed_spec_mat[ offsetCompressed ] = 0; @@ -671,28 +678,25 @@ void ASM_compress_reorganize_and_divide( void ASM_convert( volatile float *input_matrix, char *output_matrix) { - unsigned int i; unsigned int frequencyBin; unsigned int asmComponent; char * pt_char_input; char * pt_char_output; + unsigned int offsetInput; + unsigned int offsetOutput; pt_char_input = (char*) &input_matrix; pt_char_output = (char*) &output_matrix; - // copy the time information - for (i=0; idlen = TOTAL_SIZE_ASM_F0_IN_BYTES / 2; spw_ioctl_send->data = &spectral_matrix[ ( (ASM_F0_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F0) ) * NB_VALUES_PER_SM ) * 2 - + TIME_OFFSET_IN_BYTES ]; length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F0; header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F0) >> 8 ); // BLK_NR MSB diff --git a/src/fsw_spacewire.c b/src/fsw_spacewire.c --- a/src/fsw_spacewire.c +++ b/src/fsw_spacewire.c @@ -202,8 +202,8 @@ rtems_task send_task( rtems_task_argumen * */ - rtems_status_code status; // RTEMS status code - char incomingData[ACTION_MSG_PKTS_MAX_SIZE]; // incoming data buffer + rtems_status_code status; // RTEMS status code + char incomingData[MSG_QUEUE_SIZE_SEND]; // incoming data buffer spw_ioctl_pkt_send *spw_ioctl_send; size_t size; // size of the incoming TC packet u_int32_t count; diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -532,7 +532,8 @@ int enter_mode( unsigned char mode, unsi #endif status = restart_science_tasks( mode ); launch_waveform_picker( mode, transitionCoarseTime ); - launch_spectral_matrix_simu( mode ); +// launch_spectral_matrix( ); +// launch_spectral_matrix_simu( ); } else if ( mode == LFR_MODE_STANDBY ) { @@ -541,6 +542,7 @@ int enter_mode( unsigned char mode, unsi #endif #ifdef PRINT_STACK_REPORT + PRINTF("stack report selected\n") rtems_stack_checker_report_usage(); #endif PRINTF1("maxCount = %d\n", maxCount) @@ -702,7 +704,7 @@ void launch_waveform_picker( unsigned ch } } -void launch_spectral_matrix( unsigned char mode ) +void launch_spectral_matrix( void ) { SM_reset_current_ring_nodes(); ASM_reset_current_ring_node(); @@ -710,8 +712,8 @@ void launch_spectral_matrix( unsigned ch struct grgpio_regs_str *grgpio_regs = (struct grgpio_regs_str *) REGS_ADDR_GRGPIO; grgpio_regs->io_port_direction_register = - grgpio_regs->io_port_direction_register | 0x01; // [0001 1000], 0 = output disabled, 1 = output enabled - grgpio_regs->io_port_output_register = grgpio_regs->io_port_output_register | 0x00; // set the bit 0 to 1 + grgpio_regs->io_port_direction_register | 0x01; // [0000 0001], 0 = output disabled, 1 = output enabled + grgpio_regs->io_port_output_register = grgpio_regs->io_port_output_register & 0xfffffffe; // set the bit 0 to 0 set_irq_on_new_ready_matrix( 1 ); LEON_Clear_interrupt( IRQ_SPECTRAL_MATRIX ); LEON_Unmask_interrupt( IRQ_SPECTRAL_MATRIX ); @@ -719,6 +721,19 @@ void launch_spectral_matrix( unsigned ch } +void launch_spectral_matrix_simu( void ) +{ + SM_reset_current_ring_nodes(); + ASM_reset_current_ring_node(); + reset_spectral_matrix_regs(); + + // 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 ); + set_local_nb_interrupt_f0_MAX(); +} + void set_irq_on_new_ready_matrix( unsigned char value ) { if (value == 1) @@ -743,19 +758,6 @@ void set_run_matrix_spectral( unsigned c } } -void launch_spectral_matrix_simu( unsigned char mode ) -{ - SM_reset_current_ring_nodes(); - ASM_reset_current_ring_node(); - reset_spectral_matrix_regs(); - - // 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 ); - set_local_nb_interrupt_f0_MAX(); -} - //**************** // CLOSING ACTIONS void update_last_TC_exe( ccsdsTelecommandPacket_t *TC, unsigned char * time ) diff --git a/src/tc_load_dump_parameters.c b/src/tc_load_dump_parameters.c --- a/src/tc_load_dump_parameters.c +++ b/src/tc_load_dump_parameters.c @@ -43,6 +43,7 @@ int action_load_normal_par(ccsdsTelecomm rtems_status_code status; unsigned char sy_lfr_n_bp_p0; unsigned char sy_lfr_n_bp_p1; + unsigned int sy_lfr_n_asm_p; float aux; flag = LFR_SUCCESSFUL; @@ -75,17 +76,6 @@ int action_load_normal_par(ccsdsTelecomm } } - //*************** - // sy_lfr_n_asm_p - if (flag == LFR_SUCCESSFUL) - { - result = set_sy_lfr_n_asm_p( TC, queue_id ); - if (result != LFR_SUCCESSFUL) - { - flag = LFR_DEFAULT; - } - } - //**************************************************************** // check the consistency between sy_lfr_n_bp_p0 and sy_lfr_n_bp_p1 if (flag == LFR_SUCCESSFUL) @@ -122,6 +112,33 @@ int action_load_normal_par(ccsdsTelecomm } } + //**************************************************************** + // check the consistency between sy_lfr_n_asm_p and sy_lfr_n_bp_p0 + if (flag == LFR_SUCCESSFUL) + { + sy_lfr_n_bp_p0 = TC->dataAndCRC[ DATAFIELD_POS_SY_LFR_N_BP_P0 ]; + sy_lfr_n_asm_p = + TC->dataAndCRC[ DATAFIELD_POS_SY_LFR_N_ASM_P ] * 256 + + TC->dataAndCRC[ DATAFIELD_POS_SY_LFR_N_ASM_P + 1 ]; + aux = ( (float ) sy_lfr_n_asm_p / sy_lfr_n_bp_p0 ) - floor(sy_lfr_n_asm_p / sy_lfr_n_bp_p0); + if (aux != 0) + { + status = send_tm_lfr_tc_exe_inconsistent( TC, queue_id, DATAFIELD_POS_SY_LFR_N_ASM_P+10, sy_lfr_n_asm_p ); + flag = LFR_DEFAULT; + } + } + + //*************** + // sy_lfr_n_asm_p + if (flag == LFR_SUCCESSFUL) + { + result = set_sy_lfr_n_asm_p( TC, queue_id ); + if (result != LFR_SUCCESSFUL) + { + flag = LFR_DEFAULT; + } + } + //********************* // sy_lfr_n_cwf_long_f3 if (flag == LFR_SUCCESSFUL) diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -65,7 +65,6 @@ rtems_isr waveforms_isr( rtems_vector_nu */ rtems_status_code status; - static unsigned char nb_swf = 0; if ( (lfrCurrentMode == LFR_MODE_NORMAL) || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) @@ -115,23 +114,12 @@ 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) { - 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; + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } - else - { - reset_wfp_burst_enable(); - nb_swf = 0; - } - + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] } - break; //******