Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -rce20c155091cd03f6ec01c0316a428b8b612492f -r860cbde5c5777360f2e7b3e7d1348863f62d4328 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision ce20c155091cd03f6ec01c0316a428b8b612492f) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 860cbde5c5777360f2e7b3e7d1348863f62d4328) @@ -34,6 +34,7 @@ #include "RTC.h" #include "SafetyShutdown.h" #include "SystemCommMessages.h" +#include "TaskGeneral.h" #include "TemperatureSensors.h" #include "Thermistors.h" #include "UVReactors.h" @@ -46,29 +47,37 @@ // ********** private data ********** -static DG_POST_STATE_T postState = DG_POST_STATE_START; ///< Currently active initialize & POST state. -static BOOL postCompleted = FALSE; ///< Flag indicating POST completed. -static BOOL postPassed = FALSE; ///< Flag indicating all POST tests passed. -static BOOL tempPOSTPassed = TRUE; ///< Temporary flag indicating all POST tests completed so far have passed. +#define START_POST_DELAY_COUNT ( ( 1 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Start POST delay in count. + +static DG_POST_STATE_T postState = DG_POST_STATE_START; ///< Currently active initialize & POST state. +static BOOL postCompleted = FALSE; ///< Flag indicating POST completed. +static BOOL postPassed = FALSE; ///< Flag indicating all POST tests passed. +static BOOL tempPOSTPassed = TRUE; ///< Temporary flag indicating all POST tests completed so far have passed. +static U32 startPOSTDelayCounter = 0; ///< Start POST delay counter. + // ********** private function prototypes ********** static DG_POST_STATE_T handlePOSTStatus( SELF_TEST_STATUS_T testStatus ); +static DG_POST_STATE_T handlePOSTStateStart( void ); static SELF_TEST_STATUS_T execFWCompatibilityTest( void ); /*********************************************************************//** * @brief - * The initInitAndPOSTMode function initializes the Initialization and POST mode module. + * The initInitAndPOSTMode function initializes the Initialization and POST + * mode module. * @details Inputs: none - * @details Outputs: Initialization and POST mode module initialized + * @details Outputs: postState, postCompleted, tempPOSTPassed, + * startPOSTDelayCounter * @return none *************************************************************************/ void initInitAndPOSTMode( void ) { - postState = DG_POST_STATE_START; - postCompleted = FALSE; - postPassed = FALSE; - tempPOSTPassed = TRUE; + postState = DG_POST_STATE_START; + postCompleted = FALSE; + postPassed = FALSE; + tempPOSTPassed = TRUE; + startPOSTDelayCounter = 0; } /*********************************************************************//** @@ -77,11 +86,13 @@ * initialization and POST mode. * @details Inputs: none * @details Outputs: none - * @return none + * @return initial state *************************************************************************/ -void transitionToInitAndPOSTMode( void ) +U32 transitionToInitAndPOSTMode( void ) { - // TODO - anything needed here? + initInitAndPOSTMode(); + + return postState; } /*********************************************************************//** @@ -100,11 +111,7 @@ switch ( postState ) { case DG_POST_STATE_START: - SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_STARTUP, 0, 0 ) - postState = DG_POST_STATE_FW_COMPATIBILITY; -#ifdef SKIP_POST - postState = DG_POST_STATE_COMPLETED; -#endif + postState = handlePOSTStateStart(); break; case DG_POST_STATE_FW_COMPATIBILITY: @@ -308,6 +315,36 @@ /*********************************************************************//** * @brief + * The handlePOSTStateStart function handles the POST start state. + * @details Inputs: startPOSTDelayCounter + * @details Outputs: startPOSTDelayCounter + * @return next POST state + *************************************************************************/ +static DG_POST_STATE_T handlePOSTStateStart( void ) +{ + DG_POST_STATE_T state = DG_POST_STATE_START; + + // There is a delay before starting POST to make sure the CAN bus is up and listening so + // when the event data can be sent + if ( ++startPOSTDelayCounter > START_POST_DELAY_COUNT ) + { + // Send the startup event + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_STARTUP, 0, 0 ) + // Send the first submode change event. It is the mode Init and it does not start from a previous + // mode previous and current are both published as Init + SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_OP_MODE_CHANGE, DG_MODE_INIT, DG_MODE_INIT ) + state = DG_POST_STATE_FW_COMPATIBILITY; +#ifdef SKIP_POST + state = DG_POST_STATE_COMPLETED; +#endif + startPOSTDelayCounter = 0; + } + + return state; +} + +/*********************************************************************//** + * @brief * The getCurrentInitAndPOSTState function returns the current state of the * initialization and POST mode. * @details Inputs: postState Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rce20c155091cd03f6ec01c0316a428b8b612492f -r860cbde5c5777360f2e7b3e7d1348863f62d4328 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision ce20c155091cd03f6ec01c0316a428b8b612492f) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 860cbde5c5777360f2e7b3e7d1348863f62d4328) @@ -263,17 +263,25 @@ MESSAGE_T msg; U08 *payloadPtr = msg.payload; U32 e = (U32)event; + // Convert the two data types enums to U32. The enums are interpreted as a U08 by the compiler + U32 dataType1 = (U32)dat1.dataType; + U32 dataType2 = (U32)dat2.dataType; // Create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_DG_EVENT; - msg.hdr.payloadLen = sizeof( U32 ) + sizeof( EVENT_DATA_T ) * 2; + // The payload length is the event ID, 2 event datas and the events data types for each of the event data + msg.hdr.payloadLen = sizeof( U32 ) + 2 * sizeof( EVENT_DATAS_T ) + 2 * sizeof( U32 ); memcpy( payloadPtr, &e, sizeof( U32 ) ); payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &dat1, sizeof( EVENT_DATA_T ) ); - payloadPtr += sizeof( EVENT_DATA_T ); - memcpy( payloadPtr, &dat2, sizeof( EVENT_DATA_T ) ); + memcpy( payloadPtr, &dataType1, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &dat1.data, sizeof( EVENT_DATAS_T ) ); + payloadPtr += sizeof( EVENT_DATAS_T ); + memcpy( payloadPtr, &dataType2, sizeof( U32 ) ); + payloadPtr += sizeof( U32 ); + memcpy( payloadPtr, &dat2.data, sizeof( EVENT_DATAS_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_2_UI, ACK_NOT_REQUIRED ); @@ -503,33 +511,6 @@ /*********************************************************************//** * @brief - * The broadcastHeatersData function sends out DG heaters data - * @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 ( HEATERS_DATA_T *heatersData ) -{ - BOOL result; - MESSAGE_T msg; - U08 *payloadPtr = msg.payload; - - // create a message record - blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_DG_HEATERS_DATA; - msg.hdr.payloadLen = sizeof( HEATERS_DATA_T ); - - memcpy( payloadPtr, heatersData, 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 ); - - return result; -} - -/*********************************************************************//** - * @brief * The broadcastDrainPumpData function sends out the drain pump data. * @details Inputs: none * @details Outputs: Drain pump data msg constructed and queued @@ -861,8 +842,8 @@ result = TRUE; memcpy( &payload, message->payload, sizeof( TARGET_TEMPS_PAYLOAD_T ) ); - setPrimaryHeaterTargetTemperature( payload.targetPrimaryHeaterTemp ); - setTrimmerHeaterTargetTemperature( payload.targetTrimmerHeaterTemp ); + setHeaterTargetTemperature( DG_PRIMARY_HEATER, payload.targetPrimaryHeaterTemp ); + setHeaterTargetTemperature( DG_TRIMMER_HEATER, payload.targetTrimmerHeaterTemp ); } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); } @@ -1615,7 +1596,14 @@ result = TRUE; memcpy( &drainCmd, message->payload, sizeof( DRAIN_CMD_T ) ); - startDrainCmd( drainCmd ); + if ( DG_CMD_START == drainCmd.cmd ) + { + startDrainCmd( drainCmd ); + } + else + { + stopDrainCmd(); + } } sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); @@ -1750,11 +1738,11 @@ if ( TRUE == startingHeater ) { - result = startPrimaryHeater(); + result = startHeater( DG_PRIMARY_HEATER ); } else { - stopPrimaryHeater(); + stopHeater( DG_PRIMARY_HEATER ); result = TRUE; } } @@ -2303,14 +2291,14 @@ /*********************************************************************//** * @brief - * The handleTestDrainPumpRPMOverrideRequest function handles a request to - * override the drain pump speed set point (in RPM). + * The handleTestSetDrainPumpRPM function handles a request to set the drain + * pump speed set point (in RPM). * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleTestDrainPumpRPMOverrideRequest( MESSAGE_T *message ) +void handleTestSetDrainPumpRPM( MESSAGE_T *message ) { BOOL result = FALSE; @@ -2458,14 +2446,14 @@ /************************************************************************* * @brief - * The handleSetDrainPumpDeltaPressureOverrideRequest function handles a - * request to override the delta pressure for the drain pump. + * The handleSetDrainPumpTargetOutletPressure function handles a + * request to set the drain pump outlet pressure. * @details Inputs: none * @details Outputs: message handled * @param message a pointer to the message to handle * @return none *************************************************************************/ -void handleSetDrainPumpDeltaPressureOverrideRequest( MESSAGE_T *message ) +void handleSetDrainPumpTargetOutletPressure( MESSAGE_T *message ) { BOOL result = 0; @@ -2538,7 +2526,7 @@ } else { - result = testResetSwitchesDataPublishIntervalOverrid(); + result = testResetSwitchesDataPublishIntervalOverride(); } } @@ -3147,38 +3135,6 @@ /*********************************************************************//** * @brief -* The handleTestROFlowRateOverride function handles a request to override -* the RO flow rate. -* @details Inputs: none -* @details Outputs: message handled -* @param message a pointer to the message to handle -* @return none -*******************************************************************/ -void handleTestMeasuredROFlowRateOverride( MESSAGE_T *message ) -{ - TEST_OVERRIDE_ARRAY_PAYLOAD_T payload; - BOOL result = FALSE; - - // verify payload length - if ( sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) == message->hdr.payloadLen ) - { - memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_ARRAY_PAYLOAD_T ) ); - if ( FALSE == payload.reset ) - { - result = testSetMeasuredROFlowRateOverride( payload.state.f32 ); - } - else - { - result = testResetMeasuredROFlowRateOverride(); - } - } - - // respond to request - sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); -} - -/*********************************************************************//** -* @brief * The handleTestThermistorsValueOverride function handles a request to * override a thermistor's value. * @details Inputs: none @@ -3736,6 +3692,59 @@ /*********************************************************************//** * @brief +* The handleStopDGRTCClock function handles a request to stop the RTC clock. +* @details Inputs: none +* @details Outputs: message handled +* @param message a pointer to the message to handle +* @return none +*************************************************************************/ +void handleStopDGRTCClock( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( 0 == message->hdr.payloadLen ) + { + testSetStopRTC(); + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** +* @brief +* The handleSetDrainPumpMeasuredRPMOverrideRequest function handles a request +* to override the drain pump measured RPM. +* @details Inputs: none +* @details Outputs: message handled +* @param message a pointer to the message to handle +* @return none +*************************************************************************/ +void handleSetDrainPumpMeasuredRPMOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetDrainPumpMeasuredRPMOverride( payload.state.u32 ); + } + else + { + result = testResetDrainPumpMeasuredRPMOverride(); + } + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +/*********************************************************************//** +* @brief * The handleStartStopDGChemicalDisinfect function handles a request to start * or stop DG chemical disinfect mode. * @details Inputs: none Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -rce20c155091cd03f6ec01c0316a428b8b612492f -r860cbde5c5777360f2e7b3e7d1348863f62d4328 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision ce20c155091cd03f6ec01c0316a428b8b612492f) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 860cbde5c5777360f2e7b3e7d1348863f62d4328) @@ -23,7 +23,6 @@ #include "DrainPump.h" #include "Fans.h" #include "FluidLeak.h" -#include "Heaters.h" #include "LoadCell.h" #include "MessageSupport.h" #include "ModeChemicalDisinfect.h" @@ -63,6 +62,9 @@ // MSG_ID_DG_EVENT BOOL sendEvent( DG_EVENT_ID_T event, EVENT_DATA_T dat1, EVENT_DATA_T dat2 ); +// Serialize message +U32 serializeMessage( MESSAGE_T msg, COMM_BUFFER_T buffer, BOOL ackReq ); + // MSG_ID_ALARM_TRIGGERED BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); @@ -93,18 +95,12 @@ // MSG_ID_DRAIN_PUMP_DATA BOOL broadcastDrainPumpData( DRAIN_PUMP_DATA_T *drainPumpData ); -// MSG_ID_DG_CONCENTRATE_PUMP_DATA -BOOL broadcastConcentratePumpData( void * concentratePumpDataPtr ); - // MSG_ID_DG_PRESSURES_DATA BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ); // MSG_ID_DG_RESERVOIR_DATA BOOL broadcastReservoirData( U32 resID, U32 fillToVol, U32 drainToVol ); -// MSG_ID_HEATERS_READINGS -BOOL broadcastHeatersData( HEATERS_DATA_T *heatersData ); - // MSG_ID_TEMPERATURE_SENSORS_READINGS BOOL broadcastTemperatureSensorsData( TEMPERATURE_SENSORS_DATA_T* tempSensorsData ); @@ -266,8 +262,8 @@ // MSG_ID_DIALYSATE_FLOW_SEND_INTERVAL_OVERRIDE: void handleTestDialysateFlowDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); -// MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE -void handleTestDrainPumpRPMOverrideRequest( MESSAGE_T *message ); +// MSG_ID_DRAIN_PUMP_SET_RPM +void handleTestSetDrainPumpRPM( MESSAGE_T *message ); // MSG_ID_DRAIN_PUMP_SEND_INTERVAL_OVERRIDE: void handleTestDrainPumpDataBroadcastIntervalOverrideRequest( MESSAGE_T *message ); @@ -282,7 +278,7 @@ void handleTestDGSafetyShutdownOverrideRequest( MESSAGE_T *message ); // MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE -void handleSetDrainPumpDeltaPressureOverrideRequest( MESSAGE_T *message ); +void handleSetDrainPumpTargetOutletPressure( MESSAGE_T *message ); // MSG_ID_DG_SWITCHES_STATUS_OVERRIDE void handleSetSwitchesStatusOverrideRequest( MESSAGE_T *message ); @@ -410,6 +406,12 @@ // MSG_ID_DG_BLOCK_MESSAGE_TRANSMISSION void handleTestBlockMessagesRequest( MESSAGE_T *message ); +// MSG_ID_DG_STOP_RTC_CLOCK +void handleStopDGRTCClock( MESSAGE_T * message ); + +// MSG_ID_DG_DRAIN_PUMP_MEASURED_RPM_OVERRIDE +void handleSetDrainPumpMeasuredRPMOverrideRequest( MESSAGE_T *message ); + // MSG_ID_DG_SUPER_CLEAR_ALARMS_CMD void handleTestSuperClearAlarmsRequest( MESSAGE_T *message );