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
21 #include "Com_Arc_Types.h"
\r
23 #include "Com_Internal.h"
\r
24 #include "Com_misc.h"
\r
28 #define timerDec(timer) \
\r
30 timer = timer - 1; \
\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
43 // Monitor signal reception deadline
\r
44 if ( (Arc_IPdu->Com_Arc_IpduStarted) && (signal->ComTimeoutFactor > 0) ) {
\r
46 // Decrease deadline monitoring timer.
\r
47 timerDec(Arc_Signal->Com_Arc_DeadlineCounter);
\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
57 // A timeout has occurred.
\r
58 if (signal->ComTimeoutNotification != NULL) {
\r
59 signal->ComTimeoutNotification();
\r
63 Arc_Signal->Com_Arc_DeadlineCounter = signal->ComTimeoutFactor;
\r
67 if (Arc_Signal->ComSignalUpdated) {
\r
68 if (ComConfig->ComSignal[i].ComNotification != NULL) {
\r
69 ComConfig->ComSignal[i].ComNotification();
\r
71 Arc_Signal->ComSignalUpdated = 0;
\r
77 void Com_MainFunctionTx(void) {
\r
78 //DEBUG(DEBUG_MEDIUM, "Com_MainFunctionTx() excecuting\n");
\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
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
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
94 timerDec(Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer);
\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
100 timerDec(Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer);
\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
106 Com_TriggerIPduSend(i);
\r
108 // Reset periodic timer
\r
109 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;
\r
111 // Register this nth-transmission.
\r
112 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;
\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
119 Com_TriggerIPduSend(i);
\r
121 // Reset periodic timer.
\r
122 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimePeriodFactor;
\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
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
135 // Reset periodic timer
\r
136 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeRepetitionPeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeRepetitionPeriodFactor;
\r
138 // Register this nth-transmission.
\r
139 Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft--;
\r
143 // The IDPU has NONE transmission mode.
\r