Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r19f13e67288117e7f81c1245a75cc6b5f8aaf899 -rce64b7e15824641a6a6465c28eec5d8ec593f110 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 19f13e67288117e7f81c1245a75cc6b5f8aaf899) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision ce64b7e15824641a6a6465c28eec5d8ec593f110) @@ -61,6 +61,7 @@ static HD_OP_MODE_T currentMode; ///< Current operation mode. static U32 currentSubMode; ///< The currently active state of the active mode. static U32 broadcastModeIntervalCtr; ///< Interval counter used to determine when to broadcast operation mode. Initialize to 11 to stagger broadcast. +static U32 currentSubState; /// Interval (in task intervals) at which to publish operation mode data to CAN bus. static OVERRIDE_U32_T opModePublishInterval = { BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, BROADCAST_HD_OP_MODE_INTERVAL, 0 }; /// Local structure init for saving confirmation requests @@ -110,6 +111,7 @@ lastMode = MODE_INIT; currentMode = MODE_INIT; currentSubMode = 0; + currentSubState = 0xFF; broadcastModeIntervalCtr = DATA_PUBLISH_COUNTER_START_COUNT; transitionToNewOperationMode( MODE_INIT ); @@ -136,6 +138,7 @@ { HD_OP_MODE_T newMode; U32 priorSubMode = currentSubMode; + U32 priorSubState = currentSubState; // Any new mode requests? newMode = arbitrateModeRequest(); // Will return current mode if no pending requests @@ -209,9 +212,10 @@ break; } // End switch - // Send sub-mode change event when appropriate - if ( priorSubMode != currentSubMode ) + // Send operation status event when appropriate + if ( lastMode != currentMode || priorSubMode != currentSubMode || priorSubState != currentSubState ) { + sendOperationStatusEvent(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_MODE_CHANGE, priorSubMode, currentSubMode ) } @@ -372,8 +376,6 @@ *************************************************************************/ static void transitionToNewOperationMode( HD_OP_MODE_T newMode ) { - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_OP_MODE_CHANGE, lastMode, newMode ) - // Setup for new operating mode switch ( newMode ) { @@ -574,7 +576,30 @@ return new_id; } +void setCurrentSubState( U32 subState ) +{ + currentSubState = subState; +} +void sendOperationStatusEvent() +{ + + U32 opData = 0; + EVENT_DATA_T dat1; + EVENT_DATA_T dat2; + dat2.dataType = EVENT_DATA_TYPE_U32; + dat2.data.uInt.data = (U32)(d2); + + opData = ( currentMode + ( currentSubMode << SHIFT_8_BITS_FOR_BYTE_SHIFT ) + + ( currentSubState << SHIFT_16_BITS_FOR_WORD_SHIFT ) ) & MASK_OFF_U32_MSB; + + dat1.dataType = EVENT_DATA_TYPE_U32; + dat1.data.uInt.data = (U32)(opData); + + sendEvent( HD_EVENT_OPERATION_STATUS, dat1, dat2 ); +} +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/