Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r52ded7b22d4b413aa8182f1343e4fbb78e8c3b0a -r090cfb22a7c0b4738299c3fb411ca77aaba8d968 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 52ded7b22d4b413aa8182f1343e4fbb78e8c3b0a) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 090cfb22a7c0b4738299c3fb411ca77aaba8d968) @@ -55,6 +55,8 @@ static DD_OP_MODE_T lastMode; ///< Last operation mode prior to current mode. static DD_OP_MODE_T currentMode; ///< The currently active mode. static U32 currentSubMode; ///< The currently active state of the active mode. +static TD_MODE_SUB_MODE_T tdModes; ///< TD operations mode. + /// 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. @@ -63,21 +65,15 @@ /// This matrix determines legal transitions from one mode to another. static const DD_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_DD_MODES - 1 ][ NUM_OF_DD_MODES - 1 ] = { - // from to-> FAULT SERVICE INIT STANBY STBY-SOLO GEN-IDLE FILL DRAIN FLUSH HEAT DIS CHEM DIS CHEM_FLUSH HEAT_COOL RO_PER_SAMPLE - /* FAUL */{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* SERV */{ DD_MODE_NLEG, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* INIT *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_INIT, DD_MODE_STAN, DG_MODE_SOLO, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* STAN *///{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_INIT, DD_MODE_STAN, DG_MODE_SOLO, DG_MODE_GENE, DD_MODE_NLEG, DD_MODE_NLEG, DG_MODE_FLUS, DD_MODE_HEAT, DG_MODE_CHEM, DG_MODE_CHFL, DD_MODE_HCOL, DD_MODE_ROPS }, - /* SOLO *///{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_INIT, DD_MODE_STAN, DG_MODE_SOLO, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DG_MODE_FLUS, DD_MODE_HEAT, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HCOL, DD_MODE_ROPS }, - /* GENE *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DG_MODE_DRAI, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* FILL *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DG_MODE_GENE, DG_MODE_FILL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* DRAI *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DG_MODE_GENE, DD_MODE_NLEG, DG_MODE_DRAI, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* FLUS *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DG_MODE_SOLO, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DG_MODE_FLUS, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* HEAT *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DG_MODE_SOLO, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HEAT, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HCOL, DD_MODE_NLEG }, - /* CHEM *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DG_MODE_CHEM, DG_MODE_CHFL, DD_MODE_NLEG, DD_MODE_NLEG }, - /* CHFL *///{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DG_MODE_CHFL, DD_MODE_NLEG, DD_MODE_NLEG }, - /* HCOL */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HCOL, DD_MODE_NLEG }, - /* ROPS */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_ROPS }, + // from to-> FAULT SERVICE INIT STANBY GEND HEAT HCOL ROPS + /* FAUL */{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, + /* SERV */{ DD_MODE_NLEG, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, + /* INIT */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_INIT, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, + /* STAN */{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_INIT, DD_MODE_STAN, DD_MODE_GEND, DD_MODE_HEAT, DD_MODE_HCOL, DD_MODE_ROPS }, + /* GEND */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_GEND, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, + /* HEAT */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_HEAT, DD_MODE_HCOL, DD_MODE_NLEG }, + /* HCOL */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HCOL, DD_MODE_NLEG }, + /* ROPS */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_ROPS }, }; // ********** private function prototypes ********** @@ -91,8 +87,8 @@ /*********************************************************************//** * @brief * The initOperationModes function initializes the operation modes module. - * @details Inputs: none - * @details Outputs: modeRequest, lastMode, currentMode, currentSubMode, + * @details \b Inputs: none + * @details \b Outputs: modeRequest, lastMode, currentMode, currentSubMode, * dataPublishCounter * @return none *************************************************************************/ @@ -135,8 +131,13 @@ /*********************************************************************//** * @brief * The execOperationModes function executes the operation modes state machine. - * @details Inputs: currentMode, currentSubMode - * @details Outputs: currentMode, currentSubMode + * It decides new mode transition after validation and executes the required operations + * in each mode. Also, publish the events with the mode details and broadcast the operation + * mode informations. + * @details \b Inputs: currentMode, currentSubMode + * @details \b Outputs: currentMode, currentSubMode + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT when illegal mode transition requested + * and invalid operation mode encountered. * @return none *************************************************************************/ void execOperationModes( void ) @@ -181,18 +182,18 @@ currentSubMode = execFaultMode(); break; -// case DD_MODE_SERV: -// currentSubMode = execServiceMode(); -// break; + case DD_MODE_SERV: + currentSubMode = execServiceMode(); + break; case DD_MODE_INIT: currentSubMode = execInitAndPOSTMode(); break; + + case DD_MODE_STAN: + currentSubMode = execStandbyMode(); + break; // -// case DD_MODE_STAN: -// currentSubMode = execStandbyMode(); -// break; -// // case DG_MODE_SOLO: // currentSubMode = execSoloMode(); // break; @@ -257,8 +258,9 @@ /*********************************************************************//** * @brief * The requestNewOperationMode function requests a new operation mode. - * @details Inputs: none - * @details Outputs: makes the requested mode "pending" + * @details \b Inputs: none + * @details \b Outputs: makes the requested mode "pending" + * @details \b Alarm : ALARM_ID_DD_SOFTWARE_FAULT when invalid mode requested * @param newMode requested mode * @return none *************************************************************************/ @@ -279,8 +281,8 @@ /*********************************************************************//** * @brief * The getCurrentOperationMode function returns the current operation mode. - * @details Inputs: none - * @details Outputs: none + * @details \b Inputs: none + * @details \b Outputs: none * @return current mode *************************************************************************/ DD_OP_MODE_T getCurrentOperationMode( void ) @@ -291,8 +293,8 @@ /*********************************************************************//** * @brief * The getPreviousOperationMode function gets the previous operation mode. - * @details Inputs: lastMode - * @details Outputs: none + * @details \b Inputs: lastMode + * @details \b Outputs: none * @return the previous operation mode *************************************************************************/ DD_OP_MODE_T getPreviousOperationMode( void ) @@ -303,8 +305,8 @@ /*********************************************************************//** * @brief * The getCurrentOperationSubMode function gets the current operation submode. - * @details Inputs: currentSubMode - * @details Outputs: none + * @details \b Inputs: currentSubMode + * @details \b Outputs: none * @return the current operation submode *************************************************************************/ U32 getCurrentOperationSubMode( void ) @@ -316,8 +318,8 @@ * @brief * The arbitrateModeRequest function selects highest priority mode request * and clear all requests. - * @details Inputs: none - * @details Outputs: Arbitrated mode requests + * @details \b Inputs: none + * @details \b Outputs: Arbitrated mode requests * @return highest priority requested mode *************************************************************************/ static DD_OP_MODE_T arbitrateModeRequest( void ) @@ -354,8 +356,8 @@ * @brief * The transitionToNewOperationMode function undergo the process of transition * to new operation mode. - * @details Inputs: currentSubMode - * @details Outputs: Transition to new mode + * @details \b Inputs: currentSubMode + * @details \b Outputs: Transition to new mode * @param newMode new op mode to transition to * @return none *************************************************************************/ @@ -371,15 +373,15 @@ case DD_MODE_FAUL: currentSubMode = transitionToFaultMode(); break; -// case DD_MODE_SERV: -// currentSubMode = transitionToServiceMode(); -// break; + case DD_MODE_SERV: + currentSubMode = transitionToServiceMode(); + break; case DD_MODE_INIT: currentSubMode = transitionToInitAndPOSTMode(); break; -// case DD_MODE_STAN: -// currentSubMode = transitionToStandbyMode(); -// break; + case DD_MODE_STAN: + currentSubMode = transitionToStandbyMode(); + break; // case DG_MODE_SOLO: // currentSubMode = transitionToSoloMode(); // break; @@ -426,8 +428,8 @@ * @brief * The broadcastOperationMode function broadcasts the current operation mode at * the prescribed interval. - * @details Inputs: broadcastModeIntervalCtr - * @details Outputs: DG operation mode broadcast message sent + * @details \b Inputs: broadcastModeIntervalCtr + * @details \b Outputs: DD operation mode broadcast message sent * @return none *************************************************************************/ static void broadcastOperationMode( void ) @@ -449,8 +451,8 @@ * @brief * The getDGOpModePublishInterval function gets the current DG operation mode * data publish interval. - * @details Inputs: dgOpModePublishInterval - * @details Outputs: DG operation mode broadcast message sent + * @details \b Inputs: dgOpModePublishInterval + * @details \b Outputs: DG operation mode broadcast message sent * @return none *************************************************************************/ static U32 getDGOpModePublishInterval( void ) @@ -468,8 +470,8 @@ /*********************************************************************//** * @brief * The setCurrentSubState function sets the current subState. - * @details Inputs: subState - * @details Outputs: currentSubState + * @details \b Inputs: subState + * @details \b Outputs: currentSubState * @param subState the enumerated sub state. * @return none *************************************************************************/ @@ -482,8 +484,8 @@ * @brief * The sendOperationStatusEvent function constructs and sends an DG operation * status event. - * @details Inputs: currentMode, currentSubMode, currentSubState - * @details Outputs: dat1, dat2. + * @details \b Inputs: currentMode, currentSubMode, currentSubState + * @details \b Outputs: dat1, dat2. * @return none *************************************************************************/ static void sendOperationStatusEvent() @@ -503,7 +505,40 @@ sendEvent( DG_EVENT_OPERATION_STATUS, dat1, dat2 ); } +/*********************************************************************//** + * @brief + * The setTDOperationMode function sets TD operation mode value. + * @details \b Inputs: none + * @details \b Outputs: tdMode + * @param mode which is TD mode + * @param subMode which is TD submode + * @return none + *************************************************************************/ +void setTDOperationMode( U32 mode, U32 subMode ) +{ + // thread protection for queue operations + _disable_IRQ(); + tdModes.tdMode = (TD_OP_MODE_T)mode; + tdModes.tdSubMode = subMode; + // release thread protection + _enable_IRQ(); +} +/*********************************************************************//** + * @brief + * The getTDOperationMode function copies the provided buffer with the TD + * mode and submode. + * @details \b Inputs: none + * @details \b Outputs: TdMode + * @param mode* pointer to the buffer of type TD_MODE_SUB_MODE_T + * @return none + *************************************************************************/ +void getTDOperationMode( TD_MODE_SUB_MODE_T* mode ) +{ + mode->tdMode = tdModes.tdMode; + mode->tdSubMode = tdModes.tdSubMode; +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -513,8 +548,8 @@ * @brief * The testSetOperationMode function will transition to a given operation * mode if the transition is legal. - * @details Inputs: MODE_TRANSITION_TABLE[][] - * @details Outputs: modeRequest[], result + * @details \b Inputs: MODE_TRANSITION_TABLE[][] + * @details \b Outputs: modeRequest[], result * @param newMode ID of requested mode to transition to * @return TRUE if request successful, FALSE if not *************************************************************************/ @@ -541,8 +576,8 @@ * @brief * The testSetDGOpModePublishIntervalOverride function overrides the * DG operation mode publish interval. - * @details Inputs: none - * @details Outputs: dgOpModePublishInterval + * @details \b Inputs: none + * @details \b Outputs: dgOpModePublishInterval * @param value override DG operation mode publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ @@ -566,8 +601,8 @@ * @brief * The testResetDGOpModePublishIntervalOverride function resets the * override of the DG operation mode publish interval. - * @details Inputs: none - * @details Outputs: dgOpModePublishInterval + * @details \b Inputs: none + * @details \b Outputs: dgOpModePublishInterval * @return TRUE if override reset successful, FALSE if not *************************************************************************/ BOOL testResetDGOpModePublishIntervalOverride( void )