Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -reae0635792a827b7cf9197cf6f6e253f2a094260 -r73c6b6fb7bbb934277157ce1e218358c573a6af1 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision eae0635792a827b7cf9197cf6f6e253f2a094260) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 73c6b6fb7bbb934277157ce1e218358c573a6af1) @@ -1293,7 +1293,6 @@ setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - signalROPumpHardStop(); rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; @@ -1708,21 +1707,18 @@ static HEAT_DISINFECT_STATUS_T getHeatDisinfectStatus( void ) { HEAT_DISINFECT_STATUS_T status = HEAT_DISINFECT_HEAT_UP_IN_PROGRESS; + F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); + F32 ThdTemp = getTemperatureValue( TEMPSENSORS_HEAT_DISINFECT ); + F32 loadCellA1 = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); + F32 loadCellB1 = getLoadCellSmallFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); + BOOL isR1OutOfRange = ( fabs( loadCellA1 - R1HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML ? TRUE : FALSE ); + BOOL isR2OutOfRange = ( fabs( loadCellB1 - R2HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML ? TRUE : FALSE ); + BOOL isGradientOutOfRange = ( fabs( TPoTemp - ThdTemp ) > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ? TRUE : FALSE ); - F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); - F32 ThdTemp = getTemperatureValue( TEMPSENSORS_HEAT_DISINFECT ); - - 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 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; - // Perform check if no pending alarm if ( ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger ) { - if ( TRUE != gradientOutOfRange ) + if ( FALSE == isGradientOutOfRange ) { tempGradOutOfRangeTimer = 0; } Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.c =================================================================== diff -u --- firmware/App/Modes/ModeHeatDisinfectActiveCool.c (revision 0) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.c (revision 73c6b6fb7bbb934277157ce1e218358c573a6af1) @@ -0,0 +1,316 @@ + +#include "CPLD.h" +#include "MessageSupport.h" +#include "ModeFault.h" +#include "ModeHeatDisinfectActiveCool.h" +#include "OperationModes.h" +#include "ROPump.h" +#include "TaskGeneral.h" +#include "TemperatureSensors.h" +#include "Timers.h" +#include "Valves.h" + +/** + * @addtogroup DGHeatDisinfectActiveCoolMode + * @{ + */ + +// ********** private data ********** + +#define HEAT_DISINFECT_ACTIVE_COOL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode heat disinfect active cool data publish interval in counts. +#define ROF_COOL_DOWN_TARGET_FLOW_LPM 0.3F ///< RO filter cool down target flow in L/min. +#define HEAT_DISINFECT_ACTIVE_COOL_MAX_RO_PRESSURE_PSI 40 ///< Heat disinfect active cool maximum RO pressure in psi. +#define TARGET_THD_SENSOR_FOR_RINSING_C 44.0F ///< Target THd temperature sensor value before rinsing in C. +#define ROF_COOL_DOWN_CIRCULATION_TIME_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< RO filter cool down circulation timer in milliseconds. +#define ROF_COOL_DOWN_MAX_TIME_MS ( 90 * SEC_PER_MIN * MS_PER_SECOND ) ///< RO filter cool down maximum state time in milliseconds. + +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T heatDisinfectActiveCoolState; ///< Mode heat disinfect active cool state. +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T heatDisinfectActiceCoolPrevState; ///< Mode heat disinfect active cool previous state. +static U32 stateTimer; ///< Mode heat disinfect active cool state timer. +static U32 dataPublishCounter; ///< Mode heat disinfect active cool data publish counter. +static U32 overallHeatDisinfectActiveCoolTimer; ///< Mode heat disinfect active cool over mode timer. +static U32 ROFCoolingTimer; ///< Mode heat disinfect active cool RO filter cooling timer. +static ALARM_ID_T alarmDetectedPendingTrigger; ///< Mode heat disinfect active cool pending alarm trigger. + +// ********** private function prototypes ********** + +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolStartState( void ); +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolCoolDownROFilterState( void ); +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolCancelBasicPathState( void ); + +static void failHeatDisinfectActiveCool( void ); +static void publishHeatDisinfectActiveCoolData( void ); + +/*********************************************************************//** + * @brief + * The initHeatDisinfectActiveCoolMode function initializes the heat disinfect + * active cool mode module. + * @details Inputs: none + * @details Outputs: heatDisinfectActiveCoolState, stateTimer, dataPublishCounter, + * overallHeatDisinfectActiveCoolTimer, ROFCoolingTimer, alarmDetectedPendingTrigger + * heatDisinfectActiceCoolPrevState, + * @return none + *************************************************************************/ +void initHeatDisinfectActiveCoolMode( void ) +{ + heatDisinfectActiveCoolState = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_START; + heatDisinfectActiceCoolPrevState = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_START; + stateTimer = 0; + dataPublishCounter = 0; + overallHeatDisinfectActiveCoolTimer = 0; + ROFCoolingTimer = 0; + alarmDetectedPendingTrigger = ALARM_ID_NO_ALARM; +} + +/*********************************************************************//** + * @brief + * The transitionToHeatDisinfectActiveCoolMode function prepares for transition to + * heat disinfect active cool mode + * @details Inputs: none + * @details Outputs: none + * @return initial state + *************************************************************************/ +U32 transitionToHeatDisinfectActiveCoolMode( void ) +{ + deenergizeActuators(); + + initHeatDisinfectActiveCoolMode(); + + setCPLDCleanLEDColor( CPLD_CLEAN_LED_ORANGE ); + + return heatDisinfectActiveCoolState; +} + +/*********************************************************************//** + * @brief + * The execHeatDisinfectActiveCoolMode function executes the heat disinfect + * active cool mode state machine. + * @details Inputs: heatDisinfectActiveCoolState + * @details Outputs: heatDisinfectActiveCoolState + * @return current state + *************************************************************************/ +U32 execHeatDisinfectActiveCoolMode( void ) +{ + // TODO the inlet water check? + // TODO check the caps to be closed + + switch( heatDisinfectActiveCoolState ) + { + case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_START: + heatDisinfectActiveCoolState = handleHeatDisinfectActiveCoolStartState(); + break; + + case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COOL_DOWN_RO_FILTER: + heatDisinfectActiveCoolState = handleHeatDisinfectActiveCoolCoolDownROFilterState(); + break; + + case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_CANCEL_BASIC_PATH: + heatDisinfectActiveCoolState = handleHeatDisinfectActiveCoolCancelBasicPathState(); + break; + + case DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE: + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_HEAT_DISINFECT_ACTIVE_COOL_INVALID_EXEC_STATE, heatDisinfectActiveCoolState ) + heatDisinfectActiveCoolState = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_START; + break; + } + + publishHeatDisinfectActiveCoolData(); + + return heatDisinfectActiveCoolState; +} + +/*********************************************************************//** + * @brief + * The getCurrentHeatDisinfectActiveCoolState function returns the current + * state of the heat disinfect active cool mode. + * @details Inputs: heatDisinfectActiveCoolState + * @details Outputs: none + * @return the current state of heat disinfect active cool mode. + *************************************************************************/ +DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T getCurrentHeatDisinfectActiveCoolState( void ) +{ + return heatDisinfectActiveCoolState; +} + +/*********************************************************************//** + * @brief + * The stopDGHeatDisinfectActiveCool function stops heat disinfect active + * cool mode. + * @details Inputs: none + * @details Outputs: none + * @return TRUE is current operation mode is heat disinfect active cool, + * otherwise FALSE + *************************************************************************/ +BOOL stopDGHeatDisinfectActiveCool( void ) +{ + BOOL status = FALSE; + + // Check if the current operation mode is heat disinfect active cool + if ( DG_MODE_HCOL == getCurrentOperationMode() ) + { + // Reset all the actuators + deenergizeActuators(); + + // Transition to mode standby + requestNewOperationMode( DG_MODE_STAN ); + + status = TRUE; + } + + return status; +} + +// ********** private functions ********** + +/*********************************************************************//** + * @brief + * The handleHeatDisinfectActiveCoolStartState function handles the heat + * disinfect active cool start state. + * @details Inputs: anone + * @details Outputs: ROFCoolingTimer, stateTimer + * @return next state of the heat disinfect active cool state machine + *************************************************************************/ +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolStartState( void ) +{ + DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COOL_DOWN_RO_FILTER; + + // De-energize all the valves that are not in the path anymore + // and wait for the RO membrane to be cooled down. + setValveState( VPI, VALVE_STATE_CLOSED ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRD1, VALVE_STATE_CLOSED ); + setValveState( VBF, VALVE_STATE_OPEN ); + setValveState( VDR, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setROPumpTargetFlowRateLPM( ROF_COOL_DOWN_TARGET_FLOW_LPM, HEAT_DISINFECT_ACTIVE_COOL_MAX_RO_PRESSURE_PSI ); + + ROFCoolingTimer = 0; + stateTimer = getMSTimerCount(); + + return state; +} + +/*********************************************************************//** + * @brief + * The handleHeatDisinfectActiveCoolCoolDownROFilterState function handles + * the heat disinfect active cool cool down RO filter state. The state + * monitors the temperature at THd and if it is less than 45 C, it transitions + * to the next state. + * @details Inputs: stateTimer, ROFCoolingTimer + * @details Outputs: stateTimer, ROFcoolingTimer, heatDisinfectUIState, + * heatDisinfectActiceCoolPrevState, heatDisinfectActiceCoolPrevState + * @return next state of the heat disinfect active cool state machine + *************************************************************************/ +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolCoolDownROFilterState( void ) +{ + DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COOL_DOWN_RO_FILTER; + + // THd is the closet sensor to the RO filter and this temperature is monitored + // until it is dropped below 45 C to be able to run fluid through the RO filter + F32 THdTemp = getTemperatureValue( TEMPSENSORS_HEAT_DISINFECT ); + + if ( ( 0 == ROFCoolingTimer ) && ( THdTemp < TARGET_THD_SENSOR_FOR_RINSING_C ) ) + { + // Temperature is below target - perform mandatory cool down + ROFCoolingTimer = getMSTimerCount(); + } + else if ( THdTemp >= TARGET_THD_SENSOR_FOR_RINSING_C ) + { + // Temperature is not below target - reset the timer and keep looking + ROFCoolingTimer = 0; + } + + if ( ( ROFCoolingTimer != 0 ) && ( TRUE == didTimeout( ROFCoolingTimer, ROF_COOL_DOWN_CIRCULATION_TIME_MS ) ) ) + { + // Temperature is below target, transition to next state + setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); + setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + signalROPumpHardStop(); + + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COMPLETE; + } + else if ( ( TRUE == didTimeout( stateTimer, ROF_COOL_DOWN_MAX_TIME_MS ) ) ) + { + heatDisinfectActiceCoolPrevState = state; + alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_ACTIVE_COOL_TIME_OUT; + state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_CANCEL_BASIC_PATH; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleHeatDisinfectActiveCoolCancelBasicPathState function handles the + * heat disinfect active cool cancel mode basic path state. The state sets + * the state to complete and raises an alarm. + * @details Inputs: none + * @details Outputs: none + * @return next state of the heat disinfect active cool state machine + *************************************************************************/ +static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolCancelBasicPathState( void ) +{ + DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_CANCEL_BASIC_PATH; + + failHeatDisinfectActiveCool(); + + return state; +} + +/*********************************************************************//** + * @brief + * The failHeatDisinfect function sets the alarm that failed the heat + * disinfect mode. + * @details Inputs: alarmDetectedPendingTrigger, prevHeatDisinfectState + * @details Outputs: none + * @return none + *************************************************************************/ +static void failHeatDisinfectActiveCool( void ) +{ + // In the cleaning modes the alarms are triggered but the mode is not transitioned to fault automatically + // so transition to fault mode is done here + if ( alarmDetectedPendingTrigger != ALARM_ID_NO_ALARM ) + { + SET_ALARM_WITH_1_U32_DATA( alarmDetectedPendingTrigger, heatDisinfectActiceCoolPrevState ) + } + requestNewOperationMode( DG_MODE_FAUL ); +} + +/*********************************************************************//** + * @brief + * The publishHeatDisinfectActiveCoolData function publishes heat disinfect + * active cool data at the set interval. + * @details Inputs: dataPublishCounter + * @details Outputs: dataPublishCounter + * @return: none + *************************************************************************/ +static void publishHeatDisinfectActiveCoolData( void ) +{ + if ( ++dataPublishCounter >= HEAT_DISINFECT_ACTIVE_COOL_DATA_PUB_INTERVAL ) + { + MODE_HEAT_DISINFECT_ACTIVE_COOL_DATA_T data; + + data.heatDisinfectActivCoolState = (U32)heatDisinfectActiveCoolState; + data.overallElapsedTime = calcTimeSince( overallHeatDisinfectActiveCoolTimer ); + data.stateElapsedTime = calcTimeSince( stateTimer ); + data.cancellationMode = 0; + + broadcastData( MSG_ID_DG_HEAT_DISINFECT_ACTIVE_COOL_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( MODE_HEAT_DISINFECT_ACTIVE_COOL_DATA_T ) ); + + dataPublishCounter = 0; + } +} + +/**@}*/ + Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.h =================================================================== diff -u --- firmware/App/Modes/ModeHeatDisinfectActiveCool.h (revision 0) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.h (revision 73c6b6fb7bbb934277157ce1e218358c573a6af1) @@ -0,0 +1,40 @@ + + +#ifndef APP_MODES_MODEHEATDISINFECTACTIVECOOL_H_ +#define APP_MODES_MODEHEATDISINFECTACTIVECOOL_H_ + +#include "DGCommon.h" +#include "DGDefs.h" + +/** + * @defgroup DGHeatDisinfectActiveCoolMode DGHeatDisinfectActiveCoolMode + * @brief Heat disinfection active cool mode module. Manages the state machine for the heat disinfect active cool mode. + * + * @addtogroup DGHeatDisinfectActiveCoolMode + * @{ + */ + +// ********** public definitions ********** + +/// Heat disinfect active cool data publish struct +typedef struct +{ + U32 heatDisinfectActivCoolState; ///< Heat disinfect active cool state. + U32 overallElapsedTime; ///< Overall elapsed time in heat disinfect active cool mode. + U32 stateElapsedTime; ///< Current heat disinfect active cool elapsed time. + U32 cancellationMode; ///< Heat disinfect active cool cancellation mode. +} MODE_HEAT_DISINFECT_ACTIVE_COOL_DATA_T; + +// ********** public function prototypes ********** + +void initHeatDisinfectActiveCoolMode( void ); // Initialize this module +U32 transitionToHeatDisinfectActiveCoolMode( void ); // Prepares for transition to heat disinfect mode +U32 execHeatDisinfectActiveCoolMode( void ); // Execute the heat disinfect mode state machine (call from OperationModes) + +DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T getCurrentHeatDisinfectActiveCoolState( void ); // get the current state of the heat disinfect mode + +BOOL stopDGHeatDisinfectActiveCool( void ); // Stop DG heat disinfect + +/**@}*/ + +#endif Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r0c296cef29037819be204c45a23d4d38a52b2718 -r73c6b6fb7bbb934277157ce1e218358c573a6af1 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 0c296cef29037819be204c45a23d4d38a52b2718) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 73c6b6fb7bbb934277157ce1e218358c573a6af1) @@ -25,6 +25,7 @@ #include "ModeFlush.h" #include "ModeGenIdle.h" #include "ModeHeatDisinfect.h" +#include "ModeHeatDisinfectActiveCool.h" #include "ModeInitPOST.h" #include "ModeService.h" #include "ModeSolo.h" @@ -60,18 +61,20 @@ /// This matrix determines legal transitions from one mode to another. static const DG_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_DG_MODES - 1 ][ NUM_OF_DG_MODES - 1 ] = { -// from to-> FAULT SERVICE INIT STANBY STBY-SOLO GEN-IDLE FILL DRAIN FLUSH HEAT DIS CHEM DIS - /* FAUL */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* SERV */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* INIT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* STAN */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_CHEM }, - /* SOLO */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_NLEG }, - /* GENE */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* FILL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* DRAI */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, - /* FLUS */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_NLEG, DG_MODE_NLEG }, - /* HEAT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HEAT, DG_MODE_NLEG }, - /* CHEM */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHEM } + // from to-> FAULT SERVICE INIT STANBY STBY-SOLO GEN-IDLE FILL DRAIN FLUSH HEAT DIS CHEM DIS CHEM_FLUSH HEAT_COOL + /* FAUL */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_HCOL }, + /* SERV */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* INIT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* STAN */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_HCOL }, + /* SOLO */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* GENE */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* FILL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* DRAI */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_DRAI, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* FLUS */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, + /* HEAT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HEAT, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL }, + /* CHEM */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_NLEG }, + /* CHFL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_NLEG }, + /* HCOL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_HCOL }, }; @@ -119,6 +122,7 @@ initFlushMode(); initHeatDisinfectMode(); initChemicalDisinfectMode(); + initHeatDisinfectActiveCoolMode(); } /*********************************************************************//** @@ -203,6 +207,9 @@ currentSubMode = execChemicalDisinfectMode(); break; + case DG_MODE_HCOL: + currentSubMode = execHeatDisinfectActiveCoolMode(); + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, (U32)currentMode ) currentMode = DG_MODE_FAUL; @@ -355,6 +362,9 @@ case DG_MODE_CHEM: currentSubMode = transitionToChemicalDisinfectMode(); break; + case DG_MODE_HCOL: + currentSubMode = transitionToHeatDisinfectActiveCoolMode(); + break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, (U32)newMode ) break; Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -r73c6b6fb7bbb934277157ce1e218358c573a6af1 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 73c6b6fb7bbb934277157ce1e218358c573a6af1) @@ -143,6 +143,7 @@ SW_FAULT_ID_INVALID_USAGE_INFO_SELECTED, SW_FAULT_ID_NVDATA_MANAGEMENT_OPS_TIMEOUT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, + SW_FAULT_ID_HEAT_DISINFECT_ACTIVE_COOL_INVALID_EXEC_STATE, // 115 NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T;