Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r4fdc3246f14c8b3b04724d39803530f60b6caac8 -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 4fdc3246f14c8b3b04724d39803530f60b6caac8) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -24,15 +24,10 @@ #include "ROPump.h" #include "PIControllers.h" #include "SystemCommMessages.h" -#include "TaskGeneral.h" +#include "TaskPriority.h" #include "TemperatureSensors.h" #include "Timers.h" -#ifdef ENABLE_DIP_SWITCHES -#include "mibspi.h" -#include "FPGA.h" -#endif - /** * @addtogroup Heaters * @{ @@ -54,7 +49,7 @@ #define CONTROLLER_CHECK_INTERVAL_COUNT 10U ///< Time interval count to check the PI controller. #define TEMP_SENSORS_INTERVAL_COUNT 10U ///< Temperature sensors interval count. -#define HEATERS_DATA_PUBLISH_INTERVAL (500 / TASK_GENERAL_INTERVAL ) ///< Heaters data publish interval. +#define HEATERS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / ( 2 * TASK_PRIORITY_INTERVAL ) ) ///< Heaters data publish interval. #define SMALL_PRIMARY_AND_TRIMMER_HEATERS_POST_TARGET_TEMPERATURE 40U ///< Small primary and trimmer heaters target temperature during POST. #define MAIN_PRIMARY_HEATER_POST_TARGET_TEMPERATURE 35U ///< Main primary heater target temperature during POST. @@ -64,6 +59,8 @@ #define MINIMUM_TARGET_TEMPERATURE 10U ///< Minimum allowed target temperature for the heaters. #define MAXIMUM_TARGET_TEMPERATURE 90U ///< Maximum allowed target temperature for the heaters. +#define HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ( ( 3 * MS_PER_SECOND ) / TASK_PRIORITY_INTERVAL ) ///< Heaters are on but there is no sufficient flow timeout in counts. + /// Heaters self-test enums typedef enum heaters_self_test_states { @@ -122,6 +119,7 @@ static U32 selfTestElapsedTime; ///< Self-test elapsed time variable. static BOOL hasStartPrimaryHeaterRequested; ///< Start primary heater request flag. static BOOL hasStartTrimmerHeaterRequested; ///< Start trimmer heater request flag. +static U32 heatersOnWithNoFlowTimeOut; ///< Heaters are on but there is no sufficient flow. // ********** private function prototypes ********** @@ -140,13 +138,8 @@ static void setTrimmerHeaterPWM( F32 pwm ); static void resetHeaterState( NAME_OF_HEATER_T heater ); static void publishHeatersData( void ); -static U32 getPublishHeatersDataInterval( void ); +static U32 getPublishHeatersDataInterval( void ); -// TODO: Remove the below code. FOR TESTING ONLY -#define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) -#define TOGGLEPRIMAYHEATER() ( ( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0 ) -//TODO: Remove the above code. FOR TESTING ONLY - /*********************************************************************//** * @brief * The initHeaters function initializes the variables and the PI controllers @@ -284,23 +277,33 @@ /*********************************************************************//** * @brief - * The execHeatersMonitor function turns off the heaters when RO pump is not on. - * @details Inputs: none - * @details Outputs: Turns off the heaters when RO pump is not on + * The execHeatersMonitor function turns off the heaters when RO pump is + * not on. + * @details Inputs: none TODO update the doxygen header function + * @details Outputs: none * @return none *************************************************************************/ void execHeatersMonitor( void ) { - // If the RO pump is not on, turn off the heaters - if ( ! isReverseOsmosisPumpOn() ) + if ( isPrimaryHeaterOn || isTrimmerHeaterOn ) { -#ifndef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD - stopPrimaryHeater(); // TODO - this is so immediate - if other module requests RO pump on and start heater, this monitor may stop the heater request before RO pump has a chance to start - stopTrimmerHeater(); -#endif -#endif + // If the RO pump is not on, turn off the heaters + if ( isReverseOsmosisPumpOn() && getMeasuredROFlowRate() < MIN_RO_FLOWRATE_LPM ) + { + if ( ++heatersOnWithNoFlowTimeOut > HEATERS_ON_WITH_NO_FLOW_TIMEOUT_COUNT ) + { + stopPrimaryHeater(); // TODO - this is so immediate - if other module requests RO pump on and start heater, this monitor may stop the heater request before RO pump has a chance to start + stopTrimmerHeater(); + + heatersOnWithNoFlowTimeOut = 0; + } + } } + + //TODO add code to remember the former state of the heaters and if they were on, turn them on again + + // Check for data publication + publishHeatersData(); } /*********************************************************************//** @@ -505,26 +508,6 @@ { PRIMARY_HEATERS_EXEC_STATES_T state = PRIMARY_HEATERS_EXEC_STATE_OFF; - // TODO for testing only. remove -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD - if ( TOGGLEPRIMAYHEATER() ) - { - setPrimaryHeaterTargetTemperature( 37 ); - startPrimaryHeater(); - F32 pumpPWM = 1; - etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - F32 fanPWM = 0.25; - etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - hasStartPrimaryHeaterRequested = TRUE; - } -#endif -#endif -#endif - // TODO remove this code for testing - if ( hasStartPrimaryHeaterRequested ) { resetHeaterState( PRIMARY_HEATER ); @@ -534,8 +517,6 @@ state = PRIMARY_HEATERS_EXEC_STATE_CONTROL_TO_TARGET; } - publishHeatersData(); - return state; } @@ -577,26 +558,6 @@ primaryHeaterTimerCounter = 0; } - publishHeatersData(); - - // TODO remove this code -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD - if ( !TOGGLEPRIMAYHEATER() ) - { - stopPrimaryHeater(); - F32 pumpPWM = 0; - etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - F32 fanPWM = 0; - etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - } -#endif -#endif -#endif - // TODO Remove this code - if ( ! isPrimaryHeaterOn ) { state = PRIMARY_HEATERS_EXEC_STATE_OFF; @@ -617,29 +578,6 @@ { TRIMMER_HEATER_EXEC_STATES_T state = TRIMMER_HEATER_EXEC_STATE_OFF; - // TODO for testing only. remove -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD -// if ( TOGGLEPRIMAYHEATER() ) -// { - //setTrimmerHeaterTargetTemperature( 38 ); - //startTrimmerHeater(); - //F32 pumpPWM = 1; - //etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStartROPump(); - //temporaryStartFan(); - //F32 fanPWM = 0.25; - //etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStartROPump(); - //temporaryStartFan(); -// } -#endif -#endif -#endif - // TODO remove this code for testing - if ( hasStartTrimmerHeaterRequested ) { resetHeaterState( TRIMMER_HEATER ); @@ -649,8 +587,6 @@ state = TRIMMER_HEATER_EXEC_STATE_CONTROL_TO_TARGET; } - publishHeatersData(); - return state; } @@ -674,30 +610,6 @@ trimmerHeaterTimerCounter = 0; } - publishHeatersData(); - - // TODO remove this code -#ifdef DEBUG_ENABLED -#ifdef ENABLE_DIP_SWITCHES -#ifndef EMC_TEST_BUILD -// if ( !TOGGLEPRIMAYHEATER() ) -// { - //stopTrimmerHeater(); - //F32 pumpPWM = 0; - //etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( pumpPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStartROPump(); - //temporaryStartFan(); - //F32 fanPWM = 0; - //etpwmSetCmpA( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //etpwmSetCmpB( etpwmREG6, (U32)( (S32)( ( fanPWM * (F32)(etpwmREG6->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); - //temporaryStopROPump(); - //temporaryStopFan(); -// } -#endif -#endif -#endif - // TODO Remove this code - if ( ! isTrimmerHeaterOn ) { state = TRIMMER_HEATER_EXEC_STATE_OFF; @@ -788,23 +700,28 @@ /*********************************************************************//** * @brief - * The publishTemperatureData function publishes the temperature sensors - * data into the USB debug port at the defined time interval. + * The publishTemperatureData function publishes the heaters data into + * at the defined time interval. * @details Inputs: dataPublicationTimerCounter - * @details Outputs: Broadcast temperature sensors' data + * @details Outputs: dataPublicationTimerCounter * @return none *************************************************************************/ static void publishHeatersData( void ) { if ( ++dataPublicationTimerCounter >= getPublishHeatersDataInterval() ) { - broadcastHeatersData( (U32)(mainPrimaryHeaterDutyCycle*100), (U32)(smallPrimaryHeaterDutyCycle*100), (U32)(trimmerHeaterDutyCycle*100) ); + HEATERS_DATA_T data; + data.mainPrimaryDutyCyclePct = mainPrimaryHeaterDutyCycle * 100; + data.smallPrimaryDutyCyclePct = smallPrimaryHeaterDutyCycle * 100; + data.trimmerDutyCyclePct = trimmerHeaterDutyCycle * 100; + + broadcastHeatersData( &data ); + dataPublicationTimerCounter = 0; } } - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -824,7 +741,7 @@ if ( isTestingActivated() ) { - U32 interval = value / TASK_GENERAL_INTERVAL; + U32 interval = value / TASK_PRIORITY_INTERVAL; result = TRUE; heatersDataPublishInterval.ovData = interval; Index: firmware/App/Controllers/Heaters.h =================================================================== diff -u -r54f45c387430e440ab4607451fc84dea61f273f1 -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision 54f45c387430e440ab4607451fc84dea61f273f1) +++ firmware/App/Controllers/Heaters.h (.../Heaters.h) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -23,11 +23,27 @@ /** * @defgroup Heaters Heaters * @brief Heaters driver modules. Controls the primary and trimmer heaters. + * The primary heaters are manufactured by Heatron, PN: UEL14EXK2A-Rev D with + * operating temperature in between 5C and 95C. + * The trimmer heater is manufactured by Heatron, PN: UEL5EXK1A-Rev D with + * operating temperature in between 5C and 95C. * * @addtogroup Heaters * @{ */ +// ********** public definitions ********** + +/// Heaters data publish struct +typedef struct +{ + F32 mainPrimaryDutyCyclePct; ///< Main primary heater duty cycle in percent. + F32 smallPrimaryDutyCyclePct; ///< Small primary heater duty cycle in percent. + F32 trimmerDutyCyclePct; ///< Trimmer heater duty cycle in percent. +} HEATERS_DATA_T; + +// ********** public function prototypes ********** + void initHeaters( void ); void setPrimaryHeaterTargetTemperature( F32 targetTemp ); Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r5fc16235c1752c993b3f1285f3a2b9738372af7a -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 5fc16235c1752c993b3f1285f3a2b9738372af7a) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -168,10 +168,10 @@ MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE ); // Initialize the persistent alarm for flow out of upper and lower range - initPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_UPPER_RANGE, ALARM_ID_FLOW_RATE_OUT_OF_RANGE, TRUE, + initPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_UPPER_RANGE, ALARM_ID_FLOW_RATE_OUT_OF_UPPER_RANGE, TRUE, FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL, FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL ); - initPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_LOWER_RANGE, ALARM_ID_FLOW_RATE_OUT_OF_RANGE, TRUE, + initPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_LOWER_RANGE, ALARM_ID_FLOW_RATE_OUT_OF_LOWER_RANGE, TRUE, FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL, FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL ); // Initialize the persistent alarm for max allowed pressure out of range Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r76105aa3acd8870d705ed4af84954b697477d6ef -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 76105aa3acd8870d705ed4af84954b697477d6ef) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -23,6 +23,8 @@ #include "OperationModes.h" #include "Pressures.h" #include "ROPump.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" #include "TemperatureSensors.h" #include "Timers.h" #include "UVReactors.h" @@ -37,6 +39,8 @@ // General defines #define MAX_ALLOWED_STATE_TRIALS 1 ///< Max allowed trials on a state. This is general among all the states. +#define HEAT_DISINFECT_DATA_PUB_INTERVAL ( MS_PER_SECOND / \ + TASK_GENERAL_INTERVAL ) ///< Mode Heat Disinfect data publish interval in counts. // Start state defines #define MIN_INLET_PRESSURE_PSI 30.0 ///< Minimum water inlet pressure in psi. @@ -117,6 +121,7 @@ static U32 rsrvrsVolMonitorTimer = 0; ///< Reservoir 1 & 2 volume monitor timers during heat disinfect. static BOOL areRsrvrsLeaking = FALSE; ///< Reservoir 1 & 2 leak check flag during heat disinfect. static BOOL hasPostHeatDisinfectWaitStarted = FALSE; ///< Final delay at the end of heat disinfect and before flush flag. +static U32 dataPublishCounter = 0; ///< Heat Disinfect data publish counter. // ********** private function prototypes ********** @@ -144,27 +149,32 @@ static BOOL isRsrvrFull( RSRVRS_T r, F32 targetVol, U32 timeout, DG_HEAT_DISINFECT_STATE_T state ); static BOOL isRsrvrEmpty( RSRVRS_T r, U32 timeout, DG_HEAT_DISINFECT_STATE_T failedState ); static BOOL isStateHeatDisinfectComplete( DG_HEAT_DISINFECT_STATE_T state ); +static void publishHeatDisinfectData( void ); /*********************************************************************//** * @brief - * The initHeatDisinfectMode function initializes the heat disinfect mode module. - * @details Inputs: none TODO update as we go - * @details Outputs: Initialized heat disinfect mode module + * The initHeatDisinfectMode function initializes the heat disinfect mode + * module. + * @details Inputs: none + * @details Outputs: heatDisinfectState, stateTimer, isThisLastDrain, + * stateTrialCounter, areTempSensorsInRange, isR1Full, isR2Full, + * R1HeatDisinfectVol, R2HeatDisinfectVol, hasPostHeatDisinfectWaitStarted, + * overallHeatDisinfectTimer TODO fill up as we go * @return none *************************************************************************/ void initHeatDisinfectMode( void ) { - heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; - - stateTimer = 0; - isThisLastDrain = FALSE; - stateTrialCounter = 0; - areTempSensorsInRange = FALSE; - isR1Full = FALSE; - isR2Full = FALSE; - R1HeatDisinfectVol = 0; - R2HeatDisinfectVol = 0; + heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; + stateTimer = 0; + isThisLastDrain = FALSE; + stateTrialCounter = 0; + areTempSensorsInRange = FALSE; + isR1Full = FALSE; + isR2Full = FALSE; + R1HeatDisinfectVol = 0; + R2HeatDisinfectVol = 0; hasPostHeatDisinfectWaitStarted = FALSE; + overallHeatDisinfectTimer = getMSTimerCount(); } /*********************************************************************//** @@ -276,6 +286,8 @@ break; } + publishHeatDisinfectData(); + return heatDisinfectState; } @@ -1247,4 +1259,29 @@ return heatDisinfectStatus; } +/*********************************************************************//** + * @brief + * The publishHeatDisinfectData function publishes heat disinfect data at + * the set interval. + * @details Inputs: dataPublishCounter + * @details Outputs: dataPublishCounter + * @return: none + *************************************************************************/ +static void publishHeatDisinfectData( void ) +{ + if ( ++dataPublishCounter > HEAT_DISINFECT_DATA_PUB_INTERVAL ) + { + MODE_HEAT_DISINFECT_DATA_T data; + + data.heatDisinfectState = (U32)heatDisinfectState; + // Get the time elapsed so far and convert them to minutes + data.overallElapsedTime = calcTimeSince( overallHeatDisinfectTimer ) / ( 60 * MS_PER_SECOND ); + data.heatDisinfectElapsedTime = calcTimeSince( stateTimer ) / ( 60 * MS_PER_SECOND ); + + broadcastHeatDisinfectData( &data ); + + dataPublishCounter = 0; + } +} + /**@}*/ Index: firmware/App/Modes/ModeHeatDisinfect.h =================================================================== diff -u -r5fc16235c1752c993b3f1285f3a2b9738372af7a -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision 5fc16235c1752c993b3f1285f3a2b9738372af7a) +++ firmware/App/Modes/ModeHeatDisinfect.h (.../ModeHeatDisinfect.h) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -23,14 +23,22 @@ /** * @defgroup DGHeatDisinfectMode DGHeatDisinfectMode - * @brief Heat disinfection mode module. Manages the state machine for the heat disinfection mode. + * @brief Heat disinfection mode module. Manages the state machine for the heat disinfection mode. * * @addtogroup DGHeatDisinfectMode * @{ */ // ********** public definitions ********** +/// Heat Disinfect data publish struct +typedef struct +{ + U32 heatDisinfectState; ///< Heat disinfect State. + U32 overallElapsedTime; ///< Overall elapsed time in heat disinfect mode. + U32 heatDisinfectElapsedTime; ///< Elapsed time in just heat disinfecting. +} MODE_HEAT_DISINFECT_DATA_T; + // ********** public function prototypes ********** void initHeatDisinfectMode( void ); // initialize this module Index: firmware/App/Services/MessagePayloads.h =================================================================== diff -u -rf7292cd3376119210980f14e8bdb0ec5e0cf5df5 -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Services/MessagePayloads.h (.../MessagePayloads.h) (revision f7292cd3376119210980f14e8bdb0ec5e0cf5df5) +++ firmware/App/Services/MessagePayloads.h (.../MessagePayloads.h) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -91,14 +91,6 @@ F32 targetTrimmerHeaterTemp; ///< Trimmer heater set temperature target } TARGET_TEMPS_PAYLOAD_T; -/// Heaters data struct. -typedef struct -{ - U32 mainPrimayHeaterDC; ///< Main primary heater DC - U32 smallPrimaryHeaterDC; ///< Small primary heater DC - U32 trimmerHeaterDC; ///< Trimmer heater DC -} HEATERS_DATA_T; - #pragma pack(pop) /**@}*/ Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rd145aee7286405e19dfd703b0e29375b85c6c38a -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision d145aee7286405e19dfd703b0e29375b85c6c38a) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -420,31 +420,24 @@ /*********************************************************************//** * @brief * The broadcastHeatersData function sends out DG heaters data - * @details Inputs: heaters data - * @details Outputs: heatears data msg constructed and queued - * @param mainPrimaryDC main primary heater duty cycle - * @param smallPrimaryDC small primary heater duty cycle - * @param trimmerDC trimmer heater duty cycle + * @details Inputs: none + * @details Outputs: heaters data msg constructed and queued + * @param heatersData which is the heaters data structure pointer * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastHeatersData ( U32 mainPrimaryDC, U32 smallPrimaryDC, U32 trimmerDC ) +BOOL broadcastHeatersData ( HEATERS_DATA_T *heatersData ) { BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - HEATERS_DATA_T payload; - + // create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_DG_HEATERS_DATA; msg.hdr.payloadLen = sizeof( HEATERS_DATA_T ); - payload.mainPrimayHeaterDC = mainPrimaryDC; - payload.smallPrimaryHeaterDC = smallPrimaryDC; - payload.trimmerHeaterDC = trimmerDC; + memcpy( payloadPtr, heatersData, sizeof( HEATERS_DATA_T ) ); - memcpy( payloadPtr, &payload, sizeof( HEATERS_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 ); @@ -854,6 +847,34 @@ return result; } +/*********************************************************************//** + * @brief + * The broadcastHeatDisinfectData function sends out the heat disinfect + * mode data. + * @details Inputs: none + * @details Outputs: heat disinfect data msg constructed and queued + * @param heatDisinfectData which is heat disinfect msg constructed and queued + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastHeatDisinfectData( MODE_HEAT_DISINFECT_DATA_T *heatDisinfectData ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_HEAT_DISINFECT_DATA; + msg.hdr.payloadLen = sizeof( MODE_HEAT_DISINFECT_DATA_T ); + + memcpy( payloadPtr, heatDisinfectData, sizeof( MODE_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; +} + // *********************************************************************** // **************** Message Handling Helper Functions ******************** // *********************************************************************** Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rd145aee7286405e19dfd703b0e29375b85c6c38a -re0265b8fad80add7a5d54db11ecc72fd6b1665a8 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision d145aee7286405e19dfd703b0e29375b85c6c38a) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision e0265b8fad80add7a5d54db11ecc72fd6b1665a8) @@ -21,7 +21,8 @@ #include "DGCommon.h" #include "DrainPump.h" #include "Fans.h" - +#include "Heaters.h" +#include "ModeHeatDisinfect.h" #include "MsgQueues.h" #include "ROPump.h" #include "Thermistors.h" @@ -79,7 +80,7 @@ BOOL broadcastReservoirData( U32 resID, U32 fillToVol, U32 drainToVol ); // MSG_ID_HEATERS_READINGS -BOOL broadcastHeatersData ( U32 mainPrimaryDC, U32 smallPrimaryDC, U32 trimmerDC ); +BOOL broadcastHeatersData ( HEATERS_DATA_T *heatersData ); // MSG_ID_TEMPERATURE_SENSORS_READINGS BOOL broadcastTemperatureSensorsData ( U08 *sensorsValue, U32 byteLength ); @@ -126,6 +127,9 @@ // MSG_ID_DG_UV_REACTORS_DATA BOOL broadcastUVReactorsData( UV_REACTORS_DATA_T *uvReactorsData ); +// MSG_ID_DG_HEAT_DISINFECT_DATA +BOOL broadcastHeatDisinfectData( MODE_HEAT_DISINFECT_DATA_T *heatDisinfectData ); + // *********** public test support message functions ********** #ifdef DEBUG_ENABLED