]> rtime.felk.cvut.cz Git - arc.git/blob - system/EcuM/EcuM_Main.c
Re-added generic callout stubs file for Dcm (with make rule).
[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 //lint -emacro(904,VALIDATE,VALIDATE_RV,VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
17 \r
18 #include "Std_Types.h"\r
19 #include "EcuM.h"\r
20 #include "EcuM_Generated_Types.h"\r
21 #include "EcuM_Internals.h"\r
22 \r
23 #if defined(USE_DEM)\r
24 #include "Dem.h"\r
25 #endif\r
26 #if defined(USE_NVM)\r
27 #include "NvM.h"\r
28 #endif\r
29 \r
30 static uint32 internal_data_run_state_timeout = 0;\r
31 #if defined(USE_NVM)\r
32 static uint32 internal_data_go_off_one_state_timeout = 0;\r
33 static NvM_RequestResultType writeAllResult;\r
34 #endif\r
35 \r
36 #ifdef CFG_ECUM_USE_SERVICE_COMPONENT\r
37 /** @req EcuM2749 */\r
38 static Rte_ModeType_EcuM_Mode currentMode;\r
39 \r
40 void set_current_state(EcuM_StateType state) {\r
41         /* Update the state */\r
42         internal_data.current_state = state;\r
43 \r
44         Rte_ModeType_EcuM_Mode newMode = currentMode;\r
45         switch( state ) {\r
46         case ECUM_STATE_WAKEUP:\r
47         case ECUM_STATE_WAKEUP_ONE:\r
48         case ECUM_STATE_WAKEUP_VALIDATION:\r
49         case ECUM_STATE_WAKEUP_REACTION:\r
50         case ECUM_STATE_WAKEUP_TWO:\r
51         case ECUM_STATE_SLEEP:\r
52         case ECUM_STATE_SHUTDOWN:\r
53                 newMode = RTE_MODE_EcuM_Mode_SLEEP;\r
54                 break;\r
55         case ECUM_STATE_GO_SLEEP:\r
56                 if( internal_data.shutdown_target == ECUM_STATE_SLEEP ) {\r
57                         newMode = RTE_MODE_EcuM_Mode_SLEEP; /** @req EcuM2752 */\r
58                 }\r
59                 break;\r
60         case ECUM_STATE_GO_OFF_ONE:\r
61         case ECUM_STATE_GO_OFF_TWO:\r
62                 newMode = RTE_MODE_EcuM_Mode_SHUTDOWN;\r
63                 break;\r
64         case ECUM_STATE_WAKEUP_TTII:\r
65                 if( internal_data.shutdown_target == ECUM_STATE_SLEEP ) {\r
66                         newMode = RTE_MODE_EcuM_Mode_WAKE_SLEEP; /** @req EcuM2752 */\r
67                 }\r
68                 break;\r
69         case ECUM_STATE_PREP_SHUTDOWN:\r
70         case ECUM_STATE_APP_POST_RUN: /* Assuming this is same as RUN_III */\r
71                 newMode = RTE_MODE_EcuM_Mode_POST_RUN;\r
72                 break;\r
73         case ECUM_STATE_APP_RUN: /* Assuming this is same as RUN_II */\r
74                 newMode = RTE_MODE_EcuM_Mode_RUN;\r
75                 break;\r
76         case ECUM_STATE_STARTUP_TWO:\r
77                 newMode = RTE_MODE_EcuM_Mode_STARTUP;\r
78                 break;\r
79         default:\r
80                 /* Do nothing */\r
81                 break;\r
82         }\r
83 \r
84         if( newMode != currentMode ) {\r
85                 currentMode = newMode;\r
86                 Rte_Switch_EcuM_CurrentMode_currentMode(currentMode); /** @req EcuM2750 */\r
87         }\r
88 }\r
89 #endif\r
90 \r
91 \r
92 void EcuM_enter_run_mode(void){\r
93         set_current_state(ECUM_STATE_APP_RUN);\r
94         EcuM_OnEnterRUN(); /** @req EcuM2308 */\r
95         //TODO: Call ComM_EcuM_RunModeIndication(NetworkHandleType Channel) for all channels that have requested run.\r
96         internal_data_run_state_timeout = internal_data.config->EcuMRunMinimumDuration / ECUM_MAIN_FUNCTION_PERIOD; /** @req EcuM2310 */\r
97 }\r
98 \r
99 \r
100 //--------- Local functions ------------------------------------------------------------------------------------------------\r
101 \r
102 static inline void enter_go_sleep_mode(void){\r
103         set_current_state(ECUM_STATE_GO_SLEEP);\r
104         EcuM_OnGoSleep();\r
105 }\r
106 \r
107 static inline void enter_go_off_one_mode(void){\r
108         set_current_state(ECUM_STATE_GO_OFF_ONE);\r
109         EcuM_OnGoOffOne();\r
110 \r
111 #if defined(USE_COMM)\r
112         ComM_DeInit();\r
113 #endif\r
114 \r
115 #if defined(USE_NVM)\r
116 \r
117         // Start NvM_WriteAll and timeout timer\r
118         NvM_WriteAll();\r
119 \r
120         internal_data_go_off_one_state_timeout = internal_data.config->EcuMNvramWriteAllTimeout / ECUM_MAIN_FUNCTION_PERIOD;\r
121 #endif\r
122 }\r
123 \r
124 \r
125 static inline boolean hasRunRequests(void){\r
126         uint32 result = internal_data.run_requests;\r
127 \r
128 #if defined(USE_COMM)\r
129         result |= internal_data.run_comm_requests;\r
130 #endif\r
131 \r
132         return (result != 0);\r
133 }\r
134 \r
135 static inline boolean hasPostRunRequests(void){\r
136         return (internal_data.postrun_requests != 0);\r
137 }\r
138 \r
139 \r
140 \r
141 static inline void in_state_appRun(void){\r
142         if (internal_data_run_state_timeout){\r
143                 internal_data_run_state_timeout--;\r
144         }\r
145 \r
146         if ((!hasRunRequests()) && (internal_data_run_state_timeout == 0)){\r
147                 EcuM_OnExitRun();       /** @req EcuM2865 */\r
148                 set_current_state(ECUM_STATE_APP_POST_RUN);/** @req EcuM2865 */\r
149         }\r
150 }\r
151 \r
152 \r
153 static inline void in_state_appPostRun(void){\r
154         if (hasRunRequests()){\r
155                 set_current_state(ECUM_STATE_APP_RUN);/** @req EcuM2866 */ /** @req EcuM2308 */\r
156                 EcuM_OnEnterRUN(); /** @req EcuM2308 */\r
157                 //TODO: Call ComM_EcuM_RunModeIndication(NetworkHandleType Channel) for all channels that have requested run.\r
158                 internal_data_run_state_timeout = internal_data.config->EcuMRunMinimumDuration / ECUM_MAIN_FUNCTION_PERIOD; /** @req EcuM2310 */\r
159 \r
160         } else if (!hasPostRunRequests()){\r
161                 EcuM_OnExitPostRun(); /** @req EcuM2761 */\r
162                 set_current_state(ECUM_STATE_PREP_SHUTDOWN);/** @req EcuM2761 */\r
163 \r
164                 EcuM_OnPrepShutdown();\r
165         } else {\r
166                 // TODO: Do something?\r
167         }\r
168 }\r
169 \r
170 static inline void in_state_prepShutdown(void){\r
171 #if defined(USE_DEM)\r
172         // DEM shutdown\r
173         Dem_Shutdown();\r
174 #endif\r
175 \r
176         // Switch shutdown mode\r
177         switch(internal_data.shutdown_target){\r
178                 //If in state Off or Reset go into Go_Off_One:\r
179                 case ECUM_STATE_OFF:\r
180                 case ECUM_STATE_RESET:\r
181                         enter_go_off_one_mode();\r
182                         break;\r
183                 case ECUM_STATE_SLEEP:\r
184                         enter_go_sleep_mode();\r
185                         break;\r
186                 default:\r
187                         //TODO: Report error.\r
188                         break;\r
189         }\r
190 }\r
191 \r
192 static inline void in_state_goOffOne(void){\r
193 #if defined(USE_NVM)\r
194                 if (internal_data_go_off_one_state_timeout){\r
195                         internal_data_go_off_one_state_timeout--;\r
196                 }\r
197                 // Wait for the NVM job (NvmWriteAll) to terminate\r
198                 NvM_GetErrorStatus(0, &writeAllResult);\r
199                 if ((writeAllResult != NVM_REQ_PENDING) || (internal_data_go_off_one_state_timeout == 0)){\r
200                         ShutdownOS(E_OK);\r
201                 }\r
202 #else\r
203                 ShutdownOS(E_OK);\r
204 #endif\r
205 }\r
206 \r
207 \r
208 //----- MAIN -----------------------------------------------------------------------------------------------------------------\r
209 void EcuM_MainFunction(void){\r
210         VALIDATE_NO_RV(internal_data.initiated, ECUM_MAINFUNCTION_ID, ECUM_E_NOT_INITIATED);\r
211 \r
212         switch(internal_data.current_state){\r
213 \r
214                 case ECUM_STATE_APP_RUN:\r
215                         in_state_appRun();\r
216                         break;\r
217                 case ECUM_STATE_APP_POST_RUN:\r
218                         in_state_appPostRun();\r
219                         break;\r
220                 case ECUM_STATE_PREP_SHUTDOWN:\r
221                         in_state_prepShutdown();\r
222                         break;\r
223                 case ECUM_STATE_GO_OFF_ONE:\r
224                         in_state_goOffOne();\r
225                         break;\r
226                 case ECUM_STATE_GO_SLEEP:\r
227                         // TODO: Fill out\r
228                         break;\r
229                 default:\r
230                         //TODO: Report error.\r
231                         break;\r
232         }\r
233 }\r