Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -r5315092604c1a6f4ec8ba1339809bd0099f921da -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 5315092604c1a6f4ec8ba1339809bd0099f921da) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -293,7 +293,7 @@ deenergizeActuators( NO_PARK_CONC_PUMPS ); initChemicalDisinfectMode(); - + setCurrentSubState( NO_SUB_STATE ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_YELLOW ); #ifndef _RELEASE_ Index: firmware/App/Modes/ModeChemicalDisinfectFlush.c =================================================================== diff -u -r5315092604c1a6f4ec8ba1339809bd0099f921da -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision 5315092604c1a6f4ec8ba1339809bd0099f921da) +++ firmware/App/Modes/ModeChemicalDisinfectFlush.c (.../ModeChemicalDisinfectFlush.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -197,7 +197,7 @@ deenergizeActuators( NO_PARK_CONC_PUMPS ); initChemicalDisinfectFlushMode(); - + setCurrentSubState( NO_SUB_STATE ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_YELLOW ); activateAlarmNoData( ALARM_ID_DG_CHEM_DISINFECT_FLUSH_REMOVE_ACID ); Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -r67da3f0d10e1143173b1e8c29061097d609d8623 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 67da3f0d10e1143173b1e8c29061097d609d8623) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -113,6 +113,7 @@ { // re-initialize each time we transition to drain mode initDrainMode(); + setCurrentSubState( NO_SUB_STATE ); DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); Index: firmware/App/Modes/ModeFault.c =================================================================== diff -u -r56ba1b163b0cbf6953638065b2108f745b17ec8f -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision 56ba1b163b0cbf6953638065b2108f745b17ec8f) +++ firmware/App/Modes/ModeFault.c (.../ModeFault.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -75,7 +75,7 @@ deenergizeActuators( PARK_CONC_PUMPS ); initFaultMode(); - + setCurrentSubState( NO_SUB_STATE ); // Publish POST failure status to UI if fault triggered in Init/POST mode if ( DG_MODE_INIT == getPreviousOperationMode() ) { Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -rc7ea3969643ead419cbfcd34c3cb203c45bcad71 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision c7ea3969643ead419cbfcd34c3cb203c45bcad71) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -217,7 +217,7 @@ U32 transitionToFillMode( void ) { initFillMode(); - + setCurrentSubState( NO_SUB_STATE ); // Set initial actuator states setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); Index: firmware/App/Modes/ModeFlush.c =================================================================== diff -u -re12f1b3d41ae133bc0975fcb126e431c2bedda59 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision e12f1b3d41ae133bc0975fcb126e431c2bedda59) +++ firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -171,7 +171,7 @@ deenergizeActuators( NO_PARK_CONC_PUMPS ); initFlushMode(); - + setCurrentSubState( NO_SUB_STATE ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_BLUE ); return flushState; Index: firmware/App/Modes/ModeGenIdle.c =================================================================== diff -u -r5315092604c1a6f4ec8ba1339809bd0099f921da -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision 5315092604c1a6f4ec8ba1339809bd0099f921da) +++ firmware/App/Modes/ModeGenIdle.c (.../ModeGenIdle.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -104,7 +104,7 @@ { // Re-initialize each time we transition to generation idle mode initGenIdleMode(); - + setCurrentSubState( NO_SUB_STATE ); // Set initial actuator states setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPI, VALVE_STATE_OPEN ); @@ -286,6 +286,7 @@ static DG_GEN_IDLE_MODE_STATE_T handleBadFillState( void ) { DG_GEN_IDLE_MODE_STATE_T result = DG_GEN_IDLE_MODE_STATE_HANDLE_BAD_FILL; + U32 priorSubState = badFillState; // Execute current bad fill state switch ( badFillState ) @@ -316,6 +317,10 @@ break; } + if ( priorSubState != badFillState ) + { + setCurrentSubState( badFillState ); + } return result; } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r5315092604c1a6f4ec8ba1339809bd0099f921da -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 5315092604c1a6f4ec8ba1339809bd0099f921da) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -318,7 +318,7 @@ deenergizeActuators( NO_PARK_CONC_PUMPS ); initHeatDisinfectMode(); - + setCurrentSubState( NO_SUB_STATE ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_ORANGE ); return heatDisinfectState; Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.c =================================================================== diff -u -re12f1b3d41ae133bc0975fcb126e431c2bedda59 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision e12f1b3d41ae133bc0975fcb126e431c2bedda59) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -177,7 +177,7 @@ deenergizeActuators( NO_PARK_CONC_PUMPS ); initHeatDisinfectActiveCoolMode(); - + setCurrentSubState( NO_SUB_STATE ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_ORANGE ); return heatDisinfectActiveCoolState; Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r0ee5103ebceb698eadac7b18398471361811a151 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 0ee5103ebceb698eadac7b18398471361811a151) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -95,7 +95,7 @@ { initInitAndPOSTMode(); setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); - + setCurrentSubState( NO_SUB_STATE ); resetRTCPOSTState(); resetNVDataMgmtPOSTState(); resetAccelPOSTState(); Index: firmware/App/Modes/ModeService.c =================================================================== diff -u -r6499ea25921fcf67826fa0c35bb03caf411ba542 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeService.c (.../ModeService.c) (revision 6499ea25921fcf67826fa0c35bb03caf411ba542) +++ firmware/App/Modes/ModeService.c (.../ModeService.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -58,7 +58,7 @@ setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); deenergizeActuators( NO_PARK_CONC_PUMPS ); initServiceMode(); - + setCurrentSubState( NO_SUB_STATE ); return serviceState; } Index: firmware/App/Modes/ModeSolo.c =================================================================== diff -u -r6499ea25921fcf67826fa0c35bb03caf411ba542 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/ModeSolo.c (.../ModeSolo.c) (revision 6499ea25921fcf67826fa0c35bb03caf411ba542) +++ firmware/App/Modes/ModeSolo.c (.../ModeSolo.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -57,7 +57,7 @@ U32 transitionToSoloMode( void ) { initSoloMode(); - + setCurrentSubState( NO_SUB_STATE ); setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); return soloState; Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -rc230be1bd4296324bf5dfc288c212eb7c2ce5d2d -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision c230be1bd4296324bf5dfc288c212eb7c2ce5d2d) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -57,6 +57,7 @@ /// DG operation mode data publish interval. static OVERRIDE_U32_T dgOpModePublishInterval = { BROADCAST_DG_OP_MODE_INTERVAL, BROADCAST_DG_OP_MODE_INTERVAL, 0, 0 }; static U32 dataPublishCounter; ///< Interval counter used to determine when to broadcast operation mode. Initialize to 11 to stagger broadcast. +static U32 currentSubState; ///< The currently active sub state. /// 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 ] = @@ -83,6 +84,7 @@ static void transitionToNewOperationMode( DG_OP_MODE_T newMode ); static U32 getDGOpModePublishInterval( void ); static void broadcastOperationMode( void ); +static void sendOperationStatusEvent( void ); /*********************************************************************//** * @brief @@ -106,6 +108,7 @@ lastMode = DG_MODE_INIT; currentMode = DG_MODE_INIT; currentSubMode = 0; + currentSubState = 0xFF; dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; transitionToNewOperationMode( DG_MODE_INIT ); @@ -137,6 +140,8 @@ { DG_OP_MODE_T newMode; U32 priorSubMode = currentSubMode; + U32 priorOpMode = currentMode; + U32 priorSubState = currentSubState; // any new mode requests? newMode = arbitrateModeRequest(); // will return current mode if no pending requests @@ -220,9 +225,10 @@ break; } - // Send sub-mode change event when appropriate - if ( priorSubMode != currentSubMode ) + // Send operation status event when appropriate + if ( priorOpMode != currentMode || priorSubMode != currentSubMode || priorSubState != currentSubState ) { + sendOperationStatusEvent(); SEND_EVENT_WITH_2_U32_DATA( DG_EVENT_SUB_MODE_CHANGE, priorSubMode, currentSubMode ) } @@ -426,7 +432,47 @@ return result; } +/*********************************************************************//** + * @brief + * The setCurrentSubState function sets the current subState. + * @details Inputs: subState + * @details Outputs: currentSubState + * @param subState the enumerated sub state. + * @return none + *************************************************************************/ +void setCurrentSubState( U32 subState ) +{ + currentSubState = subState; +} +/*********************************************************************//** + * @brief + * The sendOperationStatusEvent function constructs and sends an DG operation + * status event. + * @details Inputs: currentMode, currentSubMode, currentSubState + * @details Outputs: dat1, dat2. + * @param none + * @return none + *************************************************************************/ +static void sendOperationStatusEvent() +{ + + EVENT_DATA_T dat1; + EVENT_DATA_T dat2; + U32 opData = ( (U08)currentMode + + ( (U08)currentSubMode << SHIFT_8_BITS_FOR_BYTE_SHIFT ) + + ( (U08)currentSubState << SHIFT_16_BITS_FOR_WORD_SHIFT ) ); + + dat2.dataType = EVENT_DATA_TYPE_U32; + dat2.data.uInt.data = 0; + + dat1.dataType = EVENT_DATA_TYPE_U32; + dat1.data.uInt.data = opData; + + sendEvent( DG_EVENT_OPERATION_STATUS, dat1, dat2 ); +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Modes/OperationModes.h =================================================================== diff -u -r6499ea25921fcf67826fa0c35bb03caf411ba542 -rd19a072db6880577f677093929b53445e34a33e3 --- firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision 6499ea25921fcf67826fa0c35bb03caf411ba542) +++ firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision d19a072db6880577f677093929b53445e34a33e3) @@ -31,6 +31,8 @@ // ********** public definitions ********** +#define NO_SUB_STATE 0xFF ///< value for when submode does not have specific substates and is not applicable. + /// Operation modes data structure typedef struct { @@ -45,6 +47,7 @@ void requestNewOperationMode( DG_OP_MODE_T newMode ); // request a transition to a new operation mode DG_OP_MODE_T getCurrentOperationMode( void ); // get the current operation mode DG_OP_MODE_T getPreviousOperationMode( void ); // get the previous operation mode +void setCurrentSubState( U32 subState ); // Set the current substate. BOOL testSetOperationMode( DG_OP_MODE_T newMode ); // Force transition to a given mode (if allowed) BOOL testSetDGOpModePublishIntervalOverride( U32 value );