Index: firmware/App/Modes/ModeChemicalDisinfectFlush.c =================================================================== diff -u -r9e7b4f8ffe2a0d86e077a89417ef396a3bc86c6d -r54abf84364e737dd350153d5fab7dd652f917ef4 --- firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision 9e7b4f8ffe2a0d86e077a89417ef396a3bc86c6d) +++ firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision 54abf84364e737dd350153d5fab7dd652f917ef4) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2022-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2022-2024 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 ModeChemicalDisinfectFlush.c * * @author (last) Dara Navaei -* @date (last) 28-Jul-2023 +* @date (last) 09-Sep-2024 * * @author (original) Dara Navaei * @date (original) 15-Nov-2022 @@ -112,7 +112,6 @@ static DG_RESERVOIR_STATUS_T rsrvr1Status; ///< Reservoir 1 status. static DG_RESERVOIR_STATUS_T rsrvr2Status; ///< Reservoir 2 status. static U32 waitTimer; ///< Wait timer for reservoir flushing. -static U32 drainTimer; ///< Timer for reservoir draining during flush states static U32 dataPublishCounter; ///< Chemical disinfect flush data publish counter. static CANCELLATION_MODE_T cancellationMode; ///< Cancellation mode. static U32 rsrvrFillToFullStableTimerCounter; ///< Task interval counter for determining if reservoir is full @@ -173,7 +172,6 @@ alarmDetectedPendingTrigger = ALARM_ID_NO_ALARM; chemDisinfectFlushUIState = CHEM_DISINFECT_FLUSH_UI_STATE_NOT_RUNNING; waitTimer = 0; - drainTimer = 0; dataPublishCounter = 0; disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; hasAlarmBeenTriggered = FALSE; @@ -555,7 +553,7 @@ * UF filter for a period of time. After the flush it transitions to the * next state. * @details Inputs: stateTimer, - * @details Outputs: stateTimer, drainTimer, numberOfPostDisinfectRinses, + * @details Outputs: stateTimer, numberOfPostDisinfectRinses, * rsrvrFillToFullStableTimerCounter * @return next state of the chemical disinfect flush state machine *************************************************************************/ @@ -574,7 +572,6 @@ setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; - drainTimer = getMSTimerCount(); numberOfPostDisinfectRinses = 0; rsrvrFillToFullStableTimerCounter = 0; stateTimer = getMSTimerCount(); @@ -593,32 +590,15 @@ * if the fill times out, it transitions to water cancellation state. * If the drain and rinse are completed within the defined time, it * transitions to the next state. - * @details Inputs: rsrvr1Status, rsrvr2Status, drainTimer, waitTimer - * @details Outputs: stateTimer, rsrvr1Status, rsrvr2Status, drainTimer, + * @details Inputs: rsrvr1Status, rsrvr2Status, waitTimer + * @details Outputs: stateTimer, rsrvr1Status, rsrvr2Status, * waitTimer, prevChemDisinfectFlushState, alarmDetectedPendingTrigger * @return next state of the chemical disinfect flush state machine *************************************************************************/ static DG_CHEM_DISINFECT_FLUSH_STATE_T handleChemicalDisinfectFlushFlushR2ToR1DrainR1State( void ) { DG_CHEM_DISINFECT_FLUSH_STATE_T state = DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_R2_TO_R1_DRAIN_R1; - // Check whether draining R1 has timed out - if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr1Status ) - { - // Do not use the standard drain status function because we are filling and draining at the same time - if ( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ) < RSRVRS_DRAIN_TARGET_VOLUME_ML ) - { - rsrvr1Status = DG_RESERVOIR_REACHED_TARGET; - } - else if ( TRUE == didTimeout( drainTimer, RSRVRS_FLUSH_DRAIN_TIMEOUT_MS ) ) - { - // reservoir 1 drain timeout - prevChemDisinfectFlushState = state; - alarmDetectedPendingTrigger = ALARM_ID_DG_RESERVOIR_DRAIN_TIMEOUT; - state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_WATER_PATH; - } - } - // Check whether R2 fill has timed out if ( DG_RESERVOIR_BELOW_TARGET == rsrvr2Status ) { @@ -645,7 +625,6 @@ setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); rsrvr1Status = DG_RESERVOIR_BELOW_TARGET; rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; - drainTimer = getMSTimerCount(); stateTimer = getMSTimerCount(); state = DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_R1_TO_R2_DRAIN_R2; } @@ -672,23 +651,6 @@ { DG_CHEM_DISINFECT_FLUSH_STATE_T state = DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_R1_TO_R2_DRAIN_R2; - // Check whether draining R2 has timed out - if ( DG_RESERVOIR_ABOVE_TARGET == rsrvr2Status ) - { - // Do not use the standard drain status function because we are filling and draining at the same time - if ( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ) < RSRVRS_DRAIN_TARGET_VOLUME_ML ) - { - rsrvr2Status = DG_RESERVOIR_REACHED_TARGET; - } - else if ( TRUE == didTimeout( drainTimer, RSRVRS_FLUSH_DRAIN_TIMEOUT_MS ) ) - { - // reservoir 2 drain timeout - prevChemDisinfectFlushState = state; - alarmDetectedPendingTrigger = ALARM_ID_DG_RESERVOIR_DRAIN_TIMEOUT; - state = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_WATER_PATH; - } - } - // Check whether R1 fill has timed out if ( DG_RESERVOIR_BELOW_TARGET == rsrvr1Status ) { @@ -718,7 +680,6 @@ setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); rsrvr2Status = DG_RESERVOIR_BELOW_TARGET; rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - drainTimer = getMSTimerCount(); stateTimer = getMSTimerCount(); state = DG_CHEM_DISINFECT_FLUSH_STATE_FLUSH_R2_TO_R1_DRAIN_R1; } @@ -819,7 +780,7 @@ * chemical disinfect flush cancel mode water path state. * @details Inputs: rsrvr1Status, rsrvr2Status, cancellationMode, stateTimer * @details Outputs: rsrvr1Status, rsrvr2Status, cancellationMode, stateTimer, - * ChemDisinfectFlushUIState + * ChemDisinfectFlushUIState, haveDrainParamsBeenInit * @return next state of the chemical disinfect flush state machine *************************************************************************/ static DG_CHEM_DISINFECT_FLUSH_STATE_T handleChemicalDisinfectFlushCancelModeWaterPathState( void ) @@ -833,12 +794,15 @@ // Stop all the actuators first then decide who should run next deenergizeActuators( NO_PARK_CONC_PUMPS ); - cancellationMode = CANCELLATION_MODE_WATER; - rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; + haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; + haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; + cancellationMode = CANCELLATION_MODE_WATER; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; // The drain is set to start from reservoir 2 setValveState( VRD2, VALVE_STATE_OPEN ); + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); // Start the timer for drain timeout @@ -1075,16 +1039,21 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CAPS_MONITOR ) != SW_CONFIG_ENABLE_VALUE ) #endif { + OPN_CLS_STATE_T concCap = getSwitchStatus( CONCENTRATE_CAP ); + OPN_CLS_STATE_T dialysateCap = getSwitchStatus( DIALYSATE_CAP ); + // If either the dialysate cap or the concentrate cap is open during any state, alarm - if ( ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) || ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) ) + if ( ( STATE_OPEN == concCap ) || ( STATE_OPEN == dialysateCap ) ) { - if ( chemDisinfectFlushState != DG_CHEM_DISINFECT_FLUSH_STATE_START ) + if ( ( chemDisinfectFlushState != DG_CHEM_DISINFECT_FLUSH_STATE_START ) && + ( chemDisinfectFlushState != DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_WATER_PATH ) && + ( chemDisinfectFlushState != DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_BASIC_PATH ) ) { prevChemDisinfectFlushState = chemDisinfectFlushState; chemDisinfectFlushState = DG_CHEM_DISINFECT_FLUSH_STATE_CANCEL_WATER_PATH; alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; - if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + if ( STATE_OPEN == concCap ) { alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; }