# HG changeset patch # User paul # Date 2015-01-28 06:14:15 # Node ID 59ee969ac7c22f6ba3c9be71953a9ff49a60be60 # Parent 3fe0b645620cc2d376545c937a98c95311fb1920 sync diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,2 +1,2 @@ -d896e23033404156cdc95f5bf66e038de84de04b LFR_basic-parameters -5cfb4f574403f86583ac510d5921709548a9c902 header/lfr_common_headers +a0aa2c6f13574ae69c8645af2a2afa5d448e6c76 LFR_basic-parameters +a8668a35669295aaba22432d247158626f00a52a header/lfr_common_headers diff --git a/FSW-qt/fsw-qt.pro b/FSW-qt/fsw-qt.pro --- a/FSW-qt/fsw-qt.pro +++ b/FSW-qt/fsw-qt.pro @@ -2,7 +2,7 @@ TEMPLATE = app # CONFIG += console v8 sim # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** vhdl_dev *** debug_tch # lpp_dpu_destid -CONFIG += console verbose lpp_dpu_destid cpu_usage_report +CONFIG += console verbose lpp_dpu_destid cpu_usage_report stack_report CONFIG -= qt include(./sparc.pri) @@ -107,5 +107,6 @@ HEADERS += \ ../header/lfr_common_headers/TC_types.h \ ../header/lfr_common_headers/tm_byte_positions.h \ ../LFR_basic-parameters/basic_parameters.h \ - ../LFR_basic-parameters/basic_parameters_params.h + ../LFR_basic-parameters/basic_parameters_params.h \ + ../header/GscMemoryLPP.hpp diff --git a/header/GscMemoryLPP.hpp b/header/GscMemoryLPP.hpp new file mode 100644 --- /dev/null +++ b/header/GscMemoryLPP.hpp @@ -0,0 +1,66 @@ +#ifndef GSCMEMORY_HPP_ +#define GSCMEMORY_HPP_ + +static unsigned int getCacheControlRegister(){ + +#ifndef LEON3 +#define LEON3 +#endif + +#ifdef LEON3 + unsigned int cacheControlRegister = 0; + __asm__ __volatile__("lda [%%g0] 2, %0" : "=r"(cacheControlRegister) : ); + return cacheControlRegister; +#endif +} + +static void setCacheControlRegister(unsigned int cacheControlRegister){ + +#ifdef LEON3 + __asm__ __volatile__("sta %0, [%%g0] 2" : : "r"(cacheControlRegister)); +#endif +} + + +/** + * Flush the data cache and the instruction cache. + * + * @return + */ +static inline void flushCache() { + asm("flush"); +} + + +static void enableInstructionCache() { + +#ifdef LEON3 + unsigned int cacheControlRegister; + cacheControlRegister = getCacheControlRegister(); + cacheControlRegister = (cacheControlRegister | 0x3); + setCacheControlRegister(cacheControlRegister); +#endif +} + +static void enableDataCache() { + +#ifdef LEON3 + unsigned int cacheControlRegister; + cacheControlRegister = getCacheControlRegister(); + cacheControlRegister = (cacheControlRegister | 0xc); + setCacheControlRegister(cacheControlRegister); +#endif +} + +static void enableInstructionBurstFetch() { + +#ifdef LEON3 + unsigned int cacheControlRegister; + cacheControlRegister = getCacheControlRegister(); + // set the bit IB to 1 + cacheControlRegister = (cacheControlRegister | 0x10000); + setCacheControlRegister(cacheControlRegister); +#endif +} + +#endif /* GSCMEMORY_HPP_ */ diff --git a/header/fsw_init.h b/header/fsw_init.h --- a/header/fsw_init.h +++ b/header/fsw_init.h @@ -16,6 +16,8 @@ #include "avf1_prc1.h" #include "avf2_prc2.h" +#include "GscMemoryLPP.hpp" + extern rtems_name Task_name[20]; /* array of task names */ extern rtems_id Task_id[20]; /* array of task ids */ 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 @@ -40,13 +40,32 @@ typedef struct unsigned char acquisitionTime[6]; unsigned char pa_lfr_bp_blk_nr[2]; // SOURCE DATA - unsigned char data[ 30 * 22 ]; // MAX size is 22 * 30 [TM_LFR_SCIENCE_BURST_BP2_F1] + unsigned char data[ 780 ]; // MAX size is 26 bins * 30 Bytes [TM_LFR_SCIENCE_BURST_BP2_F1] } bp_packet; typedef struct { - Header_TM_LFR_SCIENCE_BP_with_spare_t header; - unsigned char data[ 9 * 13 ]; // only for TM_LFR_SCIENCE_NORMAL_BP1_F0 and F1 + unsigned char targetLogicalAddress; + unsigned char protocolIdentifier; + unsigned char reserved; + unsigned char userApplication; + unsigned char packetID[2]; + unsigned char packetSequenceControl[2]; + unsigned char packetLength[2]; + // DATA FIELD HEADER + unsigned char spare1_pusVersion_spare2; + unsigned char serviceType; + unsigned char serviceSubType; + unsigned char destinationID; + unsigned char time[6]; + // AUXILIARY HEADER + unsigned char sid; + unsigned char biaStatusInfo; + unsigned char acquisitionTime[6]; + unsigned char source_data_spare; + unsigned char pa_lfr_bp_blk_nr[2]; + // SOURCE DATA + unsigned char data[ 117 ]; // 13 bins * 9 Bytes only for TM_LFR_SCIENCE_NORMAL_BP1_F0 and F1 } bp_packet_with_spare; typedef struct @@ -93,10 +112,10 @@ void ASM_generic_init_ring(ring_node_asm // Basic Parameters void BP_reset_current_ring_nodes( void ); -void BP_init_header(bp_packet *header, +void BP_init_header(bp_packet *packet, unsigned int apid, unsigned char sid, unsigned int packetLength , unsigned char blkNr); -void BP_init_header_with_spare( Header_TM_LFR_SCIENCE_BP_with_spare_t *header, +void BP_init_header_with_spare(bp_packet_with_spare *packet, unsigned int apid, unsigned char sid, unsigned int packetLength, unsigned char blkNr ); void BP_send( char *data, diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -21,7 +21,6 @@ extern volatile int wf_buffer_f0[ ]; extern volatile int wf_buffer_f1[ ]; extern volatile int wf_buffer_f2[ ]; extern volatile int wf_buffer_f3[ ]; -extern char wf_cont_f3_light[ ]; extern waveform_picker_regs_0_1_18_t *waveform_picker_regs; extern time_management_regs_t *time_management_regs; @@ -61,7 +60,7 @@ int send_waveform_CWF3_light(ring_node * // void compute_acquisition_time(unsigned int coarseTime, unsigned int fineTime, unsigned int sid, unsigned char pa_lfr_pkt_nr, unsigned char *acquisitionTime ); -void build_snapshot_from_ring(ring_node *ring_node_to_send , unsigned char frequencyChannel ); +void build_snapshot_from_ring(ring_node *ring_node_to_send, unsigned char frequencyChannel , unsigned long long acquisitionTimeF0_asLong); void snapshot_resynchronization( unsigned char *timePtr ); // rtems_id get_pkts_queue_id( void ); diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -41,7 +41,6 @@ volatile int wf_buffer_f0[ NB_RING_NODES volatile int wf_buffer_f1[ NB_RING_NODES_F1 * WFRM_BUFFER ] __attribute__((aligned(0x100))); volatile int wf_buffer_f2[ NB_RING_NODES_F2 * WFRM_BUFFER ] __attribute__((aligned(0x100))); volatile int wf_buffer_f3[ NB_RING_NODES_F3 * WFRM_BUFFER ] __attribute__((aligned(0x100))); -char wf_cont_f3_light[ (NB_SAMPLES_PER_SNAPSHOT) * NB_BYTES_CWF3_LIGHT_BLK + TIME_OFFSET_IN_BYTES ] __attribute__((aligned(0x100))); //*********************************** // SPECTRAL MATRICES GLOBAL VARIABLES diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -61,6 +61,21 @@ #include "fsw_init.h" #include "fsw_config.c" +void initCache() +{ +// unsigned int cacheControlRegister; + +// cacheControlRegister = getCacheControlRegister(); +// printf("(0) cacheControlRegister = %x\n", cacheControlRegister); + + enableInstructionCache(); + enableDataCache(); + enableInstructionBurstFetch(); + +// cacheControlRegister = getCacheControlRegister(); +// printf("(1) cacheControlRegister = %x\n", cacheControlRegister); +} + rtems_task Init( rtems_task_argument ignored ) { /** This is the RTEMS INIT taks, it the first task launched by the system. @@ -71,6 +86,9 @@ rtems_task Init( rtems_task_argument ign * */ + //*********** + // INIT CACHE + unsigned char *vhdlVersion; reset_lfr(); @@ -87,9 +105,14 @@ rtems_task Init( rtems_task_argument ign send_console_outputs_on_apbuart_port(); set_apbuart_scaler_reload_register(REGS_ADDR_APBUART, APBUART_SCALER_RELOAD_VALUE); enable_apbuart_transmitter(); + DEBUG_PRINTF("\n\n\n\n\nIn INIT *** Now the console is on port COM1\n") + PRINTF("\n\n\n\n\n") + + initCache(); + PRINTF("*************************\n") PRINTF("** LFR Flight Software **\n") PRINTF1("** %d.", SW_VERSION_N1) @@ -324,8 +347,8 @@ int create_all_tasks( void ) // create a if (status == RTEMS_SUCCESSFUL) // SEND { status = rtems_task_create( - Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT, + Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE * 2, + RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_SEND] ); } @@ -360,7 +383,7 @@ int create_all_tasks( void ) // create a { status = rtems_task_create( Task_name[TASKID_AVF0], TASK_PRIORITY_AVF0, RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT, + RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF0] ); } @@ -376,7 +399,7 @@ int create_all_tasks( void ) // create a { status = rtems_task_create( Task_name[TASKID_AVF1], TASK_PRIORITY_AVF1, RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT, + RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF1] ); } @@ -392,7 +415,7 @@ int create_all_tasks( void ) // create a { status = rtems_task_create( Task_name[TASKID_AVF2], TASK_PRIORITY_AVF2, RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT, + RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_AVF2] ); } @@ -470,7 +493,7 @@ int create_all_tasks( void ) // create a { status = rtems_task_create( Task_name[TASKID_HOUS], TASK_PRIORITY_HOUS, RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT, + RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_HOUS] ); } diff --git a/src/fsw_spacewire.c b/src/fsw_spacewire.c --- a/src/fsw_spacewire.c +++ b/src/fsw_spacewire.c @@ -255,7 +255,6 @@ rtems_task send_task( rtems_task_argumen charPtr[3] = incomingData[3]; incomingRingNodePtr = (ring_node*) ring_node_address; sid = incomingRingNodePtr->sid; -// printf("sid = %d\n", incomingRingNodePtr->sid); if ( (sid==SID_NORM_CWF_LONG_F3) || (sid==SID_BURST_CWF_F2 ) || (sid==SID_SBM1_CWF_F1 ) @@ -439,7 +438,7 @@ int spacewire_configure_link( int fd ) // status = ioctl(fd, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a if (status!=RTEMS_SUCCESSFUL) { - PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs + PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs } // status = ioctl(fd, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts @@ -684,12 +683,12 @@ rtems_timer_service_routine user_routine void init_header_cwf( Header_TM_LFR_SCIENCE_CWF_t *header ) { - header->targetLogicalAddress = CCSDS_DESTINATION_ID; - header->protocolIdentifier = CCSDS_PROTOCOLE_ID; - header->reserved = DEFAULT_RESERVED; - header->userApplication = CCSDS_USER_APP; - header->packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; - header->packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT; + header->targetLogicalAddress = CCSDS_DESTINATION_ID; + header->protocolIdentifier = CCSDS_PROTOCOLE_ID; + header->reserved = DEFAULT_RESERVED; + header->userApplication = CCSDS_USER_APP; + header->packetSequenceControl[0]= TM_PACKET_SEQ_CTRL_STANDALONE; + header->packetSequenceControl[1]= TM_PACKET_SEQ_CNT_DEFAULT; header->packetLength[0] = 0x00; header->packetLength[1] = 0x00; // DATA FIELD HEADER @@ -984,6 +983,9 @@ int spw_send_waveform_CWF3_light( ring_n header->blkNr[0] = (unsigned char) (BLK_NR_CWF_SHORT_F3 >> 8); header->blkNr[1] = (unsigned char) (BLK_NR_CWF_SHORT_F3 ); + printf("spw_send_waveform_CWF3_light => [0] = %x, [1] = %x, [2] = %x, [3] = %x, [4] = %x, [5] = %x\n", + dataPtr[0], dataPtr[1], dataPtr[2], dataPtr[3], dataPtr[4], dataPtr[5]); + //********************* // SEND CWF3_light DATA for (i=0; icoarseTimeNORM ); - set_time( packet_norm_bp1.header.acquisitionTime, (unsigned char *) &incomingMsg->coarseTimeNORM ); + set_time( packet_norm_bp1.time, (unsigned char *) &incomingMsg->coarseTimeNORM ); + set_time( packet_norm_bp1.acquisitionTime, (unsigned char *) &incomingMsg->coarseTimeNORM ); BP_send( (char *) &packet_norm_bp1, queue_id, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP1_F0 + PACKET_LENGTH_DELTA, SID_NORM_BP1_F0 ); 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 @@ -202,7 +202,7 @@ rtems_task prc1_task( rtems_task_argumen //************* // NORM headers - BP_init_header_with_spare( &packet_norm_bp1.header, + BP_init_header_with_spare( &packet_norm_bp1, APID_TM_SCIENCE_NORMAL_BURST, SID_NORM_BP1_F1, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP1_F1, NB_BINS_COMPRESSED_SM_F1 ); BP_init_header( &packet_norm_bp2, @@ -299,13 +299,13 @@ rtems_task prc1_task( rtems_task_argumen // 1) compress the matrix for Basic Parameters calculation ASM_compress_reorganize_and_divide( incomingMsg->norm->matrix, compressed_sm_norm_f1, nb_sm_before_f1.norm_bp1, - NB_BINS_COMPRESSED_SM_F0, NB_BINS_TO_AVERAGE_ASM_F0, - ASM_F0_INDICE_START ); + NB_BINS_COMPRESSED_SM_F1, NB_BINS_TO_AVERAGE_ASM_F1, + ASM_F1_INDICE_START ); // 2) compute the BP1 set BP1_set( compressed_sm_norm_f1, k_coeff_intercalib_f1_norm, NB_BINS_COMPRESSED_SM_F1, packet_norm_bp1.data ); // 3) send the BP1 set - set_time( packet_norm_bp1.header.time, (unsigned char *) &incomingMsg->coarseTimeNORM ); - set_time( packet_norm_bp1.header.acquisitionTime, (unsigned char *) &incomingMsg->coarseTimeNORM ); + set_time( packet_norm_bp1.time, (unsigned char *) &incomingMsg->coarseTimeNORM ); + set_time( packet_norm_bp1.acquisitionTime, (unsigned char *) &incomingMsg->coarseTimeNORM ); BP_send( (char *) &packet_norm_bp1, queue_id_send, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP1_F1 + PACKET_LENGTH_DELTA, SID_NORM_BP1_F1 ); 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 @@ -16,15 +16,13 @@ extern ring_node sm_ring_f2[ ]; //*** // F2 ring_node_asm asm_ring_norm_f2 [ NB_RING_NODES_ASM_NORM_F2 ]; -ring_node_asm asm_ring_burst_sbm_f2[ NB_RING_NODES_ASM_BURST_SBM_F2 ]; ring_node ring_to_send_asm_f2 [ NB_RING_NODES_ASM_F2 ]; int buffer_asm_f2 [ NB_RING_NODES_ASM_F2 * TOTAL_SIZE_SM ]; float asm_f2_reorganized [ TOTAL_SIZE_SM ]; -char asm_f2_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ]; +char asm_f2_char [ TOTAL_SIZE_SM * 2 ]; float compressed_sm_norm_f2[ TOTAL_SIZE_COMPRESSED_ASM_NORM_F2]; -float compressed_sm_sbm_f2 [ TOTAL_SIZE_COMPRESSED_ASM_SBM_F2 ]; float k_coeff_intercalib_f2[ NB_BINS_COMPRESSED_SM_F2 * NB_K_COEFF_PER_BIN ]; // 12 * 32 = 384 @@ -134,7 +132,7 @@ rtems_task avf2_task( rtems_task_argumen // send the message to MATR if (msgForMATR.event != 0x00) { - status = rtems_message_queue_send( queue_id_prc2, (char *) &msgForMATR, MSG_QUEUE_SIZE_PRC0); + status = rtems_message_queue_send( queue_id_prc2, (char *) &msgForMATR, MSG_QUEUE_SIZE_PRC2); } if (status != RTEMS_SUCCESSFUL) { @@ -150,7 +148,7 @@ rtems_task prc2_task( rtems_task_argumen asm_msg *incomingMsg; // rtems_status_code status; - rtems_id queue_id; + rtems_id queue_id_send; rtems_id queue_id_q_p2; bp_packet packet_norm_bp1; bp_packet packet_norm_bp2; @@ -162,8 +160,6 @@ rtems_task prc2_task( rtems_task_argumen init_ring( ring_to_send_asm_f2, NB_RING_NODES_ASM_F2, (volatile int*) buffer_asm_f2, TOTAL_SIZE_SM ); current_ring_node_to_send_asm_f2 = ring_to_send_asm_f2; - incomingMsg = NULL; - //************* // NORM headers BP_init_header( &packet_norm_bp1, @@ -173,7 +169,7 @@ rtems_task prc2_task( rtems_task_argumen APID_TM_SCIENCE_NORMAL_BURST, SID_NORM_BP2_F2, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP2_F2, NB_BINS_COMPRESSED_SM_F2 ); - status = get_message_queue_id_send( &queue_id ); + status = get_message_queue_id_send( &queue_id_send ); if (status != RTEMS_SUCCESSFUL) { PRINTF1("in PRC2 *** ERR get_message_queue_id_send %d\n", status) @@ -211,7 +207,7 @@ rtems_task prc2_task( rtems_task_argumen // 3) send the BP1 set set_time( packet_norm_bp1.time, (unsigned char *) &incomingMsg->coarseTimeNORM ); set_time( packet_norm_bp1.acquisitionTime, (unsigned char *) &incomingMsg->coarseTimeNORM ); - BP_send( (char *) &packet_norm_bp1, queue_id, + BP_send( (char *) &packet_norm_bp1, queue_id_send, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP1_F2 + PACKET_LENGTH_DELTA, SID_NORM_BP1_F2 ); if (incomingMsg->event & RTEMS_EVENT_NORM_BP2_F2) @@ -221,7 +217,7 @@ rtems_task prc2_task( rtems_task_argumen // 2) send the BP2 set set_time( packet_norm_bp2.time, (unsigned char *) &incomingMsg->coarseTimeNORM ); set_time( packet_norm_bp2.acquisitionTime, (unsigned char *) &incomingMsg->coarseTimeNORM ); - BP_send( (char *) &packet_norm_bp2, queue_id, + BP_send( (char *) &packet_norm_bp2, queue_id_send, PACKET_LENGTH_TM_LFR_SCIENCE_NORM_BP2_F2 + PACKET_LENGTH_DELTA, SID_NORM_BP2_F2 ); } @@ -239,7 +235,7 @@ rtems_task prc2_task( rtems_task_argumen current_ring_node_to_send_asm_f2->fineTime = incomingMsg->fineTimeNORM; current_ring_node_to_send_asm_f2->sid = SID_NORM_ASM_F2; // 3) send the spectral matrix packets - status = rtems_message_queue_send( queue_id, ¤t_ring_node_to_send_asm_f2, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id_send, ¤t_ring_node_to_send_asm_f2, sizeof( ring_node* ) ); // change asm ring node current_ring_node_to_send_asm_f2 = current_ring_node_to_send_asm_f2->next; } 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 @@ -72,6 +72,8 @@ void spectral_matrices_isr_f0( void ) break; case 1: full_ring_node = current_ring_node_sm_f0->previous; + full_ring_node->coarseTime = spectral_matrix_regs->f0_0_coarse_time; + full_ring_node->fineTime = spectral_matrix_regs->f0_0_fine_time; current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_0_address = current_ring_node_sm_f0->buffer_address; // if there are enough ring nodes ready, wake up an AVFx task @@ -79,8 +81,6 @@ void spectral_matrices_isr_f0( void ) if (nb_sm_f0 == NB_SM_BEFORE_AVF0) { ring_node_for_averaging_sm_f0 = full_ring_node; - ring_node_for_averaging_sm_f0->coarseTime = spectral_matrix_regs->f0_0_coarse_time; - ring_node_for_averaging_sm_f0->fineTime = spectral_matrix_regs->f0_0_fine_time; if (rtems_event_send( Task_id[TASKID_AVF0], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); @@ -91,6 +91,8 @@ void spectral_matrices_isr_f0( void ) break; case 2: full_ring_node = current_ring_node_sm_f0->previous; + full_ring_node->coarseTime = spectral_matrix_regs->f0_1_coarse_time; + full_ring_node->fineTime = spectral_matrix_regs->f0_1_fine_time; current_ring_node_sm_f0 = current_ring_node_sm_f0->next; spectral_matrix_regs->f0_1_address = current_ring_node_sm_f0->buffer_address; // if there are enough ring nodes ready, wake up an AVFx task @@ -98,8 +100,6 @@ void spectral_matrices_isr_f0( void ) if (nb_sm_f0 == NB_SM_BEFORE_AVF0) { ring_node_for_averaging_sm_f0 = full_ring_node; - ring_node_for_averaging_sm_f0->coarseTime = spectral_matrix_regs->f0_1_coarse_time; - ring_node_for_averaging_sm_f0->fineTime = spectral_matrix_regs->f0_1_fine_time; if (rtems_event_send( Task_id[TASKID_AVF0], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); @@ -130,6 +130,8 @@ void spectral_matrices_isr_f1( void ) break; case 1: full_ring_node = current_ring_node_sm_f1->previous; + full_ring_node->coarseTime = spectral_matrix_regs->f1_0_coarse_time; + full_ring_node->fineTime = spectral_matrix_regs->f1_0_fine_time; current_ring_node_sm_f1 = current_ring_node_sm_f1->next; spectral_matrix_regs->f1_0_address = current_ring_node_sm_f1->buffer_address; // if there are enough ring nodes ready, wake up an AVFx task @@ -137,8 +139,6 @@ void spectral_matrices_isr_f1( void ) if (nb_sm_f1 == NB_SM_BEFORE_AVF1) { ring_node_for_averaging_sm_f1 = full_ring_node; - ring_node_for_averaging_sm_f1->coarseTime = spectral_matrix_regs->f1_0_coarse_time; - ring_node_for_averaging_sm_f1->fineTime = spectral_matrix_regs->f1_0_fine_time; if (rtems_event_send( Task_id[TASKID_AVF1], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); @@ -149,6 +149,8 @@ void spectral_matrices_isr_f1( void ) break; case 2: full_ring_node = current_ring_node_sm_f1->previous; + full_ring_node->coarseTime = spectral_matrix_regs->f1_1_coarse_time; + full_ring_node->fineTime = spectral_matrix_regs->f1_1_fine_time; current_ring_node_sm_f1 = current_ring_node_sm_f1->next; spectral_matrix_regs->f1_1_address = current_ring_node_sm_f1->buffer_address; // if there are enough ring nodes ready, wake up an AVFx task @@ -156,8 +158,6 @@ void spectral_matrices_isr_f1( void ) if (nb_sm_f1 == NB_SM_BEFORE_AVF1) { ring_node_for_averaging_sm_f1 = full_ring_node; - ring_node_for_averaging_sm_f1->coarseTime = spectral_matrix_regs->f1_1_coarse_time; - ring_node_for_averaging_sm_f1->fineTime = spectral_matrix_regs->f1_1_fine_time; if (rtems_event_send( Task_id[TASKID_AVF1], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { status_code = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_3 ); @@ -343,75 +343,75 @@ void SM_reset_current_ring_nodes( void ) //***************** // Basic Parameters -void BP_init_header( bp_packet *header, +void BP_init_header( bp_packet *packet, unsigned int apid, unsigned char sid, unsigned int packetLength, unsigned char blkNr ) { - header->targetLogicalAddress = CCSDS_DESTINATION_ID; - header->protocolIdentifier = CCSDS_PROTOCOLE_ID; - header->reserved = 0x00; - header->userApplication = CCSDS_USER_APP; - header->packetID[0] = (unsigned char) (apid >> 8); - header->packetID[1] = (unsigned char) (apid); - header->packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; - header->packetSequenceControl[1] = 0x00; - header->packetLength[0] = (unsigned char) (packetLength >> 8); - header->packetLength[1] = (unsigned char) (packetLength); + packet->targetLogicalAddress = CCSDS_DESTINATION_ID; + packet->protocolIdentifier = CCSDS_PROTOCOLE_ID; + packet->reserved = 0x00; + packet->userApplication = CCSDS_USER_APP; + packet->packetID[0] = (unsigned char) (apid >> 8); + packet->packetID[1] = (unsigned char) (apid); + packet->packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; + packet->packetSequenceControl[1] = 0x00; + packet->packetLength[0] = (unsigned char) (packetLength >> 8); + packet->packetLength[1] = (unsigned char) (packetLength); // DATA FIELD HEADER - header->spare1_pusVersion_spare2 = 0x10; - header->serviceType = TM_TYPE_LFR_SCIENCE; // service type - header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype - header->destinationID = TM_DESTINATION_ID_GROUND; - header->time[0] = 0x00; - header->time[1] = 0x00; - header->time[2] = 0x00; - header->time[3] = 0x00; - header->time[4] = 0x00; - header->time[5] = 0x00; + packet->spare1_pusVersion_spare2 = 0x10; + packet->serviceType = TM_TYPE_LFR_SCIENCE; // service type + packet->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype + packet->destinationID = TM_DESTINATION_ID_GROUND; + packet->time[0] = 0x00; + packet->time[1] = 0x00; + packet->time[2] = 0x00; + packet->time[3] = 0x00; + packet->time[4] = 0x00; + packet->time[5] = 0x00; // AUXILIARY DATA HEADER - header->sid = sid; - header->biaStatusInfo = 0x00; - header->acquisitionTime[0] = 0x00; - header->acquisitionTime[1] = 0x00; - header->acquisitionTime[2] = 0x00; - header->acquisitionTime[3] = 0x00; - header->acquisitionTime[4] = 0x00; - header->acquisitionTime[5] = 0x00; - header->pa_lfr_bp_blk_nr[0] = 0x00; // BLK_NR MSB - header->pa_lfr_bp_blk_nr[1] = blkNr; // BLK_NR LSB + packet->sid = sid; + packet->biaStatusInfo = 0x00; + packet->acquisitionTime[0] = 0x00; + packet->acquisitionTime[1] = 0x00; + packet->acquisitionTime[2] = 0x00; + packet->acquisitionTime[3] = 0x00; + packet->acquisitionTime[4] = 0x00; + packet->acquisitionTime[5] = 0x00; + packet->pa_lfr_bp_blk_nr[0] = 0x00; // BLK_NR MSB + packet->pa_lfr_bp_blk_nr[1] = blkNr; // BLK_NR LSB } -void BP_init_header_with_spare(Header_TM_LFR_SCIENCE_BP_with_spare_t *header, +void BP_init_header_with_spare( bp_packet_with_spare *packet, unsigned int apid, unsigned char sid, unsigned int packetLength , unsigned char blkNr) { - header->targetLogicalAddress = CCSDS_DESTINATION_ID; - header->protocolIdentifier = CCSDS_PROTOCOLE_ID; - header->reserved = 0x00; - header->userApplication = CCSDS_USER_APP; - header->packetID[0] = (unsigned char) (apid >> 8); - header->packetID[1] = (unsigned char) (apid); - header->packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; - header->packetSequenceControl[1] = 0x00; - header->packetLength[0] = (unsigned char) (packetLength >> 8); - header->packetLength[1] = (unsigned char) (packetLength); + packet->targetLogicalAddress = CCSDS_DESTINATION_ID; + packet->protocolIdentifier = CCSDS_PROTOCOLE_ID; + packet->reserved = 0x00; + packet->userApplication = CCSDS_USER_APP; + packet->packetID[0] = (unsigned char) (apid >> 8); + packet->packetID[1] = (unsigned char) (apid); + packet->packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; + packet->packetSequenceControl[1] = 0x00; + packet->packetLength[0] = (unsigned char) (packetLength >> 8); + packet->packetLength[1] = (unsigned char) (packetLength); // DATA FIELD HEADER - header->spare1_pusVersion_spare2 = 0x10; - header->serviceType = TM_TYPE_LFR_SCIENCE; // service type - header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype - header->destinationID = TM_DESTINATION_ID_GROUND; + packet->spare1_pusVersion_spare2 = 0x10; + packet->serviceType = TM_TYPE_LFR_SCIENCE; // service type + packet->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype + packet->destinationID = TM_DESTINATION_ID_GROUND; // AUXILIARY DATA HEADER - header->sid = sid; - header->biaStatusInfo = 0x00; - header->time[0] = 0x00; - header->time[0] = 0x00; - header->time[0] = 0x00; - header->time[0] = 0x00; - header->time[0] = 0x00; - header->time[0] = 0x00; - header->source_data_spare = 0x00; - header->pa_lfr_bp_blk_nr[0] = 0x00; // BLK_NR MSB - header->pa_lfr_bp_blk_nr[1] = blkNr; // BLK_NR LSB + packet->sid = sid; + packet->biaStatusInfo = 0x00; + packet->time[0] = 0x00; + packet->time[0] = 0x00; + packet->time[0] = 0x00; + packet->time[0] = 0x00; + packet->time[0] = 0x00; + packet->time[0] = 0x00; + packet->source_data_spare = 0x00; + packet->pa_lfr_bp_blk_nr[0] = 0x00; // BLK_NR MSB + packet->pa_lfr_bp_blk_nr[1] = blkNr; // BLK_NR LSB } void BP_send(char *data, rtems_id queue_id, unsigned int nbBytesToSend, unsigned int sid ) diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -29,6 +29,7 @@ ring_node *ring_node_to_send_cwf_f2; ring_node waveform_ring_f3[NB_RING_NODES_F3]; ring_node *current_ring_node_f3; ring_node *ring_node_to_send_cwf_f3; +char wf_cont_f3_light[ (NB_SAMPLES_PER_SNAPSHOT) * NB_BYTES_CWF3_LIGHT_BLK ]; bool extractSWF = false; bool swf_f0_ready = false; @@ -120,7 +121,6 @@ inline void waveforms_isr_f3( void ) if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { spare_status = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ); } - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2); } } } @@ -204,31 +204,34 @@ inline void waveforms_isr_burst( void ) unsigned char status; rtems_status_code spare_status; - status = (waveform_picker_regs->status & 0x30) >> 4; // [0011 0000] get the status_ready_matrix_f0_x bits + status = (waveform_picker_regs->status & 0x30) >> 4; // [0011 0000] get the status bits for f2 + switch(status) { case 1: ring_node_to_send_cwf_f2 = current_ring_node_f2->previous; + ring_node_to_send_cwf_f2->sid = SID_BURST_CWF_F2; current_ring_node_f2 = current_ring_node_f2->next; ring_node_to_send_cwf_f2->coarseTime = waveform_picker_regs->f2_0_coarse_time; ring_node_to_send_cwf_f2->fineTime = waveform_picker_regs->f2_0_fine_time; waveform_picker_regs->addr_data_f2_0 = current_ring_node_f2->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00004410; // [0100 0100 0001 0000] if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) { spare_status = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ); } + waveform_picker_regs->status = waveform_picker_regs->status & 0x00004410; // [0100 0100 0001 0000] break; case 2: ring_node_to_send_cwf_f2 = current_ring_node_f2->previous; + ring_node_to_send_cwf_f2->sid = SID_BURST_CWF_F2; current_ring_node_f2 = current_ring_node_f2->next; ring_node_to_send_cwf_f2->coarseTime = waveform_picker_regs->f2_1_coarse_time; ring_node_to_send_cwf_f2->fineTime = waveform_picker_regs->f2_1_fine_time; waveform_picker_regs->addr_data_f2_1 = current_ring_node_f2->buffer_address; - waveform_picker_regs->status = waveform_picker_regs->status & 0x00004420; // [0100 0100 0010 0000] if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_BURST ) != RTEMS_SUCCESSFUL) { spare_status = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ); } + waveform_picker_regs->status = waveform_picker_regs->status & 0x00004420; // [0100 0100 0010 0000] break; default: break; @@ -319,8 +322,9 @@ inline void waveforms_isr_sbm2( void ) // F2 if ( (waveform_picker_regs->status & 0x30) != 0x00 ) { // [0011 0000] check the f2 full bit // (1) change the receiving buffer for the waveform picker - ring_node_to_send_cwf_f2 = current_ring_node_f2->previous; - current_ring_node_f2 = current_ring_node_f2->next; + ring_node_to_send_cwf_f2 = current_ring_node_f2->previous; + ring_node_to_send_cwf_f2->sid = SID_SBM2_CWF_F2; + current_ring_node_f2 = current_ring_node_f2->next; if ( (waveform_picker_regs->status & 0x10) == 0x10) { ring_node_to_send_cwf_f2->coarseTime = waveform_picker_regs->f2_0_coarse_time; @@ -615,6 +619,9 @@ rtems_task cwf2_task(rtems_task_argument rtems_id queue_id; rtems_status_code status; ring_node *ring_node_to_send; + unsigned long long int acquisitionTimeF0_asLong; + + acquisitionTimeF0_asLong = 0x00; status = get_message_queue_id_send( &queue_id ); if (status != RTEMS_SUCCESSFUL) @@ -629,27 +636,19 @@ rtems_task cwf2_task(rtems_task_argument rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); ring_node_to_send = getRingNodeToSendCWF( 2 ); - printf("ring_node_to_send_cwf === coarse = %x, fine = %x\n", ring_node_to_send->coarseTime, ring_node_to_send->fineTime); - printf("**0** %x . %x", waveform_ring_f2[0].coarseTime, waveform_ring_f2[0].fineTime); - printf(" **1** %x . %x", waveform_ring_f2[1].coarseTime, waveform_ring_f2[1].fineTime); - printf(" **2** %x . %x", waveform_ring_f2[2].coarseTime, waveform_ring_f2[2].fineTime); - printf(" **3** %x . %x", waveform_ring_f2[3].coarseTime, waveform_ring_f2[3].fineTime); - printf(" **4** %x . %x\n", waveform_ring_f2[4].coarseTime, waveform_ring_f2[4].fineTime); if (event_out == RTEMS_EVENT_MODE_BURST) { - ring_node_to_send->sid = SID_BURST_CWF_F2; status = rtems_message_queue_send( queue_id, &ring_node_to_send, sizeof( ring_node* ) ); } if (event_out == RTEMS_EVENT_MODE_SBM2) { - ring_node_to_send->sid = SID_SBM2_CWF_F2; status = rtems_message_queue_send( queue_id, &ring_node_to_send, sizeof( ring_node* ) ); // launch snapshot extraction if needed if (extractSWF == true) { - ring_node_to_send_swf_f2 = ring_node_to_send; + ring_node_to_send_swf_f2 = ring_node_to_send_cwf_f2; // extract the snapshot - build_snapshot_from_ring( ring_node_to_send_swf_f2, 2 ); + build_snapshot_from_ring( ring_node_to_send_swf_f2, 2, acquisitionTimeF0_asLong ); // send the snapshot when built status = rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ); extractSWF = false; @@ -657,6 +656,8 @@ rtems_task cwf2_task(rtems_task_argument if (swf_f0_ready && swf_f1_ready) { extractSWF = true; + // record the acquition time of the fà snapshot to use to build the snapshot at f2 + acquisitionTimeF0_asLong = get_acquisition_time( (unsigned char *) &ring_node_to_send_swf_f0->coarseTime ); swf_f0_ready = false; swf_f1_ready = false; } @@ -694,12 +695,6 @@ rtems_task cwf1_task(rtems_task_argument rtems_event_receive( RTEMS_EVENT_MODE_SBM1, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); ring_node_to_send_cwf = getRingNodeToSendCWF( 1 ); - printf("ring_node_to_send_cwf === coarse = %x, fine = %x\n", ring_node_to_send_cwf->coarseTime, ring_node_to_send_cwf->fineTime); - printf("**0** %x . %x", waveform_ring_f1[0].coarseTime, waveform_ring_f1[0].fineTime); - printf(" **1** %x . %x", waveform_ring_f1[1].coarseTime, waveform_ring_f1[1].fineTime); - printf(" **2** %x . %x", waveform_ring_f1[2].coarseTime, waveform_ring_f1[2].fineTime); - printf(" **3** %x . %x", waveform_ring_f1[3].coarseTime, waveform_ring_f1[3].fineTime); - printf(" **4** %x . %x\n\n", waveform_ring_f1[4].coarseTime, waveform_ring_f1[4].fineTime); ring_node_to_send_cwf_f1->sid = SID_SBM1_CWF_F1; status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf, sizeof( ring_node* ) ); // launch snapshot extraction if needed @@ -733,6 +728,9 @@ rtems_task swbd_task(rtems_task_argument */ rtems_event_set event_out; + unsigned long long int acquisitionTimeF0_asLong; + + acquisitionTimeF0_asLong = 0x00; BOOT_PRINTF("in SWBD ***\n") @@ -742,7 +740,8 @@ rtems_task swbd_task(rtems_task_argument RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); if (event_out == RTEMS_EVENT_MODE_SBM1) { - build_snapshot_from_ring( ring_node_to_send_swf_f1, 1 ); + acquisitionTimeF0_asLong = get_acquisition_time( (unsigned char *) &ring_node_to_send_swf_f0->coarseTime ); + build_snapshot_from_ring( ring_node_to_send_swf_f1, 1, acquisitionTimeF0_asLong ); swf_f1_ready = true; // the snapshot has been extracted and is ready to be sent } else @@ -868,6 +867,8 @@ int send_waveform_CWF3_light( ring_node wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 5 ] = sample[ 5 ]; } + printf("send_waveform_CWF3_light => [0] = %x, [1] = %x, [2] = %x\n", dataPtr[0], dataPtr[1], dataPtr[2]); + // SEND PACKET status = rtems_message_queue_send( queue_id, &ring_node_cwf3_light, sizeof( ring_node* ) ); if (status != RTEMS_SUCCESSFUL) { @@ -952,11 +953,10 @@ void compute_acquisition_time( unsigned } -void build_snapshot_from_ring( ring_node *ring_node_to_send, unsigned char frequencyChannel ) +void build_snapshot_from_ring( ring_node *ring_node_to_send, unsigned char frequencyChannel, unsigned long long int acquisitionTimeF0_asLong ) { unsigned int i; unsigned long long int centerTime_asLong; - unsigned long long int acquisitionTimeF0_asLong; unsigned long long int acquisitionTime_asLong; unsigned long long int bufferAcquisitionTime_asLong; unsigned char *ptr1; @@ -977,11 +977,11 @@ void build_snapshot_from_ring( ring_node deltaT_F2 = 262144; // (2048. / 256. / 2.) * 65536. = 262144; sampleOffset_asLong = 0x00; - // (1) get the f0 acquisition time - acquisitionTimeF0_asLong = get_acquisition_time( (unsigned char *) &ring_node_to_send->coarseTime ); + // (1) get the f0 acquisition time => the value is passed in argument // (2) compute the central reference time centerTime_asLong = acquisitionTimeF0_asLong + deltaT_F0; + printf("centerTime_asLong = %llx\n", centerTime_asLong); // (3) compute the acquisition time of the current snapshot switch(frequencyChannel) @@ -1010,7 +1010,7 @@ void build_snapshot_from_ring( ring_node for (i=0; icoarseTime ); + bufferAcquisitionTime_asLong = get_acquisition_time( (unsigned char *) &ring_node_to_send->coarseTime ); if (bufferAcquisitionTime_asLong <= acquisitionTime_asLong) { PRINTF1("buffer found with acquisition time = %llx\n", bufferAcquisitionTime_asLong) @@ -1022,7 +1022,7 @@ void build_snapshot_from_ring( ring_node // (5) compute the number of samples to take in the current buffer sampleOffset_asLong = ((acquisitionTime_asLong - bufferAcquisitionTime_asLong) * frequency_asLong ) >> 16; nbSamplesPart1_asLong = NB_SAMPLES_PER_SNAPSHOT - sampleOffset_asLong; - PRINTF2("sampleOffset_asLong = %llx, nbSamplesPart1_asLong = %llx\n", sampleOffset_asLong, nbSamplesPart1_asLong) + PRINTF2("sampleOffset_asLong = %lld, nbSamplesPart1_asLong = %lld\n", sampleOffset_asLong, nbSamplesPart1_asLong) // (6) compute the final acquisition time acquisitionTime_asLong = bufferAcquisitionTime_asLong +