Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -rd325999b7b3ea03b7e294cb8a0b97df93812fbe9 -r53fa5b74d40bf3775d2a0cd50309daf100e94652 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision d325999b7b3ea03b7e294cb8a0b97df93812fbe9) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 53fa5b74d40bf3775d2a0cd50309daf100e94652) @@ -167,6 +167,8 @@ static F32 disinfectantMixRatio ; ///< Current disinfectant mixing ratio. static DISINFECT_NV_OPS_T disinfectNVOps; ///< Disinfect non-volatile memory operations. static BOOL haveDrainParamsBeenInit[ NUM_OF_DG_RESERVOIRS ]; ///< Boolean flag to indicate whether the drain parameters have been reset or not. +static U32 maxTemperatureOutOfRangeStartTimeMS; ///< Maximum temperature out of range start time in milliseconds. +static U32 maxCondOutOfRangeStartTimeMS; ///< Maximum conductivity out of range start time in milliseconds. #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 @@ -225,7 +227,8 @@ * alarmDetectedPendingTrigger, flushCircWaitTime, flushDisinfectantWaitTime * primeAcidSteadyStateCounter, rsrvrFillStableTimeCounter, R1FullVolume, * rsrvrFillToFullStableTimeCounter, R2FullVolume, disinfectantMixRatio, - * haveDrainParamsBeenInit[ DG_RESERVOIR_1 ], haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] + * haveDrainParamsBeenInit[ DG_RESERVOIR_1 ], haveDrainParamsBeenInit[ DG_RESERVOIR_2 ], + * maxTemperatureOutOfRangeStartTimeMS, maxCondOutOfRangeStartTimeMS * @return none *************************************************************************/ void initChemicalDisinfectMode( void ) @@ -268,14 +271,13 @@ R1FullVolume = 0.0F; R2FullVolume = 0.0F; disinfectantMixRatio = 0.0F; + maxTemperatureOutOfRangeStartTimeMS = getMSTimerCount(); + maxCondOutOfRangeStartTimeMS = getMSTimerCount(); #ifndef _RELEASE_ setNelsonSupportConditions(); #endif - initPersistentAlarm( ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_OUT_OF_RANGE, DISINFECT_TEMP_OUT_OF_RANGE_TIMEOUT_MS, DISINFECT_TEMP_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_CHEM_DISINFECT_TARGET_COND_OUT_OF_RANGE, DISINFECT_COND_OUT_OF_RANGE_TIMEOUT_MS, DISINFECT_COND_OUT_OF_RANGE_TIMEOUT_MS ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, PARK_CONC_PUMPS ); } @@ -676,9 +678,7 @@ isTD2Out = ( fabs( TD2Temp - avgTemp ) > MAX_FLUSH_CIRC_TEMP_SENSOR_DIFF_C ? TRUE : FALSE ); } -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DISINFECT_CONDUCTIVITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) -#endif + if ( getTestConfigStatus( TEST_CONFIG_MIX_WITH_WATER ) != TRUE ) { isCD2Out = ( cd2Conductivity > MAX_FLUSH_CIRC_CONDUCTIVITY_US_PER_CM ? TRUE : FALSE ); isCPoOut = ( cpoConductivity > MAX_FLUSH_CIRC_CONDUCTIVITY_US_PER_CM ? TRUE : FALSE ); @@ -750,8 +750,7 @@ handleDisinfectantMixing( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * ML_PER_LITER, disinfectantMixRatio ); #ifndef _RELEASE_ - if ( ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DISINFECT_CONDUCTIVITY_CHECK ) != SW_CONFIG_ENABLE_VALUE ) && - ( nelsonSupport != NELSON_CHEM_DISINFECT ) ) + if ( nelsonSupport != NELSON_CHEM_DISINFECT ) #endif { if ( cd2Conductivity < MIN_PRIME_ACID_CONDUCTIVITY_US_PER_CM ) @@ -813,12 +812,10 @@ F32 cd2Cond = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); BOOL isCD2OutOfRange = ( ( cd2Cond < MIN_DISINFECT_CONDUCTIVITY_US_PER_CM || cd2Cond > MAX_DISINFECT_CONDUCTIVITY_US_PER_CM ) ? TRUE : FALSE ); -#ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_DISINFECT_CONDUCTIVITY_CHECK ) ) + if ( getTestConfigStatus( TEST_CONFIG_MIX_WITH_WATER ) != TRUE ) { isCD2OutOfRange = FALSE; } -#endif if ( TRUE == isCD2OutOfRange ) { @@ -1380,7 +1377,7 @@ static DG_RESERVOIR_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout ) { DG_RESERVOIR_STATUS_T status = DG_RESERVOIR_ABOVE_TARGET; - BOOL isDrainComplete = hasTargetDrainToZeroBeenReached( r, drainSteadyStateTimeout ); + BOOL isDrainComplete = FALSE; // If the drain parameters of the reservoir is not initialized, initialize them if ( FALSE == haveDrainParamsBeenInit[ r ] ) @@ -1389,6 +1386,10 @@ haveDrainParamsBeenInit[ r ] = TRUE; } + // NOTE: the drain status should be checked once the reservoirs parameters are initialized. This is to make sure the + // the timers for stable drain time are initialized prior to using them again + isDrainComplete = hasTargetDrainToZeroBeenReached( r, drainSteadyStateTimeout ); + if ( TRUE == isDrainComplete ) { stateTimer = getMSTimerCount(); @@ -1648,19 +1649,22 @@ * chemical disinfect is cancelled. If the conductivity of the diluted disinfectant * mix is not within the specified limits, an alarm is set and disinfect is * cancelled. - * @details Inputs: chemDisinfectState, reservoir volumes, reservoir volume monitor timer, - * inlet water temperature, pressure, and conductivity, disinfectant conductivity. - * @details Outputs: prevChemDisinfectState, chemDisinfectState, cancel state, - * alarmDetectedPendingTrigger + * @details Inputs: chemDisinfectState, R1FullVolume, isRsrvrLeaking, + * rsrvrsVolMonitorCounter, maxTemperatureOutOfRangeStartTimeMS, + * maxCondOutOfRangeStartTimeMS + * @details Outputs: chemDisinfectState, isRsrvrLeaking, rsrvrsVolMonitorCounter, + * alarmDetectedPendingTrigger, prevChemDisinfectState, + * maxTemperatureOutOfRangeStartTimeMS, maxCondOutOfRangeStartTimeMS * @return: none *************************************************************************/ static void monitorModeChemicalDisinfect( void ) { + BOOL signalMaxTempOrMaxCondIsOutOfRange = FALSE; + // Reservoir leak detection. if ( ( DG_CHEM_DISINFECT_STATE_DISINFECT_R1_TO_R2 == chemDisinfectState ) || ( DG_CHEM_DISINFECT_STATE_DISINFECT_R2_TO_R1 == chemDisinfectState ) ) { BOOL isRsrvrVolumeOutOfRange = FALSE; - //isRsrvrLeaking = FALSE; if ( DG_CHEM_DISINFECT_STATE_DISINFECT_R1_TO_R2 == chemDisinfectState ) { @@ -1700,8 +1704,8 @@ if ( ( ( STATE_CLOSED == getSwitchStatus( CONCENTRATE_CAP ) || ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) ) ) && ( chemDisinfectState != DG_CHEM_DISINFECT_STATE_START ) ) { - prevChemDisinfectState = chemDisinfectState; - chemDisinfectState = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + prevChemDisinfectState = chemDisinfectState; + chemDisinfectState = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; if ( STATE_CLOSED == getSwitchStatus( CONCENTRATE_CAP ) ) { @@ -1721,27 +1725,26 @@ F32 cd2CondUSCM = getConductivityValue( (U32)CONDUCTIVITYSENSORS_CD2_SENSOR ); F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); BOOL isCD2OutofRange = ( ( cd2CondUSCM < MIN_DISINFECT_CONDUCTIVITY_US_PER_CM ) || ( cd2CondUSCM > MAX_DISINFECT_CONDUCTIVITY_US_PER_CM ) ? TRUE : FALSE ); - BOOL isTPoOutofRange = ( TPoTemp > MAX_DISINFECT_TPO_TEMPERATURE_C ); + BOOL isTPoOutofRange = ( TPoTemp > MAX_DISINFECT_TPO_TEMPERATURE_C ? TRUE : FALSE ); -#ifndef _RELEASE_ - if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_DISINFECT_CONDUCTIVITY_CHECK ) ) + maxTemperatureOutOfRangeStartTimeMS = ( TRUE == isTPoOutofRange ? maxTemperatureOutOfRangeStartTimeMS : getMSTimerCount() ); + maxCondOutOfRangeStartTimeMS = ( TRUE == isCD2OutofRange ? maxCondOutOfRangeStartTimeMS : getMSTimerCount() ); + + if ( TRUE == didTimeout( maxTemperatureOutOfRangeStartTimeMS, DISINFECT_TEMP_OUT_OF_RANGE_TIMEOUT_MS ) ) { - isCD2OutofRange = FALSE; + signalMaxTempOrMaxCondIsOutOfRange = TRUE; + alarmDetectedPendingTrigger = ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_OUT_OF_RANGE; } -#endif - checkPersistentAlarm( ALARM_ID_DG_CHEM_DISINFECT_TARGET_COND_OUT_OF_RANGE, isCD2OutofRange, cd2CondUSCM, MAX_DISINFECT_CONDUCTIVITY_US_PER_CM ); - checkPersistentAlarm( ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_OUT_OF_RANGE, isTPoOutofRange, TPoTemp, MAX_DISINFECT_TPO_TEMPERATURE_C ); - - if ( ( TRUE == isAlarmActive( ALARM_ID_DG_CHEM_DISINFECT_TARGET_COND_OUT_OF_RANGE ) ) || - ( TRUE == isAlarmActive( ALARM_ID_DG_CHEM_DISINFECT_TARGET_TEMP_OUT_OF_RANGE ) ) ) + if ( ( TRUE == didTimeout( maxCondOutOfRangeStartTimeMS, DISINFECT_COND_OUT_OF_RANGE_TIMEOUT_MS ) ) && + ( getTestConfigStatus( TEST_CONFIG_MIX_WITH_WATER ) != TRUE ) ) { - prevChemDisinfectState = chemDisinfectState; - chemDisinfectState = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + signalMaxTempOrMaxCondIsOutOfRange = TRUE; + alarmDetectedPendingTrigger = ALARM_ID_DG_CHEM_DISINFECT_TARGET_COND_OUT_OF_RANGE; } } - if ( ( TRUE == isDGFaultAlarmActive() ) || ( TRUE == isAnyCleaningModeInletWaterConditionActive() ) ) + if ( ( TRUE == isDGFaultAlarmActive() ) || ( TRUE == isAnyCleaningModeInletWaterConditionActive() ) || ( TRUE == signalMaxTempOrMaxCondIsOutOfRange ) ) { if ( chemDisinfectState != DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH ) {