]> rtime.felk.cvut.cz Git - arc.git/blob - communication/Lin/LinSM.c
b1e0cc93103da067a373be7cf2653bca5235a9f6
[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         uint8 i;\r
70 \r
71         for (i=0; i<LINIF_CONTROLLER_CNT; i++)\r
72         {\r
73                 LinSMChannelStatus[i] = LINSM_NO_COM;\r
74                 ScheduleRequestTimer[i] = 0;\r
75                 GoToSleepTimer[i] = 0;\r
76                 WakeUpTimer[i] = 0;\r
77         }\r
78 \r
79         LinIf_Init(0);\r
80         LinSMStatus = LINSM_INIT;\r
81 }\r
82 \r
83 void LinSM_DeInit()\r
84 {\r
85         LinIf_DeInit();\r
86         LinSMStatus = LINSM_UNINIT;\r
87 }\r
88 \r
89 Std_ReturnType LinSM_ScheduleRequest(NetworkHandleType channel,LinIf_SchHandleType schedule)\r
90 {\r
91         VALIDATE_W_RV( (LinSMStatus != LINSM_UNINIT), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_UNINIT, E_NOT_OK);\r
92         VALIDATE_W_RV( (channel < LINIF_CONTROLLER_CNT), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL, E_NOT_OK);\r
93         VALIDATE_W_RV( (LinSMChannelStatus[channel] == LINSM_RUN_SCHEDULE), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_NOT_IN_RUN_SCHEDULE, E_NOT_OK);\r
94         VALIDATE_W_RV( (schedule < LINIF_SCH_CNT), LINSM_SCHEDULE_REQUEST_SERVICE_ID, LINSM_E_PARAMETER, E_NOT_OK);\r
95 \r
96         ScheduleRequestTimer[channel]=LINSM_SCHEDULE_REQUEST_TIMEOUT;\r
97         return LinIf_ScheduleRequest(channel, schedule);\r
98 }\r
99 \r
100 Std_ReturnType LinSM_GetCurrentComMode(NetworkHandleType network,ComM_ModeType* mode)\r
101 {\r
102         VALIDATE_W_RV( (LinSMStatus != LINSM_UNINIT), LINSM_GET_CURRENT_COM_MODE_SERVICE_ID, LINSM_E_UNINIT, E_NOT_OK);\r
103         VALIDATE_W_RV( (network < LINIF_CONTROLLER_CNT), LINSM_GET_CURRENT_COM_MODE_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL, E_NOT_OK);\r
104         VALIDATE_W_RV( (mode != NULL), LINSM_GET_CURRENT_COM_MODE_SERVICE_ID, LINSM_E_PARAMETER_POINTER, E_NOT_OK);\r
105 \r
106         *mode= LinSMChannelStatus[network];\r
107         return E_OK;\r
108 }\r
109 \r
110 Std_ReturnType LinSM_RequestComMode(NetworkHandleType network,ComM_ModeType mode)\r
111 {\r
112         Std_ReturnType res = E_NOT_OK;\r
113         VALIDATE_W_RV( (LinSMStatus != LINSM_UNINIT), LINSM_REQUEST_COM_MODE_SERVICE_ID, LINSM_E_UNINIT, E_NOT_OK);\r
114         VALIDATE_W_RV( (network < LINIF_CONTROLLER_CNT), LINSM_REQUEST_COM_MODE_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL, E_NOT_OK);\r
115 \r
116         switch(mode)\r
117         {\r
118                 case COMM_NO_COMMUNICATION:\r
119                         if (E_OK == LinIf_GotoSleep(network)){\r
120                                 LinSMChannelStatus[network] = LINSM_GOTO_SLEEP;\r
121                                 GoToSleepTimer[network]=LINSM_GOTO_SLEEP_TIMEOUT;\r
122                                 res = E_OK;\r
123                         }\r
124                         break;\r
125                 case COMM_SILENT_COMMUNICATION:\r
126                         // Standard say nothing about this case.\r
127                         break;\r
128                 case COMM_FULL_COMMUNICATION:\r
129                         WakeUpTimer[network]=LINSM_WAKEUP_TIMEOUT; //should be done here since some implementations will confirm immediatly\r
130                         if (E_OK == LinIf_WakeUp(network)){\r
131                                 res = E_OK;\r
132                         }\r
133                         else\r
134                         {\r
135                                 WakeUpTimer[network]=0;\r
136                         }\r
137                         break;\r
138                 default:\r
139                         break;\r
140         }\r
141         return res;\r
142 }\r
143 \r
144 void LinSM_ScheduleRequest_Confirmation(NetworkHandleType channel){\r
145         Com_PduGroupIdType IpduGroupId = 0;\r
146         VALIDATE( (LinSMStatus != LINSM_UNINIT), LINSM_SCHEDULE_REQUEST_CONF_SERVICE_ID, LINSM_E_UNINIT);\r
147         VALIDATE( (channel < LINIF_CONTROLLER_CNT), LINSM_SCHEDULE_REQUEST_CONF_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL);\r
148 \r
149         if(ScheduleRequestTimer[channel]!=0){\r
150                 Com_IpduGroupStop(IpduGroupId);\r
151                 Com_IpduGroupStart(IpduGroupId,FALSE);\r
152                 ScheduleRequestTimer[channel]=0;\r
153         }\r
154 }\r
155 \r
156 void LinSM_WakeUp_Confirmation(NetworkHandleType channel,boolean success){\r
157         VALIDATE( (LinSMStatus != LINSM_UNINIT), LINSM_WAKEUP_CONF_SERVICE_ID, LINSM_E_UNINIT);\r
158         VALIDATE( (channel < LINIF_CONTROLLER_CNT), LINSM_WAKEUP_CONF_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL);\r
159 \r
160         if(WakeUpTimer[channel]!=0){\r
161                 WakeUpTimer[channel]=0;\r
162                 ComM_BusSM_ModeIndication(channel,COMM_FULL_COMMUNICATION);\r
163                 LinSMChannelStatus[channel] = LINSM_RUN_SCHEDULE;\r
164         }\r
165 }\r
166 \r
167 void LinSM_GotoSleep_Confirmation(NetworkHandleType channel,boolean success){\r
168         VALIDATE( (LinSMStatus != LINSM_UNINIT), LINSM_GOTO_SLEEP_CONF_SERVICE_ID, LINSM_E_UNINIT);\r
169         VALIDATE( (channel < LINIF_CONTROLLER_CNT), LINSM_GOTO_SLEEP_CONF_SERVICE_ID, LINSM_E_NOXEXISTENT_CHANNEL);\r
170 \r
171         if(GoToSleepTimer[channel]!=0){\r
172                 GoToSleepTimer[channel]=0;\r
173                 LinSMChannelStatus[channel] = LINSM_NO_COM;\r
174                 ComM_BusSM_ModeIndication(channel,COMM_NO_COMMUNICATION);\r
175         }\r
176 }\r
177 \r
178 void LinSM_TimerTick()\r
179 {\r
180         uint8 channel;\r
181         for(channel=0;channel<LINIF_CONTROLLER_CNT;channel++){\r
182                 // Check timers\r
183                 if(ScheduleRequestTimer[channel] > 0){\r
184                         ScheduleRequestTimer[channel]--;\r
185                         if(ScheduleRequestTimer[channel]==0){\r
186                                 Det_ReportError(MODULE_ID_LINSM,0,LINSM_REQUEST_COM_MODE_SERVICE_ID,LINSM_E_CONFIRMATION_TIMEOUT);\r
187                                 LinSMChannelStatus[channel] = LINSM_NO_COM;\r
188                         }\r
189                 }\r
190                 if(GoToSleepTimer[channel] > 0){\r
191                         GoToSleepTimer[channel]--;\r
192                         if(GoToSleepTimer[channel]==0){\r
193                                 Det_ReportError(MODULE_ID_LINSM,0,LINSM_REQUEST_COM_MODE_SERVICE_ID,LINSM_E_CONFIRMATION_TIMEOUT);\r
194                                 LinSMChannelStatus[channel] = LINSM_NO_COM;\r
195                         }\r
196                 }\r
197                 if(WakeUpTimer[channel] > 0){\r
198                         WakeUpTimer[channel]--;\r
199                         if(WakeUpTimer[channel]==0){\r
200                                 Det_ReportError(MODULE_ID_LINSM,0,LINSM_REQUEST_COM_MODE_SERVICE_ID,LINSM_E_CONFIRMATION_TIMEOUT);\r
201                                 LinSMChannelStatus[channel] = LINSM_NO_COM;\r
202                         }\r
203                 }\r
204         }\r
205 }\r