Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -r4bd3bf3483660050d3026f7f9adff43782bfc620 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 4bd3bf3483660050d3026f7f9adff43782bfc620) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -1784,17 +1784,20 @@ 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; - - if ( STATE_CLOSED == getSwitchStatus( CONCENTRATE_CAP ) ) + if ( ( chemDisinfectState != DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH ) && ( chemDisinfectState != DG_CHEM_DISINFECT_STATE_CANCEL_BASIC_PATH ) ) { - alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + prevChemDisinfectState = chemDisinfectState; + chemDisinfectState = DG_CHEM_DISINFECT_STATE_CANCEL_WATER_PATH; + + if ( STATE_CLOSED == getSwitchStatus( CONCENTRATE_CAP ) ) + { + alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + } + if ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) + { + alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; + } } - if ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) - { - alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; - } } } Index: firmware/App/Modes/ModeChemicalDisinfectFlush.c =================================================================== diff -u -r4bd3bf3483660050d3026f7f9adff43782bfc620 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision 4bd3bf3483660050d3026f7f9adff43782bfc620) +++ firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -1045,7 +1045,9 @@ // If either the dialysate cap or the concentrate cap is open during any state, alarm 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; Index: firmware/App/Modes/ModeFlush.c =================================================================== diff -u -r4bd3bf3483660050d3026f7f9adff43782bfc620 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision 4bd3bf3483660050d3026f7f9adff43782bfc620) +++ firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -1129,15 +1129,18 @@ { if ( ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) || ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) ) { - // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path - // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function - prevFlushState = flushState; - flushState = DG_FLUSH_STATE_CANCEL_WATER_PATH; - alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; - - if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + if ( ( flushState != DG_FLUSH_STATE_CANCEL_WATER_PATH ) && ( flushState != DG_FLUSH_STATE_CANCEL_BASIC_PATH ) ) { - alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path + // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function + prevFlushState = flushState; + flushState = DG_FLUSH_STATE_CANCEL_WATER_PATH; + alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; + + if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + { + alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + } } } } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r4bd3bf3483660050d3026f7f9adff43782bfc620 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 4bd3bf3483660050d3026f7f9adff43782bfc620) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -117,6 +117,10 @@ #define MIX_DRAIN_WEIGHT_UNCHANGE_TIMEOUT ( 15 * MS_PER_SECOND ) ///< Time period of unchanged weight during mix draining before timeout. #define MIX_DRAIN_TEMPERATURE_THRESHOLD_C 60.0F ///< Temperature threshold for performing mix drain or normal drain. +// Passive cool defines +#define PASSIVE_COOL_TIME_TO_DRAIN_MS ( 20 * MS_PER_SECOND ) ///< Passive cool time needed to be below temperature range in milliseconds. +#define PASSIVE_COOL_TEMP_THRESHOLD_TO_DRAIN_C 59.0F ///< Passive cool threshold temperature to drain in C. + #ifndef _RELEASE_ #define NELSON_SUPPORT_TARGET_TEMP_C 6.0F // Nelson support heat disinfect target temperature in C. #define NELSON_SUPPORT_STOP_TEMP_C ( NELSON_SUPPORT_TARGET_TEMP_C - 5.0F ) // Nelson support heat disinfect stop temperature in C. @@ -162,6 +166,14 @@ F32 stopTempC; ///< Heat disinfect temperature to stop disinfect in C. } HEAT_DISINFECT_TIME_STATUS_T; +/// Passive heat disinfect status +typedef struct +{ + BOOL isPassiveHeatDisRqustd; ///< Boolean flag to indicate the status of passive heat disinfect. + BOOL isTempBelowRange; ///< Boolean flag to indicate whether the temperature is below range. + U32 tempsCheckStartTimeMS; ///< Temperatures below range start time in milliseconds. +} PASSIVE_COOL_HEAT_DISINFECT_STATUS_T; + // ********** private data ********** static DG_HEAT_DISINFECT_STATE_T heatDisinfectState; ///< Current active heat disinfect state. @@ -190,8 +202,9 @@ 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 +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. +static PASSIVE_COOL_HEAT_DISINFECT_STATUS_T passiveCoolHeatDisStatus; ///< Passive cool heat disinfect status. #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 @@ -251,7 +264,7 @@ * hasROFCirculationBeenStarted, ROFCirculationTimer, targetDisinfectTime * ROFCirculationCoolingCounter, concentratePumpsPrimeTimer, areRsrvrsLeaking * haveDrainParamsBeenInit, tempGradOutOfRangeTimer, disinfectNVOps, - * dataPublishCounter, timeStatus, concPumpsStartTemperatureC + * dataPublishCounter, timeStatus, concPumpsStartTemperatureC, passiveHeatDisStatus * @return none *************************************************************************/ void initHeatDisinfectMode( void ) @@ -282,6 +295,8 @@ dataPublishCounter = 0; concPumpsStartTemperatureC = HEAT_DISINFECT_CONC_PUMPS_START_TEMP_C; isRODisinfectDone = FALSE; + passiveCoolHeatDisStatus.tempsCheckStartTimeMS = 0.0F; // NOTE: the "is passive" flag cannot be set here because it is set in with the request functions + passiveCoolHeatDisStatus.isTempBelowRange = FALSE; // Initialize the disinfect times timeStatus[ RO_AT_77_C ].startTempC = HEAT_DISINFECT_START_TEMP_AT_77_C; @@ -516,6 +531,21 @@ return status; } +/*********************************************************************//** + * @brief + * The setActiveOrPassiveHeatDisinfectStatus function sets the status of the + * heat disinfect as to whether it is active cool or passive cool + * @details Inputs: none + * @details Outputs: nocturnalHeatDisStatus + * @param isPassive boolean flag to indicate whether to run passive heat + * disinfect or not + * @return none + *************************************************************************/ +void setActiveOrPassiveHeatDisinfectStatus( BOOL isPassive ) +{ + passiveCoolHeatDisStatus.isPassiveHeatDisRqustd = isPassive; +} + // ********** private functions ********** /*********************************************************************//** @@ -545,6 +575,7 @@ setValveState( VPO, VALVE_STATE_FILL_C_TO_NC); setValveState( VRD1, VALVE_STATE_OPEN ); setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_PASSIVE_COOL_HEAT_DISINFECT_STATUS, (U32)passiveCoolHeatDisStatus.isPassiveHeatDisRqustd, 0 ) return state; } @@ -1090,6 +1121,12 @@ startHeater( DG_TRIMMER_HEATER ); } + // If the user has selected the passive cool heat disinfect, trigger the alarm to prompt the user to turn off the inlet water valves + if ( TRUE == passiveCoolHeatDisStatus.isPassiveHeatDisRqustd ) + { + activateAlarmNoData( ALARM_ID_DG_TURN_OFF_INLET_WATER_VALVES ); + } + stateTimer = getMSTimerCount(); rsrvrsVolMonitorTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_DISINFECT_R1_TO_R2; @@ -1376,32 +1413,43 @@ *************************************************************************/ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectCoolDownHeatersState( void ) { - DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS; + DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS; + BOOL setActuatorsPriorToTransition = FALSE; heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_COOL_DOWN_DEVICE; writeDisinfectDataToNV( USAGE_INFO_HEAT_DIS ); - if ( TRUE == didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) + if ( ( TRUE == didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) && ( FALSE == passiveCoolHeatDisStatus.isPassiveHeatDisRqustd ) ) { - signalROPumpHardStop(); + setActuatorsPriorToTransition = TRUE; + } + else + { + F32 TDiC = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 THdC = getTemperatureValue( TEMPSENSORS_HEAT_DISINFECT ); - if ( TRUE == isDrainPumpOn() ) + if ( ( TDiC > PASSIVE_COOL_TEMP_THRESHOLD_TO_DRAIN_C ) || ( THdC > PASSIVE_COOL_TEMP_THRESHOLD_TO_DRAIN_C ) ) { - // Stop the drain pump and the RO pump to exit the closed loop - signalDrainPumpHardStop(); - setValveState( VRD1, VALVE_STATE_CLOSED ); + passiveCoolHeatDisStatus.tempsCheckStartTimeMS = getMSTimerCount(); } - else + else if ( TRUE == didTimeout( passiveCoolHeatDisStatus.tempsCheckStartTimeMS, PASSIVE_COOL_TIME_TO_DRAIN_MS ) ) { - setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); - rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - stateTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; + setActuatorsPriorToTransition = TRUE; } } + if ( TRUE == setActuatorsPriorToTransition ) + { + signalROPumpHardStop(); + setValveState( VRD1, VALVE_STATE_CLOSED ); + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; + } + return state; } @@ -1412,31 +1460,36 @@ * times out, it transitions to basic cancellation state. Otherwise, it * transitions to the next state. * @details Inputs: stateTimer, rsrvr1Status, rsrvr2Status, - * isDrainPumpOnInMixDrain + * isDrainPumpOnInMixDrain, passiveCoolHeatDisStatus * @details Outputs: stateTimer, rsrvr1Status, rsrvr2Status, * isDrainPumpOnInMixDrain * @return next state of the heat disinfect state machine *************************************************************************/ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectMixDrainR1State( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; + U32 targetDrainRPM = ( TRUE == passiveCoolHeatDisStatus.isPassiveHeatDisRqustd ? DRAIN_PUMP_TARGET_RPM : DRAIN_PUMP_RPM_IN_MIX_DRAIN ); heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_FLUSH_AFTER_DISINFECT; if ( ( TRUE == didTimeout( stateTimer, DRAIN_PUMP_START_TIME_IN_MIX_DRAIN_MS ) ) && ( FALSE == isDrainPumpInMixDrainOn ) ) { isDrainPumpInMixDrainOn = TRUE; - setValveState( VPI, VALVE_STATE_OPEN ); + if ( FALSE == passiveCoolHeatDisStatus.isPassiveHeatDisRqustd ) + { + setValveState( VPI, VALVE_STATE_OPEN ); + turnOnUVReactor( INLET_UV_REACTOR ); + } + setValveState( VRD1, VALVE_STATE_OPEN ); setValveState( VBF, VALVE_STATE_CLOSED ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); // Turn on the drain pump to drain the reservoirs in open loop mode - setDrainPumpTargetRPM( DRAIN_PUMP_RPM_IN_MIX_DRAIN ); - turnOnUVReactor( INLET_UV_REACTOR ); + setDrainPumpTargetRPM( targetDrainRPM ); } else if ( TRUE == isDrainPumpInMixDrainOn ) { @@ -1550,8 +1603,10 @@ // Stop all the actuators first then decide who should run next deenergizeActuators( NO_PARK_CONC_PUMPS ); - // The two sensors must be less than a threshold to decide if mix drain is needed to normal drain - if ( ( TDi < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) && ( TRo < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) ) + // The two sensors must be less than a threshold to decide if mix drain is needed to normal drain or the + // passive cool heat disinfect should have been selected + if ( ( ( TDi < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) && ( TRo < MIX_DRAIN_TEMPERATURE_THRESHOLD_C ) ) || + ( TRUE == passiveCoolHeatDisStatus.isPassiveHeatDisRqustd ) ) { targetRPM = DRAIN_PUMP_TARGET_RPM; cancellationMode = CANCELLATION_MODE_COLD; @@ -1652,9 +1707,16 @@ } else #endif + + if ( FALSE == passiveCoolHeatDisStatus.isPassiveHeatDisRqustd ) { requestNewOperationMode( DG_MODE_HCOL ); } + else + { + // After nocturnal run transition to standby since there is not active cool + requestNewOperationMode( DG_MODE_STAN ); + } return state; } @@ -2040,15 +2102,18 @@ { if ( ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) || ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) ) { - // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path - // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function - prevHeatDisinfectState = heatDisinfectState; - heatDisinfectState = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; - alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; - - if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + if ( ( heatDisinfectState != DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH ) && ( heatDisinfectState != DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH ) ) { - alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path + // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function + prevHeatDisinfectState = heatDisinfectState; + heatDisinfectState = DG_HEAT_DISINFECT_STATE_CANCEL_WATER_PATH; + alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; + + if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + { + alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + } } } } Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -r4bd3bf3483660050d3026f7f9adff43782bfc620 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 4bd3bf3483660050d3026f7f9adff43782bfc620) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -51,6 +51,8 @@ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ); // get the current state of the heat disinfect mode BOOL stopDGHeatDisinfect( void ); // Stop DG heat disinfect +void setActiveOrPassiveHeatDisinfectStatus( BOOL isPassive ); + BOOL testSetDG77CStateTimerOverride( U32 timer ); // set override timer for disinfection at 77C BOOL testResetDG77CStateTimerOverride( void ); // reset override timer for disinfection at 77C BOOL testSetDG82CStateTimerOverride( U32 timer ); // set override timer for disinfection at 82C Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.c =================================================================== diff -u -r4bd3bf3483660050d3026f7f9adff43782bfc620 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 4bd3bf3483660050d3026f7f9adff43782bfc620) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -771,15 +771,19 @@ { if ( ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) || ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ) ) { - // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path - // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function - heatDisinfectActiceCoolPrevState = heatDisinfectActiveCoolState; - heatDisinfectActiveCoolState = DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE; - alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; - - if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + if ( ( heatDisinfectActiveCoolState != DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE ) && + ( heatDisinfectActiveCoolState != DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_BASIC_PATH_STATE ) ) { - alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + // Set the variables to fail and go to cancel water path. Set the pending alarm to no alarm so the cancel water path + // will not be raising the alarm at end of the cancel water path. The recoverable alarm is raised here in this function + heatDisinfectActiceCoolPrevState = heatDisinfectActiveCoolState; + heatDisinfectActiveCoolState = DG_HEAT_DISINFECT_ACTIVE_COOL_CANCEL_WATER_PATH_STATE; + alarmDetectedPendingTrigger = ALARM_ID_DG_DIALYSATE_CAP_NOT_IN_PROPER_POSITION; + + if ( STATE_OPEN == getSwitchStatus( CONCENTRATE_CAP ) ) + { + alarmDetectedPendingTrigger = ALARM_ID_DG_CONCENTRATE_CAP_NOT_IN_PROPER_POSITION; + } } } } Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r54d18d86b3947c977163f87fc9f07e6799b1f2c9 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 54d18d86b3947c977163f87fc9f07e6799b1f2c9) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -589,9 +589,11 @@ * The startDGHeatDisinfect function starts heat disinfect mode. * @details Inputs: standbyState * @details Outputs: none + * @param isPassive: boolean flag to indicate whether this is passive cool heat + * or active cool heat disinfect * @return: TRUE if the switch was successful *************************************************************************/ -BOOL startDGHeatDisinfect( void ) +BOOL startDGHeatDisinfect( BOOL isPassive ) { BOOL status = FALSE; @@ -605,7 +607,7 @@ getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - cmdResponse.commandID = DG_CMD_START_HEAT_DISINFECT; + cmdResponse.commandID = ( FALSE == isPassive ? DG_CMD_START_HEAT_DISINFECT_ACTIVE_COOL : DG_CMD_START_HEAT_DISINFECT_PASSIVE_COOL ); cmdResponse.rejected = FALSE; cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; @@ -666,7 +668,7 @@ getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); - cmdResponse.commandID = DG_CMD_START_HEAT_DISINFECT; + cmdResponse.commandID = DG_CMD_START_ACTIVE_COOL; cmdResponse.rejected = FALSE; cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -r4bd3bf3483660050d3026f7f9adff43782bfc620 -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 4bd3bf3483660050d3026f7f9adff43782bfc620) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -49,7 +49,7 @@ BOOL signalAbortWaterSampling( void ); // HD signal to abort water sampling. BOOL startDGFlush( void ); // HD start flush mode -BOOL startDGHeatDisinfect( void ); // HD start heat disinfect mode +BOOL startDGHeatDisinfect( BOOL isPassive ); // HD start heat disinfect mode BOOL startDGHeatDisinfectActiveCool( void ); DG_STANDBY_MODE_STATE_T getCurrentStandbyState( void ); // get the current state of the standby mode. Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r23ebb5812ecd93ca42999259f7f62f46fd482ebd -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 23ebb5812ecd93ca42999259f7f62f46fd482ebd) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -906,7 +906,7 @@ break; case MSG_ID_DG_START_STOP_HEAT_DISINFECT_CMD_REQUEST: - handleStartStopDGHeatDisinfect( message ); + handleStartStopDGActiveCoolHeatDisinfect( message ); break; case MSG_ID_DG_START_STOP_CHEM_DISINFECT: @@ -969,6 +969,10 @@ handleReceiveROPermeatSampleDispenseRequest( message ); break; + case MSG_ID_DG_START_STOP_PASSIVE_COOL_HEAT_DISINFECT: + handleStartStopDGPassiveCoolHeatDisifnect( message ); + break; + case MSG_ID_HD_REQUEST_SERVICE_RECORD_FROM_HD: handleSendDGServiceRecordToHD( message ); break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r33fba6f57b9ca5c90f6d887e7a5bab9b2abda12e -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 33fba6f57b9ca5c90f6d887e7a5bab9b2abda12e) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -1265,14 +1265,14 @@ /*********************************************************************//** * @brief - * The handleStartStopDGHeatDisinfect function handles a request start or - * stop DG heat disifect mode. + * The handleStartStopDGActiveCoolHeatDisinfect function handles a request start or + * stop DG active cool heat disifect mode. * @details Inputs: none * @details Outputs: message handled * @param message: a pointer to the message to handle * @return result *************************************************************************/ -BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ) +BOOL handleStartStopDGActiveCoolHeatDisinfect( MESSAGE_T *message ) { BOOL status = FALSE; @@ -1284,7 +1284,8 @@ if ( TRUE == startingDGHeatDisinfect ) { - status = startDGHeatDisinfect(); + setActiveOrPassiveHeatDisinfectStatus( FALSE ); + status = startDGHeatDisinfect( FALSE ); } else { @@ -1968,7 +1969,29 @@ serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_2_HD, ACK_REQUIRED ); } +/*********************************************************************//** + * @brief + * The handleStartStopDGPassiveHeatDisifnect function handles a request to + * start or stop DG passive cool heat disinfect. + * @details Inputs: none + * @details Outputs: message handled + * @param message: a pointer to the message to handle + * @return result + *************************************************************************/ +void handleStartStopDGPassiveCoolHeatDisifnect( MESSAGE_T* message ) +{ + BOOL status = FALSE; + if ( message->hdr.payloadLen == sizeof(U32) ) + { + setActiveOrPassiveHeatDisinfectStatus( TRUE ); + status = startDGHeatDisinfect( TRUE ); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, status ); +} + + // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r33fba6f57b9ca5c90f6d887e7a5bab9b2abda12e -r91beb8b83d0fbcb2b879781624169c26a97a7ab4 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 33fba6f57b9ca5c90f6d887e7a5bab9b2abda12e) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 91beb8b83d0fbcb2b879781624169c26a97a7ab4) @@ -198,6 +198,9 @@ // MSG_ID_HD_REQUEST_SERVICE_RECORD_FROM_HD void handleSendDGServiceRecordToHD( MESSAGE_T* message ); +// MSG_ID_DG_START_STOP_NOCTURNAL_HEAT_DISINFECT +void handleStartStopDGPassiveCoolHeatDisifnect( MESSAGE_T* message ); + // *********** public test support message functions ********** // MSG_TESTER_LOG_IN @@ -338,7 +341,7 @@ BOOL handleStartStopDGFlush( MESSAGE_T *message ); // MSG_ID_DG_START_STOP_HEAT_DISINFECT -BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ); +BOOL handleStartStopDGActiveCoolHeatDisinfect( MESSAGE_T *message ); // MSG_ID_UI_DG_SET_RTC_REQUEST void handleUIClockSyncRequest( MESSAGE_T *message );