diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,2 +1,2 @@ 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters -e01ac8bd125a79a7af38b0e3ba0330f5be1a3c92 header/lfr_common_headers +7ee7da2ed42fbc9cd673ae7f3a865345cea0f83f header/lfr_common_headers diff --git a/header/grlib_regs.h b/header/grlib_regs.h --- a/header/grlib_regs.h +++ b/header/grlib_regs.h @@ -175,12 +175,9 @@ typedef struct{ // unsigned int buffer_length; // 0x8c = buffer length in burst 2688 / 16 = 168 // - volatile int16_t v_dummy; // 0x90 - volatile int16_t v; // 0x90 - volatile int16_t e1_dummy; // 0x94 - volatile int16_t e1; // 0x94 - volatile int16_t e2_dummy; // 0x98 - volatile int16_t e2; // 0x98 + volatile int v; // 0x90 + volatile int e1; // 0x94 + volatile int e2; // 0x98 } waveform_picker_regs_0_1_18_t; //********************* diff --git a/header/tc_load_dump_parameters.h b/header/tc_load_dump_parameters.h --- a/header/tc_load_dump_parameters.h +++ b/header/tc_load_dump_parameters.h @@ -93,6 +93,8 @@ unsigned int check_update_info_hk_tds_mo unsigned int check_update_info_hk_thr_mode( unsigned char mode ); void set_hk_lfr_sc_rw_f_flag( unsigned char wheel, unsigned char freq, float value ); void set_hk_lfr_sc_rw_f_flags( void ); +int check_sy_lfr_rw_f( ccsdsTelecommandPacket_t *TC, int offset, int* pos, float* value ); +int check_all_sy_lfr_rw_f( ccsdsTelecommandPacket_t *TC, int *pos, float*value ); void getReactionWheelsFrequencies( ccsdsTelecommandPacket_t *TC ); void setFBinMask(unsigned char *fbins_mask, float rw_f, unsigned char deltaFreq, float sy_lfr_rw_k ); void build_sy_lfr_rw_mask( unsigned int channel ); diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -80,12 +80,12 @@ unsigned char hk_lfr_q_p0_fifo_size_max unsigned char hk_lfr_q_p1_fifo_size_max = 0; unsigned char hk_lfr_q_p2_fifo_size_max = 0; // sequence counters are incremented by APID (PID + CAT) and destination ID -unsigned short sequenceCounters_SCIENCE_NORMAL_BURST = 0; -unsigned short sequenceCounters_SCIENCE_SBM1_SBM2 = 0; -unsigned short sequenceCounters_TC_EXE[SEQ_CNT_NB_DEST_ID] = {0}; -unsigned short sequenceCounters_TM_DUMP[SEQ_CNT_NB_DEST_ID] = {0}; -unsigned short sequenceCounterHK = {0}; -spw_stats grspw_stats = {0}; +unsigned short sequenceCounters_SCIENCE_NORMAL_BURST __attribute__((aligned(0x4))) = 0; +unsigned short sequenceCounters_SCIENCE_SBM1_SBM2 __attribute__((aligned(0x4))) = 0; +unsigned short sequenceCounters_TC_EXE[SEQ_CNT_NB_DEST_ID] __attribute__((aligned(0x4))) = {0}; +unsigned short sequenceCounters_TM_DUMP[SEQ_CNT_NB_DEST_ID] __attribute__((aligned(0x4))) = {0}; +unsigned short sequenceCounterHK __attribute__((aligned(0x4))) = {0}; +spw_stats grspw_stats __attribute__((aligned(0x4))) = {0}; // TC_LFR_UPDATE_INFO rw_f_t rw_f; diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -34,8 +34,8 @@ #define CONFIGURE_INIT_TASK_MODE (RTEMS_DEFAULT_MODES | RTEMS_NO_PREEMPT) #define CONFIGURE_INIT_TASK_ATTRIBUTES (RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT) #define CONFIGURE_MAXIMUM_DRIVERS 16 -#define CONFIGURE_MAXIMUM_PERIODS 5 // [hous] [load] [avgv] -#define CONFIGURE_MAXIMUM_TIMERS 5 // [spiq] [link] [spacewire_reset_link] +#define CONFIGURE_MAXIMUM_PERIODS 6 // [hous] [load] [avgv] +#define CONFIGURE_MAXIMUM_TIMERS 6 // [spiq] [link] [spacewire_reset_link] #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 5 #ifdef PRINT_STACK_REPORT #define CONFIGURE_STACK_CHECKER_ENABLED diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -347,6 +347,24 @@ rtems_task hous_task(rtems_task_argument return; } +int32_t getIntFromShort( int reg ) +{ + int16_t ret_as_int16; + int32_t ret_as_int32; + char *regPtr; + char *ret_as_int16_ptr; + + regPtr = (char*) ® + ret_as_int16_ptr = (char*) &ret_as_int16; + + ret_as_int16_ptr[BYTE_0] = regPtr[BYTE_3]; + ret_as_int16_ptr[BYTE_1] = regPtr[BYTE_4]; + + ret_as_int32 = (int32_t) ret_as_int16; + + return ret_as_int32; +} + rtems_task avgv_task(rtems_task_argument argument) { #define MOVING_AVERAGE 16 @@ -401,9 +419,9 @@ rtems_task avgv_task(rtems_task_argument else { // get new values - newValue_v = (int32_t) waveform_picker_regs->v; - newValue_e1 = (int32_t) waveform_picker_regs->e1; - newValue_e2 = (int32_t) waveform_picker_regs->e2; + newValue_v = getIntFromShort( waveform_picker_regs->v ); + newValue_e1 = getIntFromShort( waveform_picker_regs->e1 ); + newValue_e2 = getIntFromShort( waveform_picker_regs->e2 ); // compute the moving average average_v = average_v + newValue_v - v[k]; 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 @@ -764,6 +764,7 @@ unsigned char acquisitionTimeIsValid( un + offsetInFineTime + shiftInFineTime - acquisitionDurations[channel]; + acquisitionTimeRangeMax = timecodeReference + offsetInFineTime diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -256,10 +256,16 @@ int action_update_info(ccsdsTelecommandP */ unsigned int val; - int result; unsigned int status; unsigned char mode; unsigned char * bytePosPtr; + int pos; + float value; + + pos = INIT_CHAR; + value = INIT_FLOAT; + + status = LFR_DEFAULT; bytePosPtr = (unsigned char *) &TC->packetID; @@ -276,37 +282,45 @@ int action_update_info(ccsdsTelecommandP mode = (bytePosPtr[ BYTE_POS_UPDATE_INFO_PARAMETERS_SET6 ] & BITS_THR_MODE); status = check_update_info_hk_thr_mode( mode ); } - if (status == LFR_SUCCESSFUL) // if the parameter check is successful + if (status == LFR_SUCCESSFUL) // check reaction wheels frequencies { - val = (housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * CONST_256) - + housekeeping_packet.hk_lfr_update_info_tc_cnt[1]; - val++; - housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> SHIFT_1_BYTE); - housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val); + status = check_all_sy_lfr_rw_f(TC, &pos, &value); } - // pa_bia_status_info - // => pa_bia_mode_mux_set 3 bits - // => pa_bia_mode_hv_enabled 1 bit - // => pa_bia_mode_bias1_enabled 1 bit - // => pa_bia_mode_bias2_enabled 1 bit - // => pa_bia_mode_bias3_enabled 1 bit - // => pa_bia_on_off (cp_dpu_bias_on_off) - pa_bia_status_info = bytePosPtr[ BYTE_POS_UPDATE_INFO_PARAMETERS_SET2 ] & BITS_BIA; // [1111 1110] - pa_bia_status_info = pa_bia_status_info - | (bytePosPtr[ BYTE_POS_UPDATE_INFO_PARAMETERS_SET1 ] & 1); + // if the parameters checking succeeds, udpate all parameters + if (status == LFR_SUCCESSFUL) + { + // pa_bia_status_info + // => pa_bia_mode_mux_set 3 bits + // => pa_bia_mode_hv_enabled 1 bit + // => pa_bia_mode_bias1_enabled 1 bit + // => pa_bia_mode_bias2_enabled 1 bit + // => pa_bia_mode_bias3_enabled 1 bit + // => pa_bia_on_off (cp_dpu_bias_on_off) + pa_bia_status_info = bytePosPtr[ BYTE_POS_UPDATE_INFO_PARAMETERS_SET2 ] & BITS_BIA; // [1111 1110] + pa_bia_status_info = pa_bia_status_info + | (bytePosPtr[ BYTE_POS_UPDATE_INFO_PARAMETERS_SET1 ] & 1); - // REACTION_WHEELS_FREQUENCY, copy the incoming parameters in the local variable (to be copied in HK packets) - getReactionWheelsFrequencies( TC ); - set_hk_lfr_sc_rw_f_flags(); - build_sy_lfr_rw_masks(); + // REACTION_WHEELS_FREQUENCY, copy the incoming parameters in the local variable (to be copied in HK packets) + getReactionWheelsFrequencies( TC ); + set_hk_lfr_sc_rw_f_flags(); + build_sy_lfr_rw_masks(); + + // once the masks are built, they have to be merged with the fbins_mask + merge_fbins_masks(); - // once the masks are built, they have to be merged with the fbins_mask - merge_fbins_masks(); + // increase the TC_LFR_UPDATE_INFO counter + if (status == LFR_SUCCESSFUL) // if the parameter check is successful + { + val = (housekeeping_packet.hk_lfr_update_info_tc_cnt[0] * CONST_256) + + housekeeping_packet.hk_lfr_update_info_tc_cnt[1]; + val++; + housekeeping_packet.hk_lfr_update_info_tc_cnt[0] = (unsigned char) (val >> SHIFT_1_BYTE); + housekeeping_packet.hk_lfr_update_info_tc_cnt[1] = (unsigned char) (val); + } + } - result = status; - - return result; + return status; } int action_enable_calibration(ccsdsTelecommandPacket_t *TC, rtems_id queue_id, unsigned char *time) diff --git a/src/tc_load_dump_parameters.c b/src/tc_load_dump_parameters.c --- a/src/tc_load_dump_parameters.c +++ b/src/tc_load_dump_parameters.c @@ -791,6 +791,7 @@ int set_sy_lfr_n_cwf_long_f3(ccsdsTeleco //********************** // BURST MODE PARAMETERS + int set_sy_lfr_b_bp_p0(ccsdsTelecommandPacket_t *TC) { /** This function sets the time between two basic parameter sets, in s (SY_LFR_B_BP_P0). @@ -829,6 +830,7 @@ int set_sy_lfr_b_bp_p1( ccsdsTelecommand //********************* // SBM1 MODE PARAMETERS + int set_sy_lfr_s1_bp_p0( ccsdsTelecommandPacket_t *TC ) { /** This function sets the time between two basic parameter sets, in s (SY_LFR_S1_BP_P0). @@ -867,6 +869,7 @@ int set_sy_lfr_s1_bp_p1( ccsdsTelecomman //********************* // SBM2 MODE PARAMETERS + int set_sy_lfr_s2_bp_p0( ccsdsTelecommandPacket_t *TC ) { /** This function sets the time between two basic parameter sets, in s (SY_LFR_S2_BP_P0). @@ -905,6 +908,7 @@ int set_sy_lfr_s2_bp_p1( ccsdsTelecomman //******************* // TC_LFR_UPDATE_INFO + unsigned int check_update_info_hk_lfr_mode( unsigned char mode ) { unsigned int status; @@ -1040,6 +1044,113 @@ void set_hk_lfr_sc_rw_f_flags( void ) set_hk_lfr_sc_rw_f_flag( WHEEL_4, FREQ_4, rw_f.cp_rpw_sc_rw4_f4 ); } +int check_sy_lfr_rw_f( ccsdsTelecommandPacket_t *TC, int offset, int* pos, float* value ) +{ + float rw_k; + int ret; + + ret = LFR_SUCCESSFUL; + rw_k = INIT_FLOAT; + + copyFloatByChar( (unsigned char*) &rw_k, (unsigned char*) &TC->packetID[ offset ] ); + + *pos = offset; + *value = rw_k; + + if (rw_k < MIN_SY_LFR_RW_F) + { + ret = WRONG_APP_DATA; + } + + return ret; +} + +int check_all_sy_lfr_rw_f( ccsdsTelecommandPacket_t *TC, int *pos, float*value ) +{ + int ret; + + ret = LFR_SUCCESSFUL; + + //**** + //**** + // RW1 + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW1_F1, pos, value ); // F1 + if (ret == LFR_SUCCESSFUL) // F2 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW1_F2, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F3 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW1_F3, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F4 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW1_F4, pos, value ); + } + + //**** + //**** + // RW2 + if (ret == LFR_SUCCESSFUL) // F1 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW2_F1, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F2 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW2_F2, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F3 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW2_F3, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F4 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW2_F4, pos, value ); + } + + //**** + //**** + // RW3 + if (ret == LFR_SUCCESSFUL) // F1 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW3_F1, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F2 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW3_F2, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F3 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW3_F3, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F4 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW3_F4, pos, value ); + } + + //**** + //**** + // RW4 + if (ret == LFR_SUCCESSFUL) // F1 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW4_F1, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F2 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW4_F2, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F3 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW4_F3, pos, value ); + } + if (ret == LFR_SUCCESSFUL) // F4 + { + ret = check_sy_lfr_rw_f( TC, BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW4_F4, pos, value ); + } + + return ret; +} + void getReactionWheelsFrequencies( ccsdsTelecommandPacket_t *TC ) { /** This function get the reaction wheels frequencies in the incoming TC_LFR_UPDATE_INFO and copy the values locally. @@ -1345,7 +1456,7 @@ int check_sy_lfr_rw_k( ccsdsTelecommandP *pos = offset; *value = rw_k; - if (rw_k < MIN_SY_LFR_RW_K) + if (rw_k < MIN_SY_LFR_RW_F) { ret = WRONG_APP_DATA; } @@ -1353,7 +1464,7 @@ int check_sy_lfr_rw_k( ccsdsTelecommandP return ret; } -int check_all_sy_lfr_rw_k( ccsdsTelecommandPacket_t *TC, int *pos, float*value ) +int check_all_sy_lfr_rw_k( ccsdsTelecommandPacket_t *TC, int *pos, float *value ) { int ret; @@ -1436,8 +1547,6 @@ int check_all_sy_lfr_rw_k( ccsdsTelecomm ret = check_sy_lfr_rw_k( TC, DATAFIELD_POS_SY_LFR_RW4_K4, pos, value ); } - - return ret; } @@ -1453,19 +1562,16 @@ int check_sy_lfr_filter_parameters( ccsd float sy_lfr_pas_filter_shift; float sy_lfr_sc_rw_delta_f; char *parPtr; - int *datafield_pos; - float *rw_k; + int datafield_pos; + float rw_k; flag = LFR_SUCCESSFUL; sy_lfr_pas_filter_tbad = INIT_FLOAT; sy_lfr_pas_filter_shift = INIT_FLOAT; sy_lfr_sc_rw_delta_f = INIT_FLOAT; parPtr = NULL; - datafield_pos = NULL; - rw_k = NULL; - - *datafield_pos = LFR_DEFAULT_ALT; - *rw_k = INIT_FLOAT; + datafield_pos = INIT_INT; + rw_k = INIT_FLOAT; //*************** // get parameters @@ -1502,11 +1608,14 @@ int check_sy_lfr_filter_parameters( ccsd //*********************** // sy_lfr_pas_filter_tbad - if ( (sy_lfr_pas_filter_tbad < MIN_PAS_FILTER_TBAD) || (sy_lfr_pas_filter_tbad > MAX_PAS_FILTER_TBAD) ) + if (flag == LFR_SUCCESSFUL) { - parPtr = (char*) &sy_lfr_pas_filter_tbad; - status = send_tm_lfr_tc_exe_inconsistent( TC, queue_id, DATAFIELD_POS_SY_LFR_PAS_FILTER_TBAD + DATAFIELD_OFFSET, parPtr[FLOAT_LSBYTE] ); - flag = WRONG_APP_DATA; + if ( (sy_lfr_pas_filter_tbad < MIN_PAS_FILTER_TBAD) || (sy_lfr_pas_filter_tbad > MAX_PAS_FILTER_TBAD) ) + { + parPtr = (char*) &sy_lfr_pas_filter_tbad; + status = send_tm_lfr_tc_exe_inconsistent( TC, queue_id, DATAFIELD_POS_SY_LFR_PAS_FILTER_TBAD + DATAFIELD_OFFSET, parPtr[FLOAT_LSBYTE] ); + flag = WRONG_APP_DATA; + } } //************************* @@ -1549,6 +1658,7 @@ int check_sy_lfr_filter_parameters( ccsd { if ( sy_lfr_sc_rw_delta_f < MIN_SY_LFR_SC_RW_DELTA_F ) { + parPtr = (char*) &sy_lfr_pas_filter_shift; status = send_tm_lfr_tc_exe_inconsistent( TC, queue_id, DATAFIELD_POS_SY_LFR_SC_RW_DELTA_F + DATAFIELD_OFFSET, sy_lfr_sc_rw_delta_f ); flag = WRONG_APP_DATA; } @@ -1558,14 +1668,14 @@ int check_sy_lfr_filter_parameters( ccsd // sy_lfr_rw_k if (flag == LFR_SUCCESSFUL) { - flag = check_all_sy_lfr_rw_k( TC, datafield_pos, rw_k ); + flag = check_all_sy_lfr_rw_k( TC, &datafield_pos, &rw_k ); if (flag != LFR_SUCCESSFUL) { - status = send_tm_lfr_tc_exe_inconsistent( TC, queue_id, *datafield_pos + DATAFIELD_OFFSET, *rw_k ); + parPtr = (char*) &sy_lfr_pas_filter_shift; + status = send_tm_lfr_tc_exe_inconsistent( TC, queue_id, datafield_pos + DATAFIELD_OFFSET, parPtr[FLOAT_LSBYTE] ); } } - return flag; }