]> rtime.felk.cvut.cz Git - arc.git/blob - communication/Com/Com_Sched.c
Initial commit.
[arc.git] / communication / Com / Com_Sched.c
1 /* -------------------------------- Arctic Core ------------------------------
2  * Arctic Core - the open source AUTOSAR platform http://arccore.com
3  *
4  * Copyright (C) 2009  ArcCore AB <contact@arccore.com>
5  *
6  * This source code is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License version 2 as published by the
8  * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13  * for more details.
14  * -------------------------------- Arctic Core ------------------------------*/
15
16
17
18
19
20
21
22
23 #include "Com_Sched.h"\r
24 #include <string.h>\r
25 #include "Trace.h"\r
26 \r
27 #define timerDec(timer) \\r
28         if (timer > 0) { \\r
29                 timer = timer - 1; \\r
30         } \\r
31 \r
32 \r
33 void Com_MainFunctionRx() {\r
34         //DEBUG(DEBUG_MEDIUM, "Com_MainFunctionRx() excecuting\n");\r
35         const ComSignal_type *signal;\r
36         for (int i = 0; !ComConfig->ComSignal[i].ComEcoreEOL; i++) {\r
37                 signal = &ComConfig->ComSignal[i];\r
38                 ComGetEcoreSignal(signal->ComHandleId);\r
39                 ComGetEcoreIPdu(EcoreSignal->ComIPduHandleId);\r
40 \r
41                 // Monitor signal reception deadline\r
42                 if (EcoreIPdu->ComEcoreIpduStarted && EcoreSignal->ComTimeoutFactor > 0) {\r
43 \r
44                         // Decrease deadline monitoring timer.\r
45                         timerDec(EcoreSignal->ComEcoreDeadlineCounter);\r
46 \r
47                         // Check if a timeout has occurred.\r
48                         if (EcoreSignal->ComEcoreDeadlineCounter == 0) {\r
49                                 if (signal->ComRxDataTimeoutAction == COM_TIMEOUT_DATA_ACTION_REPLACE) {\r
50                                         // Replace signal data.\r
51                                         uint32 signalInitData;\r
52                                         memset(&signalInitData, signal->ComSignalInitValue, sizeof(uint32));\r
53 \r
54                                         Com_CopyData(EcoreIPdu->ComIPduDataPtr, &signalInitData, signal->ComBitSize, signal->ComBitPosition, 0);\r
55 \r
56                                 }\r
57 \r
58                                 // A timeout has occurred.\r
59                                 if (signal->ComTimeoutNotification != NULL) {\r
60                                         signal->ComTimeoutNotification();\r
61                                 }\r
62 \r
63                                 // Restart timer\r
64                                 EcoreSignal->ComEcoreDeadlineCounter = EcoreSignal->ComTimeoutFactor;\r
65                         }\r
66                 }\r
67 \r
68                 if (EcoreSignal->ComSignalUpdated) {\r
69                         ComConfig->ComSignal[i].ComNotification();\r
70                         EcoreSignal->ComSignalUpdated = 0;\r
71                 }\r
72         }\r
73 }\r
74 \r
75 \r
76 void Com_MainFunctionTx() {\r
77         //DEBUG(DEBUG_MEDIUM, "Com_MainFunctionTx() excecuting\n");\r
78         // Decrease timers.\r
79         const ComIPdu_type *IPdu;\r
80         for (int i = 0; !ComConfig->ComIPdu[i].ComEcoreEOL; i++) {\r
81                 IPdu = &ComConfig->ComIPdu[i];\r
82                 ComGetEcoreIPdu(i);\r
83 \r
84                 // Is this a IPdu that should be transmitted?\r
85                 if (IPdu->ComIPduDirection == SEND && EcoreIPdu->ComEcoreIpduStarted) {\r
86                         // Decrease minimum delay timer\r
87                         timerDec(EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduMinimumDelayTimer);\r
88 \r
89                         // If IPDU has periodic or mixed transmission mode.\r
90                         if (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == PERIODIC\r
91                                 || IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == MIXED) {\r
92 \r
93                                 timerDec(EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeTimePeriodTimer);\r
94 \r
95                                 // Is it time for a direct transmission?\r
96                                 if (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == MIXED\r
97                                         && EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduNumberOfRepetitionsLeft > 0) {\r
98 \r
99                                         timerDec(EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer);\r
100 \r
101                                         // Is it time for a transmission?\r
102                                         if (EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer == 0\r
103                                                 && EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduMinimumDelayTimer == 0) {\r
104 \r
105                                                 Com_TriggerIPduSend(IPdu->ComIPduRxHandleId);\r
106 \r
107                                                 // Reset periodic timer\r
108                                                 EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;\r
109 \r
110                                                 // Register this nth-transmission.\r
111                                                 EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;\r
112                                         }\r
113                                 }\r
114 \r
115                                 // Is it time for a cyclic transmission?\r
116                                 if (EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeTimePeriodTimer == 0 && EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduMinimumDelayTimer == 0) {\r
117 \r
118                                         Com_TriggerIPduSend(IPdu->ComIPduRxHandleId); // Send IPDU!\r
119 \r
120                                         // Reset periodic timer.\r
121                                         EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimePeriodFactor;\r
122                                 }\r
123 \r
124                         // If IPDU has direct transmission mode.\r
125                         } else if (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == DIRECT) {\r
126                                 // Do we need to transmit anything?\r
127                                 if (EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduNumberOfRepetitionsLeft > 0) {\r
128                                         timerDec(EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer);\r
129 \r
130                                         // Is it time for a transmission?\r
131                                         if (EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer == 0 && EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduMinimumDelayTimer == 0) {\r
132                                                 Com_TriggerIPduSend(IPdu->ComIPduRxHandleId);\r
133 \r
134                                                 // Reset periodic timer\r
135                                                 EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;\r
136 \r
137                                                 // Register this nth-transmission.\r
138                                                 EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;\r
139                                         }\r
140                                 }\r
141 \r
142                         // The IDPU has NONE transmission mode.\r
143                         } else {\r
144                                 // Don't send!\r
145                         }\r
146                 }\r
147         }\r
148 \r
149         // Send scheduled packages.\r
150         // Cyclic\r
151         for (int i = 0; !ComConfig->ComIPdu[i].ComEcoreEOL; i++) {\r
152                 if (ComConfig->ComIPdu[i].ComIPduDirection == SEND) {\r
153 \r
154                 }\r
155         }\r
156 }\r