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; }
uint8 Com_ReceiveSignal(Com_SignalIdType SignalId, void* SignalDataPtr) { VALIDATE_SIGNAL(SignalId, 0x0b, E_NOT_OK); DEBUG(DEBUG_LOW, "Com_ReceiveSignal: SignalId %d\n", SignalId); const ComSignal_type * Signal = GET_Signal(SignalId); const ComIPdu_type *IPdu = GET_IPdu(Signal->ComIPduHandleId); uint8 r = E_OK; const void* pduDataPtr = 0; if (IPdu->ComIPduSignalProcessing == DEFERRED && IPdu->ComIPduDirection == RECEIVE) { pduDataPtr = IPdu->ComIPduDeferredDataPtr; } else { if (isPduBufferLocked(getPduId(IPdu))) { r = COM_BUSY; } pduDataPtr = IPdu->ComIPduDataPtr; } Com_ReadSignalDataFromPduBuffer( SignalId, FALSE, SignalDataPtr, pduDataPtr); return r; }
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; }
uint8 Com_ReceiveDynSignal(Com_SignalIdType SignalId, void* SignalDataPtr, uint16* Length) { const ComSignal_type * Signal = GET_Signal(SignalId); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Signal->ComIPduHandleId); const ComIPdu_type *IPdu = GET_IPdu(Signal->ComIPduHandleId); imask_t state; uint8 startFromPduByte; uint8 r = E_OK; const void* pduDataPtr; Com_SignalType signalType = Signal->ComSignalType; if (signalType != UINT8_DYN) { return COM_SERVICE_NOT_AVAILABLE; } Irq_Save(state); if (*Length > Arc_IPdu->Com_Arc_DynSignalLength) { *Length = Arc_IPdu->Com_Arc_DynSignalLength; } startFromPduByte = (Signal->ComBitPosition) / 8; pduDataPtr = 0; if (IPdu->ComIPduSignalProcessing == DEFERRED && IPdu->ComIPduDirection == RECEIVE) { pduDataPtr = IPdu->ComIPduDeferredDataPtr; } else { if (isPduBufferLocked(getPduId(IPdu))) { r = COM_BUSY; } pduDataPtr = IPdu->ComIPduDataPtr; } memcpy((void*)SignalDataPtr, (void*)((uint8*)pduDataPtr + startFromPduByte), *Length); Irq_Restore(state); return r; }
Std_ReturnType Com_ReceiveSignalGroup(Com_SignalGroupIdType SignalGroupId) { const ComSignal_type * Signal = GET_Signal(SignalGroupId); const ComIPdu_type *IPdu = GET_IPdu(Signal->ComIPduHandleId); if (isPduBufferLocked(getPduId(IPdu))) { return COM_BUSY; } // Copy Ipdu data buffer to shadow buffer. Com_CopySignalGroupDataFromPduToShadowBuffer(SignalGroupId); return E_OK; }
uint8 Com_SendDynSignal(Com_SignalIdType SignalId, const void* SignalDataPtr, uint16 Length) { const ComSignal_type * Signal = GET_Signal(SignalId); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(Signal->ComIPduHandleId); const ComIPdu_type *IPdu = GET_IPdu(Signal->ComIPduHandleId); imask_t state; Com_SignalType signalType = Signal->ComSignalType; uint8 signalLength; Com_BitPositionType bitPosition; uint8 startFromPduByte; if (signalType != UINT8_DYN) { return COM_SERVICE_NOT_AVAILABLE; } if (isPduBufferLocked(getPduId(IPdu))) { return COM_BUSY; } signalLength = Signal->ComBitSize / 8; bitPosition = Signal->ComBitPosition; if (signalLength < Length) { return E_NOT_OK; } startFromPduByte = bitPosition / 8; Irq_Save(state); memcpy((void *)((uint8 *)IPdu->ComIPduDataPtr + startFromPduByte), SignalDataPtr, Length); Arc_IPdu->Com_Arc_DynSignalLength = Length; // 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(state); return E_OK; }
void Com_ReceiveShadowSignal(Com_SignalIdType SignalId, void *SignalDataPtr) { Com_Arc_GroupSignal_type *Arc_GroupSignal = GET_ArcGroupSignal(SignalId); uint8 pduSize = GET_IPdu(GET_Signal(SignalId)->ComIPduHandleId)->ComIPduSize; Com_ReadSignalDataFromPduBuffer(SignalId, TRUE, SignalDataPtr, (void *)Arc_GroupSignal->Com_Arc_ShadowBuffer,pduSize); }