Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r8bd1ae47aa13a843aa8abd6321ddc050deacb4a6 -rc137d3c7cb17b0364d745e10ff6dbd1901eb1baa --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 8bd1ae47aa13a843aa8abd6321ddc050deacb4a6) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision c137d3c7cb17b0364d745e10ff6dbd1901eb1baa) @@ -49,6 +49,7 @@ static U32 broadcastModeIntervalCtr = 11; ///< Interval counter used to determine when to broadcast operation mode. Initialize to 11 to stagger broadcast. /// 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 }; +static U32 priorSubMode = 0; ///< The prior submode state. /// This matrix determines legal transitions from one mode to another static const HD_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_MODES - 1 ][ NUM_OF_MODES - 1 ] = { @@ -88,6 +89,7 @@ // Start in init mode currentMode = MODE_INIT; currentSubMode = 0; + priorSubMode = 0; transitionToNewOperationMode( MODE_INIT ); // Call initializers for the individual modes @@ -111,8 +113,9 @@ void execOperationModes( void ) { HD_OP_MODE_T newMode; - U32 priorSubMode = currentSubMode; + priorSubMode = currentSubMode; + // Any new mode requests? newMode = arbitrateModeRequest(); // Will return current mode if no pending requests newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; @@ -128,7 +131,6 @@ if ( currentMode != newMode ) { // Handle transition to new mode - priorSubMode = 0; lastMode = currentMode; transitionToNewOperationMode( newMode ); currentMode = newMode; @@ -332,33 +334,37 @@ switch ( newMode ) { case MODE_FAUL: - transitionToFaultMode(); + currentSubMode = transitionToFaultMode(); break; case MODE_SERV: - transitionToServiceMode(); + currentSubMode = transitionToServiceMode(); break; case MODE_INIT: - transitionToInitAndPOSTMode(); + currentSubMode = transitionToInitAndPOSTMode(); break; case MODE_STAN: - transitionToStandbyMode(); + currentSubMode = transitionToStandbyMode(); break; case MODE_TPAR: - transitionToTreatParamsMode(); + currentSubMode = transitionToTreatParamsMode(); break; case MODE_PRET: - transitionToPreTreatmentMode(); + currentSubMode = transitionToPreTreatmentMode(); break; case MODE_TREA: - transitionToTreatmentMode(); + currentSubMode = transitionToTreatmentMode(); break; case MODE_POST: - transitionToPostTreatmentMode(); + currentSubMode = transitionToPostTreatmentMode(); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, newMode ) break; } + + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_MODE_CHANGE, priorSubMode, currentSubMode ) + + priorSubMode = currentSubMode; } /*********************************************************************//**