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: Tue Apr 15 07:45:50 2014 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Thu Apr 17 09:53:23 2014 # Project: fsw-qt.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro @@ -10,7 +10,7 @@ CC = sparc-rtems-gcc 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 +DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=6 -DPRINT_MESSAGES_ON_CONSOLE -DPRINT_TASK_STATISTICS -DBOOT_MESSAGES CFLAGS = -pipe -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../src/basic_parameters diff --git a/FSW-qt/fsw-qt.pro b/FSW-qt/fsw-qt.pro --- a/FSW-qt/fsw-qt.pro +++ b/FSW-qt/fsw-qt.pro @@ -1,7 +1,7 @@ TEMPLATE = app # CONFIG += console v8 sim # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** vhdl_dev *** debug_tch -CONFIG += console verbose cpu_usage_report +CONFIG += console verbose cpu_usage_report boot_messages CONFIG -= qt include(./sparc.pri) 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,10 +1,10 @@ - + ProjectExplorer.Project.ActiveTarget - 1 + 0 ProjectExplorer.Project.EditorSettings @@ -51,147 +51,9 @@ ProjectExplorer.Project.Target.0 - Desktop - Desktop - {e04e3924-0bd8-4708-be18-f1474e45608e} - 0 - 0 - 0 - - - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - false - - false - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - false - - - - 2 - Build - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - -w - -r - - true - clean - - - 1 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - 1 - - - 0 - Deploy - - ProjectExplorer.BuildSteps.Deploy - - 1 - Deploy locally - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - fsw-qt - - Qt4ProjectManager.Qt4RunConfiguration:/opt/DEV_PLE/FSW-qt/fsw-qt.pro - - fsw-qt.pro - false - true - - 3768 - false - true - false - false - true - - 1 - - - - ProjectExplorer.Project.Target.1 - - Desktop-Qt 4.8.2 in PATH (System) - Desktop-Qt 4.8.2 in PATH (System) - {5289e843-9ef2-45ce-88c6-ad27d8e08def} + Desktop-Qt 4.8.3 in PATH (System) + Desktop-Qt 4.8.3 in PATH (System) + {be73cf6a-f9d8-4d5a-8adf-adc2d83e2e44} 0 0 0 @@ -326,11 +188,11 @@ ProjectExplorer.Project.TargetCount - 2 + 1 ProjectExplorer.Project.Updater.EnvironmentId - {2e58a81f-9962-4bba-ae6b-760177f0656c} + {cdbf9cdc-1e84-406e-889b-c4feef49e75c} ProjectExplorer.Project.Updater.FileVersion diff --git a/header/fsw_init.h b/header/fsw_init.h --- a/header/fsw_init.h +++ b/header/fsw_init.h @@ -26,7 +26,8 @@ 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 ); +rtems_status_code get_message_queue_id_prc0( rtems_id *queue_id ); +rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id ); // int start_recv_send_tasks( void ); // diff --git a/header/fsw_params.h b/header/fsw_params.h --- a/header/fsw_params.h +++ b/header/fsw_params.h @@ -19,12 +19,27 @@ typedef struct ring_node } ring_node; typedef struct { + // F0 unsigned int f0; unsigned int norm_bp1_f0; unsigned int norm_bp2_f0; unsigned int norm_asm_f0; unsigned int sbm_bp1_f0; unsigned int sbm_bp2_f0; + // F1 + unsigned int f1; + unsigned int norm_bp1_f1; + unsigned int norm_bp2_f1; + unsigned int norm_asm_f1; + unsigned int sbm_bp1_f1; + unsigned int sbm_bp2_f1; + // F2 + unsigned int f2; + unsigned int norm_bp1_f2; + unsigned int norm_bp2_f2; + unsigned int norm_asm_f2; + unsigned int sbm_bp1_f2; + unsigned int sbm_bp2_f2; } nb_sm_t; typedef struct { @@ -39,7 +54,31 @@ typedef struct { unsigned int sbm1_bp2_f0; unsigned int sbm2_bp1_f0; unsigned int sbm2_bp2_f0; -} nb_sm_before_bp_t; +} nb_sm_before_bp_asm_f0; + +typedef struct { + unsigned int norm_bp1_f1; + unsigned int norm_bp2_f1; + unsigned int norm_asm_f1; + unsigned int burst_sbm_bp1_f1; + unsigned int burst_sbm_bp2_f1; + unsigned int burst_bp1_f1; + unsigned int burst_bp2_f1; + unsigned int sbm2_bp1_f1; + unsigned int sbm2_bp2_f1; +} nb_sm_before_bp_asm_f1; + +typedef struct { + unsigned int norm_bp1_f2; + unsigned int norm_bp2_f2; + unsigned int norm_asm_f2; + unsigned int burst_sbm_bp1_f2; + unsigned int burst_sbm_bp2_f2; + unsigned int burst_bp1_f2; + unsigned int burst_bp2_f2; + unsigned int sbm2_bp1_f2; + unsigned int sbm2_bp2_f2; +} nb_sm_before_bp_asm_f2; //************************ // flight software version @@ -87,8 +126,18 @@ typedef struct { #define RTEMS_EVENT_NORM_BP1_F0 RTEMS_EVENT_6 #define RTEMS_EVENT_NORM_BP2_F0 RTEMS_EVENT_7 #define RTEMS_EVENT_NORM_ASM_F0 RTEMS_EVENT_8 -#define RTEMS_EVENT_BURST_SBM_BP1_F0 RTEMS_EVENT_9 -#define RTEMS_EVENT_BURST_SBM_BP2_F0 RTEMS_EVENT_10 +#define RTEMS_EVENT_NORM_BP1_F1 RTEMS_EVENT_9 +#define RTEMS_EVENT_NORM_BP2_F1 RTEMS_EVENT_10 +#define RTEMS_EVENT_NORM_ASM_F1 RTEMS_EVENT_11 +#define RTEMS_EVENT_NORM_BP1_F2 RTEMS_EVENT_12 +#define RTEMS_EVENT_NORM_BP2_F2 RTEMS_EVENT_13 +#define RTEMS_EVENT_NORM_ASM_F2 RTEMS_EVENT_14 +#define RTEMS_EVENT_BURST_SBM_BP1_F0 RTEMS_EVENT_15 +#define RTEMS_EVENT_BURST_SBM_BP2_F0 RTEMS_EVENT_16 +#define RTEMS_EVENT_BURST_SBM_BP1_F1 RTEMS_EVENT_17 +#define RTEMS_EVENT_BURST_SBM_BP2_F1 RTEMS_EVENT_18 +#define RTEMS_EVENT_BURST_SBM_BP1_F2 RTEMS_EVENT_19 +#define RTEMS_EVENT_BURST_SBM_BP2_F2 RTEMS_EVENT_20 //**************************** // LFR DEFAULT MODE PARAMETERS @@ -173,7 +222,7 @@ typedef struct { #define TASKID_WFRM 8 #define TASKID_DUMB 9 #define TASKID_HOUS 10 -#define TASKID_MATR 11 +#define TASKID_PRC0 11 #define TASKID_CWF3 12 #define TASKID_CWF2 13 #define TASKID_CWF1 14 @@ -194,21 +243,24 @@ typedef struct { #define TASK_PRIORITY_ACTN 50 #define TASK_PRIORITY_AVF0 60 #define TASK_PRIORITY_BPF0 60 -#define TASK_PRIORITY_MATR 100 +#define TASK_PRIORITY_PRC0 100 #define TASK_PRIORITY_STAT 200 #define TASK_PRIORITY_DUMB 200 #define MSG_QUEUE_COUNT_RECV 10 -#define MSG_QUEUE_COUNT_SEND 50 -#define MSG_QUEUE_COUNT_MATR 10 +#define MSG_QUEUE_COUNT_SEND 50 +#define MSG_QUEUE_COUNT_PRC0 10 +#define MSG_QUEUE_COUNT_PRC1 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 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 MSG_QUEUE_SIZE_PRC0 20 // two pointers and one rtems_event + 2 integers +#define MSG_QUEUE_SIZE_PRC1 20 // two pointers and one rtems_event + 2 integers #define QUEUE_RECV 0 #define QUEUE_SEND 1 -#define QUEUE_MATR 2 +#define QUEUE_PRC0 2 +#define QUEUE_PRC1 3 //******* // 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 @@ -63,5 +63,6 @@ #define NB_SM_BEFORE_SBM2_BP2_F0 480 // 480 matrices at f0 = 5.00 second // GENERAL #define NB_SM_BEFORE_AVF0 8 +#define NB_SM_BEFORE_AVF1 8 #endif // FSW_PARAMS_PROCESSING_H diff --git a/header/fsw_processing.h b/header/fsw_processing.h --- a/header/fsw_processing.h +++ b/header/fsw_processing.h @@ -43,15 +43,17 @@ typedef struct bp_packet_with_spare typedef struct asm_msg { - ring_node_asm *norm_f0; - ring_node_asm *burst_sbmf0; + ring_node_asm *norm; + ring_node_asm *burst_sbm; 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; +extern nb_sm_before_bp_asm_f0 nb_sm_before_f0; +extern nb_sm_before_bp_asm_f1 nb_sm_before_f1; +extern nb_sm_before_bp_asm_f2 nb_sm_before_f2; extern volatile int sm_f0[ ]; extern volatile int sm_f1[ ]; @@ -75,7 +77,7 @@ rtems_isr spectral_matrices_isr_simu( rt // RTEMS TASKS rtems_task smiq_task( rtems_task_argument argument ); // added to test the spectral matrix simulator rtems_task avf0_task( rtems_task_argument lfrRequestedMode ); -rtems_task matr_task( rtems_task_argument lfrRequestedMode ); +rtems_task prc0_task( rtems_task_argument lfrRequestedMode ); //****************** // Spectral Matrices @@ -115,6 +117,7 @@ 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 ); +extern rtems_status_code get_message_queue_id_prc0( rtems_id *queue_id ); +extern rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id ); #endif // FSW_PROCESSING_H_INCLUDED diff --git a/header/tc_load_dump_parameters.h b/header/tc_load_dump_parameters.h --- a/header/tc_load_dump_parameters.h +++ b/header/tc_load_dump_parameters.h @@ -10,7 +10,9 @@ #include "fsw_misc.h" extern nb_sm_t nb_sm; -extern nb_sm_before_bp_t nb_sm_before_bp; +extern nb_sm_before_bp_asm_f0 nb_sm_before_f0; +extern nb_sm_before_bp_asm_f1 nb_sm_before_f1; +extern nb_sm_before_bp_asm_f2 nb_sm_before_f2; int action_load_common_par( ccsdsTelecommandPacket_t *TC ); int action_load_normal_par(ccsdsTelecommandPacket_t *TC, rtems_id queue_id , unsigned char *time); diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -49,7 +49,9 @@ char wf_cont_f3_light[ (NB_SAMPL // SPECTRAL MATRICES GLOBAL VARIABLES nb_sm_t nb_sm; -nb_sm_before_bp_t nb_sm_before_bp; +nb_sm_before_bp_asm_f0 nb_sm_before_f0; +nb_sm_before_bp_asm_f1 nb_sm_before_f1; +nb_sm_before_bp_asm_f2 nb_sm_before_f2; // alignment constraints for the spectral matrices buffers => the first data after the time (8 bytes) shall be aligned on 0x00 volatile int sm_f0[ NB_RING_NODES_SM_F0 * TOTAL_SIZE_SM ] __attribute__((aligned(0x100))); 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 3 +#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 4 #ifdef PRINT_STACK_REPORT #define CONFIGURE_STACK_CHECKER_ENABLED #endif @@ -86,8 +86,8 @@ rtems_task Init( rtems_task_argument ign PRINTF("*************************\n") PRINTF("** LFR Flight Software **\n") PRINTF1("** %d.", SW_VERSION_N1) - PRINTF1("%d.", SW_VERSION_N2) - PRINTF1("%d.", SW_VERSION_N3) + PRINTF1("%d." , SW_VERSION_N2) + PRINTF1("%d." , SW_VERSION_N3) PRINTF1("%d **\n", SW_VERSION_N4) PRINTF("*************************\n") PRINTF("\n\n") @@ -256,7 +256,7 @@ void create_names( void ) // create all Task_name[TASKID_WFRM] = rtems_build_name( 'W', 'F', 'R', 'M' ); Task_name[TASKID_DUMB] = rtems_build_name( 'D', 'U', 'M', 'B' ); Task_name[TASKID_HOUS] = rtems_build_name( 'H', 'O', 'U', 'S' ); - Task_name[TASKID_MATR] = rtems_build_name( 'M', 'A', 'T', 'R' ); + Task_name[TASKID_PRC0] = rtems_build_name( 'P', 'R', 'C', '0' ); Task_name[TASKID_CWF3] = rtems_build_name( 'C', 'W', 'F', '3' ); Task_name[TASKID_CWF2] = rtems_build_name( 'C', 'W', 'F', '2' ); Task_name[TASKID_CWF1] = rtems_build_name( 'C', 'W', 'F', '1' ); @@ -268,7 +268,8 @@ 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' ); + misc_name[QUEUE_PRC0] = rtems_build_name( 'Q', '_', 'P', '0' ); + misc_name[QUEUE_PRC1] = rtems_build_name( 'Q', '_', 'P', '1' ); } int create_all_tasks( void ) // create all tasks which run in the software @@ -351,9 +352,9 @@ 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 * 2, + Task_name[TASKID_PRC0], TASK_PRIORITY_PRC0, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES, - RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_MATR] + RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_PRC0] ); } @@ -507,11 +508,11 @@ int start_all_tasks( void ) // start all } } - if (status == RTEMS_SUCCESSFUL) // MATR + if (status == RTEMS_SUCCESSFUL) // PRC0 { - status = rtems_task_start( Task_id[TASKID_MATR], matr_task, 1 ); + status = rtems_task_start( Task_id[TASKID_PRC0], prc0_task, 1 ); if (status!=RTEMS_SUCCESSFUL) { - BOOT_PRINTF("in INIT *** Error starting TASK_MATR\n") + BOOT_PRINTF("in INIT *** Error starting TASK_PRC0\n") } } @@ -612,15 +613,24 @@ rtems_status_code create_message_queues( 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, + //***************************************************************************** + // create the queue for handling averaged spectral matrices for processing @ f0 + status_matr = rtems_message_queue_create( misc_name[QUEUE_PRC0], + MSG_QUEUE_COUNT_PRC0, MSG_QUEUE_SIZE_PRC0, RTEMS_FIFO | RTEMS_LOCAL, &queue_id ); if ( status_send != RTEMS_SUCCESSFUL ) { - PRINTF1("in create_message_queues *** ERR creating MATR queue, %d\n", status_matr) + PRINTF1("in create_message_queues *** ERR creating PR_0 queue, %d\n", status_matr) } + //***************************************************************************** + // create the queue for handling averaged spectral matrices for processing @ f1 +// status_matr = rtems_message_queue_create( misc_name[QUEUE_PRC1], +// MSG_QUEUE_COUNT_PRC1, MSG_QUEUE_SIZE_PRC1, +// RTEMS_FIFO | RTEMS_LOCAL, &queue_id ); +// if ( status_send != RTEMS_SUCCESSFUL ) { +// PRINTF1("in create_message_queues *** ERR creating PR_1 queue, %d\n", status_matr) +// } + if ( status_recv != RTEMS_SUCCESSFUL ) { ret = status_recv; @@ -661,14 +671,26 @@ 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 get_message_queue_id_prc0( rtems_id *queue_id ) { rtems_status_code status; rtems_name queue_name; - queue_name = rtems_build_name( 'Q', '_', 'M', 'R' ); + queue_name = rtems_build_name( 'Q', '_', 'P', '0' ); status = rtems_message_queue_ident( queue_name, 0, queue_id ); return status; } + +rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id ) +{ + rtems_status_code status; + rtems_name queue_name; + + queue_name = rtems_build_name( 'Q', '_', 'P', '1' ); + + 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 @@ -17,14 +17,17 @@ ring_node_sm sm_ring_f0[ NB_RING_NODES_S ring_node_sm sm_ring_f1[ NB_RING_NODES_SM_F1 ]; ring_node_sm sm_ring_f2[ NB_RING_NODES_SM_F2 ]; ring_node_sm *current_ring_node_sm_f0; -ring_node_sm *ring_node_for_averaging_sm_f0; ring_node_sm *current_ring_node_sm_f1; ring_node_sm *current_ring_node_sm_f2; +ring_node_sm *ring_node_for_averaging_sm_f0; +ring_node_sm *ring_node_for_averaging_sm_f1; 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 *current_ring_node_asm_burst_sbm_f1; ring_node_asm *current_ring_node_asm_norm_f0; +ring_node_asm *current_ring_node_asm_norm_f1; float asm_norm_f0 [ TOTAL_SIZE_SM ]; float asm_f0_reorganized [ TOTAL_SIZE_SM ]; @@ -43,35 +46,103 @@ void reset_nb_sm_f0( unsigned char lfrMo nb_sm.sbm_bp1_f0 = 0; nb_sm.sbm_bp2_f0 = 0; - nb_sm_before_bp.norm_bp1_f0 = parameter_dump_packet.sy_lfr_n_bp_p0 * 96; - nb_sm_before_bp.norm_bp2_f0 = parameter_dump_packet.sy_lfr_n_bp_p1 * 96; - nb_sm_before_bp.norm_asm_f0 = (parameter_dump_packet.sy_lfr_n_asm_p[0] * 256 + parameter_dump_packet.sy_lfr_n_asm_p[1]) * 96; - nb_sm_before_bp.sbm1_bp1_f0 = parameter_dump_packet.sy_lfr_s1_bp_p0 * 24; - nb_sm_before_bp.sbm1_bp2_f0 = parameter_dump_packet.sy_lfr_s1_bp_p1 * 96; - nb_sm_before_bp.sbm2_bp1_f0 = parameter_dump_packet.sy_lfr_s2_bp_p0 * 96; - nb_sm_before_bp.sbm2_bp2_f0 = parameter_dump_packet.sy_lfr_s2_bp_p1 * 96; - nb_sm_before_bp.burst_bp1_f0 = parameter_dump_packet.sy_lfr_b_bp_p0 * 96; - nb_sm_before_bp.burst_bp2_f0 = parameter_dump_packet.sy_lfr_b_bp_p1 * 96; + nb_sm_before_f0.norm_bp1_f0 = parameter_dump_packet.sy_lfr_n_bp_p0 * 96; + nb_sm_before_f0.norm_bp2_f0 = parameter_dump_packet.sy_lfr_n_bp_p1 * 96; + nb_sm_before_f0.norm_asm_f0 = (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_f0 = parameter_dump_packet.sy_lfr_s1_bp_p0 * 24; + nb_sm_before_f0.sbm1_bp2_f0 = parameter_dump_packet.sy_lfr_s1_bp_p1 * 96; + nb_sm_before_f0.sbm2_bp1_f0 = parameter_dump_packet.sy_lfr_s2_bp_p0 * 96; + nb_sm_before_f0.sbm2_bp2_f0 = parameter_dump_packet.sy_lfr_s2_bp_p1 * 96; + nb_sm_before_f0.burst_bp1_f0 = parameter_dump_packet.sy_lfr_b_bp_p0 * 96; + nb_sm_before_f0.burst_bp2_f0 = parameter_dump_packet.sy_lfr_b_bp_p1 * 96; if (lfrMode == LFR_MODE_SBM1) { - nb_sm_before_bp.burst_sbm_bp1_f0 = nb_sm_before_bp.sbm1_bp1_f0; - nb_sm_before_bp.burst_sbm_bp2_f0 = nb_sm_before_bp.sbm1_bp2_f0; + nb_sm_before_f0.burst_sbm_bp1_f0 = nb_sm_before_f0.sbm1_bp1_f0; + nb_sm_before_f0.burst_sbm_bp2_f0 = nb_sm_before_f0.sbm1_bp2_f0; } else if (lfrMode == LFR_MODE_SBM2) { - nb_sm_before_bp.burst_sbm_bp1_f0 = nb_sm_before_bp.sbm2_bp1_f0; - nb_sm_before_bp.burst_sbm_bp2_f0 = nb_sm_before_bp.sbm2_bp2_f0; + nb_sm_before_f0.burst_sbm_bp1_f0 = nb_sm_before_f0.sbm2_bp1_f0; + nb_sm_before_f0.burst_sbm_bp2_f0 = nb_sm_before_f0.sbm2_bp2_f0; + } + else if (lfrMode == LFR_MODE_BURST) + { + nb_sm_before_f0.burst_sbm_bp1_f0 = nb_sm_before_f0.burst_bp1_f0; + nb_sm_before_f0.burst_sbm_bp2_f0 = nb_sm_before_f0.burst_bp2_f0; + } + else + { + nb_sm_before_f0.burst_sbm_bp1_f0 = nb_sm_before_f0.burst_bp1_f0; + nb_sm_before_f0.burst_sbm_bp2_f0 = nb_sm_before_f0.burst_bp2_f0; + } +} + +void reset_nb_sm_f1( unsigned char lfrMode ) +{ + nb_sm.f1 = 0; + nb_sm.norm_bp1_f1 = 0; + nb_sm.norm_bp2_f1 = 0; + nb_sm.norm_asm_f1 = 0; + nb_sm.sbm_bp1_f1 = 0; + nb_sm.sbm_bp2_f1 = 0; + + nb_sm_before_f1.norm_bp1_f1 = parameter_dump_packet.sy_lfr_n_bp_p0 * 16; + nb_sm_before_f1.norm_bp2_f1 = parameter_dump_packet.sy_lfr_n_bp_p1 * 16; + nb_sm_before_f1.norm_asm_f1 = (parameter_dump_packet.sy_lfr_n_asm_p[0] * 256 + parameter_dump_packet.sy_lfr_n_asm_p[1]) * 16; + nb_sm_before_f1.sbm2_bp1_f1 = parameter_dump_packet.sy_lfr_s2_bp_p0 * 16; + nb_sm_before_f1.sbm2_bp2_f1 = parameter_dump_packet.sy_lfr_s2_bp_p1 * 16; + nb_sm_before_f1.burst_bp1_f1 = parameter_dump_packet.sy_lfr_b_bp_p0 * 16; + nb_sm_before_f1.burst_bp2_f1 = parameter_dump_packet.sy_lfr_b_bp_p1 * 16; + + if (lfrMode == LFR_MODE_SBM2) + { + nb_sm_before_f1.burst_sbm_bp1_f1 = nb_sm_before_f1.sbm2_bp1_f1; + nb_sm_before_f1.burst_sbm_bp2_f1 = nb_sm_before_f1.sbm2_bp2_f1; } else if (lfrMode == LFR_MODE_BURST) { - nb_sm_before_bp.burst_sbm_bp1_f0 = nb_sm_before_bp.burst_bp1_f0; - nb_sm_before_bp.burst_sbm_bp2_f0 = nb_sm_before_bp.burst_bp2_f0; + nb_sm_before_f1.burst_sbm_bp1_f1 = nb_sm_before_f1.burst_bp1_f1; + nb_sm_before_f1.burst_sbm_bp2_f1 = nb_sm_before_f1.burst_bp2_f1; } else { - nb_sm_before_bp.burst_sbm_bp1_f0 = nb_sm_before_bp.burst_bp1_f0; - nb_sm_before_bp.burst_sbm_bp2_f0 = nb_sm_before_bp.burst_bp2_f0; + nb_sm_before_f1.burst_sbm_bp1_f1 = nb_sm_before_f1.burst_bp1_f1; + nb_sm_before_f1.burst_sbm_bp2_f1 = nb_sm_before_f1.burst_bp2_f1; + } +} + +void reset_nb_sm_f2( unsigned char lfrMode ) +{ + nb_sm.f2 = 0; + nb_sm.norm_bp1_f2 = 0; + nb_sm.norm_bp2_f2 = 0; + nb_sm.norm_asm_f2 = 0; + nb_sm.sbm_bp1_f2 = 0; + nb_sm.sbm_bp2_f2 = 0; + + nb_sm_before_f2.norm_bp1_f2 = parameter_dump_packet.sy_lfr_n_bp_p0; + nb_sm_before_f2.norm_bp2_f2 = parameter_dump_packet.sy_lfr_n_bp_p1; + nb_sm_before_f2.norm_asm_f2 = parameter_dump_packet.sy_lfr_n_asm_p[0] * 256 + parameter_dump_packet.sy_lfr_n_asm_p[1]; + nb_sm_before_f2.sbm2_bp1_f2 = parameter_dump_packet.sy_lfr_s2_bp_p0; + nb_sm_before_f2.sbm2_bp2_f2 = parameter_dump_packet.sy_lfr_s2_bp_p1; + nb_sm_before_f2.burst_bp1_f2 = parameter_dump_packet.sy_lfr_b_bp_p0; + nb_sm_before_f2.burst_bp2_f2 = parameter_dump_packet.sy_lfr_b_bp_p1; + + if (lfrMode == LFR_MODE_SBM2) + { + nb_sm_before_f2.burst_sbm_bp1_f2 = nb_sm_before_f2.sbm2_bp1_f2; + nb_sm_before_f2.burst_sbm_bp2_f2 = nb_sm_before_f2.sbm2_bp2_f2; + } + else if (lfrMode == LFR_MODE_BURST) + { + nb_sm_before_f2.burst_sbm_bp1_f2 = nb_sm_before_f2.burst_bp1_f2; + nb_sm_before_f2.burst_sbm_bp2_f2 = nb_sm_before_f2.burst_bp2_f2; + } + else + { + nb_sm_before_f2.burst_sbm_bp1_f2 = nb_sm_before_f2.burst_bp1_f2; + nb_sm_before_f2.burst_sbm_bp2_f2 = nb_sm_before_f2.burst_bp2_f2; } } @@ -152,7 +223,7 @@ rtems_task avf0_task( rtems_task_argumen rtems_event_set event_out; rtems_status_code status; - rtems_id queue_id_matr; + rtems_id queue_id_prc0; asm_msg msgForMATR; ring_node_sm *ring_node_tab[8]; @@ -160,10 +231,10 @@ rtems_task avf0_task( rtems_task_argumen BOOT_PRINTF1("in AVFO *** lfrRequestedMode = %d\n", lfrRequestedMode) - status = get_message_queue_id_matr( &queue_id_matr ); + status = get_message_queue_id_prc0( &queue_id_prc0 ); if (status != RTEMS_SUCCESSFUL) { - PRINTF1("in MATR *** ERR get_message_queue_id_matr %d\n", status) + PRINTF1("in MATR *** ERR get_message_queue_id_prc0 %d\n", status) } while(1){ @@ -190,13 +261,13 @@ rtems_task avf0_task( rtems_task_argumen //**************************************** // 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]; + 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]; - if (nb_sm.sbm_bp1_f0 == nb_sm_before_bp.burst_sbm_bp1_f0) + if (nb_sm.sbm_bp1_f0 == nb_sm_before_f0.burst_sbm_bp1_f0) { nb_sm.sbm_bp1_f0 = 0; // set another ring for the ASM storage @@ -208,7 +279,7 @@ rtems_task avf0_task( rtems_task_argumen } } - if (nb_sm.sbm_bp2_f0 == nb_sm_before_bp.burst_sbm_bp2_f0) + if (nb_sm.sbm_bp2_f0 == nb_sm_before_f0.burst_sbm_bp2_f0) { nb_sm.sbm_bp2_f0 = 0; if ( (lfrCurrentMode == LFR_MODE_BURST) @@ -218,18 +289,19 @@ rtems_task avf0_task( rtems_task_argumen } } - if (nb_sm.norm_bp1_f0 == nb_sm_before_bp.norm_bp1_f0) + if (nb_sm.norm_bp1_f0 == nb_sm_before_f0.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) + if ( (lfrCurrentMode == LFR_MODE_NORMAL) + || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) { msgForMATR.event = msgForMATR.event | RTEMS_EVENT_NORM_BP1_F0; } } - if (nb_sm.norm_bp2_f0 == nb_sm_before_bp.norm_bp2_f0) + if (nb_sm.norm_bp2_f0 == nb_sm_before_f0.norm_bp2_f0) { nb_sm.norm_bp2_f0 = 0; if ( (lfrCurrentMode == LFR_MODE_NORMAL) @@ -239,7 +311,7 @@ rtems_task avf0_task( rtems_task_argumen } } - if (nb_sm.norm_asm_f0 == nb_sm_before_bp.norm_asm_f0) + if (nb_sm.norm_asm_f0 == nb_sm_before_f0.norm_asm_f0) { nb_sm.norm_asm_f0 = 0; if ( (lfrCurrentMode == LFR_MODE_NORMAL) @@ -254,7 +326,7 @@ rtems_task avf0_task( rtems_task_argumen // send the message to MATR if (msgForMATR.event != 0x00) { - status = rtems_message_queue_send( queue_id_matr, (char *) & msgForMATR, MSG_QUEUE_SIZE_MATR); + status = rtems_message_queue_send( queue_id_prc0, (char *) & msgForMATR, MSG_QUEUE_SIZE_PRC0); } if (status != RTEMS_SUCCESSFUL) { @@ -263,165 +335,280 @@ rtems_task avf0_task( rtems_task_argumen } } -rtems_task matr_task( rtems_task_argument lfrRequestedMode ) +rtems_task prc0_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_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; +// 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_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 ); + +// //************* +// // NORM headers +// BP_init_header_with_spare( ¤t_node_norm_bp1_f0.header, +// APID_TM_SCIENCE_NORMAL_BURST, SID_NORM_BP1_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP1_F0, NB_BINS_COMPRESSED_SM_F0 ); +// BP_init_header( ¤t_node_norm_bp2_f0.header, +// APID_TM_SCIENCE_NORMAL_BURST, SID_NORM_BP2_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP2_F0, NB_BINS_COMPRESSED_SM_F0); - unsigned long long int localTime; - - ASM_init_header( &headerASM ); +// //**************************** +// // BURST SBM1 and SBM2 headers +// if ( (lfrRequestedMode == LFR_MODE_BURST) +// || (lfrRequestedMode == LFR_MODE_NORMAL) || (lfrRequestedMode == LFR_MODE_STANDBY) ) +// { +// BP_init_header( ¤t_node_sbm_bp1_f0.header, +// APID_TM_SCIENCE_NORMAL_BURST, SID_BURST_BP1_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP1_F0, NB_BINS_COMPRESSED_SM_SBM_F0); +// BP_init_header( ¤t_node_sbm_bp2_f0.header, +// APID_TM_SCIENCE_NORMAL_BURST, SID_BURST_BP2_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP2_F0, NB_BINS_COMPRESSED_SM_SBM_F0); +// } +// else if ( lfrRequestedMode == LFR_MODE_SBM1 ) +// { +// BP_init_header( ¤t_node_sbm_bp1_f0.header, +// APID_TM_SCIENCE_SBM1_SBM2, SID_SBM1_BP1_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP1_F0, NB_BINS_COMPRESSED_SM_SBM_F0); +// BP_init_header( ¤t_node_sbm_bp2_f0.header, +// APID_TM_SCIENCE_SBM1_SBM2, SID_SBM1_BP2_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP2_F0, NB_BINS_COMPRESSED_SM_SBM_F0); +// } +// else if ( lfrRequestedMode == LFR_MODE_SBM2 ) +// { +// BP_init_header( ¤t_node_sbm_bp1_f0.header, +// APID_TM_SCIENCE_SBM1_SBM2, SID_SBM2_BP1_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP1_F0, NB_BINS_COMPRESSED_SM_SBM_F0); +// BP_init_header( ¤t_node_sbm_bp2_f0.header, +// APID_TM_SCIENCE_SBM1_SBM2, SID_SBM2_BP2_F0, +// PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP2_F0, NB_BINS_COMPRESSED_SM_SBM_F0); +// } +// else +// { +// PRINTF1("ERR *** in MATR *** unexpected lfrRequestedMode passed as argument = %d\n", (unsigned int) lfrRequestedMode) +// } - //************* - // NORM headers - BP_init_header_with_spare( ¤t_node_norm_bp1_f0.header, - APID_TM_SCIENCE_NORMAL_BURST, SID_NORM_BP1_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP1_F0, NB_BINS_COMPRESSED_SM_F0 ); - BP_init_header( ¤t_node_norm_bp2_f0.header, - APID_TM_SCIENCE_NORMAL_BURST, SID_NORM_BP2_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP2_F0, NB_BINS_COMPRESSED_SM_F0); +// status = get_message_queue_id_send( &queue_id ); +// if (status != RTEMS_SUCCESSFUL) +// { +// PRINTF1("in MATR *** ERR get_message_queue_id_send %d\n", status) +// } +// status = get_message_queue_id_prc0( &queue_id_matr); +// if (status != RTEMS_SUCCESSFUL) +// { +// PRINTF1("in MATR *** ERR get_message_queue_id_prc0 %d\n", status) +// } + +// BOOT_PRINTF1("in PRC0 *** lfrRequestedMode = %d\n", lfrRequestedMode) + +// while(1){ +// 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; - //**************************** - // BURST SBM1 and SBM2 headers - if ( (lfrRequestedMode == LFR_MODE_BURST) - || (lfrRequestedMode == LFR_MODE_NORMAL) || (lfrRequestedMode == LFR_MODE_STANDBY) ) - { - BP_init_header( ¤t_node_sbm_bp1_f0.header, - APID_TM_SCIENCE_NORMAL_BURST, SID_BURST_BP1_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP1_F0, NB_BINS_COMPRESSED_SM_SBM_F0); - BP_init_header( ¤t_node_sbm_bp2_f0.header, - APID_TM_SCIENCE_NORMAL_BURST, SID_BURST_BP2_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP2_F0, NB_BINS_COMPRESSED_SM_SBM_F0); - } - else if ( lfrRequestedMode == LFR_MODE_SBM1 ) +// localTime = getTimeAsUnsignedLongLongInt( ); +// //**************** +// //**************** +// // BURST SBM1 SBM2 +// //**************** +// //**************** +// if (incomingMsg->event & RTEMS_EVENT_BURST_SBM_BP1_F0 ) +// { +// // 1) compress the matrix for Basic Parameters calculation +// ASM_compress_reorganize_and_divide( incomingMsg->burst_sbm->matrix, compressed_sm_sbm, +// nb_sm_before_f0.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 *) &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 ( 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 *) &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); +// } +// } + +// //***** +// //***** +// // NORM +// //***** +// //***** +// if (incomingMsg->event & RTEMS_EVENT_NORM_BP1_F0) +// { +// // 1) compress the matrix for Basic Parameters calculation +// ASM_compress_reorganize_and_divide( incomingMsg->norm->matrix, compressed_sm_norm_f0, +// nb_sm_before_f0.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 *) &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 (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 *) &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 (incomingMsg->event & RTEMS_EVENT_NORM_ASM_F0) +// { +// // 1) reorganize the ASM and divide +// ASM_reorganize_and_divide( incomingMsg->norm->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); +// } + +// } +} + +rtems_task avf1_task( rtems_task_argument lfrRequestedMode ) +{ + int i; + + rtems_event_set event_out; + rtems_status_code status; + rtems_id queue_id_prc1; + asm_msg msgForMATR; + ring_node_sm *ring_node_tab[8]; + + reset_nb_sm_f1( lfrRequestedMode ); // reset the sm counters that drive the BP and ASM computations / transmissions + + BOOT_PRINTF1("in AVF1 *** lfrRequestedMode = %d\n", lfrRequestedMode) + + status = get_message_queue_id_prc1( &queue_id_prc1 ); + if (status != RTEMS_SUCCESSFUL) { - BP_init_header( ¤t_node_sbm_bp1_f0.header, - APID_TM_SCIENCE_SBM1_SBM2, SID_SBM1_BP1_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP1_F0, NB_BINS_COMPRESSED_SM_SBM_F0); - BP_init_header( ¤t_node_sbm_bp2_f0.header, - APID_TM_SCIENCE_SBM1_SBM2, SID_SBM1_BP2_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP2_F0, NB_BINS_COMPRESSED_SM_SBM_F0); - } - else if ( lfrRequestedMode == LFR_MODE_SBM2 ) - { - BP_init_header( ¤t_node_sbm_bp1_f0.header, - APID_TM_SCIENCE_SBM1_SBM2, SID_SBM2_BP1_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP1_F0, NB_BINS_COMPRESSED_SM_SBM_F0); - BP_init_header( ¤t_node_sbm_bp2_f0.header, - APID_TM_SCIENCE_SBM1_SBM2, SID_SBM2_BP2_F0, - PACKET_LENGTH_TM_LFR_SCIENCE_SBM_BP2_F0, NB_BINS_COMPRESSED_SM_SBM_F0); - } - else - { - PRINTF1("ERR *** in MATR *** unexpected lfrRequestedMode passed as argument = %d\n", (unsigned int) lfrRequestedMode) + PRINTF1("in MATR *** ERR get_message_queue_id_prc0 %d\n", status) } - status = get_message_queue_id_send( &queue_id ); - if (status != RTEMS_SUCCESSFUL) - { - 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) - } + 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_AVF1-1] = ring_node_for_averaging_sm_f1; + for ( i = 2; i < (NB_SM_BEFORE_AVF1+1); i++ ) + { + ring_node_for_averaging_sm_f0 = ring_node_for_averaging_sm_f0->previous; + ring_node_tab[NB_SM_BEFORE_AVF1-i] = ring_node_for_averaging_sm_f0; + } - BOOT_PRINTF1("in MATR *** lfrRequestedMode = %d\n", lfrRequestedMode) - - while(1){ - 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; + // compute the average and store it in the averaged_sm_f1 buffer + SM_average( current_ring_node_asm_norm_f1->matrix, + current_ring_node_asm_burst_sbm_f1->matrix, + ring_node_tab, + nb_sm.norm_bp1_f1, nb_sm.sbm_bp1_f1 ); - localTime = getTimeAsUnsignedLongLongInt( ); - //**************** - //**************** - // BURST SBM1 SBM2 - //**************** - //**************** - if (incomingMsg->event & RTEMS_EVENT_BURST_SBM_BP1_F0 ) - { - // 1) compress the matrix for Basic Parameters calculation - 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 + // update nb_average + nb_sm.norm_bp1_f1 = nb_sm.norm_bp1_f1 + NB_SM_BEFORE_AVF1; + nb_sm.norm_bp2_f1 = nb_sm.norm_bp2_f1 + NB_SM_BEFORE_AVF1; + nb_sm.norm_asm_f1 = nb_sm.norm_asm_f1 + NB_SM_BEFORE_AVF1; + nb_sm.sbm_bp1_f1 = nb_sm.sbm_bp1_f1 + NB_SM_BEFORE_AVF1; + nb_sm.sbm_bp2_f1 = nb_sm.sbm_bp2_f1 + NB_SM_BEFORE_AVF1; - // 3) send the BP1 set - 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 ( incomingMsg->event & RTEMS_EVENT_BURST_SBM_BP2_F0 ) + //**************************************** + // 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_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]; + + if (nb_sm.sbm_bp1_f1 == nb_sm_before_f1.burst_sbm_bp1_f1) + { + nb_sm.sbm_bp1_f0 = 0; + // 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_SBM2) ) { - // 1) compute the BP2 set - - // 2) send the BP2 set - 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); + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_BURST_SBM_BP1_F1; } } - //***** - //***** - // NORM - //***** - //***** - if (incomingMsg->event & RTEMS_EVENT_NORM_BP1_F0) + if (nb_sm.sbm_bp2_f1 == nb_sm_before_f1.burst_sbm_bp2_f1) { - // 1) compress the matrix for Basic Parameters calculation - 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 + nb_sm.sbm_bp2_f0 = 0; + if ( (lfrCurrentMode == LFR_MODE_BURST) || (lfrCurrentMode == LFR_MODE_SBM2) ) + { + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_BURST_SBM_BP2_F1; + } + } - // 3) send the BP1 set - 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 (incomingMsg->event & RTEMS_EVENT_NORM_BP2_F0) + if (nb_sm.norm_bp1_f1 == nb_sm_before_f1.norm_bp1_f1) + { + 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) + || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) { - // 1) compute the BP2 set - - // 2) send the BP2 set - 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); + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_NORM_BP1_F0; } } - if (incomingMsg->event & RTEMS_EVENT_NORM_ASM_F0) + if (nb_sm.norm_bp2_f1 == nb_sm_before_f1.norm_bp2_f1) { - // 1) reorganize the ASM and divide - 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); + nb_sm.norm_bp2_f0 = 0; + if ( (lfrCurrentMode == LFR_MODE_NORMAL) + || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) + { + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_NORM_BP2_F1; + } } + if (nb_sm.norm_asm_f1 == nb_sm_before_f1.norm_asm_f1) + { + nb_sm.norm_asm_f0 = 0; + if ( (lfrCurrentMode == LFR_MODE_NORMAL) + || (lfrCurrentMode == LFR_MODE_SBM1) || (lfrCurrentMode == LFR_MODE_SBM2) ) + { + msgForMATR.event = msgForMATR.event | RTEMS_EVENT_NORM_ASM_F1; + } + } + + //************************* + // send the message to MATR + if (msgForMATR.event != 0x00) + { + status = rtems_message_queue_send( queue_id_prc1, (char *) & msgForMATR, MSG_QUEUE_SIZE_PRC1); + } + + if (status != RTEMS_SUCCESSFUL) { + printf("in AVF1 *** Error sending message to PRC1, code %d\n", status); + } } } diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -610,7 +610,7 @@ int restart_science_tasks(unsigned char PRINTF1("in restart_science_task *** 5 ERR %d\n", status[5]) } - status[6] = rtems_task_restart( Task_id[TASKID_MATR], lfrRequestedMode ); + status[6] = rtems_task_restart( Task_id[TASKID_PRC0], lfrRequestedMode ); if (status[6] != RTEMS_SUCCESSFUL) { PRINTF1("in restart_science_task *** 6 ERR %d\n", status[6])