Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r3d580304b45626d1ab878338af39fd2d820d8c20 -r35d635b442da3d931c1016ae4d23ead116d214f3 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 3d580304b45626d1ab878338af39fd2d820d8c20) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 35d635b442da3d931c1016ae4d23ead116d214f3) @@ -205,6 +205,11 @@ static void publishHeatDisinfectData( void ); static void monitorModeHeatDisinfect( void ); +static BOOL checkGradientOutOfRange(HEAT_DISINFECT_STATUS_T *status); +static BOOL checkResrvoirLoss(HEAT_DISINFECT_STATUS_T *tatus); +static BOOL checkHeatDisinfectTimeout(HEAT_DISINFECT_STATUS_T *status); +static BOOL checkHeatDisinfectComplete(HEAT_DISINFECT_STATUS_T *status); + /*********************************************************************//** * @brief * The initHeatDisinfectMode function initializes the heat disinfect mode @@ -1935,7 +1940,144 @@ return status; } +#if 0 +static BOOL checkGradientOutOfRange(HEAT_DISINFECT_STATUS_T *status) +{ + BOOL returnVal = FALSE; + F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); + F32 ThdTemp = getTemperatureValue( TEMPSENSORS_HEAT_DISINFECT ); + + // Check if the temperature gradient in between the coldest and the hottest spot is more than the specified temperature and + // the timer has not started yet, start it + bool gradientOutOfRange = ( fabs( TPoTemp - ThdTemp ) > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ) ? TRUE : FALSE; + if ( !gradientOutOfRange ) + { + tempGradOutOfRangeTimer = 0; + } + else if ( 0 == tempGradOutOfRangeTimer ) + { + tempGradOutOfRangeTimer = getMSTimerCount(); + } + else if ( TRUE == didTimeout( tempGradOutOfRangeTimer, HEAT_DISINFECT_TEMP_GRAD_OUT_RANGE_TIME_MS ) ) + { + alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_TEMP_GRAD_OUT_OF_RANAGE; + *status = HEAT_DISINFECT_TEMP_GRADIENT_OUT_OF_RANGE; + returnVal = TRUE; + } + + return returnVal; + +} + +static BOOL checkResrvoirLoss(HEAT_DISINFECT_STATUS_T *status) +{ + BOOL returnVal = FALSE; + BOOL isR1OutOfRange = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ) - R1HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML; + BOOL isR2OutOfRange = fabs( getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ) - R2HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML; + + // Check if either reservoir 1 or reservoir 2 are losing volume more than allowed volume + if ( ( TRUE == isR1OutOfRange ) || ( TRUE == isR2OutOfRange ) ) + { + // If the leak is the first time after a while, set the flag and start the timer + if ( FALSE == areRsrvrsLeaking ) + { + areRsrvrsLeaking = TRUE; + rsrvrsVolMonitorTimer = getMSTimerCount(); + } + // If the volume is out of range and it has timed out, exit + else if ( TRUE == didTimeout( rsrvrsVolMonitorTimer, RSRVRS_TARGET_VOL_OUT_TIMEOUT_MS ) ) + { + areRsrvrsLeaking = FALSE; + alarmDetectedPendingTrigger = ALARM_ID_DG_RESERVOIR_LEAK_TIMEOUT; + *status = HEAT_DISINFECT_RSRVRS_LEAK_TIMEOUT; + returnVal = TRUE; + } + } + // Reservoirs are in range + else + { + areRsrvrsLeaking = FALSE; + } + + return returnVal; + +} + +static BOOL checkHeatDisinfectTimeout(HEAT_DISINFECT_STATUS_T *status) +{ + BOOL returnVal = FALSE; + + F32 ThdTemp = getTemperatureValue( TEMPSENSORS_HEAT_DISINFECT ); + + // If the coldest spot which is THd is less than minimum heat disinfect temperature, + // reset the heat disinfect timers and check whether heating up has timed out + if ( ThdTemp < HEAT_DISINFECT_START_TEMPERATURE_C ) + { + // Keep reseting the disinfect timer so the elapsed time is always 0 until disinfect truly starts + heatDisinfectTimer = getMSTimerCount(); + isPartialDisinfectInProgress = FALSE; + targetDisinfectTime = 0; + + if ( TRUE == didTimeout( stateTimer, HEAT_DISINFECT_START_TEMP_TIMOUT_MS ) ) + { + // Heating up to minimum temperature for heat disinfect failed + alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_TARGET_TEMP_TIMEOUT; + *status = HEAT_DISINFECT_HEAT_UP_TIMEOUT; + returnVal = TRUE; + } + } + else if ( ( isPartialDisinfectInProgress != TRUE ) && ( ThdTemp > HEAT_DISINFECT_START_TEMPERATURE_C ) ) + { + // The temperature of the coldest spot is in range to start the disinfect timer + heatDisinfectTimer = getMSTimerCount(); + isPartialDisinfectInProgress = TRUE; + targetDisinfectTime = HEAT_DISINFECT_TIME_MS; + *status = HEAT_DISINFECT_DISINFECT_IN_PROGRESS; + returnVal = TRUE; + + // In disinfect R1 to R2, concentrate pumps are also run + if ( DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2 == heatDisinfectState ) + { + // Turn the pumps on in reverse + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, ACID_PUMP_SPEED_ML_PER_MIN ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, BICARB_PUMP_SPEED_ML_PER_MIN ); + + // During R1 to R2 disinfect, the concentrate pumps turn on + requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); + } + } + else if ( ( TRUE == isPartialDisinfectInProgress ) && ( ThdTemp > HEAT_DISINFECT_START_TEMPERATURE_C ) ) + { + *status = HEAT_DISINFECT_DISINFECT_IN_PROGRESS; + returnVal = TRUE; + } + + return returnVal; + +} + +static BOOL checkHeatDisinfectComplete(HEAT_DISINFECT_STATUS_T *status) +{ + BOOL returnVal = FALSE; + + // If heat disinfect temperature has been reached, check if this stage of heat disinfect is done + if ( ( TRUE == isPartialDisinfectInProgress ) && ( TRUE == didTimeout( heatDisinfectTimer, HEAT_DISINFECT_TIME_MS ) ) ) + { + // Done with this stage of heat disnfect. Reset the variables + // Target disinfect time is the time that is published to the UI and when there is + // no disinfect count down, this variable is set to 0. When the target time is 0, the UI + // hides the timer on the UI disinfect screen + targetDisinfectTime = 0; + *status = HEAT_DISINFECT_COMPLETE; + isPartialDisinfectInProgress = FALSE; + returnVal = TRUE; + } + + return returnVal; +} +#endif /*********************************************************************//** * @brief * The getHeatDisinfectStatus function monitors and returns the current @@ -1976,7 +2118,6 @@ status = HEAT_DISINFECT_TEMP_GRADIENT_OUT_OF_RANGE; } -/* if ( ( fabs( TPoTemp - ThdTemp ) > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ) && ( 0 == tempGradOutOfRangeTimer ) ) { tempGradOutOfRangeTimer = getMSTimerCount(); @@ -1987,7 +2128,7 @@ alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_TEMP_GRAD_OUT_OF_RANAGE; status = HEAT_DISINFECT_TEMP_GRADIENT_OUT_OF_RANGE; } -*/ + // Check if either reservoir 1 or reservoir 2 are losing volume more than allowed volume if ( ( TRUE == isR1OutOfRange ) || ( TRUE == isR2OutOfRange ) ) { @@ -2064,6 +2205,7 @@ isPartialDisinfectInProgress = FALSE; } + return status; }