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