Index: firmware/App/Monitors/Pressures.c =================================================================== diff -u -r44bae490e03e2b458b4795673a1b108a27bcce54 -rf0ea13c1a9908920793be07a946dc366d2ab5019 --- firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision 44bae490e03e2b458b4795673a1b108a27bcce54) +++ firmware/App/Monitors/Pressures.c (.../Pressures.c) (revision f0ea13c1a9908920793be07a946dc366d2ab5019) @@ -47,6 +47,23 @@ #define PRES_LIMIT_SHORT_STABILIZE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Duration of pressure limit short stabilization period (in ms). #define PRES_LIMIT_RESTABILIZE_TIME_MS ( 15 * SEC_PER_MIN * MS_PER_SECOND ) ///< Duration of pressure limit re-stabilize period (in ms). +// Pressure limit window validation ranges (UI-editable values as per PRS) +#define ART_PRESSURE_LIMIT_WINDOW_MIN_MMHG ( 120 ) ///< Minimum arterial pressure window limit (mmHg) +#define ART_PRESSURE_LIMIT_WINDOW_MAX_MMHG ( 200 ) ///< Maximum arterial pressure window limit (mmHg) +#define ART_PRESSURE_LIMIT_WINDOW_STEP_MMHG ( 40 ) ///< Arterial pressure window increment (mmHg) + +#define VEN_PRESSURE_LIMIT_WINDOW_MIN_MMHG ( 100 ) ///< Minimum venous pressure window limit (mmHg) +#define VEN_PRESSURE_LIMIT_WINDOW_MAX_MMHG ( 200 ) ///< Maximum venous pressure window limit (mmHg) +#define VEN_PRESSURE_LIMIT_WINDOW_STEP_MMHG ( 20 ) ///< Venous pressure window increment (mmHg) + +#define VEN_ASYM_PRESSURE_LIMIT_WINDOW_MIN_MMHG ( 20 ) ///< Minimum venous asymmetric pressure limit (mmHg) +#define VEN_ASYM_PRESSURE_LIMIT_WINDOW_MAX_MMHG ( 35 ) ///< Maximum venous asymmetric pressure limit (mmHg) +#define VEN_ASYM_PRESSURE_LIMIT_WINDOW_STEP_MMHG ( 5 ) ///< Venous asymmetric pressure increment (mmHg) + +#define TMP_PRESSURE_LIMIT_WINDOW_MIN_MMHG ( 40 ) ///< Minimum TMP pressure window limit (mmHg) +#define TMP_PRESSURE_LIMIT_WINDOW_MAX_MMHG ( 100 ) ///< Maximum TMP pressure window limit (mmHg) +#define TMP_PRESSURE_LIMIT_WINDOW_STEP_MMHG ( 20 ) ///< TMP pressure window increment (mmHg) + /// Pressure Limit minimum stabilization time before short stabilization time activation static const U32 PRES_LIMIT_MIN_STABILIZATION_TIME_IN_MS = ( PRES_LIMIT_STABILIZATION_TIME_MS - PRES_LIMIT_SHORT_STABILIZE_TIME_MS ); @@ -214,6 +231,10 @@ static void determineArtVenPressureLimits( void ); static void filterInlinePressureReadings( F32 artPres, F32 venPres, F32 tmpPres ); static void filterBaroPressureReadings( F32 baroPresPSI ); +static BOOL isArterialPressureLimitWindowValid( S32 value ); +static BOOL isVenousPressureLimitWindowValid( S32 value ); +static BOOL isVenousAsymmetricPressureLimitWindowValid( S32 value ); +static BOOL isTmpPressureLimitWindowValid( S32 value ); /*********************************************************************//** * @brief @@ -1249,7 +1270,154 @@ return result; } +/*********************************************************************//** +* @brief +* The pressureLimitHandleChangeRequest function validates pressure limit +* change request received from the UI. +* @details \b Message \b Received: MSG_ID_UI_PRESSURE_LIMITS_CHANGE_REQUEST +* @details \b Message \b Sent: MSG_ID_TD_PRESSURE_LIMITS_CHANGE_RESPONSE +* @details \b Inputs: arterial, venous, venous asymmetric, and TMP +* pressure limit window values +* @details \b Outputs: pressure limits updated when valid +* @param message set message from UI +* @return TRUE if request is valid, FALSE if not +*************************************************************************/ +BOOL pressureLimitHandleChangeRequest ( MESSAGE_T *message ) +{ + BOOL result = FALSE; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + PRESSURE_LIMIT_CHANGE_REQUEST_T request = { 0 }; + PRESSURE_LIMIT_CHANGE_RESPONSE_T response = { 0 }; + if ( message->hdr.payloadLen == sizeof( request ) ) + { + memcpy( &request, &message->payload[ 0 ], sizeof( request ) ); + + if ( isArterialPressureLimitWindowValid( request.arterialPressureLimitWindowMMHG ) && + isVenousPressureLimitWindowValid( request.venousPressureLimitWindowMMHG ) && + isVenousAsymmetricPressureLimitWindowValid( request.venousAsymmetricPressureLimitWindowMMHG ) && + isTmpPressureLimitWindowValid( request.tmpPressureLimitWindowMMHG ) ) + { + setTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW, + request.arterialPressureLimitWindowMMHG ); + + setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW, + request.venousPressureLimitWindowMMHG ); + + setTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC, + request.venousAsymmetricPressureLimitWindowMMHG ); + + setTreatmentParameterS32( TREATMENT_PARAM_TMP_PRES_LIMIT_WINDOW, + request.tmpPressureLimitWindowMMHG ); + + updatePressureLimitWindows(); + + result = TRUE; + rejReason = REQUEST_REJECT_REASON_NONE; + } + else + { + result = FALSE; + rejReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + } + } + + response.accepted = result; + response.rejectionReason = rejReason; + response.arterialPressureLimitWindowMMHG = request.arterialPressureLimitWindowMMHG; + response.venousPressureLimitWindowMMHG = request.venousPressureLimitWindowMMHG; + response.venousAsymmetricPressureLimitWindowMMHG = request.venousAsymmetricPressureLimitWindowMMHG; + response.tmpPressureLimitWindowMMHG = request.tmpPressureLimitWindowMMHG; + + sendMessage( MSG_ID_TD_PRESSURE_LIMITS_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, + sizeof( response ) ); + + return result; +} + +/*********************************************************************//** + * @brief + * The isPressureLimitValueValid function checks whether a pressure limit + * value is within the specified range and aligns with the defined step. + * @details \b Inputs: value, minValue, maxValue, stepValue + * @details \b Outputs: none + * @return TRUE if value is valid, FALSE otherwise + *************************************************************************/ +static BOOL isPressureLimitValueValid( S32 value, S32 minValue, S32 maxValue, S32 stepValue ) +{ + BOOL result = FALSE; + + if ( ( value >= minValue ) && ( value <= maxValue ) ) + { + result = ( ( ( value - minValue ) % stepValue ) == 0 ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The isArterialPressureLimitWindowValid function checks whether the + * arterial pressure limit window value is within valid range. + * @details \b Inputs: value + * @details \b Outputs: none + * @return TRUE if value is valid, FALSE otherwise + *************************************************************************/ +static BOOL isArterialPressureLimitWindowValid( S32 value ) +{ + return isPressureLimitValueValid( value, + ART_PRESSURE_LIMIT_WINDOW_MIN_MMHG, + ART_PRESSURE_LIMIT_WINDOW_MAX_MMHG, + ART_PRESSURE_LIMIT_WINDOW_STEP_MMHG ); +} + +/*********************************************************************//** + * @brief + * The isVenousPressureLimitWindowValid function checks whether the + * venous pressure limit window value is within valid range. + * @details \b Inputs: value + * @details \b Outputs: none + * @return TRUE if value is valid, FALSE otherwise + *************************************************************************/ +static BOOL isVenousPressureLimitWindowValid( S32 value ) +{ + return isPressureLimitValueValid( value, + VEN_PRESSURE_LIMIT_WINDOW_MIN_MMHG, + VEN_PRESSURE_LIMIT_WINDOW_MAX_MMHG, + VEN_PRESSURE_LIMIT_WINDOW_STEP_MMHG ); +} + +/*********************************************************************//** + * @brief + * The isVenousAsymmetricPressureLimitWindowValid function checks whether + * the venous asymmetric pressure limit window value is within valid range. + * @details \b Inputs: value + * @details \b Outputs: none + * @return TRUE if value is valid, FALSE otherwise + *************************************************************************/ +static BOOL isVenousAsymmetricPressureLimitWindowValid( S32 value ) +{ + return isPressureLimitValueValid( value, + VEN_ASYM_PRESSURE_LIMIT_WINDOW_MIN_MMHG, + VEN_ASYM_PRESSURE_LIMIT_WINDOW_MAX_MMHG, + VEN_ASYM_PRESSURE_LIMIT_WINDOW_STEP_MMHG ); +} + +/*********************************************************************//** + * @brief + * The isTmpPressureLimitWindowValid function checks whether the TMP + * pressure limit window value is within valid range. + * @details \b Inputs: value + * @details \b Outputs: none + * @return TRUE if value is valid, FALSE otherwise + *************************************************************************/ +static BOOL isTmpPressureLimitWindowValid( S32 value ) +{ + return isPressureLimitValueValid( value, + TMP_PRESSURE_LIMIT_WINDOW_MIN_MMHG, + TMP_PRESSURE_LIMIT_WINDOW_MAX_MMHG, + TMP_PRESSURE_LIMIT_WINDOW_STEP_MMHG ); +} /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/