Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -rcea079b61dbd17b2ddaec99b1124248147d14e72 -r94a190522ce398399c7b93c59f788d7666ec0060 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision cea079b61dbd17b2ddaec99b1124248147d14e72) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 94a190522ce398399c7b93c59f788d7666ec0060) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2021 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 ModeDrain.c +* @file ModeDrain.c * -* @author (last) Quang Nguyen -* @date (last) 24-Aug-2020 +* @author (last) Dara Navaei +* @date (last) 06-Nov-2021 * -* @author (original) Leonardo Baloa -* @date (original) 20-Dec-2019 +* @author (original) Leonardo Baloa +* @date (original) 20-Dec-2019 * ***************************************************************************/ @@ -23,8 +23,10 @@ #include "Pressures.h" #include "Reservoirs.h" #include "ROPump.h" +#include "SystemComm.h" #include "TaskGeneral.h" #include "TemperatureSensors.h" +#include "Timers.h" #include "Valves.h" /** @@ -34,53 +36,56 @@ // ********** private definitions ********** -#define TARGET_DRAIN_PUMP_RPM 2100 ///< Target drain pump speed (in RPM). -#define DRAIN_WEIGHT_UNCHANGE_TIMEOUT ( 2 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. -/// Time period to wait after drain complete and before taring load cells. -#define DRAIN_EMPTY_TARE_WAIT ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +#define TARGET_DRAIN_PUMP_RPM 2300 ///< Target drain pump speed (in RPM). +#define DRAIN_WEIGHT_UNCHANGE_TIMEOUT ( 2 * MS_PER_SECOND ) ///< Time period of unchanged weight during draining before timeout. -#define TARGET_RO_PRESSURE_PSI 130 ///< Target pressure for RO pump. -#define TARGET_RO_FLOW_RATE_L 0.3 ///< Target flow rate for RO pump. +#define DRAIN_EMPTY_TARE_WAIT ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) /// Time period to wait after drain complete and before taring load cells. -#define DELAY_RES_DRAIN_VALVE_MS 1000 ///< Delay reservoir drain valve open by 1 second. -#define DELAY_DRAIN_PUMP_MS 2000 ///< Delay drain pump on by 2 seconds. +#define TARGET_RO_PRESSURE_PSI 130 ///< Target pressure for RO pump. +#define TARGET_RO_FLOW_RATE_L 0.3 ///< Target flow rate for RO pump. +#define DELAY_RES_DRAIN_VALVE_MS 1000 ///< Delay reservoir drain valve open by 1 second. +#define DELAY_DRAIN_PUMP_MS 2000 ///< Delay drain pump on by 2 seconds. + +#define DIALYSATE_DRAIN_TIME_OUT ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Dialysate drain time out. + // ********** private data ********** -static DG_DRAIN_STATE_T drainState; ///< Currently active drain state. -static U32 drainEmptyTareTimerCtr; ///< Timer counter for delay between drain complete and load cell tare. +static DG_DRAIN_STATE_T drainState; ///< Currently active drain state. +static U32 drainEmptyTareTimerCtr; ///< Timer counter for delay between drain complete and load cell tare. +static U32 dialysateDrainStartTime; ///< Dialysate drain start time. // ********** private function prototypes ********** +static DG_DRAIN_STATE_T handleDrainStateStart( void ); +static DG_DRAIN_STATE_T handleDrainStateDrain( void ); +static DG_DRAIN_STATE_T handleDrainStateTare( void ); -static DG_DRAIN_STATE_T handleDrainState( void ); -static DG_DRAIN_STATE_T handleTareState( void ); - /*********************************************************************//** * @brief * The initDrainMode function initializes the drain mode module. * @details Inputs: none - * @details Outputs: drainState + * @details Outputs: drainState, drainEmptyTareTimerCtr, dialysateDrainStartTime * @return none *************************************************************************/ void initDrainMode( void ) { - drainState = DG_DRAIN_STATE_START; - drainEmptyTareTimerCtr = 0; + drainState = DG_DRAIN_STATE_START; + drainEmptyTareTimerCtr = 0; + dialysateDrainStartTime = 0; } /*********************************************************************//** * @brief * The transitionToDrainMode function prepares for transition to drain mode. * @details Inputs: none * @details Outputs: Drain mode initialized - * @return none + * @return initial state *************************************************************************/ -void transitionToDrainMode( void ) +U32 transitionToDrainMode( void ) { // re-initialize each time we transition to drain mode initDrainMode(); -#ifndef V_2_SYSTEM DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); if ( DG_RESERVOIR_1 == inactiveReservoir ) @@ -91,16 +96,19 @@ { setValveStateDelayed( VRD2, VALVE_STATE_OPEN, DELAY_RES_DRAIN_VALVE_MS ); } -#endif // set initial actuator states setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setDrainPumpTargetRPMDelayed( TARGET_DRAIN_PUMP_RPM, DELAY_DRAIN_PUMP_MS ); // NOTE: The target flow rate should be set prior to setting the start primary heater // because the initial guess in the heaters driver needs the target flow to calculate // the new PWMs for the main and small primary heaters +#ifndef DISABLE_FLOW_CONTROL_TREATMENT setROPumpTargetFlowRate( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); - startPrimaryHeater(); +#endif + startHeater( DG_PRIMARY_HEATER ); + + return drainState; } /*********************************************************************//** @@ -122,18 +130,15 @@ switch ( drainState ) { case DG_DRAIN_STATE_START: - if ( TRUE == isDrainPumpOn() ) - { - drainState = DG_DRAIN_STATE_DRAIN; - } + drainState = handleDrainStateStart(); break; case DG_DRAIN_STATE_DRAIN: - drainState = handleDrainState(); + drainState = handleDrainStateDrain(); break; case DG_DRAIN_STATE_TARE: - drainState = handleTareState(); + drainState = handleDrainStateTare(); break; default: @@ -147,23 +152,43 @@ /*********************************************************************//** * @brief - * The handleDrainState function handles the drain state of the drain mode - * state machine. + * The handleDrainStateStart function handles the drain start state of + * the drain mode state machine. * @details Inputs: none + * @details Outputs: dialysateDrainStartTime + * @return the next state + *************************************************************************/ +static DG_DRAIN_STATE_T handleDrainStateStart( void ) +{ + DG_DRAIN_STATE_T state = DG_DRAIN_STATE_START; + + if ( TRUE == isDrainPumpOn() ) + { + dialysateDrainStartTime = getMSTimerCount(); + state = DG_DRAIN_STATE_DRAIN; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleDrainStateDrain function handles the drain state of the drain + * mode state machine. + * @details Inputs: none * @details Outputs: none * @return the next state *************************************************************************/ -static DG_DRAIN_STATE_T handleDrainState( void ) +static DG_DRAIN_STATE_T handleDrainStateDrain( void ) { DG_DRAIN_STATE_T result = DG_DRAIN_STATE_DRAIN; DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); - // if we have reached our target drain to volume (by weight) or cannot drain anymore, we are done draining - go back to re-circ mode + // if we have reached our target drain to volume (by weight) or cannot drain anymore, we are done draining - go back to generation idle mode if ( TRUE == hasTargetDrainVolumeBeenReached( inactiveReservoir, DRAIN_WEIGHT_UNCHANGE_TIMEOUT ) ) { setDrainPumpTargetRPM( 0 ); -#ifndef V_2_SYSTEM if ( DG_RESERVOIR_1 == inactiveReservoir ) { setValveState( VRD1, VALVE_STATE_CLOSED ); @@ -172,30 +197,35 @@ { setValveState( VRD2, VALVE_STATE_CLOSED ); } -#endif if ( TRUE == isReservoirTarePending() ) { // Tare reservoir load cells at empty if requested result = DG_DRAIN_STATE_TARE; } else { - requestNewOperationMode( DG_MODE_CIRC ); + requestNewOperationMode( DG_MODE_GENE ); } } + // Drain timed out raise the alarm + if ( TRUE == didTimeout( dialysateDrainStartTime, DIALYSATE_DRAIN_TIME_OUT ) ) + { + activateAlarmNoData( ALARM_ID_DG_DIALYSATE_DRAIN_TIME_OUT ); + } + return result; } /*********************************************************************//** * @brief - * The handleTareState function handles the tare state of the drain mode + * The handleDrainStateTare function handles the tare state of the drain mode * state machine. * @details Inputs: drainEmptyTareTimerCtr * @details Outputs: drainEmptyTareTimerCtr * @return the next state *************************************************************************/ -static DG_DRAIN_STATE_T handleTareState( void ) +static DG_DRAIN_STATE_T handleDrainStateTare( void ) { DG_DRAIN_STATE_T result = DG_DRAIN_STATE_TARE; DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); @@ -204,12 +234,10 @@ { drainEmptyTareTimerCtr = 0; tareLoadCellsAtEmpty( inactiveReservoir ); - requestNewOperationMode( DG_MODE_CIRC ); + requestNewOperationMode( DG_MODE_GENE ); -#ifndef V_2_SYSTEM setValveState( VRD1, VALVE_STATE_CLOSED ); setValveState( VRD2, VALVE_STATE_CLOSED ); -#endif } return result;