# HG changeset patch # User paul # Date 2014-11-13 07:04:48 # Node ID ddd72945217c9395cee162076335b6cc4192d64b # Parent 13f27d43af3293d85afa8bb522b097895e2e4331 New version of the waveform picker packet transmission The SEND task has been modified diff --git a/FSW-qt/Makefile b/FSW-qt/Makefile --- a/FSW-qt/Makefile +++ b/FSW-qt/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: bin/fsw -# Generated by qmake (2.01a) (Qt 4.8.6) on: Thu Nov 6 16:03:39 2014 +# Generated by qmake (2.01a) (Qt 4.8.6) on: Thu Nov 13 07:59:00 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=2 -DSW_VERSION_N2=0 -DSW_VERSION_N3=1 -DSW_VERSION_N4=1 -DLPP_DPU_DESTID -DPRINT_MESSAGES_ON_CONSOLE -DPRINT_TASK_STATISTICS +DEFINES = -DSW_VERSION_N1=2 -DSW_VERSION_N2=0 -DSW_VERSION_N3=1 -DSW_VERSION_N4=1 -DLPP_DPU_DESTID -DPRINT_MESSAGES_ON_CONSOLE CFLAGS = -pipe -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header -I../header/processing -I../src/LFR_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 @@ -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 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,6 +1,6 @@ - + EnvironmentId diff --git a/header/fsw_misc.h b/header/fsw_misc.h --- a/header/fsw_misc.h +++ b/header/fsw_misc.h @@ -34,7 +34,6 @@ void getTime( unsigned char *time); unsigned long long int getTimeAsUnsignedLongLongInt( ); void send_dumb_hk( void ); void get_v_e1_e2_f3(unsigned char *spacecraft_potential); -void get_v_e1_e2_f3_alt(unsigned char *spacecraft_potential); void get_cpu_load( unsigned char *resource_statistics ); extern int sched_yield( void ); diff --git a/header/fsw_params.h b/header/fsw_params.h --- a/header/fsw_params.h +++ b/header/fsw_params.h @@ -14,6 +14,7 @@ typedef struct ring_node { struct ring_node *previous; struct ring_node *next; + unsigned int sid; unsigned int coarseTime; unsigned int fineTime; int buffer_address; 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 @@ -12,6 +12,7 @@ #define NB_RING_NODES_SM_F0 12 // AT LEAST 8 due to the way the averaging is done #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_RING_NODES_ASM_F0 3 // AT LEAST 3 #define NB_RING_NODES_SM_F1 12 // AT LEAST 8 due to the way the averaging is done #define NB_RING_NODES_ASM_BURST_SBM_F1 5 // AT LEAST 3 #define NB_RING_NODES_ASM_NORM_F1 5 // AT LEAST 3 diff --git a/header/fsw_spacewire.h b/header/fsw_spacewire.h --- a/header/fsw_spacewire.h +++ b/header/fsw_spacewire.h @@ -31,6 +31,14 @@ void spacewire_set_RE( unsigned char val void spacewire_compute_stats_offsets( void ); void spacewire_update_statistics( void ); +void init_header_cwf( Header_TM_LFR_SCIENCE_CWF_t *header ); +void init_header_swf( Header_TM_LFR_SCIENCE_SWF_t *header ); +void init_header_asm( Header_TM_LFR_SCIENCE_ASM_t *header ); +int spw_send_waveform_CWF( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_CWF_t *header ); +int spw_send_waveform_SWF( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_SWF_t *header ); +int spw_send_waveform_CWF3_light( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_CWF_t *header ); +void spw_send_asm( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); + void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ); rtems_timer_service_routine user_routine( rtems_id timer_id, void *user_data ); diff --git a/header/processing/avf2_prc2.h b/header/processing/avf2_prc2.h --- a/header/processing/avf2_prc2.h +++ b/header/processing/avf2_prc2.h @@ -18,7 +18,7 @@ rtems_task prc2_task( rtems_task_argumen // FUNCTIONS void reset_nb_sm_f2( void ); -void SM_average_f2( float *averaged_spec_mat_f2, ring_node_sm *ring_node, unsigned int nbAverageNormF2 ); +void SM_average_f2(float *averaged_spec_mat_f2, ring_node_sm *ring_node, unsigned int nbAverageNormF2 ); //******* // EXTERN 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 @@ -13,12 +13,12 @@ typedef struct ring_node_sm { - struct ring_node_sm *previous; - struct ring_node_sm *next; - int buffer_address; - unsigned int status; - unsigned int coarseTime; - unsigned int fineTime; +struct ring_node_sm *previous; +struct ring_node_sm *next; +int buffer_address; +unsigned int status; +unsigned int coarseTime; +unsigned int fineTime; } ring_node_sm; typedef struct ring_node_asm @@ -73,7 +73,6 @@ void reset_nb_sm( void ); // SM void SM_init_rings( void ); void SM_reset_current_ring_nodes( void ); -void SM_generic_init_ring(ring_node_sm *ring, unsigned char nbNodes, volatile int sm_f[] ); // ASM void ASM_generic_init_ring(ring_node_asm *ring, unsigned char nbNodes ); void ASM_init_header( Header_TM_LFR_SCIENCE_ASM_t *header); @@ -100,8 +99,8 @@ void reset_sm_status( void ); void reset_spectral_matrix_regs( void ); void set_time(unsigned char *time, unsigned char *timeInBuffer ); unsigned long long int get_acquisition_time( unsigned char *timePtr ); -void close_matrix_actions(unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id avf_task_id, - ring_node_sm *node_for_averaging, ring_node_sm *ringNode, unsigned long long int time); +void close_matrix_actions( unsigned int *nb_sm, unsigned int nb_sm_before_avf, rtems_id avf_task_id, + ring_node_sm *node_for_averaging, ring_node_sm *ringNode, unsigned long long int time ); unsigned char getSID( rtems_event_set event ); extern rtems_status_code get_message_queue_id_prc1( rtems_id *queue_id ); @@ -109,7 +108,10 @@ extern rtems_status_code get_message_que //*************************************** // DEFINITIONS OF STATIC INLINE FUNCTIONS -static inline void SM_average( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, +static inline void SM_average(float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, + ring_node_sm *ring_node_tab[], + unsigned int nbAverageNORM, unsigned int nbAverageSBM ); +static inline void SM_average_debug( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, ring_node_sm *ring_node_tab[], unsigned int nbAverageNORM, unsigned int nbAverageSBM ); static inline void ASM_reorganize_and_divide(float *averaged_spec_mat, float *averaged_spec_mat_reorganized, @@ -119,7 +121,7 @@ static inline void ASM_compress_reorgani unsigned char nbBinsCompressedMatrix, unsigned char nbBinsToAverage , unsigned char ASMIndexStart); static inline void ASM_convert(volatile float *input_matrix, char *output_matrix); -void SM_average( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, +void SM_average_debug( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, ring_node_sm *ring_node_tab[], unsigned int nbAverageNORM, unsigned int nbAverageSBM ) { @@ -159,6 +161,39 @@ void SM_average( float *averaged_spec_ma } } +void SM_average( float *averaged_spec_mat_NORM, float *averaged_spec_mat_SBM, + ring_node_sm *ring_node_tab[], + unsigned int nbAverageNORM, unsigned int nbAverageSBM ) +{ + float sum; + unsigned int i; + + for(i=0; ibuffer_address) ) [ i ]; + + if ( (nbAverageNORM == 0) && (nbAverageSBM == 0) ) + { + averaged_spec_mat_NORM[ i ] = sum; + averaged_spec_mat_SBM[ i ] = sum; + } + else if ( (nbAverageNORM != 0) && (nbAverageSBM != 0) ) + { + averaged_spec_mat_NORM[ i ] = sum; + averaged_spec_mat_SBM[ i ] = sum; + } + else if ( (nbAverageNORM != 0) && (nbAverageSBM == 0) ) + { + averaged_spec_mat_NORM[ i ] = sum; + averaged_spec_mat_SBM[ i ] = sum; + } + else + { + PRINTF2("ERR *** in SM_average *** unexpected parameters %d %d\n", nbAverageNORM, nbAverageSBM) + } + } +} + void ASM_reorganize_and_divide( float *averaged_spec_mat, float *averaged_spec_mat_reorganized, float divider ) { int frequencyBin; diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -17,10 +17,10 @@ extern int fdSPW; //***************** // waveform buffers -extern volatile int wf_snap_f0[ ]; -extern volatile int wf_snap_f1[ ]; -extern volatile int wf_snap_f2[ ]; -extern volatile int wf_cont_f3[ ]; +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; @@ -52,17 +52,12 @@ rtems_task swbd_task( rtems_task_argumen //****************** // general functions void WFP_init_rings( void ); -void init_waveform_ring( ring_node waveform_ring[], unsigned char nbNodes, volatile int wfrm[] ); +void init_ring( ring_node ring[], unsigned char nbNodes, volatile int buffer[] , unsigned int bufferSize ); void WFP_reset_current_ring_nodes( void ); // -int init_header_snapshot_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF ); -int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF ); int init_header_continuous_cwf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF ); // -int send_waveform_SWF( ring_node *ring_node_to_send, unsigned int sid, Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id ); -int send_waveform_CWF( ring_node *ring_node_to_send, unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id ); -int send_waveform_CWF3_light( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id ); -int send_ring_node_CWF( ring_node *ring_node_to_send ); +int send_waveform_CWF3_light(ring_node *ring_node_to_send, ring_node *ring_node_cwf3_light, rtems_id queue_id ); // void compute_acquisition_time(unsigned int coarseTime, unsigned int fineTime, unsigned int sid, unsigned char pa_lfr_pkt_nr, unsigned char *acquisitionTime ); diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -37,10 +37,10 @@ unsigned char lfrCurrentMode; // WAVEFORMS GLOBAL VARIABLES // 2688 * 3 * 4 + 2 * 4 = 32256 + 8 bytes = 32264 // 127 * 256 = 32512 => delta = 248 bytes = 62 words // F0 F1 F2 F3 -volatile int wf_snap_f0[ NB_RING_NODES_F0 * WFRM_BUFFER ] __attribute__((aligned(0x100))); -volatile int wf_snap_f1[ NB_RING_NODES_F1 * WFRM_BUFFER ] __attribute__((aligned(0x100))); -volatile int wf_snap_f2[ NB_RING_NODES_F2 * WFRM_BUFFER ] __attribute__((aligned(0x100))); -volatile int wf_cont_f3[ NB_RING_NODES_F3 * WFRM_BUFFER ] __attribute__((aligned(0x100))); +volatile int wf_buffer_f0[ NB_RING_NODES_F0 * WFRM_BUFFER ] __attribute__((aligned(0x100))); +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))); //*********************************** diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -321,7 +321,7 @@ int create_all_tasks( void ) // create a status = rtems_task_create( Task_name[TASKID_SEND], TASK_PRIORITY_SEND, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT, - RTEMS_DEFAULT_ATTRIBUTES, &Task_id[TASKID_SEND] + RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT, &Task_id[TASKID_SEND] ); } if (status == RTEMS_SUCCESSFUL) // WTDG diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -225,11 +225,11 @@ rtems_task hous_task(rtems_task_argument spacewire_update_statistics(); -// get_v_e1_e2_f3_alt( housekeeping_packet.hk_lfr_sc_v_f3 ); +// get_v_e1_e2_f3( housekeeping_packet.hk_lfr_sc_v_f3 ); get_cpu_load( (unsigned char *) &housekeeping_packet.hk_lfr_cpu_load ); // SEND PACKET - status = rtems_message_queue_urgent( queue_id, &housekeeping_packet, + status = rtems_message_queue_send( queue_id, &housekeeping_packet, PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES); if (status != RTEMS_SUCCESSFUL) { PRINTF1("in HOUS *** ERR send: %d\n", status) @@ -437,73 +437,12 @@ void send_dumb_hk( void ) get_message_queue_id_send( &queue_id ); - rtems_message_queue_urgent( queue_id, &dummy_hk_packet, + rtems_message_queue_send( queue_id, &dummy_hk_packet, PACKET_LENGTH_HK + CCSDS_TC_TM_PACKET_OFFSET + CCSDS_PROTOCOLE_EXTRA_BYTES); } void get_v_e1_e2_f3( unsigned char *spacecraft_potential ) { - unsigned int coarseTime; - unsigned int acquisitionTime; - unsigned int deltaT = 0; - unsigned char *bufferPtr; - - unsigned int offset_in_samples; - unsigned int offset_in_bytes; - unsigned char f3 = 16; // v, e1 and e2 will be picked up each second, f3 = 16 Hz - - bufferPtr = NULL; - - if (lfrCurrentMode == LFR_MODE_STANDBY) - { - spacecraft_potential[0] = 0x00; - spacecraft_potential[1] = 0x00; - spacecraft_potential[2] = 0x00; - spacecraft_potential[3] = 0x00; - spacecraft_potential[4] = 0x00; - spacecraft_potential[5] = 0x00; - } - else - { - coarseTime = time_management_regs->coarse_time & 0x7fffffff; - bufferPtr = (unsigned char*) current_ring_node_f3->buffer_address; - acquisitionTime = (unsigned int) ( ( bufferPtr[0] & 0x7f ) << 24 ) - + (unsigned int) ( bufferPtr[1] << 16 ) - + (unsigned int) ( bufferPtr[2] << 8 ) - + (unsigned int) ( bufferPtr[3] ); - if ( coarseTime > acquisitionTime ) - { - deltaT = coarseTime - acquisitionTime; - offset_in_samples = (deltaT-1) * f3 ; - } - else if( coarseTime == acquisitionTime ) - { - bufferPtr = (unsigned char*) current_ring_node_f3->previous->buffer_address; // pick up v e1 and e2 in the previous f3 buffer - offset_in_samples = NB_SAMPLES_PER_SNAPSHOT-1; - } - else - { - offset_in_samples = 0; -// PRINTF2("ERR *** in get_v_e1_e2_f3 *** coarseTime = %x, acquisitionTime = %x\n", coarseTime, acquisitionTime) - } - - if ( offset_in_samples > (NB_SAMPLES_PER_SNAPSHOT - 1) ) - { -// PRINTF1("ERR *** in get_v_e1_e2_f3 *** trying to read out of the buffer, counter = %d\n", offset_in_samples) - offset_in_samples = NB_SAMPLES_PER_SNAPSHOT -1; - } - offset_in_bytes = TIME_OFFSET_IN_BYTES + offset_in_samples * NB_WORDS_SWF_BLK * 4; - spacecraft_potential[0] = bufferPtr[ offset_in_bytes + 0]; - spacecraft_potential[1] = bufferPtr[ offset_in_bytes + 1]; - spacecraft_potential[2] = bufferPtr[ offset_in_bytes + 2]; - spacecraft_potential[3] = bufferPtr[ offset_in_bytes + 3]; - spacecraft_potential[4] = bufferPtr[ offset_in_bytes + 4]; - spacecraft_potential[5] = bufferPtr[ offset_in_bytes + 5]; - } -} - -void get_v_e1_e2_f3_alt( unsigned char *spacecraft_potential ) -{ unsigned long long int localTime_asLong; unsigned long long int f3_0_AcquisitionTime_asLong; unsigned long long int f3_1_AcquisitionTime_asLong; diff --git a/src/fsw_spacewire.c b/src/fsw_spacewire.c --- a/src/fsw_spacewire.c +++ b/src/fsw_spacewire.c @@ -16,6 +16,12 @@ rtems_name semq_name; rtems_id semq_id; +//***************** +// waveform headers +Header_TM_LFR_SCIENCE_CWF_t headerCWF; +Header_TM_LFR_SCIENCE_SWF_t headerSWF; +Header_TM_LFR_SCIENCE_ASM_t headerASM; + //*********** // RTEMS TASK rtems_task spiq_task(rtems_task_argument unused) @@ -204,10 +210,23 @@ rtems_task send_task( rtems_task_argumen rtems_status_code status; // RTEMS status code char incomingData[MSG_QUEUE_SIZE_SEND]; // incoming data buffer + ring_node *incomingRingNodePtr; + int ring_node_address; + char *charPtr; spw_ioctl_pkt_send *spw_ioctl_send; size_t size; // size of the incoming TC packet u_int32_t count; rtems_id queue_id; + unsigned char sid; + + incomingRingNodePtr = NULL; + ring_node_address = 0; + charPtr = (char *) &ring_node_address; + sid = 0; + + init_header_cwf( &headerCWF ); + init_header_swf( &headerSWF ); + init_header_asm( &headerASM ); status = get_message_queue_id_send( &queue_id ); if (status != RTEMS_SUCCESSFUL) @@ -228,7 +247,40 @@ rtems_task send_task( rtems_task_argumen } else { - if ( incomingData[0] == CCSDS_DESTINATION_ID ) // the incoming message is a ccsds packet + if ( size == sizeof(ring_node*) ) + { + charPtr[0] = incomingData[0]; + charPtr[1] = incomingData[1]; + charPtr[2] = incomingData[2]; + 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 ) + || (sid==SID_SBM2_CWF_F2 )) + { + spw_send_waveform_CWF( incomingRingNodePtr, &headerCWF ); + } + else if ( (sid==SID_NORM_SWF_F0) || (sid== SID_NORM_SWF_F1) || (sid==SID_NORM_SWF_F2) ) + { + spw_send_waveform_SWF( incomingRingNodePtr, &headerSWF ); + } + else if ( (sid==SID_NORM_CWF_F3) ) + { + spw_send_waveform_CWF3_light( incomingRingNodePtr, &headerCWF ); + } + else if ( (sid==SID_NORM_ASM_F0) || (SID_NORM_ASM_F1) || (SID_NORM_ASM_F2) ) + { + spw_send_asm( incomingRingNodePtr, &headerASM ); + } + else + { + printf("unexpected sid = %d\n", sid); + } + } + else if ( incomingData[0] == CCSDS_DESTINATION_ID ) // the incoming message is a ccsds packet { status = write( fdSPW, incomingData, size ); if (status == -1){ @@ -240,6 +292,13 @@ rtems_task send_task( rtems_task_argumen spw_ioctl_send = (spw_ioctl_pkt_send*) incomingData; status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send ); if (status == -1){ + printf("size = %d, %x, %x, %x, %x, %x\n", + size, + incomingData[0], + incomingData[1], + incomingData[2], + incomingData[3], + incomingData[4]); PRINTF2("in SEND *** (2.b) ERRNO = %d, RTEMS = %d\n", errno, status) } } @@ -393,7 +452,7 @@ int spacewire_configure_link( int fd ) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n") } // - status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks + status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK, 1); // transmission blocks if (status!=RTEMS_SUCCESSFUL) { PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n") } @@ -622,3 +681,423 @@ rtems_timer_service_routine user_routine status = RTEMS_SUCCESSFUL; } } + +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->packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_336 >> 8); + header->packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_336 ); + // DATA FIELD HEADER + header->spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2; + 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[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + // AUXILIARY DATA HEADER + header->sid = 0x00; + header->hkBIA = DEFAULT_HKBIA; + header->blkNr[0] = (unsigned char) (BLK_NR_CWF >> 8); + header->blkNr[1] = (unsigned char) (BLK_NR_CWF ); +} + +void init_header_swf( Header_TM_LFR_SCIENCE_SWF_t *header ) +{ + header->targetLogicalAddress = CCSDS_DESTINATION_ID; + header->protocolIdentifier = CCSDS_PROTOCOLE_ID; + header->reserved = DEFAULT_RESERVED; + header->userApplication = CCSDS_USER_APP; + header->packetID[0] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST >> 8); + header->packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST); + header->packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; + header->packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT; + header->packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_336 >> 8); + header->packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_336 ); + // DATA FIELD HEADER + header->spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2; + 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[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + // AUXILIARY DATA HEADER + header->sid = 0x00; + header->hkBIA = DEFAULT_HKBIA; + header->pktCnt = DEFAULT_PKTCNT; // PKT_CNT + header->pktNr = 0x00; + header->blkNr[0] = (unsigned char) (BLK_NR_CWF >> 8); + header->blkNr[1] = (unsigned char) (BLK_NR_CWF ); +} + +void init_header_asm( Header_TM_LFR_SCIENCE_ASM_t *header ) +{ + header->targetLogicalAddress = CCSDS_DESTINATION_ID; + header->protocolIdentifier = CCSDS_PROTOCOLE_ID; + header->reserved = DEFAULT_RESERVED; + header->userApplication = CCSDS_USER_APP; + header->packetID[0] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST >> 8); + header->packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST); + 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 + header->spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2; + 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[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + header->time[0] = 0x00; + // AUXILIARY DATA HEADER + header->sid = 0x00; + header->biaStatusInfo = 0x00; + header->pa_lfr_pkt_cnt_asm = 0x00; + header->pa_lfr_pkt_nr_asm = 0x00; + header->pa_lfr_asm_blk_nr[0] = 0x00; + header->pa_lfr_asm_blk_nr[1] = 0x00; +} + +int spw_send_waveform_CWF( ring_node *ring_node_to_send, + Header_TM_LFR_SCIENCE_CWF_t *header ) +{ + /** This function sends CWF CCSDS packets (F2, F1 or F0). + * + * @param waveform points to the buffer containing the data that will be send. + * @param sid is the source identifier of the data that will be sent. + * @param headerCWF points to a table of headers that have been prepared for the data transmission. + * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures + * contain information to setup the transmission of the data packets. + * + * One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks. + * + */ + + unsigned int i; + int ret; + unsigned int coarseTime; + unsigned int fineTime; + rtems_status_code status; + spw_ioctl_pkt_send spw_ioctl_send_CWF; + int *dataPtr; + unsigned char sid; + + spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header + spw_ioctl_send_CWF.options = 0; + + ret = LFR_DEFAULT; + sid = (unsigned char) ring_node_to_send->sid; + + coarseTime = ring_node_to_send->coarseTime; + fineTime = ring_node_to_send->fineTime; + dataPtr = (int*) ring_node_to_send->buffer_address; + + for (i=0; ipacketSequenceControl, sid ); + + // SET SID + header->sid = sid; + + // SET PACKET TIME + compute_acquisition_time( coarseTime, fineTime, sid, i, header->acquisitionTime); + // + header->time[0] = header->acquisitionTime[0]; + header->time[1] = header->acquisitionTime[1]; + header->time[2] = header->acquisitionTime[2]; + header->time[3] = header->acquisitionTime[3]; + header->time[4] = header->acquisitionTime[4]; + header->time[5] = header->acquisitionTime[5]; + + // SET PACKET ID + if ( (sid == SID_SBM1_CWF_F1) || (sid == SID_SBM2_CWF_F2) ) + { + header->packetID[0] = (unsigned char) (APID_TM_SCIENCE_SBM1_SBM2 >> 8); + header->packetID[1] = (unsigned char) (APID_TM_SCIENCE_SBM1_SBM2); + } + else + { + header->packetID[0] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST >> 8); + header->packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST); + } + + status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send_CWF ); + if (status != RTEMS_SUCCESSFUL) { + printf("%d-%d, ERR %d\n", sid, i, (int) status); + ret = LFR_DEFAULT; + } + } + + return ret; +} + +int spw_send_waveform_SWF( ring_node *ring_node_to_send, + Header_TM_LFR_SCIENCE_SWF_t *header ) +{ + /** This function sends SWF CCSDS packets (F2, F1 or F0). + * + * @param waveform points to the buffer containing the data that will be send. + * @param sid is the source identifier of the data that will be sent. + * @param headerSWF points to a table of headers that have been prepared for the data transmission. + * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures + * contain information to setup the transmission of the data packets. + * + * One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks. + * + */ + + unsigned int i; + int ret; + unsigned int coarseTime; + unsigned int fineTime; + rtems_status_code status; + spw_ioctl_pkt_send spw_ioctl_send_SWF; + int *dataPtr; + unsigned char sid; + + spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header + spw_ioctl_send_SWF.options = 0; + + ret = LFR_DEFAULT; + + coarseTime = ring_node_to_send->coarseTime; + fineTime = ring_node_to_send->fineTime; + dataPtr = (int*) ring_node_to_send->buffer_address; + sid = ring_node_to_send->sid; + + for (i=0; i<7; i++) // send waveform + { + spw_ioctl_send_SWF.data = (char*) &dataPtr[ (i * BLK_NR_304 * NB_WORDS_SWF_BLK) ]; + spw_ioctl_send_SWF.hdr = (char*) header; + + // SET PACKET SEQUENCE CONTROL + increment_seq_counter_source_id( header->packetSequenceControl, sid ); + + // SET PACKET LENGTH AND BLKNR + if (i == 6) + { + spw_ioctl_send_SWF.dlen = BLK_NR_224 * NB_BYTES_SWF_BLK; + header->packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_224 >> 8); + header->packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_224 ); + header->blkNr[0] = (unsigned char) (BLK_NR_224 >> 8); + header->blkNr[1] = (unsigned char) (BLK_NR_224 ); + } + else + { + spw_ioctl_send_SWF.dlen = BLK_NR_304 * NB_BYTES_SWF_BLK; + header->packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_304 >> 8); + header->packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_304 ); + header->blkNr[0] = (unsigned char) (BLK_NR_304 >> 8); + header->blkNr[1] = (unsigned char) (BLK_NR_304 ); + } + + // SET PACKET TIME + compute_acquisition_time( coarseTime, fineTime, sid, i, header->acquisitionTime ); + // + header->time[0] = header->acquisitionTime[0]; + header->time[1] = header->acquisitionTime[1]; + header->time[2] = header->acquisitionTime[2]; + header->time[3] = header->acquisitionTime[3]; + header->time[4] = header->acquisitionTime[4]; + header->time[5] = header->acquisitionTime[5]; + + // SET SID + header->sid = sid; + + // SET PKTNR + header->pktNr = i+1; // PKT_NR + + // SEND PACKET + status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send_SWF ); + if (status != RTEMS_SUCCESSFUL) { + printf("%d-%d, ERR %d\n", sid, i, (int) status); + ret = LFR_DEFAULT; + } + } + + return ret; +} + +int spw_send_waveform_CWF3_light( ring_node *ring_node_to_send, + Header_TM_LFR_SCIENCE_CWF_t *header ) +{ + /** This function sends CWF_F3 CCSDS packets without the b1, b2 and b3 data. + * + * @param waveform points to the buffer containing the data that will be send. + * @param headerCWF points to a table of headers that have been prepared for the data transmission. + * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures + * contain information to setup the transmission of the data packets. + * + * By default, CWF_F3 packet are send without the b1, b2 and b3 data. This function rebuilds a data buffer + * from the incoming data and sends it in 7 packets, 6 containing 340 blocks and 1 one containing 8 blocks. + * + */ + + unsigned int i; + int ret; + unsigned int coarseTime; + unsigned int fineTime; + rtems_status_code status; + spw_ioctl_pkt_send spw_ioctl_send_CWF; + char *dataPtr; + unsigned char sid; + + spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header + spw_ioctl_send_CWF.options = 0; + + ret = LFR_DEFAULT; + sid = ring_node_to_send->sid; + + coarseTime = ring_node_to_send->coarseTime; + fineTime = ring_node_to_send->fineTime; + dataPtr = (char*) ring_node_to_send->buffer_address; + + //********************* + // SEND CWF3_light DATA + for (i=0; ipacketSequenceControl, sid ); + + // SET SID + header->sid = sid; + + // SET PACKET TIME + compute_acquisition_time( coarseTime, fineTime, SID_NORM_CWF_F3, i, header->acquisitionTime ); + // + header->time[0] = header->acquisitionTime[0]; + header->time[1] = header->acquisitionTime[1]; + header->time[2] = header->acquisitionTime[2]; + header->time[3] = header->acquisitionTime[3]; + header->time[4] = header->acquisitionTime[4]; + header->time[5] = header->acquisitionTime[5]; + + // SET PACKET ID + header->packetID[0] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST >> 8); + header->packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST); + + // SEND PACKET + status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send_CWF ); + if (status != RTEMS_SUCCESSFUL) { + printf("%d-%d, ERR %d\n", sid, i, (int) status); + ret = LFR_DEFAULT; + } + } + + return ret; +} + +void spw_send_asm( ring_node *ring_node_to_send, + Header_TM_LFR_SCIENCE_ASM_t *header ) +{ + unsigned int i; + unsigned int length = 0; + rtems_status_code status; + unsigned int sid; + char *spectral_matrix; + int coarseTime; + int fineTime; + spw_ioctl_pkt_send spw_ioctl_send_ASM; + + sid = ring_node_to_send->sid; + spectral_matrix = (char*) ring_node_to_send->buffer_address; + coarseTime = ring_node_to_send->coarseTime; + fineTime = ring_node_to_send->fineTime; + + for (i=0; i<2; i++) + { + // (1) BUILD THE DATA + switch(sid) + { + case SID_NORM_ASM_F0: + spw_ioctl_send_ASM.dlen = TOTAL_SIZE_ASM_F0_IN_BYTES / 2; // 2 packets will be sent + spw_ioctl_send_ASM.data = &spectral_matrix[ + ( (ASM_F0_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F0) ) * NB_VALUES_PER_SM ) * 2 + ]; + 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 + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F0); // BLK_NR LSB + break; + case SID_NORM_ASM_F1: + spw_ioctl_send_ASM.dlen = TOTAL_SIZE_ASM_F1_IN_BYTES / 2; // 2 packets will be sent + spw_ioctl_send_ASM.data = &spectral_matrix[ + ( (ASM_F1_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F1) ) * NB_VALUES_PER_SM ) * 2 + ]; + length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F1; + header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F1) >> 8 ); // BLK_NR MSB + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F1); // BLK_NR LSB + break; + case SID_NORM_ASM_F2: + spw_ioctl_send_ASM.dlen = TOTAL_SIZE_ASM_F2_IN_BYTES / 2; // 2 packets will be sent + spw_ioctl_send_ASM.data = &spectral_matrix[ + ( (ASM_F2_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F2) ) * NB_VALUES_PER_SM ) * 2 + ]; + length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F2; + header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F2) >> 8 ); // BLK_NR MSB + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F2); // BLK_NR LSB + break; + default: + PRINTF1("ERR *** in spw_send_asm *** unexpected sid %d\n", sid) + break; + } + spw_ioctl_send_ASM.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM + CCSDS_PROTOCOLE_EXTRA_BYTES; + spw_ioctl_send_ASM.hdr = (char *) header; + spw_ioctl_send_ASM.options = 0; + + // (2) BUILD THE HEADER + increment_seq_counter_source_id( header->packetSequenceControl, sid ); + header->packetLength[0] = (unsigned char) (length>>8); + header->packetLength[1] = (unsigned char) (length); + header->sid = (unsigned char) sid; // SID + header->pa_lfr_pkt_cnt_asm = 2; + header->pa_lfr_pkt_nr_asm = (unsigned char) (i+1); + + // (3) SET PACKET TIME + header->time[0] = (unsigned char) (coarseTime>>24); + header->time[1] = (unsigned char) (coarseTime>>16); + header->time[2] = (unsigned char) (coarseTime>>8); + header->time[3] = (unsigned char) (coarseTime); + header->time[4] = (unsigned char) (fineTime>>8); + header->time[5] = (unsigned char) (fineTime); + // + header->acquisitionTime[0] = header->time[0]; + header->acquisitionTime[1] = header->time[1]; + header->acquisitionTime[2] = header->time[2]; + header->acquisitionTime[3] = header->time[3]; + header->acquisitionTime[4] = header->time[4]; + header->acquisitionTime[5] = header->time[5]; + + // (4) SEND PACKET + status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send_ASM ); + if (status != RTEMS_SUCCESSFUL) { + printf("in ASM_send *** ERR %d\n", (int) status); + } + } +} diff --git a/src/processing/avf0_prc0.c b/src/processing/avf0_prc0.c --- a/src/processing/avf0_prc0.c +++ b/src/processing/avf0_prc0.c @@ -14,8 +14,11 @@ nb_sm_before_bp_asm_f0 nb_sm_before_f0; //*** // F0 -ring_node_asm asm_ring_norm_f0 [ NB_RING_NODES_ASM_NORM_F0 ]; -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_NORM_F0 ]; +ring_node_asm asm_ring_burst_sbm_f0 [ NB_RING_NODES_ASM_BURST_SBM_F0 ]; + +ring_node ring_to_send_asm_f0 [ NB_RING_NODES_ASM_F0 ]; +char buffer_asm_f0 [ NB_RING_NODES_ASM_F0 * TOTAL_SIZE_SM ]; float asm_f0_reorganized [ TOTAL_SIZE_SM ]; char asm_f0_char [ TIME_OFFSET_IN_BYTES + (TOTAL_SIZE_SM * 2) ]; @@ -188,11 +191,16 @@ rtems_task prc0_task( rtems_task_argumen bp_packet packet_norm_bp2_f0; bp_packet packet_sbm_bp1_f0; bp_packet packet_sbm_bp2_f0; + ring_node *current_ring_node_to_send_asm_f0; unsigned long long int localTime; ASM_init_header( &headerASM ); + // init the ring of the averaged spectral matrices which will be transmitted to the DPU + init_ring( ring_to_send_asm_f0, NB_RING_NODES_ASM_F0, (volatile int*) buffer_asm_f0, TOTAL_SIZE_SM ); + current_ring_node_to_send_asm_f0 = ring_to_send_asm_f0; + //************* // NORM headers BP_init_header_with_spare( &packet_norm_bp1_f0.header, @@ -327,14 +335,27 @@ rtems_task prc0_task( rtems_task_argumen 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_f0.norm_bp1 ); +// // 2) convert the float array in a char array +// ASM_convert( asm_f0_reorganized, (char*) current_ring_node_to_send_asm_f0->buffer_address ); +// current_ring_node_to_send_asm_f0->coarseTime = incomingMsg->coarseTime; +// current_ring_node_to_send_asm_f0->fineTime = incomingMsg->fineTime; +// current_ring_node_to_send_asm_f0->sid = SID_NORM_ASM_F0; +// // 3) send the spectral matrix packets +// status = rtems_message_queue_send( queue_id, ¤t_ring_node_to_send_asm_f0, sizeof( ring_node* ) ); +// // change asm ring node +// current_ring_node_to_send_asm_f0 = current_ring_node_to_send_asm_f0->next; // 1) reorganize the ASM and divide ASM_reorganize_and_divide( incomingMsg->norm->matrix, - asm_f0_reorganized, - nb_sm_before_f0.norm_bp1 ); + asm_f0_reorganized, + nb_sm_before_f0.norm_bp1 ); // 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.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); } 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 @@ -261,102 +261,78 @@ void reset_nb_sm( void ) nb_sm_f1 = 0; } +//void SM_init_rings_alt( void ) +//{ +// init_ring( sm_ring_f0, NB_RING_NODES_SM_F0, sm_f0, TOTAL_SIZE_SM ); +// init_ring( sm_ring_f1, NB_RING_NODES_SM_F1, sm_f0, TOTAL_SIZE_SM ); +// init_ring( sm_ring_f2, NB_RING_NODES_SM_F2, sm_f0, TOTAL_SIZE_SM ); + +// DEBUG_PRINTF1("sm_ring_f0 @%x\n", (unsigned int) sm_ring_f0) +// DEBUG_PRINTF1("sm_ring_f1 @%x\n", (unsigned int) sm_ring_f1) +// DEBUG_PRINTF1("sm_ring_f2 @%x\n", (unsigned int) sm_ring_f2) +// DEBUG_PRINTF1("sm_f0 @%x\n", (unsigned int) sm_f0) +// DEBUG_PRINTF1("sm_f1 @%x\n", (unsigned int) sm_f1) +// DEBUG_PRINTF1("sm_f2 @%x\n", (unsigned int) sm_f2) +//} + void SM_init_rings( void ) { unsigned char i; - // F0 RING - sm_ring_f0[0].next = (ring_node_sm*) &sm_ring_f0[1]; - sm_ring_f0[0].previous = (ring_node_sm*) &sm_ring_f0[NB_RING_NODES_SM_F0-1]; - sm_ring_f0[0].buffer_address = + sm_ring_f0[0].next = (ring_node_sm*) &sm_ring_f0[1]; + sm_ring_f0[0].previous = (ring_node_sm*) &sm_ring_f0[NB_RING_NODES_SM_F0-1]; + sm_ring_f0[0].buffer_address = (int) &sm_f0[ 0 ]; - - sm_ring_f0[NB_RING_NODES_SM_F0-1].next = (ring_node_sm*) &sm_ring_f0[0]; - sm_ring_f0[NB_RING_NODES_SM_F0-1].previous = (ring_node_sm*) &sm_ring_f0[NB_RING_NODES_SM_F0-2]; + sm_ring_f0[NB_RING_NODES_SM_F0-1].next = (ring_node_sm*) &sm_ring_f0[0]; + sm_ring_f0[NB_RING_NODES_SM_F0-1].previous = (ring_node_sm*) &sm_ring_f0[NB_RING_NODES_SM_F0-2]; sm_ring_f0[NB_RING_NODES_SM_F0-1].buffer_address = (int) &sm_f0[ (NB_RING_NODES_SM_F0-1) * TOTAL_SIZE_SM ]; - for(i=1; if0_0_address = sm_ring_f0[0].buffer_address; + DEBUG_PRINTF1("asm_ring_f1 @%x\n", (unsigned int) sm_ring_f1) + DEBUG_PRINTF1("asm_ring_f2 @%x\n", (unsigned int) sm_ring_f2) + spectral_matrix_regs->f0_0_address = sm_ring_f0[0].buffer_address; DEBUG_PRINTF1("spectral_matrix_regs->matrixF0_Address0 @%x\n", spectral_matrix_regs->f0_0_address) } -void SM_generic_init_ring( ring_node_sm *ring, unsigned char nbNodes, volatile int sm_f[] ) -{ - unsigned char i; - - //*************** - // BUFFER ADDRESS - for(i=0; iserviceType = TM_TYPE_LFR_SCIENCE; // service type header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype header->destinationID = TM_DESTINATION_ID_GROUND; - // AUXILIARY DATA HEADER - header->sid = 0x00; - header->biaStatusInfo = 0x00; - header->pa_lfr_pkt_cnt_asm = 0x00; - header->pa_lfr_pkt_nr_asm = 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; + // AUXILIARY DATA HEADER + header->sid = 0x00; + header->biaStatusInfo = 0x00; + header->pa_lfr_pkt_cnt_asm = 0x00; + header->pa_lfr_pkt_nr_asm = 0x00; header->pa_lfr_asm_blk_nr[0] = 0x00; // BLK_NR MSB header->pa_lfr_asm_blk_nr[1] = 0x00; // BLK_NR LSB } diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -9,19 +9,6 @@ #include "wf_handler.h" -//***************** -// waveform headers -// SWF -Header_TM_LFR_SCIENCE_SWF_t headerSWF_F0[7]; -Header_TM_LFR_SCIENCE_SWF_t headerSWF_F1[7]; -Header_TM_LFR_SCIENCE_SWF_t headerSWF_F2[7]; -// CWF -Header_TM_LFR_SCIENCE_CWF_t headerCWF_F1[ NB_PACKETS_PER_GROUP_OF_CWF ]; -Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_BURST[ NB_PACKETS_PER_GROUP_OF_CWF ]; -Header_TM_LFR_SCIENCE_CWF_t headerCWF_F2_SBM2[ NB_PACKETS_PER_GROUP_OF_CWF ]; -Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3[ NB_PACKETS_PER_GROUP_OF_CWF ]; -Header_TM_LFR_SCIENCE_CWF_t headerCWF_F3_light[ NB_PACKETS_PER_GROUP_OF_CWF_LIGHT ]; - //*************** // waveform rings // F0 @@ -62,7 +49,7 @@ void reset_extractSWF( void ) swf_f2_ready = false; } -void waveforms_isr_f3( void ) +inline void waveforms_isr_f3( void ) { rtems_status_code spare_status; @@ -94,7 +81,7 @@ void waveforms_isr_f3( void ) } } -void waveforms_isr_normal( void ) +inline void waveforms_isr_normal( void ) { rtems_status_code status; @@ -168,7 +155,7 @@ void waveforms_isr_normal( void ) } } -void waveforms_isr_burst( void ) +inline void waveforms_isr_burst( void ) { rtems_status_code spare_status; @@ -197,10 +184,9 @@ void waveforms_isr_burst( void ) } } -void waveforms_isr_sbm1( void ) +inline void waveforms_isr_sbm1( void ) { rtems_status_code status; - rtems_status_code spare_status; //*** // F1 @@ -271,15 +257,10 @@ void waveforms_isr_sbm1( void ) 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] } - // start the snapshots transmission - if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) - { - spare_status = rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_0 ); - } } } -void waveforms_isr_sbm2( void ) +inline void waveforms_isr_sbm2( void ) { rtems_status_code status; @@ -440,13 +421,12 @@ rtems_task wfrm_task(rtems_task_argument rtems_id queue_id; rtems_status_code status; bool resynchronisationEngaged; + ring_node *ring_node_wf_snap_extracted_ptr; + + ring_node_wf_snap_extracted_ptr = (ring_node *) &ring_node_wf_snap_extracted; resynchronisationEngaged = false; - init_header_snapshot_wf_table( SID_NORM_SWF_F0, headerSWF_F0 ); - init_header_snapshot_wf_table( SID_NORM_SWF_F1, headerSWF_F1 ); - init_header_snapshot_wf_table( SID_NORM_SWF_F2, headerSWF_F2 ); - status = get_message_queue_id_send( &queue_id ); if (status != RTEMS_SUCCESSFUL) { @@ -462,7 +442,7 @@ rtems_task wfrm_task(rtems_task_argument RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); if(resynchronisationEngaged == false) { // engage resynchronisation - snapshot_resynchronization( (unsigned char *) ring_node_to_send_swf_f0->buffer_address); + snapshot_resynchronization( (unsigned char *) ring_node_to_send_swf_f0->coarseTime ); resynchronisationEngaged = true; } else @@ -476,23 +456,32 @@ rtems_task wfrm_task(rtems_task_argument if (event_out == RTEMS_EVENT_MODE_NORMAL) { DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_NORMAL\n") - send_waveform_SWF( ring_node_to_send_swf_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); - send_waveform_SWF( ring_node_to_send_swf_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id); - send_waveform_SWF( ring_node_to_send_swf_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id); + ring_node_to_send_swf_f0->sid = SID_NORM_SWF_F0; + ring_node_to_send_swf_f1->sid = SID_NORM_SWF_F1; + ring_node_to_send_swf_f2->sid = SID_NORM_SWF_F2; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f0, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f1, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f2, sizeof( ring_node* ) ); } if (event_out == RTEMS_EVENT_MODE_SBM1) { DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_SBM1\n") - send_waveform_SWF( ring_node_to_send_swf_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); - send_waveform_SWF( &ring_node_wf_snap_extracted, SID_NORM_SWF_F1, headerSWF_F1, queue_id); - send_waveform_SWF( ring_node_to_send_swf_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id); + ring_node_to_send_swf_f0->sid = SID_NORM_SWF_F0; + ring_node_wf_snap_extracted_ptr->sid = SID_NORM_SWF_F1; + ring_node_to_send_swf_f2->sid = SID_NORM_SWF_F2; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f0, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_wf_snap_extracted_ptr, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f2, sizeof( ring_node* ) ); } if (event_out == RTEMS_EVENT_MODE_SBM2) { DEBUG_PRINTF("WFRM received RTEMS_EVENT_MODE_SBM2\n") - send_waveform_SWF( ring_node_to_send_swf_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); - send_waveform_SWF( ring_node_to_send_swf_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id); - send_waveform_SWF( &ring_node_wf_snap_extracted, SID_NORM_SWF_F2, headerSWF_F2, queue_id); + ring_node_to_send_swf_f0->sid = SID_NORM_SWF_F0; + ring_node_to_send_swf_f1->sid = SID_NORM_SWF_F1; + ring_node_wf_snap_extracted_ptr->sid = SID_NORM_SWF_F2; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f0, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_to_send_swf_f1, sizeof( ring_node* ) ); + status = rtems_message_queue_send( queue_id, &ring_node_wf_snap_extracted_ptr, sizeof( ring_node* ) ); } } } @@ -511,9 +500,7 @@ rtems_task cwf3_task(rtems_task_argument rtems_event_set event_out; rtems_id queue_id; rtems_status_code status; - - init_header_continuous_wf_table( SID_NORM_CWF_LONG_F3, headerCWF_F3 ); - init_header_continuous_cwf3_light_table( headerCWF_F3_light ); + ring_node ring_node_cwf3_light; status = get_message_queue_id_send( &queue_id ); if (status != RTEMS_SUCCESSFUL) @@ -521,6 +508,17 @@ rtems_task cwf3_task(rtems_task_argument PRINTF1("in CWF3 *** ERR get_message_queue_id_send %d\n", status) } + ring_node_to_send_cwf_f3->sid = SID_NORM_CWF_LONG_F3; + + // init the ring_node_cwf3_light structure + ring_node_cwf3_light.buffer_address = (int) wf_cont_f3_light; + ring_node_cwf3_light.coarseTime = 0x00; + ring_node_cwf3_light.fineTime = 0x00; + ring_node_cwf3_light.next = NULL; + ring_node_cwf3_light.previous = NULL; + ring_node_cwf3_light.sid = SID_NORM_CWF_F3; + ring_node_cwf3_light.status = 0x00; + BOOT_PRINTF("in CWF3 ***\n") while(1){ @@ -533,14 +531,14 @@ rtems_task cwf3_task(rtems_task_argument if ( (parameter_dump_packet.sy_lfr_n_cwf_long_f3 & 0x01) == 0x01) { PRINTF("send CWF_LONG_F3\n") - send_waveform_CWF( ring_node_to_send_cwf_f3, - SID_NORM_CWF_LONG_F3, headerCWF_F3, queue_id ); + ring_node_to_send_cwf_f3->sid = SID_NORM_CWF_LONG_F3; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf_f2, sizeof( ring_node* ) ); } else { PRINTF("send CWF_F3 (light)\n") - send_waveform_CWF3_light( ring_node_to_send_cwf_f3, - headerCWF_F3_light, queue_id ); + ring_node_to_send_cwf_f3->sid = SID_NORM_CWF_F3; + send_waveform_CWF3_light( ring_node_to_send_cwf_f3, &ring_node_cwf3_light, queue_id ); } } @@ -567,9 +565,6 @@ rtems_task cwf2_task(rtems_task_argument rtems_id queue_id; rtems_status_code status; - init_header_continuous_wf_table( SID_BURST_CWF_F2, headerCWF_F2_BURST ); - init_header_continuous_wf_table( SID_SBM2_CWF_F2, headerCWF_F2_SBM2 ); - status = get_message_queue_id_send( &queue_id ); if (status != RTEMS_SUCCESSFUL) { @@ -584,11 +579,15 @@ rtems_task cwf2_task(rtems_task_argument RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); if (event_out == RTEMS_EVENT_MODE_BURST) { - send_waveform_CWF( ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); +// send_waveform_CWF( ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); + ring_node_to_send_cwf_f2->sid = SID_BURST_CWF_F2; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf_f2, sizeof( ring_node* ) ); } if (event_out == RTEMS_EVENT_MODE_SBM2) { - send_waveform_CWF( ring_node_to_send_cwf_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id ); +// send_waveform_CWF( ring_node_to_send_cwf_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id ); + ring_node_to_send_cwf_f2->sid = SID_SBM2_CWF_F2; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf_f2, sizeof( ring_node* ) ); // launch snapshot extraction if needed if (extractSWF == true) { @@ -624,7 +623,7 @@ rtems_task cwf1_task(rtems_task_argument rtems_id queue_id; rtems_status_code status; - init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 ); +// init_header_continuous_wf_table( SID_SBM1_CWF_F1, headerCWF_F1 ); status = get_message_queue_id_send( &queue_id ); if (status != RTEMS_SUCCESSFUL) @@ -638,7 +637,8 @@ rtems_task cwf1_task(rtems_task_argument // wait for an RTEMS_EVENT rtems_event_receive( RTEMS_EVENT_MODE_SBM1, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); - send_waveform_CWF( ring_node_to_send_cwf_f1, SID_SBM1_CWF_F1, headerCWF_F1, queue_id ); + ring_node_to_send_cwf_f1->sid = SID_SBM1_CWF_F1; + status = rtems_message_queue_send( queue_id, &ring_node_to_send_cwf_f1, sizeof( ring_node* ) ); // launch snapshot extraction if needed if (extractSWF == true) { @@ -695,13 +695,13 @@ rtems_task swbd_task(rtems_task_argument void WFP_init_rings( void ) { // F0 RING - init_waveform_ring( waveform_ring_f0, NB_RING_NODES_F0, wf_snap_f0 ); + init_ring( waveform_ring_f0, NB_RING_NODES_F0, wf_buffer_f0, WFRM_BUFFER ); // F1 RING - init_waveform_ring( waveform_ring_f1, NB_RING_NODES_F1, wf_snap_f1 ); + init_ring( waveform_ring_f1, NB_RING_NODES_F1, wf_buffer_f1, WFRM_BUFFER ); // F2 RING - init_waveform_ring( waveform_ring_f2, NB_RING_NODES_F2, wf_snap_f2 ); + init_ring( waveform_ring_f2, NB_RING_NODES_F2, wf_buffer_f2, WFRM_BUFFER ); // F3 RING - init_waveform_ring( waveform_ring_f3, NB_RING_NODES_F3, wf_cont_f3 ); + init_ring( waveform_ring_f3, NB_RING_NODES_F3, wf_buffer_f3, WFRM_BUFFER ); ring_node_wf_snap_extracted.buffer_address = (int) wf_snap_extracted; @@ -709,25 +709,42 @@ void WFP_init_rings( void ) DEBUG_PRINTF1("waveform_ring_f1 @%x\n", (unsigned int) waveform_ring_f1) DEBUG_PRINTF1("waveform_ring_f2 @%x\n", (unsigned int) waveform_ring_f2) DEBUG_PRINTF1("waveform_ring_f3 @%x\n", (unsigned int) waveform_ring_f3) + DEBUG_PRINTF1("wf_buffer_f0 @%x\n", (unsigned int) wf_buffer_f0) + DEBUG_PRINTF1("wf_buffer_f1 @%x\n", (unsigned int) wf_buffer_f1) + DEBUG_PRINTF1("wf_buffer_f2 @%x\n", (unsigned int) wf_buffer_f2) + DEBUG_PRINTF1("wf_buffer_f3 @%x\n", (unsigned int) wf_buffer_f3) + } -void init_waveform_ring(ring_node waveform_ring[], unsigned char nbNodes, volatile int wfrm[] ) +void init_ring(ring_node ring[], unsigned char nbNodes, volatile int buffer[], unsigned int bufferSize ) { unsigned char i; - waveform_ring[0].next = (ring_node*) &waveform_ring[ 1 ]; - waveform_ring[0].previous = (ring_node*) &waveform_ring[ nbNodes - 1 ]; - waveform_ring[0].buffer_address = (int) &wfrm[0]; + //*************** + // BUFFER ADDRESS + for(i=0; i> 8); - headerSWF[ i ].packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST); - headerSWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; - if (i == 6) - { - headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_224 >> 8); - headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_224 ); - headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_224 >> 8); - headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_224 ); - } - else - { - headerSWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_SWF_304 >> 8); - headerSWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_SWF_304 ); - headerSWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_304 >> 8); - headerSWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_304 ); - } - headerSWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT; - headerSWF[ i ].pktCnt = DEFAULT_PKTCNT; // PKT_CNT - headerSWF[ i ].pktNr = i+1; // PKT_NR - // DATA FIELD HEADER - headerSWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2; - headerSWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type - headerSWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype - headerSWF[ i ].destinationID = TM_DESTINATION_ID_GROUND; - // AUXILIARY DATA HEADER - headerSWF[ i ].time[0] = 0x00; - headerSWF[ i ].time[0] = 0x00; - headerSWF[ i ].time[0] = 0x00; - headerSWF[ i ].time[0] = 0x00; - headerSWF[ i ].time[0] = 0x00; - headerSWF[ i ].time[0] = 0x00; - headerSWF[ i ].sid = sid; - headerSWF[ i ].hkBIA = DEFAULT_HKBIA; - } - - return return_value; -} - -int init_header_continuous_wf_table( unsigned int sid, Header_TM_LFR_SCIENCE_CWF_t *headerCWF ) -{ - unsigned int i; - int return_value; - - return_value = LFR_SUCCESSFUL; - - for (i=0; i> 8); - headerCWF[ i ].packetID[1] = (unsigned char) (APID_TM_SCIENCE_SBM1_SBM2); - } - else - { - headerCWF[ i ].packetID[0] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST >> 8); - headerCWF[ i ].packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST); - } - headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; - headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_336 >> 8); - headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_336 ); - headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_CWF >> 8); - headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_CWF ); - headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT; - // DATA FIELD HEADER - headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2; - headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type - headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype - headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND; - // AUXILIARY DATA HEADER - headerCWF[ i ].sid = sid; - headerCWF[ i ].hkBIA = DEFAULT_HKBIA; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - } - - return return_value; -} - -int init_header_continuous_cwf3_light_table( Header_TM_LFR_SCIENCE_CWF_t *headerCWF ) -{ - unsigned int i; - int return_value; - - return_value = LFR_SUCCESSFUL; - - for (i=0; i> 8); - headerCWF[ i ].packetID[1] = (unsigned char) (APID_TM_SCIENCE_NORMAL_BURST); - - headerCWF[ i ].packetSequenceControl[0] = TM_PACKET_SEQ_CTRL_STANDALONE; - headerCWF[ i ].packetLength[0] = (unsigned char) (TM_LEN_SCI_CWF_672 >> 8); - headerCWF[ i ].packetLength[1] = (unsigned char) (TM_LEN_SCI_CWF_672 ); - headerCWF[ i ].blkNr[0] = (unsigned char) (BLK_NR_CWF_SHORT_F3 >> 8); - headerCWF[ i ].blkNr[1] = (unsigned char) (BLK_NR_CWF_SHORT_F3 ); - - headerCWF[ i ].packetSequenceControl[1] = TM_PACKET_SEQ_CNT_DEFAULT; - // DATA FIELD HEADER - headerCWF[ i ].spare1_pusVersion_spare2 = DEFAULT_SPARE1_PUSVERSION_SPARE2; - headerCWF[ i ].serviceType = TM_TYPE_LFR_SCIENCE; // service type - headerCWF[ i ].serviceSubType = TM_SUBTYPE_LFR_SCIENCE; // service subtype - headerCWF[ i ].destinationID = TM_DESTINATION_ID_GROUND; - // AUXILIARY DATA HEADER - headerCWF[ i ].sid = SID_NORM_CWF_F3; - headerCWF[ i ].hkBIA = DEFAULT_HKBIA; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - headerCWF[ i ].time[0] = 0x00; - } - - return return_value; -} - -int send_waveform_SWF( ring_node *ring_node_to_send, unsigned int sid, - Header_TM_LFR_SCIENCE_SWF_t *headerSWF, rtems_id queue_id ) -{ - /** This function sends SWF CCSDS packets (F2, F1 or F0). - * - * @param waveform points to the buffer containing the data that will be send. - * @param sid is the source identifier of the data that will be sent. - * @param headerSWF points to a table of headers that have been prepared for the data transmission. - * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures - * contain information to setup the transmission of the data packets. - * - * One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks. - * - */ - - unsigned int i; - int ret; - unsigned int coarseTime; - unsigned int fineTime; - rtems_status_code status; - spw_ioctl_pkt_send spw_ioctl_send_SWF; - int *dataPtr; - - spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header - spw_ioctl_send_SWF.options = 0; - - ret = LFR_DEFAULT; - - coarseTime = ring_node_to_send->coarseTime; - fineTime = ring_node_to_send->fineTime; - dataPtr = (int*) ring_node_to_send->buffer_address; - - for (i=0; i<7; i++) // send waveform - { - spw_ioctl_send_SWF.data = (char*) &dataPtr[ (i * BLK_NR_304 * NB_WORDS_SWF_BLK) ]; - spw_ioctl_send_SWF.hdr = (char*) &headerSWF[ i ]; - // BUILD THE DATA - if (i==6) { - spw_ioctl_send_SWF.dlen = BLK_NR_224 * NB_BYTES_SWF_BLK; - } - else { - spw_ioctl_send_SWF.dlen = BLK_NR_304 * NB_BYTES_SWF_BLK; - } - // SET PACKET SEQUENCE COUNTER - increment_seq_counter_source_id( headerSWF[ i ].packetSequenceControl, sid ); - // SET PACKET TIME - compute_acquisition_time( coarseTime, fineTime, sid, i, headerSWF[ i ].acquisitionTime ); - // - headerSWF[ i ].time[0] = headerSWF[ i ].acquisitionTime[0]; - headerSWF[ i ].time[1] = headerSWF[ i ].acquisitionTime[1]; - headerSWF[ i ].time[2] = headerSWF[ i ].acquisitionTime[2]; - headerSWF[ i ].time[3] = headerSWF[ i ].acquisitionTime[3]; - headerSWF[ i ].time[4] = headerSWF[ i ].acquisitionTime[4]; - headerSWF[ i ].time[5] = headerSWF[ i ].acquisitionTime[5]; - // SEND PACKET - status = rtems_message_queue_send( queue_id, &spw_ioctl_send_SWF, ACTION_MSG_SPW_IOCTL_SEND_SIZE); - if (status != RTEMS_SUCCESSFUL) { - printf("%d-%d, ERR %d\n", sid, i, (int) status); - ret = LFR_DEFAULT; - } - rtems_task_wake_after(TIME_BETWEEN_TWO_SWF_PACKETS); // 300 ms between each packet => 7 * 3 = 21 packets => 6.3 seconds - } - - return ret; -} - -int send_waveform_CWF(ring_node *ring_node_to_send, unsigned int sid, - Header_TM_LFR_SCIENCE_CWF_t *headerCWF, rtems_id queue_id) -{ - /** This function sends CWF CCSDS packets (F2, F1 or F0). - * - * @param waveform points to the buffer containing the data that will be send. - * @param sid is the source identifier of the data that will be sent. - * @param headerCWF points to a table of headers that have been prepared for the data transmission. - * @param queue_id is the id of the rtems queue to which spw_ioctl_pkt_send structures will be send. The structures - * contain information to setup the transmission of the data packets. - * - * One group of 2048 samples is sent as 7 consecutive packets, 6 packets containing 340 blocks and 8 packets containing 8 blocks. - * - */ - - unsigned int i; - int ret; - unsigned int coarseTime; - unsigned int fineTime; - rtems_status_code status; - spw_ioctl_pkt_send spw_ioctl_send_CWF; - int *dataPtr; - - spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header - spw_ioctl_send_CWF.options = 0; - - ret = LFR_DEFAULT; - - coarseTime = ring_node_to_send->coarseTime; - fineTime = ring_node_to_send->fineTime; - dataPtr = (int*) ring_node_to_send->buffer_address; - - for (i=0; icoarseTime; - fineTime = ring_node_to_send->fineTime; dataPtr = (int*) ring_node_to_send->buffer_address; + ring_node_cwf3_light->coarseTime = ring_node_to_send->coarseTime; + ring_node_cwf3_light->fineTime = ring_node_to_send->fineTime; + //********************** // BUILD CWF3_light DATA for ( i=0; i< NB_SAMPLES_PER_SNAPSHOT; i++) @@ -1074,47 +809,16 @@ int send_waveform_CWF3_light( ring_node wf_cont_f3_light[ (i * NB_BYTES_CWF3_LIGHT_BLK) + 5 ] = sample[ 5 ]; } - //********************* - // SEND CWF3_light DATA - for (i=0; i