Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543 -rea02f813a3b84bfbb5f1d3b4adbba6152ba9316d --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision ea02f813a3b84bfbb5f1d3b4adbba6152ba9316d) @@ -183,6 +183,7 @@ SW_FAULT_ID_TD_VALVES_INVALID_FIND_DEENERGIZED_EDGE = 152, SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE = 153, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE = 148, + SW_FAULT_ID_INVALID_TREATMENT_MODALITY = 149, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/TxParams.c =================================================================== diff -u -rc4ddb7ea3088882c56900355ebbc9f387da51901 -rea02f813a3b84bfbb5f1d3b4adbba6152ba9316d --- firmware/App/Services/TxParams.c (.../TxParams.c) (revision c4ddb7ea3088882c56900355ebbc9f387da51901) +++ firmware/App/Services/TxParams.c (.../TxParams.c) (revision ea02f813a3b84bfbb5f1d3b4adbba6152ba9316d) @@ -164,7 +164,8 @@ // ********** private function prototypes ********** static void resetAllTreatmentParameters( void ); -static BOOL isTreatmentParamApplicable( TREATMENT_PARAM_T param ); +static BOOL isTreatmentParamNotApplicable( TREATMENT_PARAM_T param ); +static BOOL isNotApplicableTreatmentParamZero( TREATMENT_PARAM_T param ); static BOOL checkTreatmentParamsInRange( U32 *reasons ); static BOOL checkTreatmentParamsDependencies( U32 *reasons ); static void extractTreatmentParamsFromPayload( TREATMENT_PARAMS_DATA_PAYLOAD_T payload ); @@ -496,49 +497,85 @@ /*********************************************************************//** * @brief - * The isTreatmentParamApplicable function checks whether received - * treatment parameters applicable for a given treatment type. - * @details \b Inputs: none + * The isTreatmentParamNotApplicable function checks whether received + * treatment parameters not applicable for a set treatment modality. + * @details \b Inputs: stagedParams * @details \b Outputs: none - * @return TRUE if treatment parameters is applicable, FALSE if not + * @return TRUE if treatment parameters is not applicable, FALSE if not *************************************************************************/ -static BOOL isTreatmentParamApplicable( TREATMENT_PARAM_T param ) +static BOOL isTreatmentParamNotApplicable( TREATMENT_PARAM_T param ) { - BOOL result = FALSE; - BOOL nonIsolatedUFParam = FALSE; + BOOL result = TRUE; TREATMENT_TYPE_T txType = (TREATMENT_TYPE_T)stagedParams[ TREATMENT_PARAM_TREATMENT_MODALITY ].uInt; - // skip the check of tx parameter for the first param i.e. TREATMENT_PARAM_TREATMENT_MODALITY - if ( param == TREATMENT_PARAM_TREATMENT_MODALITY ) + switch ( txType ) { - result = TRUE; + case TREATMENT_MODALITY_HDF: + result = FALSE; + break; + + case TREATMENT_MODALITY_HD: + result = ( ( ( param == TREATMENT_PARAM_HDF_TREATMENT_MODE ) || ( param == TREATMENT_PARAM_SUBST_FLUID_VOLUME ) ) ? TRUE : FALSE ); + break; + + case TREATMENT_MODALITY_ISOLATED_UF: + switch ( param ) + { + // Treatment parameters that are not applicable for isolated UF + case TREATMENT_PARAM_HDF_TREATMENT_MODE: + case TREATMENT_PARAM_SUBST_FLUID_VOLUME: + case TREATMENT_PARAM_DIALYSATE_FLOW: + case TREATMENT_PARAM_DIALYSATE_TEMPERATURE: + case TREATMENT_PARAM_ACID_K_PLUS: + case TREATMENT_PARAM_ACID_CA2_PLUS: + case TREATMENT_PARAM_SODIUM: + case TREATMENT_PARAM_BICARBONATE: + case TREATMENT_PARAM_DRY_BICARB_CART_SIZE: + result = TRUE; + break; + + // Treatment parameters applicable for isolated UF + default: + result = FALSE; + break; + } + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_INVALID_TREATMENT_MODALITY, (U32)txType ) + break; } - else - { - switch ( txType ) - { - case TREATMENT_MODALITY_HDF: - result = TRUE; - break; - case TREATMENT_MODALITY_HD: - result = ( ( ( param == TREATMENT_PARAM_HDF_TREATMENT_MODE ) || ( param == TREATMENT_PARAM_SUBST_FLUID_VOLUME ) ) ? FALSE : TRUE ); - break; + return result; +} - case TREATMENT_MODALITY_ISOLATED_UF: - nonIsolatedUFParam = ( ( ( param == TREATMENT_PARAM_HDF_TREATMENT_MODE ) || ( param == TREATMENT_PARAM_SUBST_FLUID_VOLUME ) || - ( param == TREATMENT_PARAM_DIALYSATE_FLOW ) || ( param == TREATMENT_PARAM_DIALYSATE_TEMPERATURE ) || - ( param == TREATMENT_PARAM_ACID_K_PLUS ) || ( param == TREATMENT_PARAM_ACID_CA2_PLUS ) || - ( param == TREATMENT_PARAM_SODIUM ) || ( param == TREATMENT_PARAM_BICARBONATE ) || - ( param == TREATMENT_PARAM_DRY_BICARB_CART_SIZE ) ) ? FALSE : TRUE ); - result = ( nonIsolatedUFParam ? FALSE : TRUE ); - break; +/*********************************************************************//** + * @brief + * The isNotApplicableTreatmentParamZero function checks whether received + * treatment parameters is set to zero or not. + * @details \b Inputs: stagedParams + * @details \b Outputs: none + * @return TRUE if treatment parameters is set to zero, FALSE if not + *************************************************************************/ +static BOOL isNotApplicableTreatmentParamZero( TREATMENT_PARAM_T param ) +{ + BOOL result = TRUE; - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_TREATMENT_PARAMS_INVALID_PARAM, (U32)txType ) // TODO add new INVALID_TREATMENT_TYPE in SW fault - break; + if ( param <= TREATMENT_PARAM_LAST_UINT ) + { + if ( stagedParams[ param ].uInt != TX_PARAM_VALUE_NA ) + { + result = FALSE; } } + // check for float type params + else + { + if ( stagedParams[ param ].sFlt != (F32)NEARLY_ZERO ) + { + result = FALSE; + } + } return result; } @@ -557,69 +594,67 @@ BOOL result = TRUE; TREATMENT_PARAM_T param; - // Get the Treatment Type (Param 1) from the staged parameters -// TREATMENT_TYPE_T currentTxType = (TREATMENT_TYPE_T)stagedParams[ TREATMENT_PARAM_TREATMENT_MODALITY ].uInt; + reasons[ TREATMENT_PARAM_TREATMENT_MODALITY ] = REQUEST_REJECT_REASON_NONE; +// if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_TREATMENT_MODALITY, stagedParams[ TREATMENT_PARAM_TREATMENT_MODALITY ] ) ) // TODO - restore when institutional settings implemented + if ( ( stagedParams[ TREATMENT_PARAM_TREATMENT_MODALITY ].uInt < TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_TREATMENT_MODALITY ].min.uInt ) || + ( stagedParams[ TREATMENT_PARAM_TREATMENT_MODALITY ].uInt > TREAT_PARAMS_PROPERTIES[ TREATMENT_PARAM_TREATMENT_MODALITY ].max.uInt ) ) + { + reasons[ TREATMENT_PARAM_TREATMENT_MODALITY ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } - // Range check treatment parameters up to (but not including) UF volume - for ( param = TREATMENT_PARAM_FIRST_UINT; param < TREATMENT_PARAM_UF_VOLUME; param++ ) + // TODO should execute the below for loop only if result is true? + // Range check treatment parameters excluding treatment modality and up to (but not including) UF volume + for ( param = TREATMENT_PARAM_HDF_TREATMENT_MODE; param < TREATMENT_PARAM_UF_VOLUME; param++ ) { reasons[ param ] = REQUEST_REJECT_REASON_NONE; - BOOL paramApplicable = isTreatmentParamApplicable( param ); - // Check if parameter is applicable for selected treatment modality - if ( !paramApplicable ) + // Check if not applicable parameter is not set + if ( TRUE == isTreatmentParamNotApplicable( param ) ) { - BOOL isNotNA = FALSE; - - if ( param <= TREATMENT_PARAM_LAST_UINT ) + // reject if the not applicable parameter is set to non-zero + if ( FALSE == isNotApplicableTreatmentParamZero( param ) ) { - isNotNA = ( ( stagedParams[ param ].uInt != TX_PARAM_VALUE_NA ) ? TRUE : FALSE ); - } - // check for float type params - else - { - isNotNA = ( ( stagedParams[ param ].sFlt != (F32)TX_PARAM_VALUE_NA ) ? TRUE : FALSE ); - } - - if ( isNotNA ) - { reasons[ param ] = REQUEST_REJECT_REASON_PARAM_NOT_APPLICABLE; result = FALSE; } - continue; // Move to next parameter } + // do a range check for the applicable parameter + else + { #if 0 -// if ( FALSE == isTreatmentParamInRange( param, stagedParams[ param ] ) ) // TODO - restore when institutional settings implemented (and remove range checks below) -// { -// reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; -// result = FALSE; -// } +// if ( FALSE == isTreatmentParamInRange( param, stagedParams[ param ] ) ) // TODO - restore when institutional settings implemented (and remove range checks below) +// { +// reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; +// result = FALSE; +// } #else - if ( param <= TREATMENT_PARAM_LAST_UINT ) - { - if ( ( stagedParams[ param ].uInt < TREAT_PARAMS_PROPERTIES[ param ].min.uInt ) || - ( stagedParams[ param ].uInt > TREAT_PARAMS_PROPERTIES[ param ].max.uInt ) ) + if ( param <= TREATMENT_PARAM_LAST_UINT ) { - reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; - result = FALSE; + if ( ( stagedParams[ param ].uInt < TREAT_PARAMS_PROPERTIES[ param ].min.uInt ) || + ( stagedParams[ param ].uInt > TREAT_PARAMS_PROPERTIES[ param ].max.uInt ) ) + { + reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } } - } - else if ( param <= TREATMENT_PARAM_LAST_INT ) - { - if ( ( stagedParams[ param ].sInt < TREAT_PARAMS_PROPERTIES[ param ].min.sInt ) || - ( stagedParams[ param ].sInt > TREAT_PARAMS_PROPERTIES[ param ].max.sInt ) ) + else if ( param <= TREATMENT_PARAM_LAST_INT ) { - reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; - result = FALSE; + if ( ( stagedParams[ param ].sInt < TREAT_PARAMS_PROPERTIES[ param ].min.sInt ) || + ( stagedParams[ param ].sInt > TREAT_PARAMS_PROPERTIES[ param ].max.sInt ) ) + { + reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } } - } - else - { - if ( ( stagedParams[ param ].sFlt < TREAT_PARAMS_PROPERTIES[ param ].min.sFlt ) || - ( stagedParams[ param ].sFlt > TREAT_PARAMS_PROPERTIES[ param ].max.sFlt ) ) + else { - reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; - result = FALSE; + if ( ( stagedParams[ param ].sFlt < TREAT_PARAMS_PROPERTIES[ param ].min.sFlt ) || + ( stagedParams[ param ].sFlt > TREAT_PARAMS_PROPERTIES[ param ].max.sFlt ) ) + { + reasons[ param ] = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } } } }