]> rtime.felk.cvut.cz Git - arc.git/blob - communication/Com/Com_Sched.c
72f88c2048f8f0f8dd49a2e63b78b01fea90de94
[arc.git] / communication / Com / Com_Sched.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 #include "Com_Arc_Types.h"\r
22 #include "Com.h"\r
23 #include "Com_Internal.h"\r
24 #include "Com_misc.h"\r
25 #include <string.h>\r
26 #include "debug.h"\r
27 \r
28 #define timerDec(timer) \\r
29         if (timer > 0) { \\r
30                 timer = timer - 1; \\r
31         } \\r
32 \r
33 \r
34 \r
35 void Com_MainFunctionRx(void) {\r
36         //DEBUG(DEBUG_MEDIUM, "Com_MainFunctionRx() excecuting\n");\r
37         const ComSignal_type *signal;\r
38         for (uint16 i = 0; !ComConfig->ComSignal[i].Com_Arc_EOL; i++) {\r
39                 signal = &ComConfig->ComSignal[i];\r
40                 Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(signal->ComHandleId);\r
41                 Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(signal->ComIPduHandleId);\r
42 \r
43                 // Monitor signal reception deadline\r
44                 if ( (Arc_IPdu->Com_Arc_IpduStarted) && (signal->ComTimeoutFactor > 0) ) {\r
45 \r
46                         // Decrease deadline monitoring timer.\r
47                         timerDec(Arc_Signal->Com_Arc_DeadlineCounter);\r
48 \r
49                         // Check if a timeout has occurred.\r
50                         if (Arc_Signal->Com_Arc_DeadlineCounter == 0) {\r
51                                 if (signal->ComRxDataTimeoutAction == COM_TIMEOUT_DATA_ACTION_REPLACE) {\r
52                                         // Replace signal data.\r
53                                         Com_WriteSignalDataToPdu(signal->ComHandleId, signal->ComSignalInitValue);\r
54 \r
55                                 }\r
56 \r
57                                 // A timeout has occurred.\r
58                                 if (signal->ComTimeoutNotification != NULL) {\r
59                                         signal->ComTimeoutNotification();\r
60                                 }\r
61 \r
62                                 // Restart timer\r
63                                 Arc_Signal->Com_Arc_DeadlineCounter = signal->ComTimeoutFactor;\r
64                         }\r
65                 }\r
66 \r
67                 if (Arc_Signal->ComSignalUpdated) {\r
68                         if (ComConfig->ComSignal[i].ComNotification != NULL) {\r
69                                 ComConfig->ComSignal[i].ComNotification();\r
70                         }\r
71                         Arc_Signal->ComSignalUpdated = 0;\r
72                 }\r
73         }\r
74 }\r
75 \r
76 \r
77 void Com_MainFunctionTx(void) {\r
78         //DEBUG(DEBUG_MEDIUM, "Com_MainFunctionTx() excecuting\n");\r
79         // Decrease timers.\r
80         const ComIPdu_type *IPdu;\r
81         for (uint16 i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) {\r
82                 IPdu = &ComConfig->ComIPdu[i];\r
83                 Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(i);\r
84 \r
85                 // Is this a IPdu that should be transmitted?\r
86                 if ( (IPdu->ComIPduDirection == SEND) && (Arc_IPdu->Com_Arc_IpduStarted) ) {\r
87                         // Decrease minimum delay timer\r
88                         timerDec(Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduMinimumDelayTimer);\r
89 \r
90                         // If IPDU has periodic or mixed transmission mode.\r
91                         if ( (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == PERIODIC)\r
92                                 || (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == MIXED) ) {\r
93 \r
94                                 timerDec(Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer);\r
95 \r
96                                 // Is it time for a direct transmission?\r
97                                 if ( (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == MIXED)\r
98                                         && (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft > 0) ) {\r
99 \r
100                                         timerDec(Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer);\r
101 \r
102                                         // Is it time for a transmission?\r
103                                         if ( (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer == 0)\r
104                                                 && (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduMinimumDelayTimer == 0) ) {\r
105 \r
106                                                 Com_TriggerIPduSend(i);\r
107 \r
108                                                 // Reset periodic timer\r
109                                                 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;\r
110 \r
111                                                 // Register this nth-transmission.\r
112                                                 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;\r
113                                         }\r
114                                 }\r
115 \r
116                                 // Is it time for a cyclic transmission?\r
117                                 if ( (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer == 0) && (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduMinimumDelayTimer == 0) ) {\r
118 \r
119                                         Com_TriggerIPduSend(i);\r
120 \r
121                                         // Reset periodic timer.\r
122                                         Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimePeriodFactor;\r
123                                 }\r
124 \r
125                         // If IPDU has direct transmission mode.\r
126                         } else if (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == DIRECT) {\r
127                                 // Do we need to transmit anything?\r
128                                 if (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft > 0) {\r
129                                         timerDec(Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer);\r
130 \r
131                                         // Is it time for a transmission?\r
132                                         if ( (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer == 0) && (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduMinimumDelayTimer == 0) ) {\r
133                                                 Com_TriggerIPduSend(i);\r
134 \r
135                                                 // Reset periodic timer\r
136                                                 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;\r
137 \r
138                                                 // Register this nth-transmission.\r
139                                                 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;\r
140                                         }\r
141                                 }\r
142 \r
143                         // The IDPU has NONE transmission mode.\r
144                         } else {\r
145                                 // Don't send!\r
146                         }\r
147                 }\r
148         }\r
149 }\r