# HG changeset patch # User paul # Date 2017-02-02 10:43:51 # Node ID e784d0191567431d68b0db786c4d4b03548b7c64 # Parent 571c142ee2b36a6b32db4bdd723140ffbd172118 3.1.0.7 Bug #914 Masque erroné en cas de bande polluée partiellement ... Bug #862 Valeurs des masques RW erronées dans TM_LFR_PARAMETER_DUMP 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 @@ -77,7 +77,7 @@ unsigned int check_update_info_hk_lfr_mo unsigned int check_update_info_hk_tds_mode( unsigned char mode ); unsigned int check_update_info_hk_thr_mode( unsigned char mode ); void getReactionWheelsFrequencies( ccsdsTelecommandPacket_t *TC ); -void setFBinMask(unsigned char *fbins_mask, float rw_f, unsigned char deltaFreq, unsigned char flag ); +void setFBinMask(unsigned char *fbins_mask, float rw_f, unsigned char deltaFreq, unsigned char flag, float sy_lfr_rw_k ); void build_sy_lfr_rw_mask( unsigned int channel ); void build_sy_lfr_rw_masks(); void merge_fbins_masks( void ); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -64,7 +64,7 @@ option(FSW_debug_tch "?" OFF) set(SW_VERSION_N1 "3" CACHE STRING "Choose N1 FSW Version." FORCE) set(SW_VERSION_N2 "1" CACHE STRING "Choose N2 FSW Version." FORCE) set(SW_VERSION_N3 "0" CACHE STRING "Choose N3 FSW Version." FORCE) -set(SW_VERSION_N4 "6" CACHE STRING "Choose N4 FSW Version." FORCE) +set(SW_VERSION_N4 "7" CACHE STRING "Choose N4 FSW Version." FORCE) if(FSW_verbose) add_definitions(-DPRINT_MESSAGES_ON_CONSOLE) 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 @@ -978,7 +978,7 @@ void getReactionWheelsFrequencies( ccsds (unsigned char*) &bytePosPtr[ BYTE_POS_UPDATE_INFO_CP_RPW_SC_RW4_F2 ] ); } -void setFBinMask( unsigned char *fbins_mask, float rw_f, unsigned char deltaFreq, unsigned char flag ) +void setFBinMask( unsigned char *fbins_mask, float rw_f, unsigned char deltaFreq, unsigned char flag, float sy_lfr_rw_k ) { /** This function executes specific actions when a TC_LFR_UPDATE_INFO TeleCommand has been received. * @@ -998,6 +998,7 @@ void setFBinMask( unsigned char *fbins_m float fi; float deltaBelow; float deltaAbove; + float freqToFilterOut; int binBelow; int binAbove; int closestBin; @@ -1006,77 +1007,98 @@ void setFBinMask( unsigned char *fbins_m int bin; int binToRemove[NB_BINS_TO_REMOVE]; int k; + bool filteringSet; closestBin = 0; whichByte = 0; bin = 0; + filteringSet = false; for (k = 0; k < NB_BINS_TO_REMOVE; k++) { binToRemove[k] = -1; } - // compute the frequency range to filter [ rw_f - delta_f/2; rw_f + delta_f/2 ] - f_RW_min = rw_f - (filterPar.sy_lfr_sc_rw_delta_f / 2.); - f_RW_MAX = rw_f + (filterPar.sy_lfr_sc_rw_delta_f / 2.); + // compute the frequency range to filter [ rw_f - delta_f; rw_f + delta_f ] + f_RW_min = rw_f - ((filterPar.sy_lfr_sc_rw_delta_f) * sy_lfr_rw_k); + f_RW_MAX = rw_f + ((filterPar.sy_lfr_sc_rw_delta_f) * sy_lfr_rw_k); - // compute the index of the frequency bin immediately below rw_f - binBelow = (int) ( floor( ((double) rw_f) / ((double) deltaFreq)) ); - deltaBelow = rw_f - binBelow * deltaFreq; + freqToFilterOut = f_RW_min; + while ( filteringSet == false ) + { + // compute the index of the frequency bin immediately below rw_f + binBelow = (int) ( floor( ((double) freqToFilterOut) / ((double) deltaFreq)) ); + deltaBelow = freqToFilterOut - binBelow * deltaFreq; - // compute the index of the frequency bin immediately above rw_f - binAbove = (int) ( ceil( ((double) rw_f) / ((double) deltaFreq)) ); - deltaAbove = binAbove * deltaFreq - rw_f; + // compute the index of the frequency bin immediately above rw_f + binAbove = (int) ( ceil( ((double) freqToFilterOut) / ((double) deltaFreq)) ); + deltaAbove = binAbove * deltaFreq - freqToFilterOut; - // search the closest bin - if (deltaAbove > deltaBelow) - { - closestBin = binBelow; - } - else - { - closestBin = binAbove; - } + // search the closest bin + if (deltaAbove > deltaBelow) + { + closestBin = binBelow; + } + else + { + closestBin = binAbove; + } - // compute the fi interval [fi - deltaFreq * 0.285, fi + deltaFreq * 0.285] - fi = closestBin * deltaFreq; - fi_min = fi - (deltaFreq * FI_INTERVAL_COEFF); - fi_MAX = fi + (deltaFreq * FI_INTERVAL_COEFF); + // compute the fi interval [fi - deltaFreq * 0.285, fi + deltaFreq * 0.285] + fi = closestBin * deltaFreq; + fi_min = fi - (deltaFreq * FI_INTERVAL_COEFF); + fi_MAX = fi + (deltaFreq * FI_INTERVAL_COEFF); + + //************************************************************************************** + // be careful here, one shall take into account that the bin 0 IS DROPPED in the spectra + // thus, the index 0 in a mask corresponds to the bin 1 of the spectrum + //************************************************************************************** - //************************************************************************************** - // be careful here, one shall take into account that the bin 0 IS DROPPED in the spectra - // thus, the index 0 in a mask corresponds to the bin 1 of the spectrum - //************************************************************************************** + // 1. IF freqToFilterOut is included in [ fi_min; fi_MAX ] + // => remove f_(i), f_(i-1) and f_(i+1) + if ( ( freqToFilterOut > fi_min ) && ( freqToFilterOut < fi_MAX ) ) + { + binToRemove[0] = (closestBin - 1) - 1; + binToRemove[1] = (closestBin) - 1; + binToRemove[2] = (closestBin + 1) - 1; + } + // 2. ELSE + // => remove the two f_(i) which are around f_RW + else + { + binToRemove[0] = (binBelow) - 1; + binToRemove[1] = (binAbove) - 1; + binToRemove[2] = (-1); + } - // 1. IF [ f_RW_min, f_RW_MAX] is included in [ fi_min; fi_MAX ] - // => remove f_(i), f_(i-1) and f_(i+1) - if ( ( f_RW_min > fi_min ) && ( f_RW_MAX < fi_MAX ) ) - { - binToRemove[0] = (closestBin - 1) - 1; - binToRemove[1] = (closestBin) - 1; - binToRemove[2] = (closestBin + 1) - 1; - } - // 2. ELSE - // => remove the two f_(i) which are around f_RW - else - { - binToRemove[0] = (binBelow) - 1; - binToRemove[1] = (binAbove) - 1; - binToRemove[2] = (-1); - } + for (k = 0; k < NB_BINS_TO_REMOVE; k++) + { + bin = binToRemove[k]; + if ( (bin >= BIN_MIN) && (bin <= BIN_MAX) ) + { + if (flag == 1) + { + whichByte = (bin >> SHIFT_3_BITS); // division by 8 + selectedByte = ( 1 << (bin - (whichByte * BITS_PER_BYTE)) ); + fbins_mask[BYTES_PER_MASK - 1 - whichByte] = + fbins_mask[BYTES_PER_MASK - 1 - whichByte] & ((unsigned char) (~selectedByte)); // bytes are ordered MSB first in the packets + } + } + } - for (k = 0; k < NB_BINS_TO_REMOVE; k++) - { - bin = binToRemove[k]; - if ( (bin >= BIN_MIN) && (bin <= BIN_MAX) ) + // update freqToFilterOut + if ( freqToFilterOut == f_RW_MAX ) + { + filteringSet = true; // end of the loop + } + else { - if (flag == 1) - { - whichByte = (bin >> SHIFT_3_BITS); // division by 8 - selectedByte = ( 1 << (bin - (whichByte * BITS_PER_BYTE)) ); - fbins_mask[BYTES_PER_MASK - 1 - whichByte] = - fbins_mask[BYTES_PER_MASK - 1 - whichByte] & ((unsigned char) (~selectedByte)); // bytes are ordered MSB first in the packets - } + freqToFilterOut = freqToFilterOut + deltaFreq; + } + + if ( freqToFilterOut > f_RW_MAX) + { + freqToFilterOut = f_RW_MAX; } } } @@ -1117,28 +1139,28 @@ void build_sy_lfr_rw_mask( unsigned int } // RW1 F1 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw1_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW1_F1) >> SHIFT_7_BITS ); // [1000 0000] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw1_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW1_F1) >> SHIFT_7_BITS, 1. ); // [1000 0000] // RW1 F2 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw1_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW1_F2) >> SHIFT_6_BITS ); // [0100 0000] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw1_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW1_F2) >> SHIFT_6_BITS, 1. ); // [0100 0000] // RW2 F1 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw2_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW2_F1) >> SHIFT_5_BITS ); // [0010 0000] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw2_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW2_F1) >> SHIFT_5_BITS, 1. ); // [0010 0000] // RW2 F2 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw2_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW2_F2) >> SHIFT_4_BITS ); // [0001 0000] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw2_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW2_F2) >> SHIFT_4_BITS, 1. ); // [0001 0000] // RW3 F1 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw3_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW3_F1) >> SHIFT_3_BITS ); // [0000 1000] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw3_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW3_F1) >> SHIFT_3_BITS, 1. ); // [0000 1000] // RW3 F2 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw3_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW3_F2) >> SHIFT_2_BITS ); // [0000 0100] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw3_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW3_F2) >> SHIFT_2_BITS, 1. ); // [0000 0100] // RW4 F1 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw4_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW4_F1) >> 1 ); // [0000 0010] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw4_f1, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW4_F1) >> 1 , 1. ); // [0000 0010] // RW4 F2 - setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw4_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW4_F2) ); // [0000 0001] + setFBinMask( local_rw_fbins_mask, cp_rpw_sc_rw4_f2, deltaF, (cp_rpw_sc_rw_f_flags & BIT_RW4_F2) , 1.); // [0000 0001] // update the value of the fbins related to reaction wheels frequency filtering if (maskPtr != NULL)