uint8 Com_SendSignal(Com_SignalIdType SignalId, const void *SignalDataPtr) { VALIDATE_SIGNAL(SignalId, 0x0a, E_NOT_OK); // Store pointer to signal for easier coding. const ComSignal_type * Signal = GET_Signal(SignalId); const ComIPdu_type *IPdu = GET_IPdu(Signal->ComIPduHandleId); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Signal->ComIPduHandleId); if (isPduBufferLocked(getPduId(IPdu))) { return COM_BUSY; } //DEBUG(DEBUG_LOW, "Com_SendSignal: id %d, nBytes %d, BitPosition %d, intVal %d\n", SignalId, nBytes, signal->ComBitPosition, (uint32)*(uint8 *)SignalDataPtr); imask_t irq_state; Irq_Save(irq_state); Com_WriteSignalDataToPdu(Signal->ComHandleId, SignalDataPtr); // 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"); } }
void Com_Init(const Com_ConfigType *config ) { uint8 failure = 0; uint32 firstTimeout; uint8 endiannessByte; uint16 i; uint16 j; //ComIPdu_type *IPdu; //Com_Arc_IPdu_type *Arc_IPdu; const ComSignal_type *Signal; const ComGroupSignal_type *GroupSignal; DEBUG_PRINT0(DEBUG_LOW, "--Initialization of COM--\n"); ComConfig = config; //lint --e(928) PC-Lint exception Misra 11.4, Must be like this. /tojo 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. AR_ASSERT(0); } // Initialize each IPdu #if 0 //F*****g bad code as always need a dummy ComIPdu config with Com_Arc_EOL equal to TRUE. for (i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) { #else /*So I changed it to ...*/ for(i = 0;i < COM_N_IPDUS;i++){ #endif const ComIPdu_type *IPdu = GET_IPdu(i); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(i); Arc_IPdu->Com_Arc_DynSignalLength = 0; if (i >= COM_N_IPDUS) { DET_REPORTERROR(COM_MODULE_ID, COM_INSTANCE_ID, 0x01, COM_E_TOO_MANY_IPDU); failure = 1; break; } // 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. if (IPdu->ComIPduDirection == SEND) { memset((void *)IPdu->ComIPduDataPtr, IPdu->ComTxIPdu.ComTxIPduUnusedAreasDefault, IPdu->ComIPduSize); } // For each signal in this PDU. //Arc_IPdu->NComIPduSignalRef = 0; for (j = 0; (IPdu->ComIPduSignalRef != NULL) && (IPdu->ComIPduSignalRef[j] != NULL) ; j++) { Com_Arc_Signal_type * Arc_Signal; Signal = IPdu->ComIPduSignalRef[j]; Arc_Signal = GET_ArcSignal(Signal->ComHandleId); // Configure signal deadline monitoring if used. if (Signal->ComTimeoutFactor > 0) { if (Signal->ComSignalArcUseUpdateBit) { // This signal uses an update bit, and hence has its own deadline monitoring. 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 if (Signal->ComSignalArcUseUpdateBit) { CLEARBIT(IPdu->ComIPduDataPtr, Signal->ComUpdateBitPosition); } // If this signal is a signal group if (Signal->Com_Arc_IsSignalGroup) { uint8 h; // For each group signal of this signal group. for(h = 0; Signal->ComGroupSignal[h] != NULL; h++) { Com_Arc_GroupSignal_type *Arc_GroupSignal; GroupSignal = Signal->ComGroupSignal[h]; Arc_GroupSignal = GET_ArcGroupSignal(GroupSignal->ComHandleId); // Set pointer to shadow buffer Arc_GroupSignal->Com_Arc_ShadowBuffer = (void *)Signal->Com_Arc_ShadowBuffer; // Initialize group signal data. Com_WriteGroupSignalDataToPdu(Signal->ComHandleId, GroupSignal->ComHandleId, GroupSignal->ComSignalInitValue); } } else { // Initialize signal data. Com_WriteSignalDataToPdu(Signal->ComHandleId, Signal->ComSignalInitValue); } } if (IPdu->ComIPduDirection == RECEIVE && IPdu->ComIPduSignalProcessing == DEFERRED) { // Copy the initialized pdu to deferred buffer memcpy(IPdu->ComIPduDeferredDataPtr,IPdu->ComIPduDataPtr,IPdu->ComIPduSize); } // Configure per I-PDU based deadline monitoring. for (j = 0; (IPdu->ComIPduSignalRef != NULL) && (IPdu->ComIPduSignalRef[j] != NULL); j++) { Com_Arc_Signal_type * Arc_Signal; Signal = IPdu->ComIPduSignalRef[j]; Arc_Signal = GET_ArcSignal(Signal->ComHandleId); if ( (Signal->ComTimeoutFactor > 0) && (!Signal->ComSignalArcUseUpdateBit) ) { Arc_Signal->Com_Arc_DeadlineCounter = firstTimeout; } } } for (i = 0; i < COM_N_IPDUS; i++) { Com_BufferPduState[i].currentPosition = 0; Com_BufferPduState[i].locked = FALSE; } // An error occurred. if (failure) { DEBUG_PRINT0(DEBUG_LOW, "--Initialization of COM failed--\n"); //DET_REPORTERROR(COM_MODULE_ID, COM_INSTANCE_ID, 0x01, COM_E_INVALID_FILTER_CONFIGURATION); } else { DEBUG_PRINT0(DEBUG_LOW, "--Initialization of COM completed--\n"); } } void Com_DeInit( void ) { } void Com_IpduGroupStart(Com_PduGroupIdType IpduGroupId,boolean Initialize) { uint16 i; (void)Initialize; // Nothing to be done. This is just to avoid Lint warning. #if 0 for (i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) { #else /*So I changed it to ...*/ for(i = 0;i < COM_N_IPDUS;i++){ #endif if (ComConfig->ComIPdu[i].ComIPduGroupRef == IpduGroupId) { Com_Arc_Config.ComIPdu[i].Com_Arc_IpduStarted = 1; } } } void Com_IpduGroupStop(Com_PduGroupIdType IpduGroupId) { uint16 i; #if 0 for (i = 0; !ComConfig->ComIPdu[i].Com_Arc_EOL; i++) { #else /*So I changed it to ...*/ for(i = 0;i < COM_N_IPDUS;i++){ #endif if (ComConfig->ComIPdu[i].ComIPduGroupRef == IpduGroupId) { Com_Arc_Config.ComIPdu[i].Com_Arc_IpduStarted = 0; } } } /** * * @param PduId * @param PduInfoPtr * @param RetryInfoPtr not supported * @param TxDataCntPtr * @return */ BufReq_ReturnType Com_CopyTxData(PduIdType PduId, PduInfoType* PduInfoPtr, RetryInfoType* RetryInfoPtr, PduLengthType* TxDataCntPtr) { imask_t state; BufReq_ReturnType r = BUFREQ_OK; const ComIPdu_type *IPdu = GET_IPdu(PduId); boolean dirOk = ComConfig->ComIPdu[PduId].ComIPduDirection == SEND; boolean sizeOk; (void)RetryInfoPtr; // get rid of compiler warning Irq_Save(state); sizeOk = IPdu->ComIPduSize >= Com_BufferPduState[PduId].currentPosition + PduInfoPtr->SduLength; Com_BufferPduState[PduId].locked = TRUE; if (dirOk && sizeOk) { void* source = (void *)(IPdu->ComIPduDataPtr); memcpy((void *)PduInfoPtr->SduDataPtr,(void *)((uint8*)source + Com_BufferPduState[PduId].currentPosition), PduInfoPtr->SduLength); Com_BufferPduState[PduId].currentPosition += PduInfoPtr->SduLength; *TxDataCntPtr = IPdu->ComIPduSize - Com_BufferPduState[PduId].currentPosition; } else { r = BUFREQ_NOT_OK; } Irq_Restore(state); return r; }