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