Index: firmware/App/Services/TxParams.c =================================================================== diff -u -rf8531a3d3a626d68f6f4c5a01babadbdfa7dc1ab -rc4ddb7ea3088882c56900355ebbc9f387da51901 --- firmware/App/Services/TxParams.c (.../TxParams.c) (revision f8531a3d3a626d68f6f4c5a01babadbdfa7dc1ab) +++ firmware/App/Services/TxParams.c (.../TxParams.c) (revision c4ddb7ea3088882c56900355ebbc9f387da51901) @@ -47,6 +47,7 @@ #define SYRINGE_PUMP_PRIME_VOLUME_ML 0.353F ///< Target syringe prime volume (in mL). TODO- move these to syringe pump controller when implemented #define SYRINGE_PUMP_FILL_VOLUME_OFFSET_ML 0.8F ///< Advised fill volume offset due to HW variance. +#define TX_PARAM_VALUE_NA 0 ///< Value for the not applicable treatment parameters /// Record for range and default of treatment parameters. typedef struct @@ -105,25 +106,38 @@ static const TREATMENT_PARAMS_PROPERTIES_T TREAT_PARAMS_PROPERTIES[ NUM_OF_TREATMENT_PARAMS ] = { // type min max default + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=2}, {.uInt=0} }, // TREATMENT_PARAM_TREATMENT_MODALITY + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=2}, {.uInt=0} }, // TREATMENT_PARAM_HDF_TREATMENT_MODE { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=500}, {.uInt=50} }, // TREATMENT_PARAM_BLOOD_FLOW { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=600}, {.uInt=50} }, // TREATMENT_PARAM_DIALYSATE_FLOW { CRITICAL_DATA_TYPE_U32, {.uInt=60}, {.uInt=480}, {.uInt=60} }, // TREATMENT_PARAM_TREATMENT_DURATION - { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=300}, {.uInt=100} }, // TREATMENT_PARAM_SALINE_BOLUS_VOLUME - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=480}, {.uInt=0} }, // TREATMENT_PARAM_HEPARIN_STOP_TIME + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=480}, {.uInt=0} }, // TREATMENT_PARAM_HEPARIN_DELIVERY_DURATION { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=0}, {.uInt=0} }, // TREATMENT_PARAM_HEPARIN_TYPE - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=2}, {.uInt=0} }, // TREATMENT_PARAM_ACID_CONCENTRATE - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=0}, {.uInt=0} }, // TREATMENT_PARAM_BICARB_CONCENTRATE + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=5}, {.uInt=0} }, // TREATMENT_PARAM_DRY_BICARB_CART_SIZE + { CRITICAL_DATA_TYPE_U32, {.uInt=130}, {.uInt=155}, {.uInt=137} }, // TREATMENT_PARAM_SODIUM + { CRITICAL_DATA_TYPE_U32, {.uInt=20}, {.uInt=40}, {.uInt=33} }, // TREATMENT_PARAM_BICARBONATE { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=6}, {.uInt=0} }, // TREATMENT_PARAM_DIALYZER_TYPE + { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=300}, {.uInt=100} }, // TREATMENT_PARAM_FLUID_BOLUS_VOLUME + { CRITICAL_DATA_TYPE_U32, {.uInt=120}, {.uInt=200}, {.uInt=120} }, // TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW + { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=200}, {.uInt=100} }, // TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW + { CRITICAL_DATA_TYPE_U32, {.uInt=20}, {.uInt=35}, {.uInt=20} }, // TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC + { CRITICAL_DATA_TYPE_U32, {.uInt=40}, {.uInt=100}, {.uInt=40} }, // TREATMENT_PARAM_TMP_PRES_LIMIT_WINDOW { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=60}, {.uInt=0} }, // TREATMENT_PARAM_BP_MEAS_INTERVAL + { CRITICAL_DATA_TYPE_U32, {.uInt=200}, {.uInt=400}, {.uInt=300} }, // TREATMENT_PARAM_PRIME_DISCARD_VOLUME + { CRITICAL_DATA_TYPE_U32, {.uInt=200}, {.uInt=400}, {.uInt=300} }, // TREATMENT_PARAM_PRIME_RINSEBACK_VOLUME { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=300}, {.uInt=200} }, // TREATMENT_PARAM_RINSEBACK_FLOW_RATE - { CRITICAL_DATA_TYPE_U32, {.uInt=200}, {.uInt=400}, {.uInt=300} }, // TREATMENT_PARAM_RINSEBACK_VOLUME - { CRITICAL_DATA_TYPE_S32, {.sInt=120}, {.sInt=200}, {.sInt=120} }, // TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW - { CRITICAL_DATA_TYPE_S32, {.sInt=100}, {.sInt=200}, {.sInt=100} }, // TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW - { CRITICAL_DATA_TYPE_S32, {.sInt=20}, {.sInt=35}, {.sInt=20} }, // TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC - { CRITICAL_DATA_TYPE_S32, {.sInt=40}, {.sInt=100}, {.sInt=40} }, // TREATMENT_PARAM_TMP_PRES_LIMIT_WINDOW - { CRITICAL_DATA_TYPE_F32, {.sFlt=35.0}, {.sFlt=38.0}, {.sFlt=37.0} }, // TREATMENT_PARAM_DIALYSATE_TEMPERATURE - { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=1.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_DISPENSE_RATE + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=3}, {.uInt=0} }, // TREATMENT_PARAM_HEPATITIS_B + { CRITICAL_DATA_TYPE_U32, {.uInt=70}, {.uInt=140}, {.uInt=90} }, // TREATMENT_PARAM_SYSTOLIC_BP_LOW_ALARM_LIMIT + { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=260}, {.uInt=200} }, // TREATMENT_PARAM_SYSTOLIC_BP_HIGH_ALARM_LIMIT + { CRITICAL_DATA_TYPE_U32, {.uInt=40}, {.uInt=140}, {.uInt=40} }, // TREATMENT_PARAM_HEART_RATE_LOW_ALARM_LIMIT + { CRITICAL_DATA_TYPE_U32, {.uInt=80}, {.uInt=180}, {.uInt=120} }, // TREATMENT_PARAM_HEART_RATE_HIGH_ALARM_LIMIT + { CRITICAL_DATA_TYPE_U32, {.uInt=1}, {.uInt=5}, {.uInt=1} }, // TREATMENT_PARAM_PRES_ALARM_PERSISTENCE + { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=30.0}, {.sFlt=1.0} }, // TREATMENT_PARAM_SUBST_FLUID_VOLUME { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=2.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME + { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=3.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_DELIVERY_RATE + { CRITICAL_DATA_TYPE_F32, {.sFlt=35.0}, {.sFlt=38.0}, {.sFlt=37.0} }, // TREATMENT_PARAM_DIALYSATE_TEMPERATURE + { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=4.0}, {.sFlt=2.0} }, // TREATMENT_PARAM_ACID_K_PLUS + { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=3.50}, {.sFlt=2.50} }, // TREATMENT_PARAM_ACID_CA2_PLUS { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=8.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_UF_VOLUME }; @@ -150,6 +164,7 @@ // ********** private function prototypes ********** static void resetAllTreatmentParameters( void ); +static BOOL isTreatmentParamApplicable( TREATMENT_PARAM_T param ); static BOOL checkTreatmentParamsInRange( U32 *reasons ); static BOOL checkTreatmentParamsDependencies( U32 *reasons ); static void extractTreatmentParamsFromPayload( TREATMENT_PARAMS_DATA_PAYLOAD_T payload ); @@ -483,46 +498,46 @@ * @brief * The isTreatmentParamApplicable function checks whether received * treatment parameters applicable for a given treatment type. - * @details \b Inputs: stagedParams[] + * @details \b Inputs: none * @details \b Outputs: none - * @param reasons Pointer to array of reject reason codes for each parameter * @return TRUE if treatment parameters is applicable, FALSE if not *************************************************************************/ -static BOOL isTreatmentParamApplicable( TREATMENT_TYPE_T txType, TREATMENT_PARAM_T param ) +static BOOL isTreatmentParamApplicable( TREATMENT_PARAM_T param ) { BOOL result = FALSE; + BOOL nonIsolatedUFParam = FALSE; + TREATMENT_TYPE_T txType = (TREATMENT_TYPE_T)stagedParams[ TREATMENT_PARAM_TREATMENT_MODALITY ].uInt; - switch ( txType ) + // skip the check of tx parameter for the first param i.e. TREATMENT_PARAM_TREATMENT_MODALITY + if ( param == TREATMENT_PARAM_TREATMENT_MODALITY ) { - case TREATMENT_MODALITY_HDF: - result = TRUE; - break; - - case TREATMENT_MODALITY_HD: - if ( ( param == TREATMENT_PARAM_HDF_TREATMENT_MODE ) || ( param == TREATMENT_PARAM_SUBST_FLUID_VOLUME ) ) - { - result = FALSE; - } - else - { + result = TRUE; + } + else + { + switch ( txType ) + { + case TREATMENT_MODALITY_HDF: result = TRUE; - } - break; + break; - case TREATMENT_MODALITY_ISOLATED_UF: - if ( TRUE ) // TODO add condition for all 9 params - { - result = FALSE; - } - else - { - result = TRUE; - } - break; + case TREATMENT_MODALITY_HD: + result = ( ( ( param == TREATMENT_PARAM_HDF_TREATMENT_MODE ) || ( param == TREATMENT_PARAM_SUBST_FLUID_VOLUME ) ) ? FALSE : TRUE ); + break; - 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; + 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; + + 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; + } } return result; @@ -542,11 +557,37 @@ 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; + // Range check treatment parameters up to (but not including) UF volume for ( param = TREATMENT_PARAM_FIRST_UINT; 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 ) + { + BOOL isNotNA = FALSE; + + if ( param <= TREATMENT_PARAM_LAST_UINT ) + { + 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 + } #if 0 // if ( FALSE == isTreatmentParamInRange( param, stagedParams[ param ] ) ) // TODO - restore when institutional settings implemented (and remove range checks below) // { @@ -601,7 +642,7 @@ BOOL result = TRUE; U32 txDur = stagedParams[ TREATMENT_PARAM_TREATMENT_DURATION ].uInt; U32 hepST = stagedParams[ TREATMENT_PARAM_HEPARIN_DELIVERY_DURATION ].uInt; - F32 hepDR = stagedParams[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ].sFlt; + F32 hepDR = stagedParams[ TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ].sFlt; F32 hepBV = stagedParams[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ].sFlt; F32 txVol = hepBV + ( hepDR * ( hepST / (F32)SEC_PER_MIN ) ) + SYRINGE_PUMP_PRIME_VOLUME_ML + SYRINGE_PUMP_FILL_VOLUME_OFFSET_ML;