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
25 //#include <stdio.h>
\r
28 #include "Com_Arc_Types.h"
\r
29 #include "Com_Internal.h"
\r
30 #include "Com_misc.h"
\r
33 const Com_ConfigType * ComConfig;
\r
36 void Com_Init(const Com_ConfigType *config ) {
\r
37 DEBUG(DEBUG_LOW, "--Initialization of COM--\n");
\r
43 uint32 earliestDeadline;
\r
44 uint32 firstTimeout;
\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
54 const ComIPdu_type *IPdu = GET_IPdu(i);
\r
55 Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(i);
\r
57 if (i >= COM_N_IPDUS) {
\r
58 DET_REPORTERROR(COM_MODULE_ID, COM_INSTANCE_ID, 0x01, COM_E_TOO_MANY_IPDU);
\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
71 // Reset earliest deadline.
\r
72 earliestDeadline = 0xffffffffu;
\r
73 firstTimeout = 0xffffffffu;
\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
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
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
92 // Configure signal deadline monitoring if used.
\r
93 if (Signal->ComTimeoutFactor > 0) {
\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
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
106 if (firstTimeout > Signal->ComFirstTimeoutFactor) {
\r
107 firstTimeout = Signal->ComFirstTimeoutFactor;
\r
112 // Increment helper counters
\r
113 //Arc_IPdu->NComIPduSignalRef = j + 1;
\r
115 Arc_Signal->ComIPduDataPtr = Arc_IPdu->ComIPduDataPtr;
\r
116 Arc_Signal->ComIPduHandleId = i;
\r
118 // Clear update bits
\r
119 if (Signal->ComSignalArcUseUpdateBit) {
\r
120 CLEARBIT(Arc_IPdu->ComIPduDataPtr, Signal->ComUpdateBitPosition);
\r
123 // If this signal is a signal group
\r
124 if (Signal->Com_Arc_IsSignalGroup) {
\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
137 // Initialize signal data.
\r
138 Com_WriteSignalDataToPdu(Signal->ComHandleId, Signal->ComSignalInitValue);
\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
147 if ( (Signal->ComTimeoutFactor > 0) && (!Signal->ComSignalArcUseUpdateBit) ) {
\r
148 Arc_Signal->ComTimeoutFactor = earliestDeadline;
\r
149 Arc_Signal->Com_Arc_DeadlineCounter = firstTimeout;
\r
155 // An error occurred.
\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
160 DEBUG(DEBUG_LOW, "--Initialization of COM completed--\n");
\r
165 void Com_DeInit( void ) {
\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
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