Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r32367866387722d779fa89d0a0bbe837e5dd4972 -r4d3631e78796ab49d746df058af771078a15da3d --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 32367866387722d779fa89d0a0bbe837e5dd4972) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 4d3631e78796ab49d746df058af771078a15da3d) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModeTreatment.c * -* @author (last) Dara Navaei -* @date (last) 19-Sep-2022 +* @author (last) Sean Nash +* @date (last) 07-Feb-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -131,18 +131,18 @@ // ********** private function prototypes ********** -static void resetSignalFlags( void ); -static void resetAlarmSignalFlags( void ); static void broadcastTreatmentSettingsRanges( void ); static void broadcastTreatmentPeriodicData(); -static U32 getTreatmentTimeInMinutes( void ); +static U32 getMinTreatmentTimeInMinutes( void ); static TREATMENT_STATE_T handleTreatmentStartState( void ); static TREATMENT_STATE_T handleTreatmentBloodPrimeState( void ); static TREATMENT_STATE_T handleTreatmentDialysisState( void ); static TREATMENT_STATE_T handleTreatmentStopState( void ); static TREATMENT_STATE_T handleTreatmentRinsebackState( void ); static TREATMENT_STATE_T handleTreatmentRecircState( void ); static TREATMENT_STATE_T handleTreatmentEndState( void ); +static void resetSignalFlags( void ); +static void resetAlarmSignalFlags( void ); /*********************************************************************//** * @brief @@ -159,9 +159,6 @@ treatmentCompleted = FALSE; rinsebackDone = FALSE; - resetBloodPumpRotorCount(); - resetDialInPumpRotorCount(); - treatmentTimeMS = 0; lastTreatmentTimeStamp = 0; treatmentTimeBroadcastTimerCtr = TREATMENT_TIME_DATA_PUB_INTERVAL; // So we send time data immediately when we begin treatment mode @@ -197,41 +194,10 @@ treatmentStartTimeStamp = getRTCTimestamp(); treatmentEndTimeStamp = 0; hasTreatmentStartTimeBeenWrittenToNV = FALSE; - } /*********************************************************************//** * @brief - * The resetSignalFlags function resets all non-alarm signal flags. - * @details Inputs: none - * @details Outputs: non-alarm signal flags set to FALSE - * @return none - *************************************************************************/ -static void resetSignalFlags( void ) -{ - rinsebackToStoppedRequest = FALSE; - endTreatmentRequest = FALSE; - rinsebackToRecircRequest = FALSE; - bloodPrimeToDialysisRequest = FALSE; - treatmentEndToRinsebackRequest = FALSE; -} - -/*********************************************************************//** - * @brief - * The resetAlarmSignalFlags function resets all alarm signal flags. - * @details Inputs: none - * @details Outputs: alarm signal flags set to FALSE - * @return none - *************************************************************************/ -static void resetAlarmSignalFlags( void ) -{ - resumeTreatmentAlarmResponseRequest = FALSE; - initiateRinsebackAlarmResponseRequest = FALSE; - endTreatmentAlarmResponseRequest = FALSE; -} - -/*********************************************************************//** - * @brief * The transitionToTreatmentMode function prepares for transition to treatment mode. * @details Inputs: none * @details Outputs: @@ -623,16 +589,19 @@ { BOOL stop = isStopButtonPressed(); + // Trigger user stop alarm at any time in treatment mode when user presses stop button if ( TRUE == stop ) { activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_BY_USER ); } + // Check dialysate temperature during treatment mode (except end state where treatment is over, dialyzer is bypassed and temp is no longer an issue) if ( currentTreatmentState != TREATMENT_END_STATE ) { checkDialysateTemperature(); } + // Record treatment start time if not done yet if ( FALSE == hasTreatmentStartTimeBeenWrittenToNV ) { // Started the treatment set the start time in epoch @@ -996,7 +965,7 @@ // Check if we are in an appropriate treatment state for settings adjustment if ( ( MODE_TREA == currMode ) && ( currentTreatmentState > TREATMENT_START_STATE ) && ( currentTreatmentState < TREATMENT_END_STATE ) && - ( CALC_ELAPSED_TREAT_TIME_IN_MIN() < treatmentTime ) && ( treatmentTime >= getTreatmentTimeInMinutes() ) ) + ( CALC_ELAPSED_TREAT_TIME_IN_MIN() < treatmentTime ) && ( treatmentTime >= getMinTreatmentTimeInMinutes() ) ) { F32 uFVolume; U32 dialVolume = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ) * treatmentTime; // In mL @@ -1011,6 +980,8 @@ sendTreatmentLogEventData( TREATMENT_DURATION_CHANGE_EVENT, ( presTreatmentTimeSecs / SEC_PER_MIN ), treatmentTime ); presMaxUFVolumeML = uFVolume; presTreatmentTimeSecs = treatmentTime * SEC_PER_MIN; + setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, ( presMaxUFVolumeML / (F32)ML_PER_LITER ) ); + setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, ( presTreatmentTimeSecs / SEC_PER_MIN ) ); setDialysisParams( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presMaxUFVolumeML, presUFRate ); } else @@ -1040,7 +1011,7 @@ { rejectReason = REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE; } - else if ( treatmentTime < getTreatmentTimeInMinutes() ) + else if ( treatmentTime < getMinTreatmentTimeInMinutes() ) { rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_LESS_THAN_MINIMUM; } @@ -1118,7 +1089,7 @@ pendingUFRateChange = 0.0; } // Verify treatment duration change would be valid (leave zero if not valid - UI will disable option) - if ( ( trtTime <= MAX_TREATMENT_TIME_MINUTES ) && ( trtTime >= getTreatmentTimeInMinutes() ) && + if ( ( trtTime <= MAX_TREATMENT_TIME_MINUTES ) && ( trtTime >= getMinTreatmentTimeInMinutes() ) && ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) { result = TRUE; @@ -1166,8 +1137,10 @@ * @brief * The verifyUFSettingsConfirmation function verifies the user confirmed * ultrafiltration settings change(s) and, if valid, accepts the new settings. - * @details Inputs: current operating mode, treatment states and parameters - * @details Outputs: response message sent + * @details Inputs: current operating mode, treatment states and parameters, + * pendingUFVolumeChange, pendingUFRateChange + * @details Outputs: response message sent, presMaxUFVolumeML, + * presTreatmentTimeSecs, presUFRate * @param uFVolume New ultrafiltration volume confirmed by the user * @param adjustment The adjustment selected by the user * @return TRUE if new UF settings accepted, FALSE if not. @@ -1187,11 +1160,13 @@ sendTreatmentLogEventData( UF_VOLUME_CHANGE_EVENT, presMaxUFVolumeML, pendingUFVolumeChange ); result = TRUE; presMaxUFVolumeML = pendingUFVolumeChange; + setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, ( presMaxUFVolumeML / (F32)ML_PER_LITER ) ); // Which setting does user want to adjust to accommodate the UF volume change? (treatment time or UF rate) if ( UF_ADJ_TREATMENT_TIME == adjustment ) { presTreatmentTimeSecs = pendingTreatmentTimeChange * SEC_PER_MIN; + setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, ( presTreatmentTimeSecs / SEC_PER_MIN ) ); } else // Must be adjusting UF rate then { @@ -1430,7 +1405,7 @@ data.treatmentTimeElapsedinSec = elapsedTreatmentTimeInSecs; data.treatmentTimeRemaininginSec = presTreatmentTimeSecs - elapsedTreatmentTimeInSecs; } - broadcastData( MSG_ID_TREATMENT_TIME, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( TREATMENT_TIME_DATA_T ) ); + broadcastData( MSG_ID_TREATMENT_TIME_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( TREATMENT_TIME_DATA_T ) ); treatmentTimeBroadcastTimerCtr = 0; } // Broadcast treatment state data at interval @@ -1448,8 +1423,9 @@ payload.txEndState = getCurrentTreatmentEndState(); payload.heparinState = getHeparinState(); payload.dialysisState = getDialysisState(); + payload.dlzReprimeState = getDialyzerRePrimeState(); - broadcastData( MSG_ID_TREATMENT_STATE, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&payload, sizeof( TREATMENT_STATE_DATA_T ) ); + broadcastData( MSG_ID_TREATMENT_STATE_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&payload, sizeof( TREATMENT_STATE_DATA_T ) ); treatmentStateBroadcastTimerCtr = 0; } } @@ -1471,7 +1447,7 @@ // Compute minimum treatment duration U32 presTime = ( presTreatmentTimeSecs / SEC_PER_MIN ); U32 elapseTime = CALC_ELAPSED_TREAT_TIME_IN_MIN(); - U32 minTime = MAX( (elapseTime + 2), getTreatmentTimeInMinutes() ); // Treatment duration cannot be < 1 hour. add two minutes to cover rounding and ensure it is valid for next minute + U32 minTime = MAX( (elapseTime + 2), getMinTreatmentTimeInMinutes() ); // Treatment duration cannot be < 1 hour. add two minutes to cover rounding and ensure it is valid for next minute // Compute maximum treatment duration (from both UF and dialysate volume perspectives) U32 maxTimeRem = ( MAX_UF_VOLUME_ML - (U32)getUltrafiltrationReferenceVolume() ) / ( presUFRate > 0.0 ? (U32)presUFRate : 1 ); U32 maxTime1 = minTime + maxTimeRem; @@ -1553,29 +1529,58 @@ /*********************************************************************//** * @brief - * The getTreatmentTimeInMinutes function returns the treatment time in minutes. - * @details Inputs: none + * The getMinTreatmentTimeInMinutes function returns the minimum treatment + * time (in minutes) that the user could set treatment duration to. + * @details Inputs: MIN_TREATMENT_TIME_MINUTES * @details Outputs: none - * @return treatment time in minutes + * @return minimum treatment time in minutes *************************************************************************/ -static U32 getTreatmentTimeInMinutes( void ) +static U32 getMinTreatmentTimeInMinutes( void ) { - // Assuming a 1 minute treatment - // NOTE: no # define for the 1 minute treatment time since this is only used for testing - U32 treatmentTime = 1; + U32 treatmentTime = MIN_TREATMENT_TIME_MINUTES; #ifndef _RELEASE_ // Check if the 1 minute treatment software configuration has not been enabled - if ( getSoftwareConfigStatus( SW_CONFIG_ENABLE_1_MIN_TREATMENT ) != SW_CONFIG_ENABLE_VALUE ) -#endif + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_1_MIN_TREATMENT ) ) { - treatmentTime = MIN_TREATMENT_TIME_MINUTES; + treatmentTime = 1; } +#endif return treatmentTime; } +/*********************************************************************//** + * @brief + * The resetSignalFlags function resets all non-alarm signal flags. + * @details Inputs: none + * @details Outputs: non-alarm signal flags set to FALSE + * @return none + *************************************************************************/ +void resetSignalFlags( void ) +{ + rinsebackToStoppedRequest = FALSE; + endTreatmentRequest = FALSE; + rinsebackToRecircRequest = FALSE; + bloodPrimeToDialysisRequest = FALSE; + treatmentEndToRinsebackRequest = FALSE; +} +/*********************************************************************//** + * @brief + * The resetAlarmSignalFlags function resets all alarm signal flags. + * @details Inputs: none + * @details Outputs: alarm signal flags set to FALSE + * @return none + *************************************************************************/ +void resetAlarmSignalFlags( void ) +{ + resumeTreatmentAlarmResponseRequest = FALSE; + initiateRinsebackAlarmResponseRequest = FALSE; + endTreatmentAlarmResponseRequest = FALSE; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/