]> rtime.felk.cvut.cz Git - arc.git/blob - system/EcuM/EcuM.c
Merged in from osek-ctest
[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 \r
17 \r
18 \r
19 \r
20 \r
21 \r
22 \r
23 #include "EcuM.h"\r
24 #include "Modules.h"\r
25 #include "string.h"\r
26 #include "Os.h"\r
27 #include "EcuM_Internals.h"\r
28 #include "EcuM_Cbk.h"\r
29 #include "Mcu.h"\r
30 #include "Det.h"\r
31 #include "irq.h"\r
32 \r
33 EcuM_GobalType internal_data;\r
34 \r
35 void EcuM_Init( void )\r
36 {\r
37         internal_data.current_state = ECUM_STATE_STARTUP_ONE;\r
38 \r
39         // Initialize drivers that are needed to determine PostBuild configuration\r
40         EcuM_AL_DriverInitZero();\r
41 \r
42         // Initialize the OS\r
43         InitOS();\r
44 \r
45         // Enable interrupts\r
46         Irq_Init();\r
47 \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 \r
68         internal_data.initiated = TRUE;\r
69 \r
70         // Start this baby up\r
71         StartOS(internal_data.app_mode);\r
72 }\r
73 \r
74 void EcuM_StartupTwo()\r
75 {\r
76 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
77         uint32 timer;\r
78 #endif\r
79 \r
80         internal_data.current_state = ECUM_STATE_STARTUP_TWO;\r
81 \r
82         // Initialize the BSW scheduler\r
83         // TODO SchM_Init();\r
84 \r
85         // Initialize drivers that don't need NVRAM data\r
86         EcuM_AL_DriverInitTwo(internal_data.config);\r
87 \r
88 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
89         // Start timer to wait for NVM job to complete\r
90         timer = Os_SysTickGetTimeElapsed();\r
91 #endif\r
92 \r
93         // Prepare the system to startup RTE\r
94         // TODO EcuM_OnRTEStartup();\r
95 #if defined(USE_RTE)\r
96         Rte_Start();\r
97 #endif\r
98 \r
99 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
100         // Wait for the NVM job to terminate\r
101         while(Os_SysTickGetTimeElapsed()-timer < internal_data.config.EcuMNvramReadAllTimeout)\r
102         {\r
103                 //TODO\r
104         }\r
105 #endif\r
106 \r
107         // Initialize drivers that need NVRAM data\r
108         EcuM_AL_DriverInitThree(internal_data.config);\r
109 \r
110         // Indicate mode change to RTE\r
111         // TODO\r
112 }\r
113 \r
114 // Typically called from OS shutdown hook\r
115 void EcuM_Shutdown()\r
116 {\r
117         internal_data.current_state = ECUM_STATE_GO_OFF_TWO;\r
118 \r
119         // Let the last drivers do a nice shutdown\r
120         EcuM_OnGoOffTwo();\r
121 \r
122         if (internal_data.shutdown_target == ECUM_STATE_OFF)\r
123         {\r
124                 EcuM_AL_SwitchOff();\r
125         }\r
126         else\r
127         {\r
128 #if (MCU_PERFORM_RESET_API == STD_ON)\r
129                 Mcu_PerformReset();\r
130 #else\r
131                 for(;;);\r
132 #endif\r
133         }\r
134 }\r
135 \r
136 Std_ReturnType EcuM_GetState(EcuM_StateType* state)\r
137 {\r
138 #if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
139         if (state == NULL)\r
140         {\r
141                 Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETSTATE_ID, ECUM_E_NULL_POINTER);\r
142                 return E_NOT_OK;\r
143         }\r
144 #endif\r
145 \r
146         *state = internal_data.current_state;\r
147 \r
148         return E_OK;\r
149 }\r
150 \r
151 Std_ReturnType EcuM_SelectApplicationMode(AppModeType appMode)\r
152 {\r
153 #if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
154         if (!internal_data.initiated)\r
155         {\r
156                 Det_ReportError(MODULE_ID_ECUM, 1, ECUM_SELECTAPPMODE_ID, ECUM_E_NOT_INITIATED);\r
157                 return E_NOT_OK;\r
158         }\r
159 #endif\r
160 \r
161         // TODO Save this application mode for next startup\r
162 \r
163         return E_NOT_OK;\r
164 }\r
165 \r
166 Std_ReturnType EcuM_GetApplicationMode(AppModeType* appMode)\r
167 {\r
168 #if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
169         if (!internal_data.initiated)\r
170         {\r
171                 Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETAPPMODE_ID, ECUM_E_NOT_INITIATED);\r
172                 return E_NOT_OK;\r
173         }\r
174 \r
175         if (appMode == NULL)\r
176         {\r
177                 Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GETAPPMODE_ID, ECUM_E_NULL_POINTER);\r
178                 return E_NOT_OK;\r
179         }\r
180 #endif\r
181 \r
182         *appMode = internal_data.app_mode;\r
183 \r
184         return E_OK;\r
185 }\r
186 \r
187 Std_ReturnType EcuM_SelectBootTarget(EcuM_BootTargetType target)\r
188 {\r
189 #if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
190         if (!internal_data.initiated)\r
191         {\r
192                 Det_ReportError(MODULE_ID_ECUM, 1, ECUM_SELECT_BOOTARGET_ID, ECUM_E_NOT_INITIATED);\r
193                 return E_NOT_OK;\r
194         }\r
195 #endif\r
196 \r
197         // TODO Do something great here\r
198 \r
199         return E_NOT_OK;\r
200 }\r
201 \r
202 Std_ReturnType EcuM_GetBootTarget(EcuM_BootTargetType* target)\r
203 {\r
204 #if (ECUM_DEV_ERROR_DETECT == STD_ON)\r
205         if (!internal_data.initiated)\r
206         {\r
207                 Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GET_BOOTARGET_ID, ECUM_E_NOT_INITIATED);\r
208                 return E_NOT_OK;\r
209         }\r
210 \r
211         if (target == NULL)\r
212         {\r
213                 Det_ReportError(MODULE_ID_ECUM, 1, ECUM_GET_BOOTARGET_ID, ECUM_E_NULL_POINTER);\r
214                 return E_NOT_OK;\r
215         }\r
216 #endif\r
217 \r
218         // TODO Return selected boot target here\r
219 \r
220         return E_NOT_OK;\r
221 }\r