Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r9dd9502d10f57408dd50fd43275b29b89a8a66c9 -r44cc25461e4936f7928904640c87a03ef7cf3c16 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 9dd9502d10f57408dd50fd43275b29b89a8a66c9) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 44cc25461e4936f7928904640c87a03ef7cf3c16) @@ -620,7 +620,7 @@ if ( avgADC > TEMP_SENSORS_ADC_MAX_COUNT ) { - SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_OUT_OF_RANGE, TEMPSENSORS_SELF_TEST_ADC_CHECK ); + //SET_ALARM_WITH_1_U32_DATA ( ALARM_ID_TEMPERATURE_SENSORS_OUT_OF_RANGE, TEMPSENSORS_SELF_TEST_ADC_CHECK ); } } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r8266598642c10b864905217d75d483f9ece15a0b -r44cc25461e4936f7928904640c87a03ef7cf3c16 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 8266598642c10b864905217d75d483f9ece15a0b) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 44cc25461e4936f7928904640c87a03ef7cf3c16) @@ -25,9 +25,12 @@ #include "ROPump.h" #include "TemperatureSensors.h" #include "UVReactors.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" -//TODO control composition pumps -//TODO add header to functions +// TODO control composition pumps +// TODO add header to functions +// TODO add documentation /** * @addtogroup DGHeatDisinfectMode @@ -37,23 +40,32 @@ // ********** private definitions ********** // TODO: Change the target temperature to 85 -#define HEAT_DISINFECT_TARGET_TEMPERATURE 30U ///< Heat disinfection target temperature +#define HEAT_DISINFECT_TARGET_TEMPERATURE 30U ///< Heat disinfection target temperature #define MAX_TPO_AND_TDI_SENSORS_DIFFERENCE 1U #define MAX_TEMPERATURE_DEVIATION_FROM_TARGET 4U +#define HEAT_DISINFECT_RECIRC_PATH_TIME_MINS 1U +#define HEAT_DISINFECT_R1_TO_R2_TIME_MINS 1U +#define HEAT_DISINFECT_R2_TO_R1_TIME_MINS 1U + +#define MINUTES_TO_MS_CONVERSION 60000U + #define HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS 4000U //TODo do we need this? Change this to the amount of time the composite pumps will run -#define HEAT_DISINFECT_RECIRC_PATH_TIME_MS (1*60000) -#define HEAT_DISINFECT_R1_TO_R2_TIME_MS (1*60000) -#define HEAT_DISINFECT_R2_TO_R1_TIME_MS (1*60000) -#define HEAT_DISINFECT_OVERALL_TIME_MS (50*60000) +#define HEAT_DISINFECT_RECIRC_PATH_TIME_MS ( HEAT_DISINFECT_RECIRC_PATH_TIME_MINS * MINUTES_TO_MS_CONVERSION ) +#define HEAT_DISINFECT_R1_TO_R2_TIME_MS ( HEAT_DISINFECT_R1_TO_R2_TIME_MINS * MINUTES_TO_MS_CONVERSION ) +#define HEAT_DISINFECT_R2_TO_R1_TIME_MS ( HEAT_DISINFECT_R2_TO_R1_TIME_MINS * MINUTES_TO_MS_CONVERSION ) +#define HEAT_DISINFECT_TARGET_CYCLES 5U -#define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0U -#define DRAIN_PUMP_TARGET_RPM 2800U -#define RO_PUMP_TARGET_FLOW_RATE_LPM 0.9 +#define HEAT_DISINFECT_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) -#define FULL_RESERVOIRS_WEIGHT_GRAMS 500U -#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 200U +#define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0U +#define DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM 2800U +#define DRAIN_PUMP_DISINFECT_DRAIN_PATH_TARGET_RPM 1500U +#define RO_PUMP_TARGET_FLOW_RATE_LPM 0.9 +#define FULL_RESERVOIRS_WEIGHT_GRAMS 500U //TODO Change this value +#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 200U //TODO Change this value + // ********** private data ********** /// Heat disinfect evacuate/fill states @@ -70,18 +82,34 @@ static INTERNAL_HEAT_DISINFECT_STATE_T heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; static DG_HEAT_DISINFECT_STATE_T heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; ///< Currently active heat disinfect state. -static U32 heatDisinfectElapsedTime; -static U32 stateTimer; +static U32 heatDisinfectElapsedTime = 0; +static U32 stateTimer = 0; +static U32 drainPumpTargetRPM = 0; +static U32 heatDisinfectCurrentCycle = 0; +static U32 heatDisinfectPublishCounter = 0; -// ********** private function prototypes ********** +static OVERRIDE_F32_T heatDisinfectRecircDuration = { HEAT_DISINFECT_RECIRC_PATH_TIME_MS, + HEAT_DISINFECT_RECIRC_PATH_TIME_MS, + 0, 0 }; -static void stopActuators( void ); -static void setActuatorsToFillWater( void ); +static OVERRIDE_F32_T heatDisinfectR1ToR2Duration = { HEAT_DISINFECT_R1_TO_R2_TIME_MS, + HEAT_DISINFECT_R1_TO_R2_TIME_MS, + 0, 0 }; -static BOOL isTemperatureInRange( void ); -static BOOL hasHeatDisinfectTimeElapsed( void ); -static void execHeatDisinfectInternalStates( void ); +static OVERRIDE_F32_T heatDisinfectR2ToR1Duration = { HEAT_DISINFECT_R2_TO_R1_TIME_MS, + HEAT_DISINFECT_R2_TO_R1_TIME_MS, + 0, 0 }; +static OVERRIDE_U32_T heatDisinfectNoOfCyclesToRun = { HEAT_DISINFECT_TARGET_CYCLES, + HEAT_DISINFECT_TARGET_CYCLES, + 0, 0 }; + +static OVERRIDE_U32_T heatDisinfectDataPublishInterval = { HEAT_DISINFECT_DATA_PUB_INTERVAL, + HEAT_DISINFECT_DATA_PUB_INTERVAL, + 0, 0 }; + +// ********** private function prototypes ********** + static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectOffState( void ); static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterState( void ); static INTERNAL_HEAT_DISINFECT_STATE_T handleHeatDisinfectEvacRecircPathState( void ); @@ -97,6 +125,19 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterDeprimeReservoirs( void ); +static void stopActuators( void ); +static void setActuatorsToFillWater( void ); + +static BOOL isTemperatureInRange( void ); +static void execHeatDisinfectInternalStates( void ); +static void publishHeatDisinfectData ( void ); +static U32 getPublishHeatDisinfectDataInterval( void ); +static DATA_GET_PROTOTYPE( U32, getPublishHeatDisinfectDataInterval ); +static DATA_GET_PROTOTYPE( F32, getRecirculationDuration ); +static DATA_GET_PROTOTYPE( F32, getRSVR1ToRSVR2Duration ); +static DATA_GET_PROTOTYPE( F32, getRSVR2ToRSVR1Duration ); +static DATA_GET_PROTOTYPE( U32, getNoOfCyclesToRun ); + /*********************************************************************//** * @brief * The initHeatDisinfectMode function initializes the heat disinfect Mode module. @@ -105,9 +146,11 @@ * Outputs : none * @return none *************************************************************************/ -void initHeatDisinfectMode( void ) + void initHeatDisinfectMode( void ) { heatDisinfectElapsedTime = 0; + drainPumpTargetRPM = 0; + heatDisinfectCurrentCycle = 0; heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; } @@ -171,12 +214,18 @@ heatDisinfectState = handleHeatDisinfectFillWithWaterDeprimeReservoirs(); break; + case DG_HEAT_DISINFECT_STATE_COMPLETE: + // Do nothing + break; + default: // TODO - s/w fault - heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; + heatDisinfectState = DG_HEAT_DISINFECT_STATE_COMPLETE; break; } + publishHeatDisinfectData(); + return (U32)heatDisinfectState; } @@ -200,13 +249,15 @@ * @details * Inputs : none * Outputs : none - * @return none + * @return state of run *************************************************************************/ -void startDGHeatDisinfect( void ) +BOOL startDGHeatDisinfect( void ) { // TODO: make sure DG is not in the middle of something and it is in standby initHeatDisinfectMode(); requestNewOperationMode( DG_MODE_HEAT ); + + return TRUE; // For now. Check whether it is the right request before switching } /*********************************************************************//** @@ -231,8 +282,11 @@ DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_EVACUATE_DIALYSATE_FILL_WITH_WATER; stopActuators(); + drainPumpTargetRPM = DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM; heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; + heatDisinfectElapsedTime = getMSTimerCount(); + return state; } @@ -281,6 +335,7 @@ if ( fabs(TPi - TDi) <= MAX_TPO_AND_TDI_SENSORS_DIFFERENCE ) { + // Set the states to disinfect recirculation path setValveState ( VPI, VALVE_STATE_OPEN ); setValveState ( VBF, VALVE_STATE_OPEN ); setValveState ( VSP, VALVE_STATE_CLOSED ); @@ -303,18 +358,13 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; - if ( hasHeatDisinfectTimeElapsed() ) - { - state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; - } // If the temperature is out of tolerance, go back to heat water - else if ( ! isTemperatureInRange() ) + if ( ! isTemperatureInRange() ) { state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; } - else if ( didTimeout( stateTimer, HEAT_DISINFECT_RECIRC_PATH_TIME_MS ) ) + else if ( didTimeout( stateTimer, getRecirculationDuration() ) ) { - heatDisinfectElapsedTime = heatDisinfectElapsedTime + HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS; //TODO Test // Set the state for reservoir 1 to reservoir 2 setValveState ( VPI, VALVE_STATE_OPEN ); setValveState ( VBF, VALVE_STATE_OPEN ); @@ -342,18 +392,13 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_1_TO_2; - if ( hasHeatDisinfectTimeElapsed() ) - { - state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; - } // If the temperature is out of tolerance, go back to heat water - else if ( ! isTemperatureInRange() ) + if ( ! isTemperatureInRange() ) { state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; } - else if ( didTimeout( stateTimer, HEAT_DISINFECT_R1_TO_R2_TIME_MS ) ) + else if ( didTimeout( stateTimer, getRSVR1ToRSVR2Duration() ) ) { - heatDisinfectElapsedTime = heatDisinfectElapsedTime + HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS; //TODO Test // Set the state for reservoir 1 to reservoir 2 setValveState ( VPI, VALVE_STATE_OPEN ); setValveState ( VBF, VALVE_STATE_OPEN ); @@ -376,22 +421,18 @@ return state; } + static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectReservoir2To1( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_RESERVOIR_2_TO_1; - if ( hasHeatDisinfectTimeElapsed() ) - { - state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; - } // If the temperature is out of tolerance, go back to heat water - else if ( ! isTemperatureInRange() ) + if ( ! isTemperatureInRange() ) { state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; } - else if ( didTimeout( stateTimer, HEAT_DISINFECT_R2_TO_R1_TIME_MS ) ) + else if ( didTimeout( stateTimer, getRSVR2ToRSVR1Duration() ) ) { - heatDisinfectElapsedTime = heatDisinfectElapsedTime + HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS; //TODO Test // Set the state for reservoir 1 to reservoir 2 setValveState ( VPI, VALVE_STATE_OPEN ); setValveState ( VBF, VALVE_STATE_OPEN ); @@ -408,30 +449,62 @@ setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); - stateTimer = getMSTimerCount(); - - if ( heatDisinfectElapsedTime > HEAT_DISINFECT_OVERALL_TIME_MS ) + if ( ++heatDisinfectCurrentCycle > getNoOfCyclesToRun() ) { + drainPumpTargetRPM = DRAIN_PUMP_DISINFECT_DRAIN_PATH_TARGET_RPM; + heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; } else { + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRC, VALVE_STATE_RECIRC_C_TO_NC ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NO ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; } } return state; } + static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH; + execHeatDisinfectInternalStates(); //TODO test to see if it is needed to be in an if statement + + if ( heatDisinfectInternalState == INTERNAL_HEAT_DISINFECT_STATE_COMPLETE ) + { + drainPumpTargetRPM = DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM; + heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; + state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS; + } + return state; } + static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterDeprimeReservoirs( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS; + execHeatDisinfectInternalStates(); //TODO test to see if it is needed to be in an if statement + + // Done with heat disinfect + if ( heatDisinfectInternalState == INTERNAL_HEAT_DISINFECT_STATE_COMPLETE ) + { + state = DG_HEAT_DISINFECT_STATE_COMPLETE; + } + return state; } @@ -504,7 +577,27 @@ state = INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER; } + else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH ) + { + // Set the actuators for draining the path + signalROPumpHardStop(); + signalDrainPumpHardStop(); + setValveState ( VPI, VALVE_STATE_OPEN ); + setValveState ( VBF, VALVE_STATE_OPEN ); + setValveState ( VSP, VALVE_STATE_CLOSED ); + setValveState ( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState ( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState ( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState ( VRO, VALVE_STATE_R2_C_TO_NC ); + setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); + setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); + setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); + setDrainPumpTargetSpeed( drainPumpTargetRPM ); + state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_1; + } + return state; } @@ -566,7 +659,7 @@ setValveState ( VRD, VALVE_STATE_R1_C_TO_NC ); setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); - setDrainPumpTargetSpeed ( DRAIN_PUMP_TARGET_RPM ); + setDrainPumpTargetSpeed ( drainPumpTargetRPM ); state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_1; } @@ -594,7 +687,7 @@ setValveState ( VRD, VALVE_STATE_R1_C_TO_NO ); setValveState ( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); - //setDrainPumpTargetSpeed ( DRAIN_PUMP_TARGET_RPM ); probably it is not needed TODO test this + //setDrainPumpTargetSpeed ( drainPumpTargetRPM ); probably it is not needed TODO test this state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RESERVOIR_2; } @@ -615,7 +708,8 @@ setActuatorsToFillWater(); state = INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER; } - else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) + else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS || + heatDisinfectState == DG_HEAT_DISINFECT_STATE_DISINFECT_DRAIN_PATH ) { state = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; } @@ -665,18 +759,6 @@ return result; } -static BOOL hasHeatDisinfectTimeElapsed( void ) -{ - BOOL result = FALSE; - - if ( heatDisinfectElapsedTime > HEAT_DISINFECT_OVERALL_TIME_MS ) - { - result = TRUE; - } - - return result; -} - static void setActuatorsToFillWater( void ) { setValveState ( VPI, VALVE_STATE_OPEN ); @@ -693,4 +775,219 @@ setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); } +static U32 getPublishHeatDisinfectDataInterval() +{ + U32 result = heatDisinfectDataPublishInterval.data; + + if ( OVERRIDE_KEY == heatDisinfectDataPublishInterval.override ) + { + result = heatDisinfectDataPublishInterval.ovData; + } + + return result; +} + +static void publishHeatDisinfectData ( void ) +{ + if ( ++heatDisinfectPublishCounter >= getPublishHeatDisinfectDataInterval() ) + { + F32 elapsedtime = calcTimeSince( heatDisinfectElapsedTime ) / MINUTES_TO_MS_CONVERSION; + broadcastHeatDisinfectData( (U32)heatDisinfectInternalState, elapsedtime, heatDisinfectCurrentCycle ); + heatDisinfectPublishCounter = 0; + } +} + +BOOL testSetHeatDisinfectDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + + result = TRUE; + heatDisinfectDataPublishInterval.ovData = intvl; + heatDisinfectDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +BOOL testResetHeatDisinfectDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectDataPublishInterval.override = OVERRIDE_RESET; + heatDisinfectDataPublishInterval.ovData = heatDisinfectDataPublishInterval.ovInitData; + } + + return result; +} + +BOOL testSetHeatDisinfectRecircDurationOverride( F32 recircMins ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + heatDisinfectRecircDuration.ovInitData = heatDisinfectRecircDuration.data; + heatDisinfectRecircDuration.ovData = recircMins * MINUTES_TO_MS_CONVERSION; + heatDisinfectRecircDuration.override = OVERRIDE_KEY; + } + + return result; +} + +BOOL testResetHeatDisinfectRecircDurationOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectRecircDuration.ovData = heatDisinfectRecircDuration.ovInitData; + heatDisinfectRecircDuration.override = OVERRIDE_RESET; + } + + return result; +} + +BOOL testSetHeatDisinfectR1ToR2DurationOverride( F32 R1ToR2Mins ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectR1ToR2Duration.ovInitData = heatDisinfectR1ToR2Duration.data; + heatDisinfectR1ToR2Duration.ovData = R1ToR2Mins * MINUTES_TO_MS_CONVERSION; + heatDisinfectR1ToR2Duration.override = OVERRIDE_KEY; + } + + return result; +} + +BOOL testResetHeatDisinfectR1ToR2DurationOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectR1ToR2Duration.ovData = heatDisinfectR1ToR2Duration.ovInitData; + heatDisinfectR1ToR2Duration.override = OVERRIDE_RESET; + } + + return result; +} + +BOOL testSetHeatDisinfectionR2ToR1DurationOverride( F32 R2ToR1Mins ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectR2ToR1Duration.ovInitData = heatDisinfectR2ToR1Duration.data; + heatDisinfectR2ToR1Duration.ovData = R2ToR1Mins * MINUTES_TO_MS_CONVERSION; + heatDisinfectR2ToR1Duration.override = OVERRIDE_KEY; + } + + return result; +} + +BOOL testResetHeatDisinfectionR2ToR1DurationOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectR2ToR1Duration.ovData = heatDisinfectR2ToR1Duration.ovInitData; + heatDisinfectR2ToR1Duration.override = OVERRIDE_RESET; + } + + return result; +} + +BOOL testSetHeatDisinfectNoOfCyclesOverride( U32 cycles ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectNoOfCyclesToRun.ovInitData = heatDisinfectNoOfCyclesToRun.data; + heatDisinfectNoOfCyclesToRun.ovData = cycles; + heatDisinfectNoOfCyclesToRun.override = OVERRIDE_KEY; + } + + return result; +} + +BOOL testResetHeatDisinfectNoOfCyclesOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + heatDisinfectNoOfCyclesToRun.ovData = heatDisinfectNoOfCyclesToRun.ovInitData; + heatDisinfectNoOfCyclesToRun.override = OVERRIDE_RESET; + } + + return result; +} + +static F32 getRecirculationDuration() +{ + F32 result = heatDisinfectRecircDuration.data; + + if ( OVERRIDE_KEY == heatDisinfectRecircDuration.override ) + { + result = heatDisinfectRecircDuration.ovData; + } + + return result; +} + +static F32 getRSVR1ToRSVR2Duration() +{ + F32 result = heatDisinfectR1ToR2Duration.data; + + if ( OVERRIDE_KEY == heatDisinfectR1ToR2Duration.override ) + { + result = heatDisinfectR1ToR2Duration.ovData; + } + + return result; +} + +static F32 getRSVR2ToRSVR1Duration() +{ + F32 result = heatDisinfectR2ToR1Duration.data; + + if ( OVERRIDE_KEY == heatDisinfectR2ToR1Duration.override ) + { + result = heatDisinfectR2ToR1Duration.ovData; + } + + return result; +} + +static U32 getNoOfCyclesToRun() +{ + U32 result = heatDisinfectNoOfCyclesToRun.data; + + if ( OVERRIDE_KEY == heatDisinfectNoOfCyclesToRun.override ) + { + result = heatDisinfectNoOfCyclesToRun.ovData; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -rbe5079c95b05c303878763b458dc0854a600317e -r44cc25461e4936f7928904640c87a03ef7cf3c16 --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision be5079c95b05c303878763b458dc0854a600317e) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 44cc25461e4936f7928904640c87a03ef7cf3c16) @@ -40,9 +40,24 @@ DG_HEAT_DISINFECT_STATE_T getCurrentHeatDisinfectState( void ); // get the current state of the heat disinfect mode. -void startDGHeatDisinfect( void ); +BOOL startDGHeatDisinfect( void ); void stopDGHeatDisinfect( void ); +BOOL testSetHeatDisinfectDataPublishIntervalOverride( U32 value ); +BOOL testResetHeatDisinfectDataPublishIntervalOverride( void ); + +BOOL testSetHeatDisinfectRecircDurationOverride( F32 recircMins ); +BOOL testResetHeatDisinfectRecircDurationOverride( void ); + +BOOL testSetHeatDisinfectR1ToR2DurationOverride( F32 R1ToR2Mins ); +BOOL testResetHeatDisinfectR1ToR2DurationOverride( void ); + +BOOL testSetHeatDisinfectionR2ToR1DurationOverride( F32 R2ToR1Mins ); +BOOL testResetHeatDisinfectionR2ToR1DurationOverride( void ); + +BOOL testSetHeatDisinfectNoOfCyclesOverride( U32 cycles ); +BOOL testResetHeatDisinfectNoOfCyclesOverride( void ); + /**@}*/ #endif Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r1d235091e158221f1fa8b1579140905a13249a54 -r44cc25461e4936f7928904640c87a03ef7cf3c16 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 1d235091e158221f1fa8b1579140905a13249a54) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 44cc25461e4936f7928904640c87a03ef7cf3c16) @@ -1116,6 +1116,22 @@ handleSetDrainPumpDeltaPressureOverrideRequest ( message ); break; + case MSG_ID_HEAT_DISINFECT_RECIRC_PATH_DURATION_MINS: + handleSetHeatDisinfectRecircStateDurationOverrideRequest ( message ); + break; + + case MSG_ID_HEAT_DISINFECT_RSRVR1_TO_RSRVR2_DURATION_MINS: + handleSetHeatDisinfectRSVR1ToRSVR2StateDurationOverrideRequest ( message ); + break; + + case MSG_ID_HEAT_DISINFECT_RSRVR2_TO_RSRVR1_DURATION_MINS: + handleSetHeatDisinfectRSVR2ToRSVR1StateDurationOverrideRequest ( message ); + break; + + case MSG_ID_HEAT_DISINFECT_NO_OF_CYCLES_TO_RUN: + handleSetHeatDisinfectNoOfCyclesStateDurationOverrideRequest ( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r16a65b53941177fb79af9a262740da5f992f4776 -r44cc25461e4936f7928904640c87a03ef7cf3c16 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 16a65b53941177fb79af9a262740da5f992f4776) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 44cc25461e4936f7928904640c87a03ef7cf3c16) @@ -127,7 +127,14 @@ U32 mainPrimayHeaterDC; U32 smallPrimaryHeaterDC; U32 trimmerHeaterDC; -} HEATERS_DATA_T; +} HEATERS_DATA_T; + +typedef struct +{ + U32 internalState; + F32 elapsedTimeMins; + U32 currentCycle; +} DG_HEAT_DISINFECT_DATA_T; #pragma pack(pop) @@ -666,7 +673,7 @@ * The broadcastTemperatureSensorsData function sends out DG temperature * sensors data * Inputs : heaters data - * Outputs : temperatur sensors data msg constructed and queued + * Outputs : temperature sensors data msg constructed and queued * @param sensorsValue : sensors value array * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ @@ -687,6 +694,41 @@ result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); return result; +} + +/************************************************************************* + * @brief + * The broadcastHeatDisinfectData function sends out DG heat disinfection + * data + * Inputs : DG heat disinfect data + * Outputs : DG heat disinfect data msg constructed and queued + * @param internalState : The state of the internal state machine of the mode + * @param minutesElapsed: Minutes elapsed since the start of heat disinfection + * @param currentCycle: Current cycle count of DG heat disinfection + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastHeatDisinfectData( U32 internalState, F32 minutesElapsed, U32 currentCycle ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + DG_HEAT_DISINFECT_DATA_T payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_HEAT_DISINFECT_DATA; + msg.hdr.payloadLen = sizeof( DG_HEAT_DISINFECT_DATA_T ); + + payload.internalState = internalState; + payload.elapsedTimeMins = minutesElapsed; + payload.currentCycle = currentCycle; + + memcpy( payloadPtr, &payload, sizeof( DG_HEAT_DISINFECT_DATA_T ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; } // *********************************************************************** @@ -1287,7 +1329,8 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestPressureDataBroadcastIntervalOverrideRequest, testSetPressuresDataPublishIntervalOverride, testResetPressuresDataPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestPressureDataBroadcastIntervalOverrideRequest, \ + testSetPressuresDataPublishIntervalOverride, testResetPressuresDataPublishIntervalOverride ) /************************************************************************* * @brief @@ -1299,7 +1342,8 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( F32, handleTestROPumpSetPointOverrideRequest, testSetTargetROPumpFlowRateOverride, testResetTargetROPumpFlowRateOverride ) +DATA_OVERRIDE_HANDLER_FUNC_F32( F32, handleTestROPumpSetPointOverrideRequest, \ + testSetTargetROPumpFlowRateOverride, testResetTargetROPumpFlowRateOverride ) /************************************************************************* * @brief @@ -1323,7 +1367,8 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpDataBroadcastIntervalOverrideRequest, testSetROPumpDataPublishIntervalOverride, testResetROPumpDataPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpDataBroadcastIntervalOverrideRequest, \ + testSetROPumpDataPublishIntervalOverride, testResetROPumpDataPublishIntervalOverride ) /************************************************************************* * @brief @@ -1335,7 +1380,8 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDrainPumpSetPointOverrideRequest, testSetTargetDrainPumpSpeedOverride, testResetTargetDrainPumpSpeedOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDrainPumpSetPointOverrideRequest, \ + testSetTargetDrainPumpSpeedOverride, testResetTargetDrainPumpSpeedOverride ) /************************************************************************* * @brief @@ -1347,7 +1393,8 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDrainPumpDataBroadcastIntervalOverrideRequest, testSetDrainPumpDataPublishIntervalOverride, testResetDrainPumpDataPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDrainPumpDataBroadcastIntervalOverrideRequest, \ + testSetDrainPumpDataPublishIntervalOverride, testResetDrainPumpDataPublishIntervalOverride ) /************************************************************************* * @brief @@ -1371,7 +1418,8 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestValvesStatesPublishIntervalOverrideRequest, testSetValvesStatesPublishIntervalOverride, testResetValvesStatesPublishIntervalOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestValvesStatesPublishIntervalOverrideRequest, \ + testSetValvesStatesPublishIntervalOverride, testResetValvesStatesPublishIntervalOverride ) /************************************************************************* * @brief @@ -1383,7 +1431,8 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDGSafetyShutdownOverrideRequest, testSetSafetyShutdownOverride, testResetSafetyShutdownOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDGSafetyShutdownOverrideRequest, \ + testSetSafetyShutdownOverride, testResetSafetyShutdownOverride ) /************************************************************************* * @brief @@ -1395,4 +1444,76 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleSetDrainPumpDeltaPressureOverrideRequest, testSetTargetDrainPumpDeltaPressureOverride, testResetTargetDrainPumpDeltaPressureOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleSetDrainPumpDeltaPressureOverrideRequest, \ + testSetTargetDrainPumpDeltaPressureOverride, testResetTargetDrainPumpDeltaPressureOverride ) + +/************************************************************************* + * @brief + * The handleSetHeatDisinfectRecircStateDurationOverrideRequest function handles a \n + * request to override the heat disinfection recirculation state duration in minutes + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( F32, handleSetHeatDisinfectRecircStateDurationOverrideRequest, \ + testSetHeatDisinfectRecircDurationOverride, testResetHeatDisinfectRecircDurationOverride ) + +/************************************************************************* + * @brief + * The handleSetHeatDisinfectRSVR1ToRSVR2StateDurationOverrideRequest \n + * function handles a request to override the heat disinfection reservoir 1 \n + * to reservoir 2 state duration in minutes + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( F32, handleSetHeatDisinfectRSVR1ToRSVR2StateDurationOverrideRequest, \ + testSetHeatDisinfectR1ToR2DurationOverride, testResetHeatDisinfectR1ToR2DurationOverride ) + +/************************************************************************* + * @brief + * The handleSetHeatDisinfectRSVR2ToRSVR1StateDurationOverrideRequest \n + * function handles a request to override the heat disinfection reservoir 2 \n + * to reservoir 1 state duration in minutes + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( F32, handleSetHeatDisinfectRSVR2ToRSVR1StateDurationOverrideRequest, \ + testSetHeatDisinfectionR2ToR1DurationOverride, testResetHeatDisinfectionR2ToR1DurationOverride ) + +/************************************************************************* + * @brief + * The handleSetHeatDisinfectNoOfCyclesStateDurationOverrideRequest \n + * function handles a request to override the heat disinfection no of \n + * cycles to run request + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleSetHeatDisinfectNoOfCyclesStateDurationOverrideRequest, \ + testSetHeatDisinfectNoOfCyclesOverride, testResetHeatDisinfectNoOfCyclesOverride ) + + +/************************************************************************* + * @brief + * The handleSetHeatDisinfectionPublishDataIntervalOverrideRequest \n + * function handles a request to override the heat disinfection data \n + * publish interval + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleSetHeatDisinfectionPublishDataIntervalOverrideRequest, \ + testSetHeatDisinfectDataPublishIntervalOverride, testResetHeatDisinfectDataPublishIntervalOverride ) + Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r16a65b53941177fb79af9a262740da5f992f4776 -r44cc25461e4936f7928904640c87a03ef7cf3c16 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 16a65b53941177fb79af9a262740da5f992f4776) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 44cc25461e4936f7928904640c87a03ef7cf3c16) @@ -89,7 +89,10 @@ BOOL broadcastHeatersData ( U32 mainPrimaryDC, U32 smallPrimaryDC, U32 trimmerDC ); // MSG_ID_TEMPERATURE_SENSORS_READINGS -BOOL broadcastTemperatureSensorsData ( U08 *sensorsValue, U32 byteLength ); +BOOL broadcastTemperatureSensorsData ( U08 *sensorsValue, U32 byteLength ); + +//MSG_ID_DG_HEAT_DISINFECT_DATA +BOOL broadcastHeatDisinfectData( U32 internalState, F32 minutesElapsed, U32 currentCycle ); // *********** public test support message functions ********** @@ -169,6 +172,21 @@ BOOL handleSetROPumpPWM( MESSAGE_T * message ); // MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE -void handleSetDrainPumpDeltaPressureOverrideRequest( MESSAGE_T *message ); +void handleSetDrainPumpDeltaPressureOverrideRequest( MESSAGE_T *message ); + +// MSG_ID_HEAT_DISINFECT_RECIRC_PATH_DURATION_MINS +void handleSetHeatDisinfectRecircStateDurationOverrideRequest( MESSAGE_T *message ); + +//MSG_ID_HEAT_DISINFECT_RSRVR1_TO_RSRVR2_DURATION_MINS +void handleSetHeatDisinfectRSVR1ToRSVR2StateDurationOverrideRequest( MESSAGE_T *message ); + +//MSG_ID_HEAT_DISINFECT_RSRVR2_TO_RSRVR1_DURATION_MINS +void handleSetHeatDisinfectRSVR2ToRSVR1StateDurationOverrideRequest( MESSAGE_T *message ); + +//MSG_ID_HEAT_DISINFECT_NO_OF_CYCLES_TO_RUN +void handleSetHeatDisinfectNoOfCyclesStateDurationOverrideRequest( MESSAGE_T *message ); + +//MSG_ID_HEAT_DISINFECT_PUBLISH_INTERVAL_OVERRIDE +void handleSetHeatDisinfectionPublishDataIntervalOverrideRequest( MESSAGE_T *message ); #endif