#include "debug.h"\r
\r
\r
+\r
+\r
+extern Com_BufferPduStateType Com_BufferPduState[];\r
+\r
/* TODO: Better way to get endianness across all compilers? */\r
static const uint32_t endianness_test = 0xdeadbeefU;\r
ComSignalEndianess_type Com_SystemEndianness;\r
}\r
}\r
}\r
-\r
+ for (uint16 i = 0; i < COM_N_IPDUS; i++) {\r
+ Com_BufferPduState[i].currentPosition = 0;\r
+ }\r
\r
// An error occurred.\r
if (failure) {\r
}\r
}\r
}\r
+\r
+/**\r
+ *
+ * @param PduId
+ * @param PduInfoPtr
+ * @param RetryInfoPtr not supported
+ * @param TxDataCntPtr
+ * @return
+ */\r
+BufReq_ReturnType Com_CopyTxData(PduIdType PduId, PduInfoType* PduInfoPtr, RetryInfoType* RetryInfoPtr, PduLengthType* TxDataCntPtr) {\r
+ imask_t state;\r
+ Irq_Save(state);\r
+ if (PduInfoPtr->SduLength != 0) {\r
+ Com_BufferPduState[PduId].locked = true;\r
+ }\r
+ memcpy(PduInfoPtr->SduDataPtr,Com_Arc_Config.ComIPdu[PduId].ComIPduDataPtr + Com_BufferPduState[PduId].currentPosition, PduInfoPtr->SduLength);\r
+ Com_BufferPduState[PduId].currentPosition += PduInfoPtr->SduLength;\r
+ const ComIPdu_type *IPdu = GET_IPdu(PduId);\r
+ *TxDataCntPtr = IPdu->ComIPduSize - Com_BufferPduState[PduId].currentPosition;\r
+ Irq_Restore(state);\r
+ return BUFREQ_OK;\r
+}\r
#include "Det.h"\r
#include "Cpu.h"\r
\r
+Com_BufferPduStateType Com_BufferPduState[COM_N_IPDUS];\r
\r
uint8 Com_SendSignal(Com_SignalIdType SignalId, const void *SignalDataPtr) {\r
VALIDATE_SIGNAL(SignalId, 0x0a, E_NOT_OK);\r
}\r
\r
void Com_TxConfirmation(PduIdType ComTxPduId) {\r
+ imask_t state;\r
+ Irq_Save(state);\r
PDU_ID_CHECK(ComTxPduId, 0x15);\r
+ Com_BufferPduState[ComTxPduId].locked = false;\r
+ Com_BufferPduState[ComTxPduId].currentPosition = 0;\r
(void)ComTxPduId; // Nothing to be done. This is just to avoid Lint warning.\r
+ Irq_Restore(state);\r
}\r
\r
\r
// Com_CopyData(SignalDataPtr, Arc_GroupSignal->Com_Arc_ShadowBuffer, GroupSignal->ComBitSize, 0, GroupSignal->ComBitPosition);\r
Com_ReadSignalDataFromPduBuffer(SignalId, TRUE, SignalDataPtr, (void *)Arc_GroupSignal->Com_Arc_ShadowBuffer);\r
}\r
+\r
+\r
+\r
\r
#include "Com_Arc_Types.h"\r
\r
+typedef struct {\r
+ PduLengthType currentPosition;\r
+ boolean locked;\r
+} Com_BufferPduStateType;\r
+\r
extern const Com_ConfigType *ComConfig;\r
extern Com_Arc_Config_type Com_Arc_Config;\r
\r
PduR_ARC_TxConfirmation(J1939TpTxId, Result, 0x0f);
}
+/* autosar 4 api */
+BufReq_ReturnType PduR_J1939TpCopyTxData(PduIdType id, PduInfoType* info, RetryInfoType* retry, PduLengthType* availableDataPtr) {
+#if PDUR_COM_SUPPORT == STD_OFF
+ return BUFREQ_NOT_OK;
+#endif
+ const PduRRoutingPath_type *route = PduRConfig->RoutingPaths[id];
+ return Com_CopyTxData(route->SrcModule, info,0 ,availableDataPtr);
+}
#endif
void Com_RxIndication(PduIdType ComRxPduId, const PduInfoType* PduInfoPtr);\r
void Com_TxConfirmation(PduIdType ComTxPduId);\r
\r
-\r
/* Signal Groups */\r
\r
Std_ReturnType Com_SendSignalGroup(Com_SignalGroupIdType SignalGroupId);\r
void Com_ReceiveShadowSignal(Com_SignalIdType SignalId, void *SignalDataPtr);\r
\r
\r
+/* Autosar 4 Api */\r
+BufReq_ReturnType Com_CopyTxData(PduIdType PduId, PduInfoType* PduInfoPtr, RetryInfoType* RetryInfoPtr, PduLengthType* TxDataCntPtr);\r
+\r
#endif /* COM_COM_H_ */\r
BufReq_ReturnType PduR_J1939TpStartOfReception(PduIdType id, PduLengthType TpSduLength, PduLengthType* bufferSizePtr);\r
void PduR_J1939TpRxIndication(PduIdType id, NotifResultType Result);\r
\r
+/* autosar 4 api */\r
+BufReq_ReturnType PduR_J1939TpCopyTxData(PduIdType id, PduInfoType* info, RetryInfoType* retry, PduLengthType* availableDataPtr);\r
+\r
#endif\r
\r
#endif /* PDUR_CANTP_H_ */\r