]> rtime.felk.cvut.cz Git - arc.git/blob - communication/Lin/LinSM.c
8124f087981403e0bc8278f1e74758975e0312b5
[arc.git] / communication / Lin / LinSM.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 "Std_Types.h"\r
24 #include "LinIf.h"\r
25 #include "LinSM.h"\r
26 #include "LinSM_Cfg.h"\r
27 #include "Lin_Cfg.h"\r
28 #include "LinSM_Cbk.h"\r
29 #include "LinIf_Types.h"\r
30 #if defined(USE_COM)\r
31 #include "Com.h"\r
32 #endif\r
33 #include "ComM_Types.h"\r
34 #include "ComStack_Types.h"\r
35 #include "Com_Types.h"\r
36 #include "ComM_BusSm.h"\r
37 #include "Det.h"\r
38 #include "Mcu.h"\r
39 #include <stdlib.h>\r
40 #include <string.h>\r
41 \r
42 /* Development error macros. */\r
43 #if ( LINSM_DEV_ERROR_DETECT == STD_ON )\r
44 #define VALIDATE(_exp,_api,_err ) \\r
45         if( !(_exp) ) { \\r
46           Det_ReportError(MODULE_ID_LINSM,0,_api,_err); \\r
47           return; \\r
48         }\r
49 \r
50 #define VALIDATE_W_RV(_exp,_api,_err,_rv ) \\r
51         if( !(_exp) ) { \\r
52           Det_ReportError(MODULE_ID_LINSM,0,_api,_err); \\r
53           return (_rv); \\r
54         }\r
55 #else\r
56 #define VALIDATE(_exp,_api,_err )\r
57 #define VALIDATE_W_RV(_exp,_api,_err,_rv )\r
58 #endif\r
59 \r
60 static uint8 ScheduleRequestTimer[LINIF_CONTROLLER_CNT];\r
61 static uint8 GoToSleepTimer[LINIF_CONTROLLER_CNT];\r
62 static uint8 WakeUpTimer[LINIF_CONTROLLER_CNT];\r
63 \r
64 static LinSM_StatusType LinSMStatus = LINSM_UNINIT;\r
65 static LinSM_StatusType LinSMChannelStatus[LINIF_CONTROLLER_CNT];\r
66 \r
67 void LinSM_Init(const void* ConfigPtr)\r
68 {\r
69     (void)ConfigPtr;\r
70         uint8 i;\r
71 \r
72         for (i=0; i<LINIF_CONTROLLER_CNT; i++)\r
73         {\r
74                 LinSMChannelStatus[i] = LINSM_NO_COM;\r
75                 ScheduleRequestTimer[i] = 0;\r
76                 GoToSleepTimer[i] = 0;\r
77                 WakeUpTimer[i] = 0;\r
78         }\r
79 \r
80         LinIf_Init(0);\r
81         LinSMStatus = LINSM_INIT;\r
82 }\r
83 \r
84 void LinSM_DeInit()\r
85 {\r
86         LinIf_DeInit();\r
87         LinSMStatus = LINSM_UNINIT;\r
88 }\r
89 \r
90 Std_ReturnType LinSM_ScheduleRequest(NetworkHandleType channel,LinIf_SchHandleType schedule)\r
91 {\r
92         VALIDATE_W_RV( (LinSMStatus != LINSM_UNINIT), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_UNINIT, E_NOT_OK);\r
93         VALIDATE_W_RV( (channel < LINIF_CONTROLLER_CNT), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL, E_NOT_OK);\r
94         VALIDATE_W_RV( (LinSMChannelStatus[channel] == LINSM_RUN_SCHEDULE), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_NOT_IN_RUN_SCHEDULE, E_NOT_OK);\r
95         VALIDATE_W_RV( (schedule < LINIF_SCH_CNT), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_PARAMETER, E_NOT_OK);\r
96 \r
97         ScheduleRequestTimer[channel]=LINSM_SCHEDULE_REQUEST_TIMEOUT;\r
98         return LinIf_ScheduleRequest(channel, schedule);\r
99 }\r
100 \r
101 Std_ReturnType LinSM_GetCurrentComMode(NetworkHandleType network,ComM_ModeType* mode)\r
102 {\r
103         VALIDATE_W_RV( (LinSMStatus != LINSM_UNINIT), LINSM_GET_CURRENT_COM_MODE_SERVICE_ID, LINSM_E_UNINIT, E_NOT_OK);\r
104         VALIDATE_W_RV( (network < LINIF_CONTROLLER_CNT), LINSM_GET_CURRENT_COM_MODE_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL, E_NOT_OK);\r
105         VALIDATE_W_RV( (mode != NULL), LINSM_GET_CURRENT_COM_MODE_SERVICE_ID, LINSM_E_PARAMETER_POINTER, E_NOT_OK);\r
106 \r
107         switch (LinSMChannelStatus[network])\r
108         {\r
109         case LINSM_RUN_SCHEDULE:\r
110                 *mode= COMM_FULL_COMMUNICATION;\r
111                 break;\r
112         default:\r
113                 *mode= COMM_NO_COMMUNICATION;\r
114                 break;\r
115         }\r
116         return E_OK;\r
117 }\r
118 \r
119 Std_ReturnType LinSM_RequestComMode(NetworkHandleType network,ComM_ModeType mode)\r
120 {\r
121         Std_ReturnType res = E_NOT_OK;\r
122         VALIDATE_W_RV( (LinSMStatus != LINSM_UNINIT), LINSM_REQUEST_COM_MODE_SERVICE_ID, LINSM_E_UNINIT, E_NOT_OK);\r
123         VALIDATE_W_RV( (network < LINIF_CONTROLLER_CNT), LINSM_REQUEST_COM_MODE_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL, E_NOT_OK);\r
124 \r
125         switch(mode)\r
126         {\r
127                 case COMM_NO_COMMUNICATION:\r
128                         if (E_OK == LinIf_GotoSleep(network)){\r
129                                 LinSMChannelStatus[network] = LINSM_GOTO_SLEEP;\r
130                                 GoToSleepTimer[network]=LINSM_GOTO_SLEEP_TIMEOUT;\r
131                                 res = E_OK;\r
132                         }\r
133                         break;\r
134                 case COMM_SILENT_COMMUNICATION:\r
135                         // Standard say nothing about this case.\r
136                         break;\r
137                 case COMM_FULL_COMMUNICATION:\r
138                         WakeUpTimer[network]=LINSM_WAKEUP_TIMEOUT; //should be done here since some implementations will confirm immediatly\r
139                         if (E_OK == LinIf_WakeUp(network)){\r
140                                 res = E_OK;\r
141                         }\r
142                         else\r
143                         {\r
144                                 WakeUpTimer[network]=0;\r
145                         }\r
146                         break;\r
147                 default:\r
148                         break;\r
149         }\r
150         return res;\r
151 }\r
152 \r
153 void LinSM_ScheduleRequest_Confirmation(NetworkHandleType channel){\r
154         Com_PduGroupIdType IpduGroupId = 0;\r
155         VALIDATE( (LinSMStatus != LINSM_UNINIT), LINSM_SCHEDULE_REQUEST_CONF_SERVICE_ID, LINSM_E_UNINIT);\r
156         VALIDATE( (channel < LINIF_CONTROLLER_CNT), LINSM_SCHEDULE_REQUEST_CONF_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL);\r
157 \r
158         if(ScheduleRequestTimer[channel]!=0){\r
159                 Com_IpduGroupStop(IpduGroupId);\r
160                 Com_IpduGroupStart(IpduGroupId,FALSE);\r
161                 ScheduleRequestTimer[channel]=0;\r
162         }\r
163 }\r
164 \r
165 void LinSM_WakeUp_Confirmation(NetworkHandleType channel,boolean success){\r
166         VALIDATE( (LinSMStatus != LINSM_UNINIT), LINSM_WAKEUP_CONF_SERVICE_ID, LINSM_E_UNINIT);\r
167         VALIDATE( (channel < LINIF_CONTROLLER_CNT), LINSM_WAKEUP_CONF_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL);\r
168 \r
169         if(TRUE == success)\r
170         {\r
171                 if(WakeUpTimer[channel]!=0){\r
172                         WakeUpTimer[channel]=0;\r
173                         ComM_BusSM_ModeIndication(channel,COMM_FULL_COMMUNICATION);\r
174                         LinSMChannelStatus[channel] = LINSM_RUN_SCHEDULE;\r
175                 }\r
176         }\r
177 }\r
178 \r
179 void LinSM_GotoSleep_Confirmation(NetworkHandleType channel,boolean success){\r
180         VALIDATE( (LinSMStatus != LINSM_UNINIT), LINSM_GOTO_SLEEP_CONF_SERVICE_ID, LINSM_E_UNINIT);\r
181         VALIDATE( (channel < LINIF_CONTROLLER_CNT), LINSM_GOTO_SLEEP_CONF_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL);\r
182 \r
183         if(TRUE == success)\r
184         {\r
185                 if(GoToSleepTimer[channel]!=0){\r
186                         GoToSleepTimer[channel]=0;\r
187                         LinSMChannelStatus[channel] = LINSM_NO_COM;\r
188                         ComM_BusSM_ModeIndication(channel,COMM_NO_COMMUNICATION);\r
189                 }\r
190         }\r
191 }\r
192 \r
193 void LinSM_TimerTick()\r
194 {\r
195         uint8 channel;\r
196         for(channel=0;channel<LINIF_CONTROLLER_CNT;channel++){\r
197                 // Check timers\r
198                 if(ScheduleRequestTimer[channel] > 0){\r
199                         ScheduleRequestTimer[channel]--;\r
200                         if(ScheduleRequestTimer[channel]==0){\r
201                                 Det_ReportError(MODULE_ID_LINSM,0,LINSM_REQUEST_COM_MODE_SERVICE_ID,LINSM_E_CONFIRMATION_TIMEOUT);\r
202                                 LinSMChannelStatus[channel] = LINSM_NO_COM;\r
203                         }\r
204                 }\r
205                 if(GoToSleepTimer[channel] > 0){\r
206                         GoToSleepTimer[channel]--;\r
207                         if(GoToSleepTimer[channel]==0){\r
208                                 Det_ReportError(MODULE_ID_LINSM,0,LINSM_REQUEST_COM_MODE_SERVICE_ID,LINSM_E_CONFIRMATION_TIMEOUT);\r
209                                 LinSMChannelStatus[channel] = LINSM_NO_COM;\r
210                         }\r
211                 }\r
212                 if(WakeUpTimer[channel] > 0){\r
213                         WakeUpTimer[channel]--;\r
214                         if(WakeUpTimer[channel]==0){\r
215                                 Det_ReportError(MODULE_ID_LINSM,0,LINSM_REQUEST_COM_MODE_SERVICE_ID,LINSM_E_CONFIRMATION_TIMEOUT);\r
216                                 LinSMChannelStatus[channel] = LINSM_NO_COM;\r
217                         }\r
218                 }\r
219         }\r
220 }\r