Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -rf502a589b7a6c39c6fd57ceee778f5c94481af14 -rfd84d51bd0177b49578859572d24f68571280ea4 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision f502a589b7a6c39c6fd57ceee778f5c94481af14) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision fd84d51bd0177b49578859572d24f68571280ea4) @@ -7,8 +7,8 @@ * * @file ModeHeatDisinfect.c * -* @author (last) Dara Navaei -* @date (last) 25-Jul-2023 +* @author (last) Michael Garthwaite +* @date (last) 29-Aug-2023 * * @author (original) Sean * @date (original) 20-Apr-2020 @@ -106,6 +106,7 @@ #define HEAT_DISINFECT_REF_RSRVR_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Heat disinfect getting reference reservoirs value timeout in milliseconds. #define HEAT_DISINFECT_AT_82_C_TIME_MS ( 10 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time at 82 C in milliseconds. #define HEAT_DISINFECT_AT_77_C_TIME_MS ( 32 * SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect time at 77 C in milliseconds. +#define HEAT_DISNFECT_MIN_OVERRIDE_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Heat disinfect minimum override time. // Mix drain R1 and R2 #define RSRVRS_MIX_DRAIN_TIMEOUT_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 mix drain timeout in ms. @@ -187,6 +188,8 @@ static HEAT_DISINFECT_TIME_STATUS_T timeStatus[ NUM_OF_HEAT_DISINFECT_TIMES ]; ///< Heat disinfect time status. static F32 concPumpsStartTemperatureC; ///< Heat disinfect concentrate pumps start temperature in C. static BOOL isRODisinfectDone; ///< Heat disinfect is RO disinfect done flag. +static OVERRIDE_U32_T targetTimer77C = { HEAT_DISINFECT_AT_77_C_TIME_MS, 0, 0, 0 }; ///< Heat disinfection override target timer at 77 C +static OVERRIDE_U32_T targetTimer82C = { HEAT_DISINFECT_AT_82_C_TIME_MS, 0, 0, 0 }; ///< Heat disinfection override target timer at 82 C #ifndef _RELEASE_ /* Nelson Labs is in charge of testing the efficacy of the disinfects (heat and chem). The codes that contain the name Nelson are used to @@ -281,25 +284,25 @@ timeStatus[ RO_AT_77_C ].startTempC = HEAT_DISINFECT_START_TEMP_AT_77_C; timeStatus[ RO_AT_77_C ].startTimeMS = 0; timeStatus[ RO_AT_77_C ].stopTempC = HEAT_DISINFECT_STOP_TEMP_AT_76_C; - timeStatus[ RO_AT_77_C ].targetTimeMS = HEAT_DISINFECT_AT_77_C_TIME_MS; + timeStatus[ RO_AT_77_C ].targetTimeMS = getU32OverrideValue( &targetTimer77C ); timeStatus[ RO_AT_77_C ].tempSensor = TEMPSENSORS_HEAT_DISINFECT; timeStatus[ RO_AT_82_C ].startTempC = HEAT_DISINFECT_START_TEMP_AT_82_C; timeStatus[ RO_AT_82_C ].startTimeMS = 0; timeStatus[ RO_AT_82_C ].stopTempC = HEAT_DISINFECT_STOP_TEMP_AT_81_C; - timeStatus[ RO_AT_82_C ].targetTimeMS = HEAT_DISINFECT_AT_82_C_TIME_MS; + timeStatus[ RO_AT_82_C ].targetTimeMS = getU32OverrideValue( &targetTimer82C );; timeStatus[ RO_AT_82_C ].tempSensor = TEMPSENSORS_HEAT_DISINFECT; timeStatus[ RSRVR_AT_77_C ].startTempC = HEAT_DISINFECT_START_TEMP_AT_77_C; timeStatus[ RSRVR_AT_77_C ].startTimeMS = 0; timeStatus[ RSRVR_AT_77_C ].stopTempC = HEAT_DISINFECT_STOP_TEMP_AT_76_C; - timeStatus[ RSRVR_AT_77_C ].targetTimeMS = HEAT_DISINFECT_AT_77_C_TIME_MS; + timeStatus[ RSRVR_AT_77_C ].targetTimeMS = getU32OverrideValue( &targetTimer77C ); timeStatus[ RSRVR_AT_77_C ].tempSensor = TEMPSENSORS_INLET_DIALYSATE; timeStatus[ RSRVR_AT_82_C ].startTempC = HEAT_DISINFECT_START_TEMP_AT_82_C; timeStatus[ RSRVR_AT_82_C ].startTimeMS = 0; timeStatus[ RSRVR_AT_82_C ].stopTempC = HEAT_DISINFECT_STOP_TEMP_AT_81_C; - timeStatus[ RSRVR_AT_82_C ].targetTimeMS = HEAT_DISINFECT_AT_82_C_TIME_MS; + timeStatus[ RSRVR_AT_82_C ].targetTimeMS = getU32OverrideValue( &targetTimer82C ); timeStatus[ RSRVR_AT_82_C ].tempSensor = TEMPSENSORS_INLET_DIALYSATE; #ifndef _RELEASE_ @@ -1467,7 +1470,8 @@ * If the drain is completed within the define time, it transitions to the * complete state. * @details Inputs: rsrvr1Status, rsrvr2Status, cancellationMode, stateTimer - * @details Outputs: rsrvr1Status, rsrvr2Status, cancellationMode, stateTimer + * @details Outputs: rsrvr1Status, rsrvr2Status, cancellationMode, stateTimer, + * haveDrainParamsBeenInit * @return next state of the heat disinfect state machine *************************************************************************/ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectCancelModeWaterPathState( void ) @@ -1503,16 +1507,17 @@ cancellationMode = CANCELLATION_MODE_HOT; } - rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + rsrvr2Status = DG_RESERVOIR_ABOVE_TARGET; + haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; + haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; + stateTimer = getMSTimerCount(); // The drain is set to start from reservoir 2 since all the actuators have been de-energized // Set the drain valve to reservoir 2 setValveState( VRD2, VALVE_STATE_OPEN ); + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setDrainPumpTargetRPM( targetRPM ); - - // Start the timer for drain timeout - stateTimer = getMSTimerCount(); } // If reservoir 2 is empty, set to drain reservoir 1 @@ -1847,8 +1852,8 @@ if ( TPoTempC >= concPumpsStartTemperatureC ) { - F32 acidSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ); - F32 bicarbSpeed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); + F32 acidSpeed = getMeasuredPumpSpeedMLPM( CONCENTRATEPUMPS_CP1_ACID ); + F32 bicarbSpeed = getMeasuredPumpSpeedMLPM( CONCENTRATEPUMPS_CP2_BICARB ); if ( ( acidSpeed < NEARLY_ZERO ) || ( bicarbSpeed < NEARLY_ZERO ) ) { @@ -2010,6 +2015,104 @@ } } + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetDG77CStateTimerOverride function checks whether the disinfection + * time of either reservoirs or the RO filter has been elapsed. + * @details Inputs: none + * @details Outputs: targetTimer77C + * @param timer which is the time to check at 77 C + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL testSetDG77CStateTimerOverride( U32 timer ) +{ + BOOL result = FALSE; + + if ( ( TRUE == isTestingActivated() ) && ( timer >= HEAT_DISNFECT_MIN_OVERRIDE_TIME_MS ) ) + { + targetTimer77C.ovData = timer; + targetTimer77C.override = OVERRIDE_KEY; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetDG77CStateTimerOverride function checks whether the disinfection + * time of either reservoirs or the RO filter has been elapsed. + * @details Inputs: none + * @details Outputs: targetTimer77C + * @param timer which is the time to check at 77 C + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL testResetDG77CStateTimerOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetTimer77C.override = OVERRIDE_RESET; + targetTimer77C.ovData = targetTimer77C.ovInitData; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetDG82CStateTimerOverride function checks whether the disinfection + * time of either reservoirs or the RO filter has been elapsed. + * @details Inputs: none + * @details Outputs: targetTimer82C + * @param timer which is the time to check at 82 C + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL testSetDG82CStateTimerOverride( U32 timer ) +{ + BOOL result = FALSE; + + if ( ( TRUE == isTestingActivated() ) && ( timer >= HEAT_DISNFECT_MIN_OVERRIDE_TIME_MS ) ) + { + targetTimer82C.ovData = timer; + targetTimer82C.override = OVERRIDE_KEY; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetDG82CStateTimerOverride function checks whether the disinfection + * time of either reservoirs or the RO filter has been elapsed. + * @details Inputs: none + * @details Outputs: targetTimer82C + * @param timer which is the time to check at 82 C + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL testResetDG82CStateTimerOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetTimer82C.override = OVERRIDE_RESET; + targetTimer82C.ovData = targetTimer82C.ovInitData; + result = TRUE; + } + + return result; +} + /**@}*/ // ********** Nelson Support Functions **********