Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rc9890bc0bc9a1d779be9fec7e0478cfc6fba1cfb -rbdbb0ede1af201d43125d663a4ca5740e39509f6 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision c9890bc0bc9a1d779be9fec7e0478cfc6fba1cfb) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision bdbb0ede1af201d43125d663a4ca5740e39509f6) @@ -76,6 +76,14 @@ /// Macro to calculate the remaining treatment time in seconds. #define CALC_TREAT_TIME_REMAINING_IN_SECS() ( (S32)presTreatmentTimeSecs - (S32)( treatmentTimeMS / MS_PER_SECOND ) ) +/// Treatment duration requested values +typedef struct +{ + U32 requestedTxDurationMins; ///< Requested treatment duration from the user in minutes. + F32 newUFRateMLPM; ///< New calculated UF rate in mL/Min. + BOOL isUFRateConfInProgress; ///< Boolean flag to indicate whether a new UF rate confirmation has been requested. +} TREATMENT_DURATION_RQST_T; + // ********** private data ********** static TREATMENT_STATE_T currentTreatmentState; ///< Current state (sub-mode) of treatment mode. @@ -134,6 +142,8 @@ static U32 treatmentStartTimeStamp; ///< Treatment start timestampt for logging purpose. static U32 treatmentEndTimeStamp; ///< Treatment end timestampt for logging purpose. +static TREATMENT_DURATION_RQST_T txDurationRequest; ///< Treatment duration request structure. + // ********** private function prototypes ********** static void broadcastTreatmentSettingsRanges( void ); @@ -148,6 +158,7 @@ static TREATMENT_STATE_T handleTreatmentEndState( void ); static void resetSignalFlags( void ); static void resetAlarmSignalFlags( void ); +static void checkUFRateConfirmationMessageFromUI( void ); /*********************************************************************//** * @brief @@ -200,6 +211,10 @@ treatmentStartTimeStamp = getRTCTimestamp(); treatmentEndTimeStamp = 0; + txDurationRequest.requestedTxDurationMins = 0; + txDurationRequest.newUFRateMLPM = 0.0F; + txDurationRequest.isUFRateConfInProgress = FALSE; + // reset dialysate temperature alarm persistences prior to starting a treatment. resetPersistentAlarmTimer( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_SAFETY_TEMP ); resetPersistentAlarmTimer( ALARM_ID_HD_DIALYSATE_TEMP_ABOVE_TARGET_TEMP ); @@ -790,6 +805,8 @@ U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); DIALYSIS_STATE_T dialysisState = getDialysisState(); + checkUFRateConfirmationMessageFromUI(); + // Update treatment time (unless delivering a saline bolus or is in blood leak zeroing state other than flush reservoir to DPi state) switch ( dialysisState ) { @@ -1075,14 +1092,23 @@ if ( ( TRUE == isTxTimeValid ) && ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) && ( TRUE == isUFRateValid ) ) { + GENERIC_CONFIRMATION_REQUEST_T genericConfRequest; + result = TRUE; - sendTreatmentLogEventData( TREATMENT_DURATION_CHANGE_EVENT, ( presTreatmentTimeSecs / SEC_PER_MIN ), treatmentTime ); - presTreatmentTimeSecs = treatmentTime * SEC_PER_MIN; - presUFRate = newUFRateMLPM; - setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, ( presMaxUFVolumeML / (F32)ML_PER_LITER ) ); - setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, ( presTreatmentTimeSecs / SEC_PER_MIN ) ); - setDialysisDialInFlowAndUFRate( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presMaxUFVolumeML, presUFRate ); - signalInitiatePressureStabilization( USE_NORMAL_STABILIZATION_PERIOD ); + + txDurationRequest.requestedTxDurationMins = treatmentTime; + txDurationRequest.newUFRateMLPM = newUFRateMLPM; + txDurationRequest.isUFRateConfInProgress = TRUE; + + genericConfRequest.requestID = GENERIC_CONFIRM_ID_UF_RATE_CHANGE_IN_TX_DURATION_CHANGE; + genericConfRequest.requestType = GENERIC_CONFIRM_CMD_REQUEST_OPEN; + genericConfRequest.rejectReason = 0; + genericConfRequest.genericPayload1 = txDurationRequest.newUFRateMLPM; + genericConfRequest.genericPayload2 = 0.0F; + genericConfRequest.genericPayload3 = 0.0F; + genericConfRequest.genericPayload4 = 0.0F; + + sendConfirmationRequest( &genericConfRequest ); } else { @@ -1106,8 +1132,7 @@ { rejectReason = REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE; } - else if ( ( currentTreatmentState <= TREATMENT_START_STATE ) || - ( currentTreatmentState >= TREATMENT_END_STATE ) ) + else if ( ( currentTreatmentState <= TREATMENT_START_STATE ) || ( currentTreatmentState >= TREATMENT_END_STATE ) ) { rejectReason = REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE; } @@ -1120,8 +1145,13 @@ rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_CURRENT; } } - // Send response to request - sendChangeTreatmentDurationResponse( result, rejectReason, presTreatmentTimeSecs / SEC_PER_MIN, presMaxUFVolumeML ); + + if ( rejectReason != REQUEST_REJECT_REASON_NONE ) + { + // Send response to request only if there is a rejection + sendChangeTreatmentDurationResponse( result, rejectReason, presTreatmentTimeSecs / SEC_PER_MIN, presMaxUFVolumeML ); + } + // Send new ranges for settings treatmentParamsRangesBroadcastTimerCtr = getU32OverrideValue( &treatmentParamRangesPublishInterval ); broadcastTreatmentSettingsRanges(); @@ -1679,6 +1709,53 @@ endTreatmentAlarmResponseRequest = FALSE; } +/*********************************************************************//** + * @brief + * The checkUFRateConfirmationMessageFromUI function checks whether a response + * from UI has been received to see if the new UF rate due to change of + * the treatment duration is accepted or rejected. + * @details Inputs: txDurationRequest + * @details Outputs: presTreatmentTimeSecs, presUFRate, txDurationRequest, + * presMaxUFVolumeML + * @return none + *************************************************************************/ +static void checkUFRateConfirmationMessageFromUI( void ) +{ + if ( TRUE == txDurationRequest.isUFRateConfInProgress ) + { + BOOL result = FALSE; + CONFIRMATION_REQUEST_STATUS_T status = getConfirmationRequestStatus( GENERIC_CONFIRM_ID_UF_RATE_CHANGE_IN_TX_DURATION_CHANGE ); + + if ( ( CONFIRMATION_REQUEST_STATUS_ACCEPTED == status ) || ( CONFIRMATION_REQUEST_STATUS_REJECTED == status ) ) + { + if ( CONFIRMATION_REQUEST_STATUS_ACCEPTED == status ) + { + result = TRUE; + sendTreatmentLogEventData( TREATMENT_DURATION_CHANGE_EVENT, ( presTreatmentTimeSecs / SEC_PER_MIN ), txDurationRequest.requestedTxDurationMins ); + presTreatmentTimeSecs = txDurationRequest.requestedTxDurationMins * SEC_PER_MIN; + presUFRate = txDurationRequest.newUFRateMLPM; + setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, ( presMaxUFVolumeML / (F32)ML_PER_LITER ) ); + setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, ( presTreatmentTimeSecs / SEC_PER_MIN ) ); + setDialysisDialInFlowAndUFRate( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presMaxUFVolumeML, presUFRate ); + signalInitiatePressureStabilization( USE_NORMAL_STABILIZATION_PERIOD ); + } + + // Regardless of accept or reject there is no reject reason. + sendChangeTreatmentDurationResponse( result, 0, ( presTreatmentTimeSecs / SEC_PER_MIN ), presMaxUFVolumeML ); + // Send new ranges for settings + treatmentParamsRangesBroadcastTimerCtr = getU32OverrideValue( &treatmentParamRangesPublishInterval ); + broadcastTreatmentSettingsRanges(); + // Send time/state data immediately for UI update + broadcastTreatmentTimeAndState(); + + // Done with treatment duration changes whether they were accepted or rejected. + txDurationRequest.isUFRateConfInProgress = FALSE; + txDurationRequest.newUFRateMLPM = 0.0F; + txDurationRequest.requestedTxDurationMins = 0; + } + } +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/