Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r9c833ef5623ce842267e284d958820ac0dc3a7fc -rf37218b76c088f6143ad4ad89081ce8a9eaa991b --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 9c833ef5623ce842267e284d958820ac0dc3a7fc) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision f37218b76c088f6143ad4ad89081ce8a9eaa991b) @@ -118,6 +118,7 @@ { MSG_ID_UI_ULTRAFILTRATION_CHANGE_CONFIRM_REQUEST, &signalUserConfirmationOfUFVolume }, { MSG_ID_UI_DURATION_VALIDATE_REQUEST, &validateAndSetTreatmentDuration }, { MSG_ID_UI_DURATION_CONFIRM_REQUEST, &signalUserConfirmationOfTreatmentDuration }, + { MSG_ID_UI_VITALS_ADJUSTMENT_REQUEST, &vitalsAdjustmentHandleChangeRequest }, { MSG_ID_UI_BOLUS_VOLUME_CHANGE_REQUEST, &validateAndSetBolusVolume }, { MSG_ID_UI_INITIATE_TREATMENT_WORKFLOW, &signalUserInitiateTreatment }, { MSG_ID_UI_UF_PAUSE_RESUME_REQUEST, &signalPauseResumeUF }, Index: firmware/App/Services/TxParams.c =================================================================== diff -u -ra12f3ce494cd2a18aee31659c17d8a619fc70f7d -rf37218b76c088f6143ad4ad89081ce8a9eaa991b --- firmware/App/Services/TxParams.c (.../TxParams.c) (revision a12f3ce494cd2a18aee31659c17d8a619fc70f7d) +++ firmware/App/Services/TxParams.c (.../TxParams.c) (revision f37218b76c088f6143ad4ad89081ce8a9eaa991b) @@ -202,11 +202,17 @@ static void extractTreatmentParamsFromPayload( TREATMENT_PARAMS_DATA_RESPONSE_PAYLOAD_T payload ); //static void checkPressureParamsRange( TREATMENT_PARAMS_DATA_RESPONSE_PAYLOAD_T* txParams ); static void sendTreatmentParamsResponse( BOOL rejected, U32 *reasons ); +static BOOL isVitalsMeasurementIntervalValid( U32 value ); static BOOL isPressureLimitValueValid( U32 value, U32 minValue, U32 maxValue ); static BOOL isArterialPressureLimitWindowValid( U32 value ); static BOOL isVenousPressureLimitWindowValid( U32 value ); static BOOL isVenousAsymmetricPressureLimitWindowValid( U32 value ); static BOOL isTmpPressureLimitWindowValid( U32 value ); +static BOOL isVitalsAlarmLimitValueValid( U32 value, U32 minValue, U32 maxValue ); +static BOOL isSystolicBpLowAlarmLimitValid( U32 value ); +static BOOL isSystolicBpHighAlarmLimitValid( U32 value ); +static BOOL isHeartRateLowAlarmLimitValid( U32 value ); +static BOOL isHeartRateHighAlarmLimitValid( U32 value ); //static void getInstitutionalRecordEdgeValue( TREATMENT_PARAM_T param, CRITICAL_DATAS_T* value, BOOL isMin ); @@ -1637,6 +1643,211 @@ /*********************************************************************//** * @brief + * The vitalsAdjustmentHandleChangeRequest function handles the UI vitals + * settings change request during Treatment mode. + * @details \b Message \b Sent: MSG_ID_TD_VITALS_ALARM_LIMITS_CHANGE_RESPONSE + * including acceptance status and per-parameter rejection reasons. + * @details \b Inputs: none. + * @details \b Outputs: none. + * @param message set message from UI which includes the requested vitals + * alarm limits and measurement interval. + * @return TRUE if response message is sent successfully, FALSE otherwise. + *************************************************************************/ +BOOL vitalsAdjustmentHandleChangeRequest( MESSAGE_T *message ) +{ + BOOL result = FALSE; + BOOL accepted = FALSE; + + VITALS_ADJUSTMENT_REQUEST_PAYLOAD_T request; + VITALS_ADJUSTMENT_RESPONSE_PAYLOAD_T response; + + memset( &request, 0, sizeof( request ) ); + memset( &response, 0, sizeof( response ) ); + + response.systolicBpLowAlarmLimitRejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + response.systolicBpHighAlarmLimitRejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + response.heartRateLowAlarmLimitRejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + response.heartRateHighAlarmLimitRejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + response.vitalsMeasurementIntervalRejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; + + if ( message->hdr.payloadLen == sizeof( VITALS_ADJUSTMENT_REQUEST_PAYLOAD_T ) ) + { + memcpy( &request, &message->payload[ 0 ], sizeof( VITALS_ADJUSTMENT_REQUEST_PAYLOAD_T ) ); + + response.systolicBpLowAlarmLimitRejectionReason = REQUEST_REJECT_REASON_NONE; + response.systolicBpHighAlarmLimitRejectionReason = REQUEST_REJECT_REASON_NONE; + response.heartRateLowAlarmLimitRejectionReason = REQUEST_REJECT_REASON_NONE; + response.heartRateHighAlarmLimitRejectionReason = REQUEST_REJECT_REASON_NONE; + response.vitalsMeasurementIntervalRejectionReason = REQUEST_REJECT_REASON_NONE; + + if ( FALSE == isSystolicBpLowAlarmLimitValid( request.systolicBpLowAlarmLimit ) ) + { + response.systolicBpLowAlarmLimitRejectionReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + } + + if ( FALSE == isSystolicBpHighAlarmLimitValid( request.systolicBpHighAlarmLimit ) ) + { + response.systolicBpHighAlarmLimitRejectionReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + } + + if ( FALSE == isHeartRateLowAlarmLimitValid( request.heartRateLowAlarmLimit ) ) + { + response.heartRateLowAlarmLimitRejectionReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + } + + if ( FALSE == isHeartRateHighAlarmLimitValid( request.heartRateHighAlarmLimit ) ) + { + response.heartRateHighAlarmLimitRejectionReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + } + + if ( FALSE == isVitalsMeasurementIntervalValid( request.vitalsMeasurementInterval_min ) ) + { + response.vitalsMeasurementIntervalRejectionReason = REQUEST_REJECT_REASON_PARAM_OUT_OF_RANGE; + } + + accepted = ( REQUEST_REJECT_REASON_NONE == response.systolicBpLowAlarmLimitRejectionReason ) && + ( REQUEST_REJECT_REASON_NONE == response.systolicBpHighAlarmLimitRejectionReason ) && + ( REQUEST_REJECT_REASON_NONE == response.heartRateLowAlarmLimitRejectionReason ) && + ( REQUEST_REJECT_REASON_NONE == response.heartRateHighAlarmLimitRejectionReason ) && + ( REQUEST_REJECT_REASON_NONE == response.vitalsMeasurementIntervalRejectionReason ); + + if ( TRUE == accepted ) + { + setSysConfigTreatmentParameterU32( TREATMENT_PARAM_SYSTOLIC_BP_LOW_ALARM_LIMIT, request.systolicBpLowAlarmLimit ); + setSysConfigTreatmentParameterU32( TREATMENT_PARAM_SYSTOLIC_BP_HIGH_ALARM_LIMIT, request.systolicBpHighAlarmLimit ); + setSysConfigTreatmentParameterU32( TREATMENT_PARAM_HEART_RATE_LOW_ALARM_LIMIT, request.heartRateLowAlarmLimit ); + setSysConfigTreatmentParameterU32( TREATMENT_PARAM_HEART_RATE_HIGH_ALARM_LIMIT, request.heartRateHighAlarmLimit ); + setTreatmentParameterU32( TREATMENT_PARAM_BP_MEAS_INTERVAL, request.vitalsMeasurementInterval_min ); + } + } + + response.accepted = accepted; + + result = sendMessage( MSG_ID_TD_VITALS_ADJUSTMENT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( VITALS_ADJUSTMENT_RESPONSE_PAYLOAD_T ) ); + + return result; +} + +/*********************************************************************//** + * @brief + * The isVitalsAlarmLimitValueValid function validates a vitals alarm + * limit value against the specified range. + * @details \b Inputs: none. + * @details \b Outputs: none. + * @param value vitals alarm limit value to validate. + * @param minValue minimum allowable vitals alarm limit value. + * @param maxValue maximum allowable vitals alarm limit value. + * @return TRUE if value is valid, FALSE otherwise. + *************************************************************************/ +static BOOL isVitalsAlarmLimitValueValid( U32 value, U32 minValue, U32 maxValue ) +{ + return ( ( value >= minValue ) && ( value <= maxValue ) ); +} + +/*********************************************************************//** + * @brief + * The isSystolicBpLowAlarmLimitValid function validates the systolic BP + * low alarm limit value. + * @details \b Inputs: none. + * @details \b Outputs: none. + * @param value systolic BP low alarm limit value (mmHg). + * @return TRUE if the value is within valid range, FALSE otherwise. + *************************************************************************/ +static BOOL isSystolicBpLowAlarmLimitValid( U32 value ) +{ + BOOL limitValid; + + limitValid = isVitalsAlarmLimitValueValid( + value, + getU32SysConfigTreatmentParamLowerRangeLimit( TREATMENT_PARAM_SYSTOLIC_BP_LOW_ALARM_LIMIT ), + getU32SysConfigTreatmentParamUpperRangeLimit( TREATMENT_PARAM_SYSTOLIC_BP_LOW_ALARM_LIMIT ) ); + + return limitValid; +} + +/*********************************************************************//** + * @brief + * The isSystolicBpHighAlarmLimitValid function validates the systolic BP + * high alarm limit value. + * @details \b Inputs: none. + * @details \b Outputs: none. + * @param value systolic BP high alarm limit value (mmHg). + * @return TRUE if the value is within valid range, FALSE otherwise. + *************************************************************************/ +static BOOL isSystolicBpHighAlarmLimitValid( U32 value ) +{ + BOOL limitValid; + + limitValid = isVitalsAlarmLimitValueValid( + value, + getU32SysConfigTreatmentParamLowerRangeLimit( TREATMENT_PARAM_SYSTOLIC_BP_HIGH_ALARM_LIMIT ), + getU32SysConfigTreatmentParamUpperRangeLimit( TREATMENT_PARAM_SYSTOLIC_BP_HIGH_ALARM_LIMIT ) ); + + return limitValid; +} + +/*********************************************************************//** + * @brief + * The isHeartRateLowAlarmLimitValid function validates the heart rate + * low alarm limit value. + * @details \b Inputs: none. + * @details \b Outputs: none. + * @param value heart rate low alarm limit value (BPM). + * @return TRUE if the value is within valid range, FALSE otherwise. + *************************************************************************/ +static BOOL isHeartRateLowAlarmLimitValid( U32 value ) +{ + BOOL limitValid; + + limitValid = isVitalsAlarmLimitValueValid( + value, + getU32SysConfigTreatmentParamLowerRangeLimit( TREATMENT_PARAM_HEART_RATE_LOW_ALARM_LIMIT ), + getU32SysConfigTreatmentParamUpperRangeLimit( TREATMENT_PARAM_HEART_RATE_LOW_ALARM_LIMIT ) ); + + return limitValid; +} + +/*********************************************************************//** + * @brief + * The isHeartRateHighAlarmLimitValid function validates the heart rate + * high alarm limit value. + * @details \b Inputs: none. + * @details \b Outputs: none. + * @param value heart rate high alarm limit value (BPM). + * @return TRUE if the value is within valid range, FALSE otherwise. + *************************************************************************/ +static BOOL isHeartRateHighAlarmLimitValid( U32 value ) +{ + BOOL limitValid; + + limitValid = isVitalsAlarmLimitValueValid( + value, + getU32SysConfigTreatmentParamLowerRangeLimit( TREATMENT_PARAM_HEART_RATE_HIGH_ALARM_LIMIT ), + getU32SysConfigTreatmentParamUpperRangeLimit( TREATMENT_PARAM_HEART_RATE_HIGH_ALARM_LIMIT ) ); + + return limitValid; +} + +/*********************************************************************//** + * @brief + * The isVitalsMeasurementIntervalValid function validates the vitals + * measurement interval value. + * @details \b Inputs: none. + * @details \b Outputs: none. + * @param value vitals measurement interval value (minutes). + * @return TRUE if the value is within valid range, FALSE otherwise. + *************************************************************************/ +static BOOL isVitalsMeasurementIntervalValid( U32 value ) +{ + BOOL intervalValid; + + intervalValid = ( value <= 60U ); + + return intervalValid; +} + +/*********************************************************************//** + * @brief * The pressureLimitHandleChangeRequest function handles the UI pressure * limit change request during Treatment mode. * @details \b Message \b Sent: MSG_ID_TD_PRESSURE_LIMITS_CHANGE_RESPONSE including acceptance status Index: firmware/App/Services/TxParams.h =================================================================== diff -u -ra12f3ce494cd2a18aee31659c17d8a619fc70f7d -rf37218b76c088f6143ad4ad89081ce8a9eaa991b --- firmware/App/Services/TxParams.h (.../TxParams.h) (revision a12f3ce494cd2a18aee31659c17d8a619fc70f7d) +++ firmware/App/Services/TxParams.h (.../TxParams.h) (revision f37218b76c088f6143ad4ad89081ce8a9eaa991b) @@ -146,6 +146,27 @@ U32 bolusVolume; ///< Requested bolus volume (in mL). } BOLUS_VOLUME_CHANGE_REQUEST_PAYLOAD_T; +/// Payload record structure for vitals settings change request. +typedef struct +{ + U32 systolicBpLowAlarmLimit; ///< Requested systolic BP low alarm limit in mmHg. + U32 systolicBpHighAlarmLimit; ///< Requested systolic BP high alarm limit in mmHg. + U32 heartRateLowAlarmLimit; ///< Requested heart rate low alarm limit in BPM. + U32 heartRateHighAlarmLimit; ///< Requested heart rate high alarm limit in BPM. + U32 vitalsMeasurementInterval_min; ///< Requested vitals measurement interval in minutes. +} VITALS_ADJUSTMENT_REQUEST_PAYLOAD_T; + +/// Payload record structure for vitals settings change response. +typedef struct +{ + BOOL accepted; ///< Accepted/Rejected. + U32 systolicBpLowAlarmLimitRejectionReason; ///< Rejection reason for systolic BP low alarm limit. + U32 systolicBpHighAlarmLimitRejectionReason; ///< Rejection reason for systolic BP high alarm limit. + U32 heartRateLowAlarmLimitRejectionReason; ///< Rejection reason for heart rate low alarm limit. + U32 heartRateHighAlarmLimitRejectionReason; ///< Rejection reason for heart rate high alarm limit. + U32 vitalsMeasurementIntervalRejectionReason; ///< Rejection reason for vitals measurement interval. +} VITALS_ADJUSTMENT_RESPONSE_PAYLOAD_T; + /// Payload record structure for pressure limit change request. typedef struct { @@ -239,6 +260,7 @@ // Edit Treatment parameter handlers BOOL validateAndSetTreatmentDuration( MESSAGE_T *message ); // User provided treatment duration to be set and validated BOOL validateAndSetBolusVolume( MESSAGE_T *message ); // User provided bolus volume to be set and validated +BOOL vitalsAdjustmentHandleChangeRequest( MESSAGE_T *message ); // User provided vitals settings to be validated and applied BOOL pressureLimitHandleChangeRequest( MESSAGE_T *message ); // User provided pressure limit window values to be validated and applied BOOL validateAndSetUFVolume( MESSAGE_T *message ); // User provided ultrafiltration volume to be set and validated BOOL validateAndSetTreatmentSetPoints( MESSAGE_T *message ); // User provided prescription setting values to be validated and applied