Std_ReturnType Com_SendSignalGroup(Com_SignalGroupIdType SignalGroupId) { //#warning Com_SendSignalGroup should be performed atomically. Should we disable interrupts here? const ComSignal_type * Signal = GET_Signal(SignalGroupId); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Signal->ComIPduHandleId); const ComIPdu_type *IPdu = GET_IPdu(Signal->ComIPduHandleId); if (isPduBufferLocked(getPduId(IPdu))) { return COM_BUSY; } // Copy shadow buffer to Ipdu data space imask_t irq_state; Irq_Save(irq_state); Com_CopySignalGroupDataFromShadowBufferToPdu(SignalGroupId); // If the signal has an update bit. Set it! if (Signal->ComSignalArcUseUpdateBit) { SETBIT(IPdu->ComIPduDataPtr, Signal->ComUpdateBitPosition); } // If signal has triggered transmit property, trigger a transmission! if (Signal->ComTransferProperty == TRIGGERED) { Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeNumberOfRepetitions + 1; } Irq_Restore(irq_state); return E_OK; }
void Com_Init(const Com_ConfigType *config ) { DEBUG(DEBUG_LOW, "--Initialization of COM--\n"); /* !req COM328 */ /* Shall not enable inter-ECU communication */ /* !req COM483 */ /* @req COM128 */ /* @req COM217 */ /* @req COM444 */ /* @req COM772 */ // If timeout set to 0 uint8 failure = 0; /* @req COM433 */ if( NULL == config ) { DET_REPORTERROR(COM_INIT_ID, COM_E_PARAM_POINTER); return; } ComConfig = config; uint32 firstTimeout; boolean dataChanged = FALSE; //lint --e(928) PC-Lint exception Misra 11.4, Must be like this. /tojo uint8 endiannessByte = *(const uint8 *)&endianness_test; if ( endiannessByte == 0xef ) { Com_SystemEndianness = COM_LITTLE_ENDIAN; } else if ( endiannessByte == 0xde ) { Com_SystemEndianness = COM_BIG_ENDIAN; } else { // No other endianness supported //lint --e(506) PC-Lint exception Misra 13.7, 14.1, Allow boolean to always be false. assert(0); } // Initialize each IPdu //ComIPdu_type *IPdu; //Com_Arc_IPdu_type *Arc_IPdu; const ComSignal_type *Signal; const ComGroupSignal_type *GroupSignal; uint16 bufferIndex = 0; for (uint16 i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) { boolean pduHasGroupSignal = FALSE; const ComIPdu_type *IPdu = GET_IPdu(i); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(i); Arc_IPdu->Com_Arc_DynSignalLength = 0; if (i >= ComConfig->ComNofIPdus) { DET_REPORTERROR(COM_INIT_ID ,COM_E_TOO_MANY_IPDU); failure = 1; break; } /* Set the data ptr for this Pdu */ Arc_IPdu->ComIPduDataPtr = (void *)&Com_Arc_Buffer[bufferIndex]; bufferIndex += IPdu->ComIPduSize; // If this is a TX and cyclic IPdu, configure the first deadline. if ( (IPdu->ComIPduDirection == SEND) && ( (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == PERIODIC) || (IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeMode == MIXED) )) { //IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimeOffsetFactor; Arc_IPdu->Com_Arc_TxIPduTimers.ComTxModeTimePeriodTimer = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeTimeOffsetFactor; } // Reset firstTimeout. firstTimeout = 0xffffffffu; // Initialize the memory with the default value. /* @req COM015 */ if (IPdu->ComIPduDirection == SEND) { memset((void *)Arc_IPdu->ComIPduDataPtr, IPdu->ComTxIPdu.ComTxIPduUnusedAreasDefault, IPdu->ComIPduSize); } // For each signal in this PDU. //Arc_IPdu->NComIPduSignalRef = 0; for (uint16 j = 0; (IPdu->ComIPduSignalRef != NULL) && (IPdu->ComIPduSignalRef[j] != NULL) ; j++) { Signal = IPdu->ComIPduSignalRef[j]; Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId); // Configure signal deadline monitoring if used. /* @req COM333 */ // If timeout set to 0 if (Signal->ComTimeoutFactor > 0) { if (Signal->ComSignalArcUseUpdateBit) { // This signal uses an update bit, and hence has its own deadline monitoring. /* @req COM292 */ Arc_Signal->Com_Arc_DeadlineCounter = Signal->ComFirstTimeoutFactor; // Configure the deadline counter } else { // This signal does not use an update bit, and should therefore use per I-PDU deadline monitoring. if (firstTimeout > Signal->ComFirstTimeoutFactor) { firstTimeout = Signal->ComFirstTimeoutFactor; } } } // Clear update bits /* @req COM117 */ if (Signal->ComSignalArcUseUpdateBit) { CLEARBIT(Arc_IPdu->ComIPduDataPtr, Signal->ComUpdateBitPosition); } // If this signal is a signal group if (Signal->Com_Arc_IsSignalGroup) { pduHasGroupSignal = TRUE; Arc_Signal->Com_Arc_ShadowBuffer = (void *)&Com_Arc_Buffer[bufferIndex]; // For each group signal of this signal group. for(uint8 h = 0; Signal->ComGroupSignal[h] != NULL; h++) { GroupSignal = Signal->ComGroupSignal[h]; Com_Arc_GroupSignal_type *Arc_GroupSignal = GET_ArcGroupSignal(GroupSignal->ComHandleId); // Set pointer to shadow buffer Arc_GroupSignal->Com_Arc_ShadowBuffer = (void *)Arc_Signal->Com_Arc_ShadowBuffer; // Initialize shadowbuffer. /* @req COM484 */ Com_Internal_UpdateShadowSignal(GroupSignal->ComHandleId, GroupSignal->ComSignalInitValue); } // Initialize group signal data from shadowbuffer. /* @req COM098 */ Com_CopySignalGroupDataFromShadowBufferToPdu(Signal->ComHandleId, false, &dataChanged); } else { // Initialize signal data. /* @req COM098 */ Com_WriteSignalDataToPdu(Signal->ComHandleId, Signal->ComSignalInitValue, &dataChanged); } } if( pduHasGroupSignal ) { /* This pdu has includes group signals. Means that a shodow buffer was set up. * Increment index. */ bufferIndex += IPdu->ComIPduSize; } if (IPdu->ComIPduDirection == RECEIVE && IPdu->ComIPduSignalProcessing == DEFERRED) { /* Set pointer to the deferred buffer */ Arc_IPdu->ComIPduDeferredDataPtr = (void *)&Com_Arc_Buffer[bufferIndex]; bufferIndex += IPdu->ComIPduSize; // Copy the initialized pdu to deferred buffer memcpy(Arc_IPdu->ComIPduDeferredDataPtr,Arc_IPdu->ComIPduDataPtr,IPdu->ComIPduSize); } // Configure per I-PDU based deadline monitoring. for (uint16 j = 0; (IPdu->ComIPduSignalRef != NULL) && (IPdu->ComIPduSignalRef[j] != NULL); j++) { Signal = IPdu->ComIPduSignalRef[j]; Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId); /* @req COM333 */ // If timeout set to 0 if ( (Signal->ComTimeoutFactor > 0) && (!Signal->ComSignalArcUseUpdateBit) ) { /* @req COM290 */ Arc_Signal->Com_Arc_DeadlineCounter = firstTimeout; } } } for (uint16 i = 0; i < ComConfig->ComNofIPdus; i++) { Com_BufferPduState[i].currentPosition = 0; Com_BufferPduState[i].locked = false; } // An error occurred. if (failure) { DEBUG(DEBUG_LOW, "--Initialization of COM failed--\n"); //DET_REPORTERROR(COM_MODULE_ID, COM_INSTANCE_ID, 0x01, COM_E_INVALID_FILTER_CONFIGURATION); } else { initStatus = COM_INIT; DEBUG(DEBUG_LOW, "--Initialization of COM completed--\n"); } }