1 /* -------------------------------- Arctic Core ------------------------------
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
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>.
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
14 * -------------------------------- Arctic Core ------------------------------*/
23 #include "Com_Sched.h"
\r
27 #define timerDec(timer) \
\r
29 timer = timer - 1; \
\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
41 // Monitor signal reception deadline
\r
42 if (EcoreIPdu->ComEcoreIpduStarted && EcoreSignal->ComTimeoutFactor > 0) {
\r
44 // Decrease deadline monitoring timer.
\r
45 timerDec(EcoreSignal->ComEcoreDeadlineCounter);
\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
54 Com_CopyData(EcoreIPdu->ComIPduDataPtr, &signalInitData, signal->ComBitSize, signal->ComBitPosition, 0);
\r
58 // A timeout has occurred.
\r
59 if (signal->ComTimeoutNotification != NULL) {
\r
60 signal->ComTimeoutNotification();
\r
64 EcoreSignal->ComEcoreDeadlineCounter = EcoreSignal->ComTimeoutFactor;
\r
68 if (EcoreSignal->ComSignalUpdated) {
\r
69 ComConfig->ComSignal[i].ComNotification();
\r
70 EcoreSignal->ComSignalUpdated = 0;
\r
76 void Com_MainFunctionTx() {
\r
77 //DEBUG(DEBUG_MEDIUM, "Com_MainFunctionTx() excecuting\n");
\r
79 const ComIPdu_type *IPdu;
\r
80 for (int i = 0; !ComConfig->ComIPdu[i].ComEcoreEOL; i++) {
\r
81 IPdu = &ComConfig->ComIPdu[i];
\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
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
93 timerDec(EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeTimePeriodTimer);
\r
95 // Is it time for a direct transmission?
\r
96 if (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == MIXED
\r
97 && EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduNumberOfRepetitionsLeft > 0) {
\r
99 timerDec(EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer);
\r
101 // Is it time for a transmission?
\r
102 if (EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer == 0
\r
103 && EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduMinimumDelayTimer == 0) {
\r
105 Com_TriggerIPduSend(IPdu->ComIPduRxHandleId);
\r
107 // Reset periodic timer
\r
108 EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;
\r
110 // Register this nth-transmission.
\r
111 EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;
\r
115 // Is it time for a cyclic transmission?
\r
116 if (EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeTimePeriodTimer == 0 && EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduMinimumDelayTimer == 0) {
\r
118 Com_TriggerIPduSend(IPdu->ComIPduRxHandleId); // Send IPDU!
\r
120 // Reset periodic timer.
\r
121 EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimePeriodFactor;
\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
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
134 // Reset periodic timer
\r
135 EcoreIPdu->ComEcoreTxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;
\r
137 // Register this nth-transmission.
\r
138 EcoreIPdu->ComEcoreTxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;
\r
142 // The IDPU has NONE transmission mode.
\r
149 // Send scheduled packages.
\r
151 for (int i = 0; !ComConfig->ComIPdu[i].ComEcoreEOL; i++) {
\r
152 if (ComConfig->ComIPdu[i].ComIPduDirection == SEND) {
\r