void Com_TpRxIndication(PduIdType PduId, NotifResultType Result) { PDU_ID_CHECK_NO_RETURN(PduId, 0x14); const ComIPdu_type *IPdu = GET_IPdu(PduId); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(PduId); imask_t state; Irq_Save(state); // If Ipdu is stopped if (!Arc_IPdu->Com_Arc_IpduStarted) { UnlockTpBuffer(getPduId(IPdu)); Irq_Restore(state); return; } if (Result == NTFRSLT_OK) { if (IPdu->ComIPduSignalProcessing == IMMEDIATE) { // irqs needs to be disabled until signal notifications have been called // Otherwise a new Tp session can start and fill up pdus UnlockTpBuffer(getPduId(IPdu)); } // In deferred mode, buffers are unlocked in mainfunction Com_RxProcessSignals(IPdu,Arc_IPdu); } else { UnlockTpBuffer(getPduId(IPdu)); } Irq_Restore(state); }
Std_ReturnType Com_Internal_TriggerIPduSend(PduIdType ComTxPduId) { PDU_ID_CHECK(ComTxPduId, 0x17, E_NOT_OK); #if PDUR_COM_SUPPORT == STD_OFF return E_NOT_OK; #else const ComIPdu_type *IPdu = GET_IPdu(ComTxPduId); Com_Arc_IPdu_type *Arc_IPdu = GET_ArcIPdu(ComTxPduId); imask_t state; Irq_Save(state); if( isPduBufferLocked(ComTxPduId) ) { return E_NOT_OK; } // Is the IPdu ready for transmission? if (Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduMinimumDelayTimer == 0 && Arc_IPdu->Com_Arc_IpduStarted) { //lint --e(725) Suppress PC-Lint warning "Expected positive indentation...". What means? // Check callout status if (IPdu->ComIPduCallout != NULL) { if (!IPdu->ComIPduCallout(ComTxPduId, IPdu->ComIPduDataPtr)) { // TODO Report error to DET. // Det_ReportError(); Irq_Restore(state); return E_NOT_OK; } } PduInfoType PduInfoPackage; PduInfoPackage.SduDataPtr = (uint8 *)IPdu->ComIPduDataPtr; if (IPdu->ComIPduDynSignalRef != 0) { uint8 sizeWithoutDynSignal = IPdu->ComIPduSize - (IPdu->ComIPduDynSignalRef->ComBitSize/8); PduInfoPackage.SduLength = sizeWithoutDynSignal + Arc_IPdu->Com_Arc_DynSignalLength; } else { PduInfoPackage.SduLength = IPdu->ComIPduSize; } // Send IPdu! if (PduR_ComTransmit(IPdu->ArcIPduOutgoingId, &PduInfoPackage) == E_OK) { // Clear all update bits for the contained signals for (uint8 i = 0; (IPdu->ComIPduSignalRef != NULL) && (IPdu->ComIPduSignalRef[i] != NULL); i++) { if (IPdu->ComIPduSignalRef[i]->ComSignalArcUseUpdateBit) { CLEARBIT(IPdu->ComIPduDataPtr, IPdu->ComIPduSignalRef[i]->ComUpdateBitPosition); } } } else { UnlockTpBuffer(getPduId(IPdu)); return E_NOT_OK; } // Reset miminum delay timer. Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduMinimumDelayTimer = IPdu->ComTxIPdu.ComTxIPduMinimumDelayFactor; } else { return E_NOT_OK; } Irq_Restore(state); return E_OK; #endif }
void Com_TpTxConfirmation(PduIdType PduId, NotifResultType Result) { imask_t state; PDU_ID_CHECK_NO_RV(PduId, 0x15); (void)Result; // touch Irq_Save(state); UnlockTpBuffer(PduId); Irq_Restore(state); }