]> rtime.felk.cvut.cz Git - arc.git/blob - system/EcuM/EcuM_Main.c
Merged in from lint
[arc.git] / system / EcuM / EcuM_Main.c
1 /* -------------------------------- Arctic Core ------------------------------\r
2  * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
3  *\r
4  * Copyright (C) 2009  ArcCore AB <contact@arccore.com>\r
5  *\r
6  * This source code is free software; you can redistribute it and/or modify it\r
7  * under the terms of the GNU General Public License version 2 as published by the\r
8  * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
9  *\r
10  * This program is distributed in the hope that it will be useful, but\r
11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r
13  * for more details.\r
14  * -------------------------------- Arctic Core ------------------------------*/\r
15 \r
16 //lint -emacro(904,VALIDATE,VALIDATE_RV,VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
17 \r
18 #include "EcuM.h"\r
19 #include "EcuM_Cbk.h"\r
20 #include "EcuM_Internals.h"\r
21 #if defined(USE_DEM)\r
22 #include "Dem.h"\r
23 #endif\r
24 #if defined(USE_NVM)\r
25 #include "Nvm.h"\r
26 #endif\r
27 \r
28 static uint32 internal_data_run_state_timeout = 0;\r
29 #if defined(USE_NVM)\r
30 static uint32 internal_data_go_off_one_state_timeout = 0;\r
31 #endif\r
32 \r
33 \r
34 void EcuM_enter_run_mode(void)\r
35 {\r
36         internal_data.current_state = ECUM_STATE_APP_RUN;\r
37         EcuM_OnEnterRUN(); /** @req EcuM2308 */\r
38         //TODO: Call ComM_EcuM_RunModeIndication(NetworkHandleType Channel) for all channels that have requested run.\r
39         internal_data_run_state_timeout = internal_data.config->EcuMRunMinimumDuration / ECUM_MAIN_FUNCTION_PERIOD; /** @req EcuM2310 */\r
40 }\r
41 \r
42 static inline void enter_post_run_mode(void)\r
43 {\r
44         internal_data.current_state = ECUM_STATE_APP_POST_RUN;\r
45 }\r
46 \r
47 static inline void enter_prep_shutdown_mode(void)\r
48 {\r
49         internal_data.current_state = ECUM_STATE_PREP_SHUTDOWN;\r
50         EcuM_OnPrepShutdown();\r
51 }\r
52 \r
53 static inline void enter_go_sleep_mode(void)\r
54 {\r
55         internal_data.current_state = ECUM_STATE_GO_SLEEP;\r
56         EcuM_OnGoSleep();\r
57 }\r
58 \r
59 static inline void enter_go_off_one_mode(void)\r
60 {\r
61         internal_data.current_state = ECUM_STATE_GO_OFF_ONE;\r
62         EcuM_OnGoOffOne();\r
63 \r
64 #if defined(USE_COMM)\r
65         ComM_DeInit();\r
66 #endif\r
67 \r
68 #if defined(USE_NVM)\r
69 \r
70         // Start NvM_WriteAll and timeout timer\r
71         NvM_WriteAll();\r
72 \r
73         internal_data_go_off_one_state_timeout = internal_data.config->EcuMNvramWriteAllTimeout / ECUM_MAIN_FUNCTION_PERIOD;\r
74 #endif\r
75 }\r
76 \r
77 static inline boolean hasRunRequests(void)\r
78 {\r
79         uint32 result = internal_data.run_requests;\r
80 \r
81 #if defined(USE_COMM)\r
82         result |= internal_data.run_comm_requests;\r
83 #endif\r
84 \r
85         return (result != 0);\r
86 }\r
87 \r
88 static inline boolean hasPostRunRequests(void)\r
89 {\r
90         return (internal_data.postrun_requests != 0);\r
91 }\r
92 \r
93 void EcuM_MainFunction(void)\r
94 {\r
95 #if defined(USE_NVM)\r
96 static NvM_RequestResultType writeAllResult;\r
97 #endif\r
98 \r
99 VALIDATE_NO_RV(internal_data.initiated, ECUM_MAINFUNCTION_ID, ECUM_E_NOT_INITIATED);\r
100 \r
101         if (internal_data.current_state == ECUM_STATE_APP_RUN)\r
102         {\r
103                 if (internal_data_run_state_timeout)\r
104                 {\r
105                         internal_data_run_state_timeout--;\r
106                 }\r
107 \r
108                 if ((!hasRunRequests()) && (internal_data_run_state_timeout == 0))\r
109                 {\r
110                         EcuM_OnExitRun();       /** @req EcuM2865 */\r
111                         enter_post_run_mode();/** @req EcuM2865 */\r
112                         /*lint --e(904)*/ return;\r
113                 }\r
114         }\r
115 \r
116         if (internal_data.current_state == ECUM_STATE_APP_POST_RUN)\r
117         {\r
118                 if (hasRunRequests())\r
119                 {\r
120                         EcuM_enter_run_mode(); /** @req EcuM2866 */\r
121                         /*lint --e(904)*/ return;\r
122                 }\r
123 \r
124                 if (!hasPostRunRequests())\r
125                 {\r
126                         EcuM_OnExitPostRun(); /** @req EcuM2761 */\r
127                         enter_prep_shutdown_mode();/** @req EcuM2761 */\r
128                         /*lint --e(904)*/ return;\r
129                 }\r
130         }\r
131 \r
132         if (internal_data.current_state == ECUM_STATE_PREP_SHUTDOWN)\r
133         {\r
134 #if defined(USE_DEM)\r
135                 // DEM shutdown\r
136                 Dem_Shutdown();\r
137 #endif\r
138 \r
139                 // Switch shutdown mode\r
140                 if ((internal_data.shutdown_target == ECUM_STATE_OFF) || (internal_data.shutdown_target == ECUM_STATE_RESET)) {\r
141                         enter_go_off_one_mode();\r
142                 }\r
143 \r
144                 if (internal_data.shutdown_target == ECUM_STATE_SLEEP) {\r
145                         enter_go_sleep_mode();\r
146                 }\r
147         }\r
148 \r
149         if (internal_data.current_state == ECUM_STATE_GO_OFF_ONE)\r
150         {\r
151 #if defined(USE_NVM)\r
152                 if (internal_data_go_off_one_state_timeout)\r
153                         internal_data_go_off_one_state_timeout--;\r
154 \r
155                 // Wait for the NVM job (NvmWriteAll) to terminate\r
156                 NvM_GetErrorStatus(0, &writeAllResult);\r
157                 if ((writeAllResult != NVM_REQ_PENDING) || (internal_data_go_off_one_state_timeout == 0))\r
158                 {\r
159                         ShutdownOS(E_OK);\r
160                 }\r
161 #else\r
162                 ShutdownOS(E_OK);\r
163 #endif\r
164         }\r
165 \r
166         if (internal_data.current_state == ECUM_STATE_GO_SLEEP)\r
167         {\r
168                 // TODO: Fill out\r
169         }\r
170 \r
171 }\r