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