Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -rf3b83f75a19b975ad1abead662c8151a2907ac00 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f3b83f75a19b975ad1abead662c8151a2907ac00) @@ -22,12 +22,14 @@ #include "DialInFlow.h" #include "DialOutFlow.h" #include "Dialysis.h" -#include "TaskGeneral.h" +#include "ModeTreatment.h" +#include "ModeTreatmentParams.h" #include "OperationModes.h" #include "SystemCommMessages.h" +#include "TaskGeneral.h" #include "Timers.h" #include "TreatmentStop.h" -#include "ModeTreatment.h" +#include "Utilities.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; @@ -712,6 +714,92 @@ /*********************************************************************//** * @brief + * The verifyPressureLimitsChange function verifies a user change request + * for in-line pressure alarm limits. If valid, new limits are accepted + * and set. + * @details Inputs: none + * @details Outputs: new pressure limits set, response sent + * @return TRUE if new pressure limits accepted, FALSE if not. + *************************************************************************/ +BOOL verifyPressureLimitsChange( PRESSURE_LIMIT_CHANGE_REQUEST_T *data ) +{ + BOOL result = TRUE; + CRITICAL_DATAS_T proposedNewArtLowLimit, proposedNewArtHighLimit; + CRITICAL_DATAS_T proposedNewVenLowLimit, proposedNewVenHighLimit; + PRESSURE_LIMIT_CHANGE_RESPONSE_T respRecord = { FALSE, 0, 0, 0, 0, 0 }; + + proposedNewArtLowLimit.sInt = data->artLowLimit; + proposedNewArtHighLimit.sInt = data->artHighLimit; + proposedNewVenLowLimit.sInt = data->venLowLimit; + proposedNewVenHighLimit.sInt = data->venHighLimit; + + // check ranges for changed limits + if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT, proposedNewArtLowLimit ) ) + { + respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } + if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT, proposedNewArtHighLimit ) ) + { + respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } + if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT, proposedNewVenLowLimit ) ) + { + respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } + if ( FALSE == isTreatmentParamInRange( TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT, proposedNewVenHighLimit ) ) + { + respRecord.rejReasonCode = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + result = FALSE; + } + + // if ranges ok, check separation between low/high limits + if ( TRUE == result ) + { + S32 arterialPresLimitDelta = data->artHighLimit - data->artLowLimit; + S32 venousPresLimitDelta = data->venHighLimit - data->venLowLimit; + + // check arterial alarm limits dependency + if ( arterialPresLimitDelta < MIN_PRESSURE_ALARM_LIMIT_DELTA_MMHG ) + { + respRecord.rejReasonCode = REQUEST_REJECT_REASON_ARTERIAL_PRESSURE_LOW_VS_HIGH; + result = FALSE; + } + + // check venous alarm limits dependency + if ( venousPresLimitDelta < MIN_PRESSURE_ALARM_LIMIT_DELTA_MMHG ) + { + respRecord.rejReasonCode = REQUEST_REJECT_REASON_VENOUS_PRESSURE_LOW_VS_HIGH; + result = FALSE; + } + } + + // set overall result - are changes accepted? + respRecord.accepted = result; + + // if changes accepted, set new pressure limits and read back for transmit to UI. + if ( TRUE == result ) + { + setTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT, data->artLowLimit ); + setTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT, data->artHighLimit ); + setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT, data->venLowLimit ); + setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT, data->venHighLimit ); + respRecord.artLowLimit = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ); + respRecord.artHighLimit = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ); + respRecord.venLowLimit = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ); + respRecord.venHighLimit = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ); + } + + // send response + sendChangePressureLimitsChangeResponse( &respRecord ); + + return result; +} + +/*********************************************************************//** + * @brief * The broadcastTreatmentTimeAndState function broadcasts treatment time and * state data during treatment. * @details