// Determine PostBuild configuration\r
internal_data.config = EcuM_DeterminePbConfiguration();\r
\r
- // Check consistency of PB configuration\r
- // TODO\r
+ // TODO: Check consistency of PB configuration\r
\r
// Initialize drivers needed before the OS-starts\r
EcuM_AL_DriverInitOne(internal_data.config);\r
// TODO Mcu_ResetType type = Mcu_GetResetReason();\r
\r
// Set default shutdown target\r
- // TODO: Skriva om till funktion(EcuM_SelectShutdownTarget), och testa om satt! //REQ:Ecum2181\r
+ // TODO: Rewrite into function (EcuM_SelectShutdownTarget). //REQ:Ecum2181\r
internal_data.shutdown_target = internal_data.config->EcuMDefaultShutdownTarget;\r
internal_data.shutdown_mode = internal_data.config->EcuMDefaultShutdownMode;\r
\r
EcuM_AL_DriverInitThree(internal_data.config);\r
#endif\r
\r
- // Indicate mode change to RTE\r
- // TODO\r
+ // TODO: Indicate mode change to RTE\r
\r
// If coming from startup sequence, enter Run mode\r
// if (internal_data.current_state == ECUM_STATE_STARTUP_TWO)\r
return E_OK;\r
}\r
\r
-// TODO: Fix this function, should only return bool, but do also return Std_ReturnType.\r
boolean EcuM_ComM_HasRequestedRUN(NetworkHandleType user)\r
{\r
- VALIDATE_RV(internal_data.initiated, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
- VALIDATE_RV(user < 32, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
+ VALIDATE_RV(internal_data.initiated, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_NOT_INITIATED, FALSE);\r
+ VALIDATE_RV(user < 32, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_INVALID_PAR, FALSE);\r
\r
return (internal_data.run_comm_requests &((uint32)1 << user)) != 0;\r
}\r
static uint32 internal_data_run_state_timeout = 0;\r
#if defined(USE_NVM)\r
static uint32 internal_data_go_off_one_state_timeout = 0;\r
+static NvM_RequestResultType writeAllResult;\r
#endif\r
\r
\r
-void EcuM_enter_run_mode(void)\r
-{\r
+void EcuM_enter_run_mode(void){\r
internal_data.current_state = ECUM_STATE_APP_RUN;\r
EcuM_OnEnterRUN(); /** @req EcuM2308 */\r
//TODO: Call ComM_EcuM_RunModeIndication(NetworkHandleType Channel) for all channels that have requested run.\r
internal_data_run_state_timeout = internal_data.config->EcuMRunMinimumDuration / ECUM_MAIN_FUNCTION_PERIOD; /** @req EcuM2310 */\r
}\r
\r
-static inline void enter_post_run_mode(void)\r
-{\r
- internal_data.current_state = ECUM_STATE_APP_POST_RUN;\r
-}\r
\r
-static inline void enter_prep_shutdown_mode(void)\r
-{\r
- internal_data.current_state = ECUM_STATE_PREP_SHUTDOWN;\r
- EcuM_OnPrepShutdown();\r
-}\r
+//--------- Local functions ------------------------------------------------------------------------------------------------\r
\r
-static inline void enter_go_sleep_mode(void)\r
-{\r
+static inline void enter_go_sleep_mode(void){\r
internal_data.current_state = ECUM_STATE_GO_SLEEP;\r
EcuM_OnGoSleep();\r
}\r
\r
-static inline void enter_go_off_one_mode(void)\r
-{\r
+static inline void enter_go_off_one_mode(void){\r
internal_data.current_state = ECUM_STATE_GO_OFF_ONE;\r
EcuM_OnGoOffOne();\r
\r
#endif\r
}\r
\r
-static inline boolean hasRunRequests(void)\r
-{\r
+\r
+static inline boolean hasRunRequests(void){\r
uint32 result = internal_data.run_requests;\r
\r
#if defined(USE_COMM)\r
return (result != 0);\r
}\r
\r
-static inline boolean hasPostRunRequests(void)\r
-{\r
+static inline boolean hasPostRunRequests(void){\r
return (internal_data.postrun_requests != 0);\r
}\r
\r
-void EcuM_MainFunction(void)\r
-{\r
-#if defined(USE_NVM)\r
-static NvM_RequestResultType writeAllResult;\r
-#endif\r
\r
-VALIDATE_NO_RV(internal_data.initiated, ECUM_MAINFUNCTION_ID, ECUM_E_NOT_INITIATED);\r
\r
+static inline void in_state_appRun(void){\r
+ if (internal_data_run_state_timeout){\r
+ internal_data_run_state_timeout--;\r
+ }\r
\r
-switch(internal_data.current_state){\r
+ if ((!hasRunRequests()) && (internal_data_run_state_timeout == 0)){\r
+ EcuM_OnExitRun(); /** @req EcuM2865 */\r
+ internal_data.current_state = ECUM_STATE_APP_POST_RUN;/** @req EcuM2865 */\r
+ }\r
+}\r
\r
- case ECUM_STATE_APP_RUN:\r
- if (internal_data_run_state_timeout)\r
- {\r
- internal_data_run_state_timeout--;\r
- }\r
\r
- if ((!hasRunRequests()) && (internal_data_run_state_timeout == 0))\r
- {\r
- EcuM_OnExitRun(); /** @req EcuM2865 */\r
- enter_post_run_mode();/** @req EcuM2865 */\r
- /*lint --e(904)*/ return;\r
- }\r
- break;\r
- case ECUM_STATE_APP_POST_RUN:\r
- if (hasRunRequests())\r
- {\r
- EcuM_enter_run_mode(); /** @req EcuM2866 */\r
- /*lint --e(904)*/ return;\r
- }\r
+static inline void in_state_appPostRun(void){\r
+ if (hasRunRequests()){\r
+ internal_data.current_state = ECUM_STATE_APP_RUN;/** @req EcuM2866 */ /** @req EcuM2308 */\r
+ EcuM_OnEnterRUN(); /** @req EcuM2308 */\r
+ //TODO: Call ComM_EcuM_RunModeIndication(NetworkHandleType Channel) for all channels that have requested run.\r
+ internal_data_run_state_timeout = internal_data.config->EcuMRunMinimumDuration / ECUM_MAIN_FUNCTION_PERIOD; /** @req EcuM2310 */\r
\r
- if (!hasPostRunRequests())\r
- {\r
- EcuM_OnExitPostRun(); /** @req EcuM2761 */\r
- enter_prep_shutdown_mode();/** @req EcuM2761 */\r
- /*lint --e(904)*/ return;\r
- }\r
- break;\r
- case ECUM_STATE_PREP_SHUTDOWN:\r
+ } else if (!hasPostRunRequests()){\r
+ EcuM_OnExitPostRun(); /** @req EcuM2761 */\r
+ internal_data.current_state = ECUM_STATE_PREP_SHUTDOWN;/** @req EcuM2761 */\r
+\r
+ EcuM_OnPrepShutdown();\r
+ }\r
+}\r
+\r
+static inline void in_state_prepShutdown(void){\r
#if defined(USE_DEM)\r
- // DEM shutdown\r
- Dem_Shutdown();\r
+ // DEM shutdown\r
+ Dem_Shutdown();\r
#endif\r
\r
- // Switch shutdown mode\r
- if ((internal_data.shutdown_target == ECUM_STATE_OFF) || (internal_data.shutdown_target == ECUM_STATE_RESET)) {\r
+ // Switch shutdown mode\r
+ switch(internal_data.shutdown_target){\r
+ //If in state Off or Reset go into Go_Off_One:\r
+ case ECUM_STATE_OFF:\r
+ case ECUM_STATE_RESET:\r
enter_go_off_one_mode();\r
- }\r
-\r
- if (internal_data.shutdown_target == ECUM_STATE_SLEEP) {\r
+ break;\r
+ case ECUM_STATE_SLEEP:\r
enter_go_sleep_mode();\r
- }\r
- break;\r
- case ECUM_STATE_GO_OFF_ONE:\r
+ break;\r
+ default:\r
+ //TODO: Report error.\r
+ break;\r
+ }\r
+}\r
+\r
+static inline void in_state_goOffOne(void){\r
#if defined(USE_NVM)\r
if (internal_data_go_off_one_state_timeout){\r
internal_data_go_off_one_state_timeout--;\r
}\r
-\r
// Wait for the NVM job (NvmWriteAll) to terminate\r
NvM_GetErrorStatus(0, &writeAllResult);\r
- if ((writeAllResult != NVM_REQ_PENDING) || (internal_data_go_off_one_state_timeout == 0))\r
- {\r
+ if ((writeAllResult != NVM_REQ_PENDING) || (internal_data_go_off_one_state_timeout == 0)){\r
ShutdownOS(E_OK);\r
}\r
#else\r
ShutdownOS(E_OK);\r
#endif\r
- break;\r
- case ECUM_STATE_GO_SLEEP:\r
- // TODO: Fill out\r
- break;\r
- default:\r
- //TODO: Do something if the state does not belong to main at all?\r
- break;\r
}\r
\r
+\r
+//----- MAIN -----------------------------------------------------------------------------------------------------------------\r
+void EcuM_MainFunction(void){\r
+ VALIDATE_NO_RV(internal_data.initiated, ECUM_MAINFUNCTION_ID, ECUM_E_NOT_INITIATED);\r
+\r
+ switch(internal_data.current_state){\r
+\r
+ case ECUM_STATE_APP_RUN:\r
+ in_state_appRun();\r
+ break;\r
+ case ECUM_STATE_APP_POST_RUN:\r
+ in_state_appPostRun();\r
+ break;\r
+ case ECUM_STATE_PREP_SHUTDOWN:\r
+ in_state_prepShutdown();\r
+ break;\r
+ case ECUM_STATE_GO_OFF_ONE:\r
+ in_state_goOffOne();\r
+ break;\r
+ case ECUM_STATE_GO_SLEEP:\r
+ // TODO: Fill out\r
+ break;\r
+ default:\r
+ //TODO: Report error.\r
+ break;\r
+ }\r
}\r