1 /* -------------------------------- Arctic Core ------------------------------
\r
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
\r
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
\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
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
14 * -------------------------------- Arctic Core ------------------------------*/
\r
23 #include "Std_Types.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
33 #include "ComM_Types.h"
\r
34 #include "ComStack_Types.h"
\r
35 #include "Com_Types.h"
\r
36 #include "ComM_BusSm.h"
\r
42 /* Development error macros. */
\r
43 #if ( LINSM_DEV_ERROR_DETECT == STD_ON )
\r
44 #define VALIDATE(_exp,_api,_err ) \
\r
46 Det_ReportError(MODULE_ID_LINSM,0,_api,_err); \
\r
50 #define VALIDATE_W_RV(_exp,_api,_err,_rv ) \
\r
52 Det_ReportError(MODULE_ID_LINSM,0,_api,_err); \
\r
56 #define VALIDATE(_exp,_api,_err )
\r
57 #define VALIDATE_W_RV(_exp,_api,_err,_rv )
\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
64 static LinSM_StatusType LinSMStatus = LINSM_UNINIT;
\r
65 static LinSM_StatusType LinSMChannelStatus[LINIF_CONTROLLER_CNT];
\r
67 void LinSM_Init(const void* ConfigPtr)
\r
72 for (i=0; i<LINIF_CONTROLLER_CNT; i++)
\r
74 LinSMChannelStatus[i] = LINSM_NO_COM;
\r
75 ScheduleRequestTimer[i] = 0;
\r
76 GoToSleepTimer[i] = 0;
\r
81 LinSMStatus = LINSM_INIT;
\r
87 LinSMStatus = LINSM_UNINIT;
\r
90 Std_ReturnType LinSM_ScheduleRequest(NetworkHandleType channel,LinIf_SchHandleType schedule)
\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
97 ScheduleRequestTimer[channel]=LINSM_SCHEDULE_REQUEST_TIMEOUT;
\r
98 return LinIf_ScheduleRequest(channel, schedule);
\r
101 Std_ReturnType LinSM_GetCurrentComMode(NetworkHandleType network,ComM_ModeType* mode)
\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
107 switch (LinSMChannelStatus[network])
\r
109 case LINSM_RUN_SCHEDULE:
\r
110 *mode= COMM_FULL_COMMUNICATION;
\r
113 *mode= COMM_NO_COMMUNICATION;
\r
119 Std_ReturnType LinSM_RequestComMode(NetworkHandleType network,ComM_ModeType mode)
\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
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
134 case COMM_SILENT_COMMUNICATION:
\r
135 // Standard say nothing about this case.
\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
144 WakeUpTimer[network]=0;
\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
158 if(ScheduleRequestTimer[channel]!=0){
\r
159 Com_IpduGroupStop(IpduGroupId);
\r
160 Com_IpduGroupStart(IpduGroupId,FALSE);
\r
161 ScheduleRequestTimer[channel]=0;
\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
169 if(TRUE == success)
\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
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
183 if(TRUE == success)
\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
193 void LinSM_TimerTick()
\r
196 for(channel=0;channel<LINIF_CONTROLLER_CNT;channel++){
\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
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
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