]> rtime.felk.cvut.cz Git - arc.git/blob - system/EcuM/EcuM_Main.c
Merge in from arm-cm3
[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 \r
17 \r
18 \r
19 \r
20 \r
21 \r
22 \r
23 #include "EcuM.h"\r
24 #include "EcuM_Cbk.h"\r
25 #include "EcuM_Internals.h"\r
26 #if defined(USE_DEM)\r
27 #include "Dem.h"\r
28 #endif\r
29 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
30 #include "Nvm.h"\r
31 #endif\r
32 \r
33 static uint32 internal_data_run_state_timeout = 0;\r
34 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
35 static uint32 internal_data_go_off_one_state_timeout = 0;\r
36 #endif\r
37 \r
38 \r
39 \r
40 inline void EcuM_enter_run_mode(void)\r
41 {\r
42         internal_data.current_state = ECUM_STATE_APP_RUN;\r
43         EcuM_OnEnterRUN();\r
44         internal_data_run_state_timeout = internal_data.config->EcuMRunSelfRequestPeriod / ECUM_MAIN_FUNCTION_PERIOD;\r
45 }\r
46 \r
47 static inline void enter_post_run_mode(void)\r
48 {\r
49         internal_data.current_state = ECUM_STATE_APP_POST_RUN;\r
50 }\r
51 \r
52 static inline void enter_prep_shutdown_mode(void)\r
53 {\r
54         internal_data.current_state = ECUM_STATE_PREP_SHUTDOWN;\r
55         EcuM_OnPrepShutdown();\r
56 }\r
57 \r
58 static inline void enter_go_sleep_mode(void)\r
59 {\r
60         internal_data.current_state = ECUM_STATE_GO_SLEEP;\r
61         void EcuM_OnGoSleep();\r
62 }\r
63 \r
64 static inline void enter_go_off_one_mode(void)\r
65 {\r
66         internal_data.current_state = ECUM_STATE_GO_OFF_ONE;\r
67         EcuM_OnGoOffOne();\r
68 \r
69 #if defined(USE_COMM)\r
70         ComM_DeInit();\r
71 #endif\r
72 \r
73 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
74 \r
75         // Start NvM_WriteAll and timeout timer\r
76         NvM_WriteAll();\r
77 \r
78         internal_data_go_off_one_state_timeout = internal_data.config->EcuMNvramWriteAllTimeout / ECUM_MAIN_FUNCTION_PERIOD;\r
79 #endif\r
80 }\r
81 \r
82 static inline boolean hasRunRequests(void)\r
83 {\r
84         boolean result = internal_data.run_requests;\r
85 \r
86 #if defined(USE_COMM)\r
87         result |= internal_data.run_comm_requests;\r
88 #endif\r
89 \r
90         return (result != 0);\r
91 }\r
92 \r
93 static inline boolean hasPostRunRequests(void)\r
94 {\r
95         return (internal_data.postrun_requests != 0);\r
96 }\r
97 \r
98 void EcuM_MainFunction(void)\r
99 {\r
100 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
101 static NvM_RequestResultType writeAllResult;\r
102 #endif\r
103 \r
104 VALIDATE_NO_RV(internal_data.initiated, ECUM_MAINFUNCTION_ID, ECUM_E_NOT_INITIATED);\r
105 \r
106         if (internal_data.current_state == ECUM_STATE_APP_RUN)\r
107         {\r
108                 if (internal_data_run_state_timeout)\r
109                         internal_data_run_state_timeout--;\r
110 \r
111                 if (!hasRunRequests() && (internal_data_run_state_timeout == 0))\r
112                 {\r
113                         EcuM_OnExitRun();       // ECUM_2865\r
114                         enter_post_run_mode();\r
115                         return;\r
116                 }\r
117         }\r
118 \r
119         if (internal_data.current_state == ECUM_STATE_APP_POST_RUN)\r
120         {\r
121                 if (hasRunRequests())\r
122                 {\r
123                         EcuM_enter_run_mode(); // ECUM_2866\r
124                         return;\r
125                 }\r
126 \r
127                 if (!hasPostRunRequests())\r
128                 {\r
129                         EcuM_OnExitPostRun(); // ECUM_2761\r
130                         enter_prep_shutdown_mode();\r
131                         return;\r
132                 }\r
133         }\r
134 \r
135         if (internal_data.current_state == ECUM_STATE_PREP_SHUTDOWN)\r
136         {\r
137 #if defined(USE_DEM)\r
138                 // DEM shutdown\r
139                 Dem_Shutdown();\r
140 #endif\r
141 \r
142                 // Switch shutdown mode\r
143                 if ((internal_data.shutdown_target == ECUM_STATE_OFF) || (internal_data.shutdown_target == ECUM_STATE_RESET)) {\r
144                         enter_go_off_one_mode();\r
145                 }\r
146 \r
147                 if (internal_data.shutdown_target == ECUM_STATE_SLEEP) {\r
148                         enter_go_sleep_mode();\r
149                 }\r
150         }\r
151 \r
152         if (internal_data.current_state == ECUM_STATE_GO_OFF_ONE)\r
153         {\r
154 #if     (ECUM_INCLUDE_NVRAM_MGR == STD_ON)\r
155                 if (internal_data_go_off_one_state_timeout)\r
156                         internal_data_go_off_one_state_timeout--;\r
157 \r
158                 // Wait for the NVM job (NvmWriteAll) to terminate\r
159                 NvM_GetErrorStatus(0, &writeAllResult);\r
160                 if ((writeAllResult != NVM_REQ_PENDING) || (internal_data_go_off_one_state_timeout == 0))\r
161                 {\r
162                         ShutdownOS(E_OK);\r
163                 }\r
164 #else\r
165                 ShutdownOS(E_OK);\r
166 #endif\r
167         }\r
168 \r
169         if (internal_data.current_state == ECUM_STATE_GO_SLEEP)\r
170         {\r
171                 // TODO: Fill out\r
172         }\r
173 \r
174 }\r