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
71 for (i=0; i<LINIF_CONTROLLER_CNT; i++)
\r
73 LinSMChannelStatus[i] = LINSM_NO_COM;
\r
74 ScheduleRequestTimer[i] = 0;
\r
75 GoToSleepTimer[i] = 0;
\r
80 LinSMStatus = LINSM_INIT;
\r
86 LinSMStatus = LINSM_UNINIT;
\r
89 Std_ReturnType LinSM_ScheduleRequest(NetworkHandleType channel,LinIf_SchHandleType schedule)
\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
96 ScheduleRequestTimer[channel]=LINSM_SCHEDULE_REQUEST_TIMEOUT;
\r
97 return LinIf_ScheduleRequest(channel, schedule);
\r
100 Std_ReturnType LinSM_GetCurrentComMode(NetworkHandleType network,ComM_ModeType* mode)
\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
106 *mode= LinSMChannelStatus[network];
\r
110 Std_ReturnType LinSM_RequestComMode(NetworkHandleType network,ComM_ModeType mode)
\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
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
125 case COMM_SILENT_COMMUNICATION:
\r
126 // Standard say nothing about this case.
\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
135 WakeUpTimer[network]=0;
\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
149 if(ScheduleRequestTimer[channel]!=0){
\r
150 Com_IpduGroupStop(IpduGroupId);
\r
151 Com_IpduGroupStart(IpduGroupId,FALSE);
\r
152 ScheduleRequestTimer[channel]=0;
\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
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
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
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
178 void LinSM_TimerTick()
\r
181 for(channel=0;channel<LINIF_CONTROLLER_CNT;channel++){
\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
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
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