]> rtime.felk.cvut.cz Git - arc.git/blob - communication/Com/Com.c
Fix ticket 133.
[arc.git] / communication / Com / Com.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 <assert.h>\r
24 #include <stdlib.h>\r
25 //#include <stdio.h>\r
26 #include <string.h>\r
27 #include "Com.h"\r
28 #include "Com_Arc_Types.h"\r
29 #include "Com_Internal.h"\r
30 #include "Com_misc.h"\r
31 #include "debug.h"\r
32 \r
33 const Com_ConfigType * ComConfig;\r
34 \r
35 \r
36 void Com_Init(const Com_ConfigType *config ) {\r
37         DEBUG(DEBUG_LOW, "--Initialization of COM--\n");\r
38 \r
39         ComConfig = config;\r
40 \r
41         uint8 failure = 0;\r
42 \r
43         uint32 earliestDeadline;\r
44         uint32 firstTimeout;\r
45 \r
46         // Initialize each IPdu\r
47         //ComIPdu_type *IPdu;\r
48         //Com_Arc_IPdu_type *Arc_IPdu;\r
49         const ComSignal_type *Signal;\r
50         const ComGroupSignal_type *GroupSignal;\r
51         for (uint16 i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) {\r
52                 Com_Arc_Config.ComNIPdu++;\r
53 \r
54                 const ComIPdu_type *IPdu = GET_IPdu(i);\r
55                 Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(i);\r
56 \r
57                 if (i >= COM_N_IPDUS) {\r
58                         DET_REPORTERROR(COM_MODULE_ID, COM_INSTANCE_ID, 0x01, COM_E_TOO_MANY_IPDU);\r
59                         failure = 1;\r
60                         break;\r
61                 }\r
62 \r
63                 // If this is a TX and cyclic IPdu, configure the first deadline.\r
64                 if ( (IPdu->ComIPduDirection == SEND) &&\r
65                                 ( (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == PERIODIC) || (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == MIXED) )) {\r
66                         //IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimeOffsetFactor;\r
67                         Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimeOffsetFactor;\r
68                 }\r
69 \r
70 \r
71                 // Reset earliest deadline.\r
72                 earliestDeadline = 0xffffffffu;\r
73                 firstTimeout = 0xffffffffu;\r
74 \r
75                 // Initialize the memory with the default value.\r
76                 if (IPdu->ComIPduDirection == SEND) {\r
77                         memset(Arc_IPdu->ComIPduDataPtr, IPdu->ComTxIPdu.ComTxIPduUnusedAreasDefault, IPdu->ComIPduSize);\r
78                 }\r
79 \r
80                 // For each signal in this PDU.\r
81                 //Arc_IPdu->NComIPduSignalRef = 0;\r
82                 for (uint16 j = 0; (IPdu->ComIPduSignalRef != NULL) && (IPdu->ComIPduSignalRef[j] != NULL) ; j++) {\r
83                         Signal = IPdu->ComIPduSignalRef[j];\r
84                         Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
85 \r
86                         // If this signal already has been configured this is most likely an error.\r
87                         if (Arc_Signal->ComIPduDataPtr != NULL) {\r
88                                 // DET_REPORTERROR(COM_MODULE_ID, COM_INSTANCE_ID, 0x01, COM_E_INVALID_SIGNAL_CONFIGURATION);\r
89                                 // failure = 1;\r
90                         }\r
91 \r
92                         // Configure signal deadline monitoring if used.\r
93                         if (Signal->ComTimeoutFactor > 0) {\r
94 \r
95                                 if (Signal->ComSignalArcUseUpdateBit) {\r
96                                         // This signal uses an update bit, and hence has its own deadline monitoring.\r
97                                         Arc_Signal->Com_Arc_DeadlineCounter = Signal->ComFirstTimeoutFactor; // Configure the deadline counter\r
98                                         Arc_Signal->ComTimeoutFactor = Signal->ComTimeoutFactor;\r
99 \r
100                                 } else {\r
101                                         // This signal does not use an update bit, and should therefore use per I-PDU deadline monitoring.\r
102                                         // Find the earliest deadline for this I-PDU and setup the deadline later.\r
103                                         if (earliestDeadline > Signal->ComTimeoutFactor) {\r
104                                                 earliestDeadline = Signal->ComTimeoutFactor;\r
105                                         }\r
106                                         if (firstTimeout > Signal->ComFirstTimeoutFactor) {\r
107                                                 firstTimeout = Signal->ComFirstTimeoutFactor;\r
108                                         }\r
109                                 }\r
110                         }\r
111 \r
112                         // Increment helper counters\r
113                     //Arc_IPdu->NComIPduSignalRef = j + 1;\r
114 \r
115                         Arc_Signal->ComIPduDataPtr = Arc_IPdu->ComIPduDataPtr;\r
116                         Arc_Signal->ComIPduHandleId = i;\r
117 \r
118                         // Clear update bits\r
119                         if (Signal->ComSignalArcUseUpdateBit) {\r
120                                 CLEARBIT(Arc_IPdu->ComIPduDataPtr, Signal->ComUpdateBitPosition);\r
121                         }\r
122 \r
123                         // If this signal is a signal group\r
124                         if (Signal->Com_Arc_IsSignalGroup) {\r
125 \r
126                                 // For each group signal of this signal group.\r
127                                 for(uint8 h = 0; Signal->ComGroupSignal[h] != NULL; h++) {\r
128                                         GroupSignal = Signal->ComGroupSignal[h];\r
129                                         Com_Arc_GroupSignal_type *Arc_GroupSignal = GET_ArcGroupSignal(GroupSignal->ComHandleId);\r
130                                         // Set pointer to shadow buffer\r
131                                         Arc_GroupSignal->Com_Arc_ShadowBuffer = Arc_Signal->Com_Arc_ShadowBuffer;\r
132                                         // Initialize group signal data.\r
133                                         Com_WriteGroupSignalDataToPdu(Signal->ComHandleId, GroupSignal->ComHandleId, GroupSignal->ComSignalInitValue);\r
134                                 }\r
135 \r
136                         } else {\r
137                                 // Initialize signal data.\r
138                                 Com_WriteSignalDataToPdu(Signal->ComHandleId, Signal->ComSignalInitValue);\r
139                         }\r
140                 }\r
141 \r
142                 // Configure per I-PDU based deadline monitoring.\r
143                 for (uint16 j = 0; (IPdu->ComIPduSignalRef != NULL) && (IPdu->ComIPduSignalRef[j] != NULL); j++) {\r
144                         Signal = IPdu->ComIPduSignalRef[j];\r
145                         Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
146 \r
147                         if ( (Signal->ComTimeoutFactor > 0) && (!Signal->ComSignalArcUseUpdateBit) ) {\r
148                                 Arc_Signal->ComTimeoutFactor = earliestDeadline;\r
149                                 Arc_Signal->Com_Arc_DeadlineCounter = firstTimeout;\r
150                         }\r
151                 }\r
152         }\r
153 \r
154 \r
155         // An error occurred.\r
156         if (failure) {\r
157                 DEBUG(DEBUG_LOW, "--Initialization of COM failed--\n");\r
158                 //DET_REPORTERROR(COM_MODULE_ID, COM_INSTANCE_ID, 0x01, COM_E_INVALID_FILTER_CONFIGURATION);\r
159         } else {\r
160                 DEBUG(DEBUG_LOW, "--Initialization of COM completed--\n");\r
161         }\r
162 }\r
163 \r
164 \r
165 void Com_DeInit( void ) {\r
166 \r
167 }\r
168 \r
169 void Com_IpduGroupStart(Com_PduGroupIdType IpduGroupId,boolean Initialize) {\r
170         (void)Initialize; // Nothing to be done. This is just to avoid Lint warning.\r
171         for (uint16 i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) {\r
172                 if (ComConfig->ComIPdu[i].ComIPduGroupRef == IpduGroupId) {\r
173                         Com_Arc_Config.ComIPdu[i].Com_Arc_IpduStarted = 1;\r
174                 }\r
175         }\r
176 }\r
177 \r
178 void Com_IpduGroupStop(Com_PduGroupIdType IpduGroupId) {\r
179         for (uint16 i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) {\r
180                 if (ComConfig->ComIPdu[i].ComIPduGroupRef == IpduGroupId) {\r
181                         Com_Arc_Config.ComIPdu[i].Com_Arc_IpduStarted = 0;\r
182                 }\r
183         }\r
184 }\r