]> rtime.felk.cvut.cz Git - arc.git/blob - system/EcuM/EcuM.c
Added include of Rte_Main.h in EcuM.c
[arc.git] / system / EcuM / EcuM.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 "Modules.h"\r
20 #include <string.h>\r
21 #include "Os.h"\r
22 #include "EcuM_Internals.h"\r
23 #include "EcuM_Cbk.h"\r
24 #include "Mcu.h"\r
25 #include "Det.h"\r
26 #include "irq.h"\r
27 #if defined(USE_NVM)\r
28 #include "Nvm.h"\r
29 #endif\r
30 #if defined(USE_RTE)\r
31 #include "Rte_Main.h"\r
32 #endif\r
33 \r
34 EcuM_GobalType internal_data;\r
35 \r
36 void EcuM_Init( void )\r
37 {\r
38         internal_data.current_state = ECUM_STATE_STARTUP_ONE;\r
39 \r
40         // Initialize drivers that are needed to determine PostBuild configuration\r
41         EcuM_AL_DriverInitZero();\r
42 \r
43         // Initialize the OS\r
44         InitOS();\r
45 \r
46         // Enable interrupts\r
47         Irq_Init();\r
48 \r
49         // Determine PostBuild configuration\r
50         internal_data.config = EcuM_DeterminePbConfiguration();\r
51 \r
52         // Check consistency of PB configuration\r
53         // TODO\r
54 \r
55         // Initialize drivers needed before the OS-starts\r
56         EcuM_AL_DriverInitOne(internal_data.config);\r
57 \r
58         // Determine the reset/wakeup reason\r
59         // TODO Mcu_ResetType type = Mcu_GetResetReason();\r
60 \r
61         // Set default shutdown target\r
62         internal_data.shutdown_target = internal_data.config->EcuMDefaultShutdownTarget;\r
63         internal_data.shutdown_mode = internal_data.config->EcuMDefaultShutdownMode;\r
64 \r
65         // Set default application mode\r
66         internal_data.app_mode = internal_data.config->EcuMDefaultAppMode;\r
67 #if defined(USE_COMM)\r
68         internal_data.run_comm_requests = 0;\r
69 #endif\r
70         internal_data.run_requests = 0;\r
71         internal_data.postrun_requests = 0;\r
72 \r
73         internal_data.initiated = TRUE;\r
74 \r
75         // Start this baby up\r
76         StartOS(internal_data.app_mode);\r
77 }\r
78 \r
79 void EcuM_StartupTwo(void)\r
80 {\r
81 #if defined(USE_NVM)\r
82         extern CounterType Os_Arc_OsTickCounter;\r
83         TickType tickTimerStart, tickTimer, tickTimerElapsed;\r
84         StatusType tickTimerStatus;\r
85         static NvM_RequestResultType readAllResult;\r
86 #endif\r
87 \r
88         internal_data.current_state = ECUM_STATE_STARTUP_TWO;\r
89 \r
90         // Initialize the BSW scheduler\r
91         // TODO SchM_Init();\r
92 \r
93         // Initialize drivers that don't need NVRAM data\r
94         EcuM_AL_DriverInitTwo(internal_data.config);\r
95 \r
96 #if defined(USE_NVM)\r
97         // Start timer to wait for NVM job to complete\r
98         tickTimerStatus = GetCounterValue(Os_Arc_OsTickCounter , &tickTimerStart);\r
99         if (tickTimerStatus != E_OK) {\r
100                 // TODO: Generate error?\r
101         }\r
102 #endif\r
103 \r
104         // Prepare the system to startup RTE\r
105         // TODO EcuM_OnRTEStartup();\r
106 #if defined(USE_RTE)\r
107         Rte_Start();\r
108 #endif\r
109 \r
110 #if defined(USE_NVM)\r
111         // Wait for the NVM job (NvmReadAll) to terminate\r
112         do {\r
113                 NvM_GetErrorStatus(0, &readAllResult);  // Read the multiblock status\r
114                 tickTimer = tickTimerStart;     // Save this because the GetElapsedCounterValue() will destroy it.\r
115                 tickTimerStatus =  GetElapsedCounterValue(Os_Arc_OsTickCounter, &tickTimer, &tickTimerElapsed);\r
116                 if (tickTimerStatus != E_OK) {\r
117                         // TODO: Generate error?\r
118                 }\r
119         } while( (readAllResult == NVM_REQ_PENDING) && (tickTimerElapsed < internal_data.config->EcuMNvramReadAllTimeout) );\r
120 #endif\r
121 \r
122         // Initialize drivers that need NVRAM data\r
123         EcuM_AL_DriverInitThree(internal_data.config);\r
124 \r
125         // Indicate mode change to RTE\r
126         // TODO\r
127 \r
128         // If coming from startup sequence, enter Run mode\r
129 //      if (internal_data.current_state == ECUM_STATE_STARTUP_TWO)\r
130                 EcuM_enter_run_mode();\r
131 \r
132 }\r
133 \r
134 // Typically called from OS shutdown hook\r
135 void EcuM_Shutdown(void)\r
136 {\r
137         internal_data.current_state = ECUM_STATE_GO_OFF_TWO;\r
138 \r
139         // Let the last drivers do a nice shutdown\r
140         EcuM_OnGoOffTwo();\r
141 \r
142         if (internal_data.shutdown_target == ECUM_STATE_OFF)\r
143         {\r
144                 EcuM_AL_SwitchOff();\r
145         }\r
146         else\r
147         {\r
148 #if (MCU_PERFORM_RESET_API == STD_ON)\r
149                 Mcu_PerformReset();\r
150 #else\r
151                 for(;;)\r
152                 {\r
153                   ;\r
154                 }\r
155 #endif\r
156         }\r
157 }\r
158 \r
159 Std_ReturnType EcuM_GetState(EcuM_StateType* state)\r
160 {\r
161         VALIDATE_RV(state != NULL, ECUM_GETSTATE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
162 \r
163         *state = internal_data.current_state;\r
164 \r
165         return E_OK;\r
166 }\r
167 \r
168 Std_ReturnType EcuM_SelectApplicationMode(AppModeType appMode)\r
169 {\r
170         VALIDATE_RV(internal_data.initiated, ECUM_SELECTAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
171 \r
172         // TODO Save this application mode for next startup\r
173         (void) appMode;\r
174 \r
175         return E_NOT_OK;\r
176 }\r
177 \r
178 Std_ReturnType EcuM_GetApplicationMode(AppModeType* appMode)\r
179 {\r
180         VALIDATE_RV(internal_data.initiated, ECUM_GETAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
181         VALIDATE_RV(appMode != NULL, ECUM_GETAPPMODE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
182 \r
183         *appMode = internal_data.app_mode;\r
184 \r
185         return E_OK;\r
186 }\r
187 \r
188 Std_ReturnType EcuM_SelectBootTarget(EcuM_BootTargetType target)\r
189 {\r
190         VALIDATE_RV(internal_data.initiated, ECUM_SELECT_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
191 \r
192         // TODO Do something great here\r
193         (void) target;\r
194 \r
195         return E_NOT_OK;\r
196 }\r
197 \r
198 Std_ReturnType EcuM_GetBootTarget(EcuM_BootTargetType* target)\r
199 {\r
200         VALIDATE_RV(internal_data.initiated, ECUM_GET_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
201         VALIDATE_RV(target != NULL, ECUM_GET_BOOTARGET_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
202 \r
203         // TODO Return selected boot target here\r
204         (void) target;\r
205 \r
206         return E_NOT_OK;\r
207 }\r
208 \r
209 \r
210 Std_ReturnType EcuM_SelectShutdownTarget(EcuM_StateType target, uint8 mode)\r
211 {\r
212         VALIDATE_RV(internal_data.initiated, ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
213         VALIDATE_RV((target == ECUM_STATE_OFF) || (target == ECUM_STATE_RESET) || (target == ECUM_STATE_SLEEP), ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
214 \r
215         internal_data.shutdown_target = target;\r
216         internal_data.shutdown_mode = mode;\r
217 \r
218         return E_OK;\r
219 }\r
220 \r
221 \r
222 Std_ReturnType EcuM_GetShutdownTarget(EcuM_StateType *target, uint8 *mode)\r
223 {\r
224         VALIDATE_RV(internal_data.initiated, ECUM_GETSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
225 \r
226         *target = internal_data.shutdown_target;\r
227         *mode = internal_data.shutdown_mode;\r
228 \r
229         return E_OK;\r
230 }\r
231 \r
232 \r
233 Std_ReturnType EcuM_RequestRUN(EcuM_UserType user)\r
234 {\r
235         VALIDATE_RV(internal_data.initiated, ECUM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
236         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
237 \r
238         internal_data.run_requests |= (uint32)1 << user;\r
239 \r
240         return E_OK;\r
241 }\r
242 \r
243 Std_ReturnType EcuM_ReleaseRUN(EcuM_UserType user)\r
244 {\r
245         VALIDATE_RV(internal_data.initiated, ECUM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
246         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
247 \r
248         internal_data.run_requests &= ~((uint32)1 << user);\r
249 \r
250         return E_OK;\r
251 }\r
252 \r
253 #if defined(USE_COMM)\r
254 Std_ReturnType EcuM_ComM_RequestRUN(NetworkHandleType user)\r
255 {\r
256         VALIDATE_RV(internal_data.initiated, ECUM_COMM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
257         VALIDATE_RV(user < 32, ECUM_COMM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
258 \r
259         internal_data.run_comm_requests |= (uint32)1 << user;\r
260 \r
261         return E_OK;\r
262 }\r
263 \r
264 Std_ReturnType EcuM_ComM_ReleaseRUN(NetworkHandleType user)\r
265 {\r
266         VALIDATE_RV(internal_data.initiated, ECUM_COMM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
267         VALIDATE_RV(user < 32, ECUM_COMM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
268 \r
269         internal_data.run_comm_requests &= ~((uint32)1 << user);\r
270 \r
271         return E_OK;\r
272 }\r
273 \r
274 boolean EcuM_ComM_HasRequestedRUN(NetworkHandleType user)\r
275 {\r
276         VALIDATE_RV(internal_data.initiated, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
277         VALIDATE_RV(user < 32, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
278 \r
279         return (internal_data.run_comm_requests &((uint32)1 << user)) != 0;\r
280 }\r
281 #endif\r
282 \r
283 Std_ReturnType EcuM_RequestPOST_RUN(EcuM_UserType user)\r
284 {\r
285         VALIDATE_RV(internal_data.initiated, ECUM_REQUESTPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
286         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
287 \r
288         internal_data.postrun_requests |= (uint32)1 << user;\r
289 \r
290         return E_OK;\r
291 }\r
292 \r
293 Std_ReturnType EcuM_ReleasePOST_RUN(EcuM_UserType user)\r
294 {\r
295         VALIDATE_RV(internal_data.initiated, ECUM_RELEASEPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
296         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASEPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
297 \r
298         internal_data.postrun_requests &= ~((uint32)1 << user);\r
299 \r
300         return E_OK;\r
301 }\r
302 \r