.State = J1939TP_OFF,\r
};\r
static const J1939Tp_ConfigType* J1939Tp_ConfigPtr;\r
-static J1939Tp_Internal_PgStateInfoType PgStates[J1939TP_PG_COUNT];\r
-static J1939Tp_Internal_TxPgInfo txInfos[J1939TP_TX_PG_COUNT];\r
-static J1939Tp_Internal_RxPgInfo rxInfos[J1939TP_RX_PG_COUNT];\r
+static J1939Tp_Internal_ChannelInfoType channelInfos[J1939TP_CHANNEL_COUNT];\r
\r
\r
/** @req J1939TP0087 */\r
return;\r
}\r
#endif\r
- for (int i = 0; i < J1939TP_PG_COUNT; i++) {\r
+ for (int i = 0; i < J1939TP_CHANNEL_COUNT; i++) {\r
int rxCount = 0;\r
int txCount = 0;\r
- if (ConfigPtr->Pgs[i].Channel->Direction == J1939TP_TX) {\r
- PgStates[i].Tx = &(txInfos[txCount]);\r
+ if (ConfigPtr->Channels[i].Direction == J1939TP_TX) {\r
+ ConfigPtr->Channels[i].TxState = &(txInfos[txCount]);\r
+ ConfigPtr->Channels[i].RxState = 0;\r
+ txCount++;\r
+ } else if (ConfigPtr->Channel[i].Direction == J1939TP_RX) {\r
+ ConfigPtr->Channels[i].RxState = 0;\r
+ ConfigPtr->Channels[i].TxState = &(txInfos[txCount]);\r
txCount++;\r
- } else if (ConfigPtr->Pgs[i].Channel->Direction == J1939TP_RX) {\r
- PgStates[i].Rx = &(rxInfos[rxCount]);\r
rxCount++;\r
} else {\r
return; // unexpected\r
}\r
- PgStates[i].PgConfPtr = &(ConfigPtr->Pgs[i]);\r
}\r
J1939Tp_ConfigPtr = ConfigPtr;\r
globalState.State = J1939TP_ON; /** @req J1939TP0022 */\r
}\r
\r
void J1939Tp_RxIndication(PduIdType RxPduId, PduInfoType* PduInfoPtr) {\r
- J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(RxPduId);\r
- switch (PgState->PgConfPtr->Channel->Direction) {\r
- case J1939TP_TX:\r
- J1939Tp_Internal_RxIndication_TxChannel(RxPduId,PduInfoPtr);\r
- break;\r
- case J1939TP_RX:\r
- J1939Tp_Internal_RxIndication_RxChannel(RxPduId,PduInfoPtr);\r
- break;\r
- default:\r
- break;\r
+ J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
+ if (J1939Tp_Internal_GetRxPduInfo(RxPduId, RxPduInfo) != E_OK) {\r
+ return;\r
}\r
-}\r
-static inline boolean J1939Tp_Internal_IsDtPacketAlreadySent(uint8 nextPacket, uint8 totalPacketsSent) {\r
- return nextPacket < totalPacketsSent;\r
-}\r
-static void inline J1939Tp_Internal_RxIndication_TxChannel(PduIdType RxPduId, PduInfoType* PduInfoPtr) {\r
- J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(RxPduId);\r
- uint8 NumPacketsToSend = 0;\r
- uint8 NextPacket = 0;\r
-\r
- switch (PgState->Tx->State) {\r
- case J1939TP_TX_WAITING_FOR_CTS:\r
- if (J1939Tp_Internal_CheckValidCts(PduInfoPtr,&NumPacketsToSend,&NextPacket)) {\r
- if (NumPacketsToSend == 0) {\r
- // Receiver wants to keep the connection open but cant receive packets\r
- /** @req J1939TP0195 */\r
- J1939Tp_Internal_TxSessionStartTimer(PgState->Tx,J1939TP_T4_TIMEOUT_MS);\r
- } else if(J1939Tp_Internal_IsDtPacketAlreadySent(NextPacket,PgState->Tx->TotalSentDtCount)) {\r
- /** @req J1939TP0194 */\r
- PduR_J1939TpTxConfirmation(PgState->PgConfPtr->NSdu,NTFRSLT_E_NOT_OK);\r
- J1939Tp_Internal_SendConnectionAbort(PgState->PgConfPtr->Channel->CmNPdu,PgState->PgConfPtr->Pgn);\r
- PgState->Tx->State = J1939TP_TX_IDLE;\r
- } else {\r
- PgState->Tx->DtToSendBeforeCtsCount = NumPacketsToSend;\r
- PgState->Tx->SentDtCount = 0;\r
- PgState->Tx->State = J1939TP_TX_WAIT_DT_CANIF_CONFIRM;\r
- J1939Tp_Internal_SendDt(PgState);\r
- J1939Tp_Internal_TxSessionStartTimer(PgState->Tx,J1939TP_TX_CONF_TIMEOUT);\r
- }\r
- }\r
- break;\r
- case J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK:\r
- if (J1939Tp_Internal_CheckValidEndOfMsgAck(PgState,PduInfoPtr)) {\r
- PduR_J1939TpTxConfirmation(PgState->PgConfPtr->NSdu,NTFRSLT_OK);\r
- PgState->Tx->State = J1939TP_TX_IDLE;\r
- }\r
+ if (J1939Tp_Internal_ValidatePacketType(RxPduInfo) == E_NOT_OK) {\r
+ return;\r
+ }\r
+ switch (RxPduInfo->PacketType ) {\r
+ case J1939TP_REVERSE_CM:\r
+ J1939Tp_Internal_RxIndication_ReverseCm(PduInfoPtr,RxPduInfo->ChannelPtr);\r
break;\r
- default:\r
+ case J1939TP_DT:\r
+ J1939Tp_Internal_RxIndication_Dt(PduInfoPtr,RxPduInfo->ChannelPtr);\r
break;\r
- }\r
-}\r
-static void inline J1939Tp_Internal_RxIndication_RxChannel(PduIdType NSduId, PduInfoType* PduInfoPtr) {\r
- J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(NSduId);\r
- switch (PgState->Rx->State) {\r
- case J1939TP_RX_IDLE:\r
- if (J1939Tp_Internal_ReceiveRts(NSduId, PduInfoPtr) == E_OK) {\r
- PgState->Rx->State = J1939TP_RX_WAIT_CTS_CANIF_CONFIRM;\r
- J1939Tp_Internal_SendCts(PgState,PduInfoPtr);\r
- J1939Tp_Internal_RxSessionStartTimer(PgState->Rx,J1939TP_TX_CONF_TIMEOUT);\r
- }\r
+ case J1939TP_CM:\r
+ J1939Tp_Internal_RxIndication_Cm(PduInfoPtr,RxPduInfo->ChannelPtr);\r
break;\r
- case J1939TP_RX_RECEIVING_DT:\r
- J1939Tp_Internal_ReceiveDt(NSduId,PduInfoPtr);\r
default:\r
- break;\r
+ return;\r
}\r
}\r
\r
-static boolean inline J1939Tp_Internal_IsLastDt(J1939Tp_Internal_RxPgInfo* rxPgInfo) {\r
- return (rxPgInfo->TotalDtToReceiveCount == rxPgInfo->TotalReceivedDtCount);\r
-}\r
-static Std_ReturnType inline J1939Tp_Internal_ReceiveDt(PduIdType NSduId, PduInfoType* PduInfoPtr) {\r
- PduInfoType* rxPduInfo;\r
- J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(NSduId);\r
- PduIdType PduRSdu = PgState->PgConfPtr->NSdu;\r
- uint8 requestSize = DT_DATA_SIZE;\r
- boolean lastMessage = false;\r
- if (J1939Tp_Internal_IsLastDt(PgState->Rx)) {\r
- lastMessage = true;\r
- J1939Tp_Internal_DtPayloadSizeType receivedBytes = PgState->Rx->TotalReceivedDtCount*DT_DATA_SIZE;\r
- requestSize = PgState->Rx->TotalMessageSize - receivedBytes;\r
- PgState->Rx->State = J1939TP_RX_IDLE;\r
- J1939Tp_Internal_SendEndOfMsgAck(PgState);\r
- }\r
- BufReq_ReturnType r = PduR_J1939TpProvideRxBuffer(PduRSdu, requestSize, &rxPduInfo);\r
- if (r == BUFREQ_OK) {\r
- memcpy(rxPduInfo->SduDataPtr,&(PduInfoPtr[DT_BYTE_DATA_1]),requestSize);\r
- }\r
- if (lastMessage == true) {\r
- PduR_J1939TpRxIndication(PduRSdu,NTFRSLT_OK);\r
- } else {\r
- J1939Tp_Internal_RxSessionStartTimer(PgState->Rx,J1939TP_T1_TIMEOUT_MS);\r
- }\r
- return E_OK;\r
-}\r
-static Std_ReturnType inline J1939Tp_Internal_ReceiveRts(PduIdType NSduId, PduInfoType* PduInfoPtr) {\r
- J1939Tp_Internal_ControlByteType controlByte;\r
- Std_ReturnType r = J1939Tp_Internal_GetCmControlByte(PduInfoPtr,&controlByte);\r
- if (r == E_NOT_OK) {\r
- return r;\r
- }\r
- PduLengthType* bufferSizePtr = 0;\r
- /** @req J1939TP0043**/\r
- J1939Tp_Internal_DtPayloadSizeType messageSize = 0;\r
- if (controlByte == RTS_CONTROL_VALUE) {\r
- messageSize = J1939Tp_Internal_GetRtsMessageSize(PduInfoPtr);\r
-\r
- /** @req J1939TP0039**/\r
- BufReq_ReturnType BufferRes = PduR_J1939TpStartOfReception(NSduId,messageSize,bufferSizePtr);\r
- if (BufferRes != BUFREQ_OK) {\r
- return E_OK;\r
- }\r
- }\r
- J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(NSduId);\r
- PgState->Rx->TotalReceivedDtCount = 0;\r
- PgState->Rx->TotalDtToReceiveCount = PduInfoPtr->SduDataPtr[RTS_BYTE_NUM_PACKETS];\r
- PgState->Rx->TotalMessageSize = messageSize;\r
- return E_OK;\r
-}\r
-\r
\r
void J1939Tp_MainFunction(void) {\r
- for (int i = 0; i < J1939TP_PG_COUNT; i++) {\r
- J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(i);\r
+ for (int i = 0; i < J1939TP_CHANNEL_COUNT; i++) {\r
+ J1939Tp_ChannelType* Channel = &(J1939Tp_ConfigPtr->Channel[i]);\r
J1939Tp_Internal_TimerStatusType timer = J1939TP_NOT_EXPIRED;\r
- switch (PgState->PgConfPtr->Channel->Direction) {\r
+ switch (Channel->Direction) {\r
case J1939TP_TX:\r
- switch (PgState->Tx->State) {\r
+ switch (Channel->TxState->State) {\r
case J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM:\r
case J1939TP_TX_WAITING_FOR_CTS:\r
case J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK:\r
}\r
break;\r
if (timer == J1939TP_EXPIRED) {\r
- PgState->Tx->State = J1939TP_TX_IDLE;\r
- J1939Tp_Internal_SendConnectionAbort(PgState->PgConfPtr->Channel->CmNPdu,PgState->PgConfPtr->Pgn);\r
- PduR_J1939TpTxConfirmation(PgState->PgConfPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+ Channel->TxState->State = J1939TP_TX_IDLE;\r
+ if (Channel->CurrentPgPtr != 0) {\r
+ J1939Tp_Internal_SendConnectionAbort(Channel->CmNPdu,Channel->CurrentPgPtr->Pgn);\r
+ PduR_J1939TpTxConfirmation(Channel->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+ }\r
}\r
return;\r
case J1939TP_RX:\r
- switch (PgState->Rx->State) {\r
+ switch (Channel->RxState->State) {\r
case J1939TP_RX_WAIT_CTS_CANIF_CONFIRM:\r
case J1939TP_RX_RECEIVING_DT:\r
case J1939TP_RX_WAIT_ENDOFMSGACK_CANIF_CONFIRM:\r
- timer = J1939Tp_Internal_IncAndCheckTimer(&(PgState->Rx->TimerInfo));\r
+ timer = J1939Tp_Internal_IncAndCheckTimer(&(Channel->RxState->TimerInfo));\r
default:\r
break;\r
}\r
default:\r
break;\r
if (timer == J1939TP_EXPIRED) {\r
- PgState->Rx->State = J1939TP_TX_IDLE;\r
- J1939Tp_Internal_SendConnectionAbort(PgState->PgConfPtr->Channel->FcNPdu,PgState->PgConfPtr->Pgn);\r
- PduR_J1939TpRxIndication(PgState->PgConfPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+ Channel->RxState->State = J1939TP_TX_IDLE;\r
+ J1939Tp_Internal_SendConnectionAbort(Channel->FcNPdu,PgState->PgConfPtr->Pgn);\r
+ PduR_J1939TpRxIndication(Channel->RxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
}\r
return;\r
}\r
}\r
}\r
-void J1939Tp_TxConfirmation(PduIdType NSduId) {\r
- J1939Tp_Internal_PgStateInfoType* pgState = J1939Tp_Internal_GetPg(NSduId);\r
+void J1939Tp_TxConfirmation(PduIdType RxPdu) {\r
+ J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
+ if (J1939Tp_Internal_GetRxPduInfo(RxPduId, RxPduInfo) != E_OK) {\r
+ return;\r
+ }\r
+ if (J1939Tp_Internal_ValidatePacketType(RxPduInfo) != E_OK) {\r
+ return;\r
+ }\r
+ J1939Tp_ChannelType* Channel = RxPduInfo->ChannelPtr;\r
switch (pgState->PgConfPtr->Channel->Direction) {\r
case J1939TP_TX:\r
- J1939Tp_Internal_TxConfirmation_TxChannel(NSduId);\r
+ J1939Tp_Internal_TxConfirmation_TxChannel(RxPduInfo);\r
break;\r
case J1939TP_RX:\r
- J1939Tp_Internal_TxConfirmation_RxChannel(NSduId);\r
+ J1939Tp_Internal_TxConfirmation_RxChannel(RxPduInfo);\r
break;\r
default:\r
break;\r
}\r
\r
}\r
-static inline void J1939Tp_Internal_TxConfirmation_RxChannel(PduIdType NSduId) {\r
- J1939Tp_Internal_PgStateInfoType* pgState = J1939Tp_Internal_GetPg(NSduId);\r
- switch (pgState->Tx->State) {\r
- case J1939TP_RX_WAIT_CTS_CANIF_CONFIRM:\r
- J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_T2_TIMEOUT_MS);\r
- pgState->Tx->State = J1939TP_RX_RECEIVING_DT;\r
+\r
+static inline Std_ReturnType J1939Tp_Internal_ValidatePacketType(J1939Tp_RxPduInfoType* RxPduInfo) {\r
+ switch (RxPduInfo->PacketType) {\r
+ case J1939TP_REVERSE_CM:\r
+ if (RxPduInfo->ChannelPtr->Direction != J1939TP_TX ) {\r
+ return E_NOT_OK;\r
+ }\r
+ break;\r
+ case J1939TP_DT:\r
+ if (RxPduInfo->ChannelPtr->Direction != J1939TP_RX) {\r
+ return E_NOT_OK;\r
+ }\r
+ break;\r
+ case J1939TP_CM:\r
+ if (RxPduInfo->ChannelPtr->Direction != J1939TP_RX) {\r
+ return E_NOT_OK;\r
+ }\r
+ break;\r
+ default:\r
+ return E_NOT_OK;\r
+ }\r
+ return E_OK;\r
+}\r
+\r
+static inline void J1939Tp_Internal_RxIndication_Dt(PduInfoType* PduInfoPtr, J1939Tp_ChannelType* Channel) {\r
+ PduInfoType* rxPduInfo;\r
+ J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(NSduId);\r
+ PduIdType PduRSdu = Channel->RxState->CurrentPg->NSdu;\r
+ uint8 requestSize = DT_DATA_SIZE;\r
+ boolean lastMessage = false;\r
+ if (J1939Tp_Internal_IsLastDt(Channel->RxState)) {\r
+ lastMessage = true;\r
+ J1939Tp_Internal_DtPayloadSizeType receivedBytes = Channel->RxState->TotalReceivedDtCount*DT_DATA_SIZE;\r
+ requestSize = Channel->RxState->TotalMessageSize - receivedBytes;\r
+ Channel->RxState->State = J1939TP_RX_IDLE;\r
+ J1939Tp_Internal_SendEndOfMsgAck(Channel);\r
+ }\r
+ BufReq_ReturnType r = PduR_J1939TpProvideRxBuffer(PduRSdu, requestSize, &rxPduInfo);\r
+ if (r == BUFREQ_OK) {\r
+ memcpy(rxPduInfo->SduDataPtr,&(PduInfoPtr[DT_BYTE_DATA_1]),requestSize);\r
+ }\r
+ if (lastMessage == true) {\r
+ PduR_J1939TpRxIndication(PduRSdu,NTFRSLT_OK);\r
+ } else {\r
+ J1939Tp_Internal_RxSessionStartTimer(PgState->Rx,J1939TP_T1_TIMEOUT_MS);\r
+ }\r
+ return E_OK;\r
+}\r
+static inline void J1939Tp_Internal_RxIndication_Cm(PduInfoType* PduInfoPtr, J1939Tp_ChannelType* Channel) {\r
+ J1939Tp_PgType* pg = 0;\r
+ J1939Tp_PgnType pgn = J1939Tp_Internal_GetPgn(PduInfoPtr->SduDataPtr[CM_PGN_BYTE_1]);\r
+ if (J1939Tp_Internal_GetPgFromPgn(Channel,&pgn,pg) != E_OK) {\r
+ return;\r
+ }\r
+ uint8 Command = PduInfoPtr->SduDataPtr[CM_BYTE_CONTROL];\r
+ switch (Command) {\r
+ case RTS_CONTROL_VALUE:\r
+ if (channel->RxState.State == J1939TP_RX_IDLE) {\r
+ /** @req J1939TP0043**/\r
+ J1939Tp_Internal_DtPayloadSizeType messageSize = 0;\r
+ messageSize = J1939Tp_Internal_GetRtsMessageSize(PduInfoPtr);\r
+ /** @req J1939TP0039**/\r
+ BufReq_ReturnType BufferRes = PduR_J1939TpStartOfReception(pg->NSdu,messageSize,bufferSizePtr);\r
+ if (BufferRes != BUFREQ_OK) {\r
+ return E_OK;\r
+ }\r
+ Channel->RxState->TotalReceivedDtCount = 0;\r
+ Channel->RxState->TotalDtToReceiveCount = PduInfoPtr->SduDataPtr[RTS_BYTE_NUM_PACKETS];\r
+ Channel->RxState->TotalMessageSize = messageSize;\r
+ Channel->RxState->State = J1939TP_RX_WAIT_CTS_CANIF_CONFIRM;\r
+ Channel->RxState->CurrentPgPtr = pg;\r
+ J1939Tp_Internal_SendCts(Channel,PduInfoPtr);\r
+ J1939Tp_Internal_RxSessionStartTimer(Channel->RxState,J1939TP_TX_CONF_TIMEOUT);\r
+ }\r
break;\r
default:\r
break;\r
}\r
}\r
-static inline void J1939Tp_Internal_TxConfirmation_TxChannel(PduIdType NSduId) {\r
- J1939Tp_Internal_PgStateInfoType* pgState = J1939Tp_Internal_GetPg(NSduId);\r
- switch (pgState->Tx->State) {\r
- case J1939TP_TX_WAIT_DT_CANIF_CONFIRM:\r
- if (J1939Tp_Internal_WaitForEndOfMsgAck(pgState->Tx)) {\r
- J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_T3_TIMEOUT_MS);\r
- pgState->Tx->State = J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK;\r
- } else if (J1939Tp_Internal_WaitForCts(pgState->Tx)) {\r
- J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_T3_TIMEOUT_MS);\r
- pgState->Tx->State = J1939TP_TX_WAITING_FOR_CTS;\r
- } else {\r
- J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_TX_CONF_TIMEOUT);\r
- J1939Tp_Internal_SendDt(pgState);\r
+static inline void J1939Tp_Internal_RxIndication_ReverseCm(PduInfoType* PduInfoPtr, J1939Tp_ChannelType* Channel) {\r
+ J1939Tp_PgType* pg = 0;\r
+ J1939Tp_PgnType pgn = J1939Tp_Internal_GetPgn(PduInfoPtr->SduDataPtr[CM_PGN_BYTE_1]);\r
+ if (J1939Tp_Internal_GetPgFromPgn(Channel,&pgn,pg) != E_OK) {\r
+ return;\r
+ }\r
+ uint8 Command = PduInfoPtr->SduDataPtr[CM_BYTE_CONTROL];\r
+ switch (Command) {\r
+ case CTS_CONTROL_VALUE:\r
+ if (Channel->TxState->State == J1939TP_TX_WAITING_FOR_CTS) {\r
+ uint8 NumPacketsToSend = PduInfoPtr->SduDataPtr[CTS_BYTE_NUM_PACKETS];\r
+ uint8 NextPacket = PduInfoPtr->SduDataPtr[CTS_BYTE_NEXT_PACKET];\r
+ if (NumPacketsToSend == 0) {\r
+ // Receiver wants to keep the connection open but cant receive packets\r
+ /** @req J1939TP0195 */\r
+ J1939Tp_Internal_TxSessionStartTimer(PgState->Tx,J1939TP_T4_TIMEOUT_MS);\r
+ } else if(J1939Tp_Internal_IsDtPacketAlreadySent(NextPacket,Channel->TxState->TotalSentDtCount)) {\r
+ /** @req J1939TP0194 */\r
+ PduR_J1939TpTxConfirmation(pg->NSdu,NTFRSLT_E_NOT_OK);\r
+ J1939Tp_Internal_SendConnectionAbort(Channel->CmNPdu,pgn);\r
+ Channel->TxState->State = J1939TP_TX_IDLE;\r
+ } else {\r
+ Channel->TxState->DtToSendBeforeCtsCount = NumPacketsToSend;\r
+ Channel->TxState->SentDtCount = 0;\r
+ Channel->TxState->State = J1939TP_TX_WAIT_DT_CANIF_CONFIRM;\r
+ J1939Tp_Internal_SendDt(Channel);\r
+ J1939Tp_Internal_TxSessionStartTimer(Channel->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+ }\r
}\r
break;\r
- case J1939TP_TX_WAIT_RTS_CANIF_CONFIRM:\r
- pgState->Tx->State = J1939TP_TX_WAITING_FOR_CTS;\r
+ case ENDOFMSGACK_CONTROL_VALUE:\r
+ if (PChannel->TxState->State == J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK) {\r
+ PduR_J1939TpTxConfirmation(pg->NSdu,NTFRSLT_OK);\r
+ Channel->TxState->State = J1939TP_TX_IDLE;\r
+ }\r
+ break;\r
+ case CONNABORT_CONTROL_VALUE:\r
+ PduR_J1939TpTxConfirmation(pg->NSdu,NTFRSLT_E_NOT_OK);\r
+ Channel->TxState->State = J1939TP_TX_IDLE;\r
break;\r
- case J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM:\r
- pgState->Tx->State = J1939TP_TX_IDLE;\r
- PduR_J1939TpTxConfirmation(pgState->PgConfPtr->NSdu, NTFRSLT_OK);\r
-\r
default:\r
break;\r
}\r
}\r
+\r
/** @req J1939TP0180 */\r
Std_ReturnType J1939Tp_ChangeParameterRequest(PduIdType SduId, TPParameterType Parameter, uint16 value) {\r
return E_NOT_OK; /** @req J1939TP0181 */\r
}\r
+static inline void J1939Tp_Internal_TxConfirmation_RxChannel(J1939Tp_RxPduInfoType RxPdu) {\r
+ switch (RxPduInfo->PacketType ) {\r
+ case J1939TP_REVERSE_CM:\r
+ if (RxPduInfo->ChannelPtr->TxState->State == J1939TP_RX_WAIT_CTS_CANIF_CONFIRM) {\r
+ J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_T2_TIMEOUT_MS);\r
+ pgState->Tx->State = J1939TP_RX_RECEIVING_DT;\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+}\r
+static inline boolean J1939Tp_Internal_IsDtPacketAlreadySent(uint8 nextPacket, uint8 totalPacketsSent) {\r
+ return nextPacket < totalPacketsSent;\r
+}\r
+static inline Std_ReturnType J1939Tp_Internal_GetRxPduInfo(PduIdType RxPdu,J1939Tp_RxPduInfoType* RxPduInfo) {\r
+ if (RxPdu < J1939TP_RX_PDU_COUNT) {\r
+ RxPduInfo = &(J1939Tp_ConfigPtr->RxPdus[RxPdu]);\r
+ return E_OK;\r
+ } else {\r
+ return E_NOT_OK;\r
+ }\r
+\r
+}\r
+static inline Std_ReturnType J1939Tp_Internal_GetPgFromPgn(const J1939Tp_ChannelType* channel, const J1939Tp_Internal_PgnType Pgn, J1939Tp_PgType* Pg) {\r
+ for (int i = 0; i < channel->PgCount; i++) {\r
+ if (channel->Pgs[i]->pg->Pgn == Pgn) {\r
+ Pg = channel->Pgs[i]->pg;\r
+ return E_OK;\r
+ }\r
+ }\r
+ return E_NOT_OK;\r
+}\r
\r
+\r
+\r
+static inline boolean J1939Tp_Internal_IsLastDt(J1939Tp_Internal_RxChannelInfoType* rxChannelInfo) {\r
+ return (rxChannelInfo->TotalDtToReceiveCount == rxChannelInfo->TotalReceivedDtCount);\r
+}\r
+static inline void J1939Tp_Internal_TxConfirmation_TxChannel(J1939Tp_RxPduInfoType* RxPduInfo) {\r
+ J1939Tp_ChannelType* Channel = RxPduInfo->ChannelPtr;\r
+ switch (RxPduInfo->PacketType ) {\r
+ case J1939TP_REVERSE_CM:\r
+ break;\r
+ case J1939TP_CM:\r
+ if (Channel->TxState->State == J1939TP_TX_WAIT_RTS_CANIF_CONFIRM) {\r
+ pgState->Tx->State = J1939TP_TX_WAITING_FOR_CTS;\r
+ }\r
+ break;\r
+ case J1939TP_DT:\r
+ if (Channel->TxState->State == J1939TP_TX_WAIT_DT_CANIF_CONFIRM) {\r
+ if (J1939Tp_Internal_WaitForEndOfMsgAck(pgState->Tx)) {\r
+ J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_T3_TIMEOUT_MS);\r
+ pgState->Tx->State = J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK;\r
+ } else if (J1939Tp_Internal_WaitForCts(pgState->Tx)) {\r
+ J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_T3_TIMEOUT_MS);\r
+ pgState->Tx->State = J1939TP_TX_WAITING_FOR_CTS;\r
+ } else {\r
+ J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_SendDt(pgState->Tx);\r
+ }\r
+ }\r
+ break;\r
+ case J1939TP_DIRECT:\r
+ if (Channel->TxState->State == J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM) {\r
+ pgState->Tx->State = J1939TP_TX_IDLE;\r
+ PduR_J1939TpTxConfirmation(pgState->PgConfPtr->NSdu, NTFRSLT_OK);\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+}\r
/** @req J1939TP0096 */\r
Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr) {\r
#if J1939TP_DEV_ERROR_DETECT\r
J1939Tp_Internal_ReportError(J1939TP_TRANSMIT_ID,J1939TP_E_UNINIT);\r
}\r
#endif\r
- J1939Tp_Internal_PgStateInfoType* pgState = J1939Tp_Internal_GetPg(TxSduId);\r
+ J1939Tp_PgType* Pg;\r
+ if (J1939Tp_Internal_ConfGetPg(TxInfoPtr,Channel) == E_NOT_OK) {\r
+ return;\r
+ }\r
if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
PduInfoType* ToSendTxInfoPtr;\r
- PduR_J1939TpProvideTxBuffer(TxSduId, &ToSendTxInfoPtr, TxInfoPtr->SduLength);\r
- PduIdType CanIfPdu = pgState->PgConfPtr->DirectNPdu;\r
- pgState->Tx->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
+ PduR_J1939TpProvideTxBuffer(Pg->NSdu, &ToSendTxInfoPtr, TxInfoPtr->SduLength);\r
+ PduIdType CanIfPdu = Pg->DirectNPdu;\r
+ Pg->Channel->TxState->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
+ Pg->Channel->TxState->CurrentPgPtr = Pg;\r
CanIf_Transmit(CanIfPdu,ToSendTxInfoPtr);\r
} else {\r
- J1939Tp_PgnType pgn = J1939Tp_Internal_ConfGetPg(TxSduId)->Pgn;\r
- uint8 pf = J1939Tp_Internal_GetPf(pgn);\r
+ uint8 pf = J1939Tp_Internal_GetPf(Pg->Pgn);\r
J1939Tp_ProtocolType protocol = J1939Tp_Internal_GetProtocol(pf);\r
switch (protocol) { /** @req J1939TP0039*/\r
case J1939TP_PROTOCOL_BAM:\r
break;\r
case J1939TP_PROTOCOL_CMDT:\r
- pgState->Tx->State = J1939TP_TX_WAIT_RTS_CANIF_CONFIRM;\r
- J1939Tp_Internal_SendRts(pgState,TxInfoPtr);\r
- J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_TX_CONF_TIMEOUT);\r
- J1939Tp_Internal_PgStateInfoType* txPgState = J1939Tp_Internal_GetPg(TxSduId);\r
- J1939Tp_Internal_ResetTimer(txPgState);\r
- txPgState->Tx->TotalMessageSize = TxInfoPtr->SduLength;\r
- txPgState->Tx->TotalBytesSent = 0;\r
- txPgState->Tx->TotalSentDtCount = 0;\r
- txPgState->Tx->PduRPdu = TxSduId;\r
+ Pg->Channel->TxState->State = J1939TP_TX_WAIT_RTS_CANIF_CONFIRM;\r
+ Pg->Channel->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
+ Pg->Channel->TxState->TotalBytesSent = 0;\r
+ Pg->Channel->TxState->TotalSentDtCount = 0;\r
+ Pg->Channel->TxState->PduRPdu = TxSduId;\r
+ Pg->Channel->TxState->CurrentPgPtr = Pg;\r
+ J1939Tp_Internal_SendRts(Pg->Channel,TxInfoPtr);\r
+ J1939Tp_Internal_TxSessionStartTimer(Channel->TxState,J1939TP_TX_CONF_TIMEOUT);\r
break;\r
}\r
}\r
static inline uint16 J1939Tp_Internal_GetRtsMessageSize(PduInfoType* pduInfo) {\r
return (((uint16)pduInfo->SduDataPtr[RTS_BYTE_LENGTH_1]) << 8) | pduInfo->SduDataPtr[RTS_BYTE_LENGTH_1];\r
}\r
-static inline Std_ReturnType J1939Tp_Internal_GetCmControlByte(PduInfoType* pduInfo, J1939Tp_Internal_ControlByteType* controlByte) {\r
- if (pduInfo->SduLength != 8) {\r
- return E_NOT_OK;\r
- }\r
- else {\r
- *controlByte = pduInfo->SduDataPtr[0];\r
- return E_OK;\r
- }\r
-}\r
-static inline const J1939Tp_PgType* J1939Tp_Internal_ConfGetPg(PduIdType NSduId) {\r
- return &(J1939Tp_ConfigPtr->Pgs[NSduId]);\r
-}\r
-static inline boolean J1939Tp_Internal_WaitForCts(J1939Tp_Internal_TxPgInfo* TxPgState) {\r
- return TxPgState->SentDtCount == TxPgState->DtToSendBeforeCtsCount;\r
-}\r
\r
-static inline boolean J1939Tp_Internal_WaitForEndOfMsgAck(J1939Tp_Internal_TxPgInfo* TxPgState) {\r
- return TxPgState->TotalMessageSize == TxPgState->TotalBytesSent;\r
+static inline boolean J1939Tp_Internal_WaitForCts(J1939Tp_Internal_TxChannelInfoType* TxChannelState) {\r
+ return TxChannelState->SentDtCount == TxChannelState->DtToSendBeforeCtsCount;\r
}\r
\r
-\r
-static inline J1939Tp_Internal_PgStateInfoType* J1939Tp_Internal_GetPg(PduIdType NSduId) {\r
- return &(PgStates[NSduId]);\r
+static inline boolean J1939Tp_Internal_WaitForEndOfMsgAck(J1939Tp_Internal_TxChannelInfoType* TxChannelState) {\r
+ return TxChannelState->TotalMessageSize == TxChannelState->TotalBytesSent;\r
}\r
-static inline const J1939Tp_ChannelType* J1939Tp_Internal_ConfGetTxChannel(PduIdType NSduId) {\r
- return J1939Tp_ConfigPtr->Pgs[NSduId].Channel;\r
-}\r
-\r
-\r
\r
-static inline boolean J1939Tp_Internal_CheckValidEndOfMsgAck(J1939Tp_Internal_PgStateInfoType* pgState, PduInfoType* PduInfoPtr) {\r
- if (PduInfoPtr->SduLength != ENDOFMSGACK_SIZE) {\r
- return false;\r
- }\r
- if (PduInfoPtr->SduDataPtr[ENDOFMSGACK_BYTE_CONTROL] != ENDOFMSGACK_CONTROL_VALUE) {\r
- return false;\r
+static inline Std_ReturnType J1939Tp_Internal_ConfGetPg(PduIdType NSduId, J1939Tp_PgType* Pg) {\r
+ if (NSduId < J1939TP_PG_COUNT) {\r
+ Pg = &(J1939Tp_ConfigPtr->Pgs[NSduId]);\r
+ return E_OK;\r
+ } else {\r
+ return E_NOT_OK;\r
}\r
- return true;\r
}\r
+\r
static inline J1939Tp_Internal_TimerStatusType J1939Tp_Internal_IncAndCheckTimer(J1939Tp_Internal_TimerType* TimerInfo) {\r
TimerInfo->Timer += J1939TP_MAIN_FUNCTION_PERIOD;\r
if (TimerInfo->Timer >= TimerInfo->TimerExpire) {\r
return J1939TP_PROTOCOL_BAM;\r
}\r
}\r
-static inline boolean J1939Tp_Internal_CheckValidCts(PduInfoType* PduInfoPtr,uint8* NumPackets, uint8* NextPacket) {\r
- /*\r
- if (PduInfoPtr->SduLength != CTS_SIZE) {\r
- return false;\r
- }\r
- */\r
- if (PduInfoPtr->SduDataPtr[CTS_BYTE_CONTROL] != CTS_CONTROL_VALUE) {\r
- return false;\r
- }\r
\r
- *NumPackets = PduInfoPtr->SduDataPtr[CTS_BYTE_NUM_PACKETS];\r
- *NextPacket = PduInfoPtr->SduDataPtr[CTS_BYTE_NEXT_PACKET];\r
- return true;\r
-}\r
\r
-static void inline J1939Tp_Internal_SendDt(J1939Tp_Internal_PgStateInfoType* PgState) {\r
+static inline void J1939Tp_Internal_SendDt(J1939Tp_ChannelType* Channel) {\r
uint8 requestLength = DT_DATA_SIZE;\r
- uint8 bytesLeftToSend = PgState->Tx->TotalMessageSize - PgState->Tx->TotalSentDtCount * DT_DATA_SIZE;\r
+ uint8 bytesLeftToSend = Channel->TxState->TotalMessageSize - TxChannelState->TotalSentDtCount * DT_DATA_SIZE;\r
if (bytesLeftToSend < DT_DATA_SIZE){\r
requestLength = bytesLeftToSend;\r
}\r
\r
BufReq_ReturnType allocateBufferRes;\r
PduInfoType* dataPduInfoBuffer;\r
- PduIdType Pdur_NSdu = PgState->PgConfPtr->NSdu;\r
+ PduIdType Pdur_NSdu = Channel->TxState->CurrentPgPtr->NSdu;\r
allocateBufferRes = PduR_J1939TpProvideTxBuffer(Pdur_NSdu, &dataPduInfoBuffer, requestLength);\r
if (allocateBufferRes == BUFREQ_OK) {\r
- dtPduInfoBuffer.SduDataPtr[DT_BYTE_SEQ_NUM] = PgState->Tx->TotalSentDtCount;\r
+ dtPduInfoBuffer.SduDataPtr[DT_BYTE_SEQ_NUM] = Channel->TxState->TotalSentDtCount;\r
memcpy(&(dtPduInfoBuffer.SduDataPtr[DT_BYTE_DATA_1]), dataPduInfoBuffer, requestLength);\r
- PduIdType CanIf_NSdu = PgState->PgConfPtr->Channel->DtNPdu;\r
+ PduIdType CanIf_NSdu = Channel->DtNPdu;\r
CanIf_Transmit(CanIf_NSdu, &dtPduInfoBuffer);\r
- PgState->Tx->TotalBytesSent += requestLength;\r
- PgState->Tx->TotalSentDtCount++;\r
- PgState->Tx->SentDtCount++;\r
+ Channel->TxState->TotalBytesSent += requestLength;\r
+ Channel->TxState->TotalSentDtCount++;\r
+ Channel->TxState->SentDtCount++;\r
} else {\r
/* Todo: check for error */\r
}\r
\r
}\r
\r
-static void J1939Tp_Internal_SendRts(J1939Tp_Internal_PgStateInfoType* PgState, const PduInfoType* TxInfoPtr) {\r
+static inline void J1939Tp_Internal_SendRts(J1939Tp_ChannelType* Channel, const PduInfoType* TxInfoPtr) {\r
uint8 cmRtsData[RTS_SIZE];\r
cmRtsData[RTS_BYTE_CONTROL] = 16;\r
cmRtsData[RTS_BYTE_LENGTH_1] = (uint8)(TxInfoPtr->SduLength & 0x00FF);\r
if (TxInfoPtr->SduLength % J1939TP_PACKET_SIZE != 0) {\r
reminder = 1;\r
}\r
- J1939Tp_PgnType pgn = PgState->PgConfPtr->Pgn;\r
+ J1939Tp_PgnType pgn = Channel->CurrentPgPtr->Pgn;\r
cmRtsData[RTS_BYTE_NUM_PACKETS] = (TxInfoPtr->SduLength / J1939TP_PACKET_SIZE) + reminder;\r
cmRtsData[RTS_BYTE_SAE_ASSIGN] = 0xFF;\r
- /* PGN is 18 bits, RTS message have 24 bits PGN payload, therefore we squeeze in pdu id */\r
J1939Tp_Internal_SetPgn(&(cmRtsData[RTS_BYTE_PGN_1]),pgn);\r
- //cmRtsData[RTS_BYTE_PGN_3] = cmRtsData[RTS_BYTE_PGN_3] & ((TxSduId << 2) | 0x03); /* add the sdu id to the remaining 4 bits*/\r
\r
PduInfoType cmRtsPdu;\r
cmRtsPdu.SduLength = RTS_SIZE;\r
cmRtsPdu.SduDataPtr = cmRtsData;\r
\r
- CanIf_Transmit(PgState->PgConfPtr->Channel->CmNPdu,&cmRtsPdu);\r
+ CanIf_Transmit(Channel->CmNPdu,&cmRtsPdu);\r
}\r
\r
-static void inline J1939Tp_Internal_SendEndOfMsgAck(J1939Tp_Internal_PgStateInfoType* PgState) {\r
+static inline void J1939Tp_Internal_SendEndOfMsgAck(J1939Tp_ChannelType* Channel) {\r
PduInfoType endofmsgInfo;\r
uint8 endofmsgData[ENDOFMSGACK_SIZE];\r
endofmsgInfo.SduLength = ENDOFMSGACK_SIZE;\r
endofmsgInfo.SduDataPtr = endofmsgData;\r
endofmsgData[ENDOFMSGACK_BYTE_CONTROL] = ENDOFMSGACK_CONTROL_VALUE;\r
- endofmsgData[ENDOFMSGACK_BYTE_TOTAL_MSG_SIZE_1] = ((uint8)(PgState->Rx->TotalMessageSize)) << 8;\r
- endofmsgData[ENDOFMSGACK_BYTE_TOTAL_MSG_SIZE_2] = ((uint8)(PgState->Rx->TotalMessageSize));\r
- endofmsgData[ENDOFMSGACK_BYTE_NUM_PACKETS] = PgState->Rx->TotalReceivedDtCount;\r
+ endofmsgData[ENDOFMSGACK_BYTE_TOTAL_MSG_SIZE_1] = ((uint8)(Channel->RxState->TotalMessageSize)) << 8;\r
+ endofmsgData[ENDOFMSGACK_BYTE_TOTAL_MSG_SIZE_2] = ((uint8)(Channel->RxState->TotalMessageSize));\r
+ endofmsgData[ENDOFMSGACK_BYTE_NUM_PACKETS] = Channel->RxState->TotalReceivedDtCount;\r
endofmsgData[ENDOFMSGACK_BYTE_SAE_ASSIGN] = 0xFF;\r
- J1939Tp_Internal_SetPgn(&(endofmsgData[ENDOFMSGACK_BYTE_PGN_1]),PgState->PgConfPtr->Pgn);\r
- PduIdType CmNPdu = PgState->PgConfPtr->Channel->CmNPdu;\r
+ J1939Tp_Internal_SetPgn(&(endofmsgData[ENDOFMSGACK_BYTE_PGN_1]),Channel->CurrentPgPtr->Pgn);\r
+ PduIdType CmNPdu = Channel->FcNPdu;\r
\r
CanIf_Transmit(CmNPdu,&endofmsgInfo);\r
}\r
* @param NSduId\r
* @param RtsPduInfoPtr needs to be a valid RTS message\r
*/\r
-static inline void J1939Tp_Internal_SendCts(J1939Tp_Internal_PgStateInfoType* PgState, PduInfoType* RtsPduInfoPtr) {\r
+static inline void J1939Tp_Internal_SendCts(J1939Tp_ChannelType* Channel, PduInfoType* RtsPduInfoPtr) {\r
PduInfoType ctsInfo;\r
uint8 ctsData[CTS_SIZE];\r
ctsInfo.SduLength = CTS_SIZE;\r
ctsData[CTS_BYTE_PGN_1] = RtsPduInfoPtr->SduDataPtr[RTS_BYTE_PGN_1];\r
ctsData[CTS_BYTE_PGN_2] = RtsPduInfoPtr->SduDataPtr[RTS_BYTE_PGN_2];\r
ctsData[CTS_BYTE_PGN_3] = RtsPduInfoPtr->SduDataPtr[RTS_BYTE_PGN_3];\r
- PduIdType CmNPdu = PgState->PgConfPtr->Channel->CmNPdu;\r
\r
- CanIf_Transmit(CmNPdu,&ctsInfo);\r
+ CanIf_Transmit(Channel->FcNPdu,&ctsInfo);\r
\r
}\r
static inline void J1939Tp_Internal_SendConnectionAbort(PduIdType CmNPdu, J1939Tp_PgnType Pgn) {\r
J1939Tp_Internal_SetPgn(&(connAbortData[CONNABORT_BYTE_PGN_1]),Pgn);\r
CanIf_Transmit(CmNPdu,&connAbortInfo);\r
}\r
-static void inline J1939Tp_Internal_TxSessionStartTimer(J1939Tp_Internal_TxPgInfo* Tx,uint16 TimerExpire) {\r
+static inline void J1939Tp_Internal_TxSessionStartTimer(J1939Tp_Internal_TxChannelInfoType* Tx,uint16 TimerExpire) {\r
Tx->TimerInfo.Timer = 0;\r
Tx->TimerInfo.TimerExpire = TimerExpire;\r
}\r
-static void inline J1939Tp_Internal_RxSessionStartTimer(J1939Tp_Internal_RxPgInfo* Rx,uint16 TimerExpire) {\r
+static inline void J1939Tp_Internal_RxSessionStartTimer(J1939Tp_Internal_RxChannelInfoType* Rx,uint16 TimerExpire) {\r
Rx->TimerInfo.Timer = 0;\r
Rx->TimerInfo.TimerExpire = TimerExpire;\r
}\r
+/**\r
+ * set three bytes to a 18 bit pgn value
+ * @param PgnBytes must be three uint8 bytes
+ * @param pgn
+ */\r
static inline void J1939Tp_Internal_SetPgn(uint8* PgnBytes,J1939Tp_PgnType pgn ) {\r
- PgnBytes[RTS_BYTE_PGN_1] = pgn; /* get first byte */\r
- PgnBytes[RTS_BYTE_PGN_2] = pgn >> 8; /* get next byte */\r
- PgnBytes[RTS_BYTE_PGN_3] = (pgn >> 16) & 0x3; /* get next two bits */\r
+ PgnBytes[0] = pgn; /* get first byte */\r
+ PgnBytes[1] = pgn >> 8; /* get next byte */\r
+ PgnBytes[2] = (pgn >> 16) & 0x3; /* get next two bits */\r
}\r
-static inline void J1939Tp_Internal_ResetTimer(J1939Tp_Internal_PgStateInfoType* pgState) {\r
- pgState->Tx->TimerInfo.Timer = 0;\r
+/**\r
+ * return a 18 bit pgn value from three bytes
+ * @param PgnBytes must be three uint8 bytes
+ * @return
+ */\r
+static inline J1939Tp_PgnType J1939Tp_Internal_GetPgn(uint8* PgnBytes) {\r
+ J1939Tp_PgnType pgn = 0;\r
+ pgn = ((uint32)PgnBytes[0]) << 16;\r
+ pgn = pgn | (((uint32)PgnBytes[1]) << 8);\r
+ pgn = pgn | ((uint32)PgnBytes[2]);\r
+ return pgn;\r
}\r
\r
static inline void J1939Tp_Internal_ReportError(uint8 ApiId, uint8 ErrorId) {\r
#ifndef J1939TP_INTERNAL_H_\r
#define J1939TP_INTERNAL_H_\r
#include "J1939Tp_Internal_Packets.h"\r
+#include "J1939Tp_ConfigTypes.h"\r
+#include "ComStack_Types.h"\r
#define PGN_BYTE_COUNT 3\r
/** Service Ids */\r
#define J1939TP_TRANSMIT_ID 0x05\r
J1939TP_EXPIRED,\r
J1939TP_NOT_EXPIRED\r
} J1939Tp_Internal_TimerStatusType;\r
-typedef uint8 J1939Tp_Internal_ControlByteType;\r
-typedef uint32 J1939Tp_Internal_PgnType;\r
-typedef uint32 J1939Tp_Internal_DtPayloadSizeType;\r
+\r
\r
typedef struct {\r
J1939Tp_Internal_GlobalStateType State;\r
} J1939Tp_Internal_GlobalStateInfoType;\r
\r
-typedef enum {\r
- J1939TP_TX_IDLE,\r
- J1939TP_TX_WAIT_RTS_CANIF_CONFIRM,\r
- J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM,\r
- J1939TP_TX_WAITING_FOR_CTS,\r
- J1939TP_TX_WAIT_DT_CANIF_CONFIRM,\r
- J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK\r
-} J1939Tp_Internal_TxPgStateType;\r
-typedef enum {\r
- J1939TP_RX_IDLE,\r
- J1939TP_RX_WAIT_CTS_CANIF_CONFIRM,\r
- J1939TP_RX_RECEIVING_DT,\r
- J1939TP_RX_WAIT_ENDOFMSGACK_CANIF_CONFIRM,\r
-} J1939Tp_Internal_RxPgStateType;\r
-typedef struct {\r
- uint32 Timer;\r
- uint32 TimerExpire;\r
-} J1939Tp_Internal_TimerType;\r
\r
-typedef struct {\r
- J1939Tp_Internal_RxPgStateType State;\r
- J1939Tp_Internal_TimerType TimerInfo;\r
- uint8 TotalReceivedDtCount;\r
- uint8 TotalDtToReceiveCount;\r
- J1939Tp_Internal_DtPayloadSizeType TotalMessageSize;\r
-}J1939Tp_Internal_RxPgInfo;\r
\r
-typedef struct {\r
- J1939Tp_Internal_TxPgStateType State;\r
- J1939Tp_Internal_TimerType TimerInfo;\r
- uint8 SentDtCount;\r
- uint8 DtToSendBeforeCtsCount;\r
- J1939Tp_Internal_DtPayloadSizeType TotalMessageSize;\r
- uint8 TotalSentDtCount;\r
- uint16 TotalBytesSent;\r
- PduIdType PduRPdu;\r
-}J1939Tp_Internal_TxPgInfo;\r
\r
-typedef struct {\r
- J1939Tp_Internal_TxPgInfo* Tx;\r
- J1939Tp_Internal_RxPgInfo* Rx;\r
- const J1939Tp_PgType* PgConfPtr;\r
-} J1939Tp_Internal_PgStateInfoType;\r
-\r
-static void J1939Tp_Internal_SendRts(J1939Tp_Internal_PgStateInfoType* TxPgState, const PduInfoType* TxInfoPtr);\r
-static void inline J1939Tp_Internal_SendDt(J1939Tp_Internal_PgStateInfoType* PgState);\r
-static inline void J1939Tp_Internal_SendCts(J1939Tp_Internal_PgStateInfoType* TxPgState, PduInfoType* RtsPduInfoPtr);\r
-static void inline J1939Tp_Internal_SendEndOfMsgAck(J1939Tp_Internal_PgStateInfoType* PgState);\r
-static inline void J1939Tp_Internal_SendConnectionAbort(PduIdType CmPdu, J1939Tp_PgnType Pgn);\r
-static void inline J1939Tp_Internal_TxSessionStartTimer(J1939Tp_Internal_TxPgInfo* Tx,uint16 TimerExpire);\r
-static void inline J1939Tp_Internal_RxSessionStartTimer(J1939Tp_Internal_RxPgInfo* Rx,uint16 TimerExpire);\r
-static inline const J1939Tp_PgType* J1939Tp_Internal_ConfGetPg(PduIdType pduId);\r
-static inline boolean J1939Tp_Internal_WaitForCts(J1939Tp_Internal_TxPgInfo* TxPgState);\r
-static inline boolean J1939Tp_Internal_WaitForEndOfMsgAck(J1939Tp_Internal_TxPgInfo* TxPgState);\r
-\r
-static inline J1939Tp_Internal_PgStateInfoType* J1939Tp_Internal_GetPg(PduIdType txPduId);\r
-static inline const J1939Tp_ChannelType* J1939Tp_Internal_ConfGetTxChannel(PduIdType txPduId);\r
-static inline boolean J1939Tp_Internal_CheckValidEndOfMsgAck(J1939Tp_Internal_PgStateInfoType* pgState, PduInfoType* PduInfoPtr);\r
-static inline J1939Tp_Internal_TimerStatusType J1939Tp_Internal_IncAndCheckTimer(J1939Tp_Internal_TimerType* Timer);\r
-static uint8 J1939Tp_Internal_GetPf(uint32 pgn);\r
-static J1939Tp_ProtocolType J1939Tp_Internal_GetProtocol(uint8 pf);\r
-static inline boolean J1939Tp_Internal_CheckValidCts(PduInfoType* PduInfoPtr,uint8* NumPackets,uint8* NextPacket);\r
-\r
-static inline void J1939Tp_Internal_ResetTimer(J1939Tp_Internal_PgStateInfoType* pgState);\r
-static inline void J1939Tp_Internal_ReportError(uint8 ApiId, uint8 ErrorId);\r
-static void inline J1939Tp_Internal_RxIndication_TxChannel(PduIdType RxPduId, PduInfoType* PduInfoPtr);\r
-static void inline J1939Tp_Internal_RxIndication_RxChannel(PduIdType RxPduId, PduInfoType* PduInfoPtr);\r
-static Std_ReturnType inline J1939Tp_Internal_ReceiveRts(PduIdType NSduId, PduInfoType* PduInfoPtr);\r
+typedef uint8 J1939Tp_Internal_ControlByteType;\r
\r
-static Std_ReturnType inline J1939Tp_Internal_ReceiveDt(PduIdType NSduId, PduInfoType* PduInfoPtr);\r
-static inline void J1939Tp_Internal_SetPgn(uint8* PgnBytes,J1939Tp_PgnType pgn );\r
+\r
+\r
+static inline Std_ReturnType J1939Tp_Internal_ValidatePacketType(J1939Tp_RxPduInfoType* RxPduInfo);\r
+\r
+static inline void J1939Tp_Internal_RxIndication_Dt(PduInfoType* PduInfoPtr, J1939Tp_ChannelType* Channel);\r
+static inline void J1939Tp_Internal_RxIndication_Cm(PduInfoType* PduInfoPtr, J1939Tp_ChannelType* Channel);\r
+static inline void J1939Tp_Internal_RxIndication_ReverseCm(PduInfoType* PduInfoPtr, J1939Tp_ChannelType* Channel);\r
+Std_ReturnType J1939Tp_ChangeParameterRequest(PduIdType SduId, TPParameterType Parameter, uint16 value);\r
+static inline void J1939Tp_Internal_TxConfirmation_RxChannel(J1939Tp_RxPduInfoType RxPdu);\r
+static inline boolean J1939Tp_Internal_IsDtPacketAlreadySent(uint8 nextPacket, uint8 totalPacketsSent);\r
+static inline Std_ReturnType J1939Tp_Internal_GetRxPduInfo(PduIdType RxPdu,J1939Tp_RxPduInfoType* RxPduInfo);\r
+static inline Std_ReturnType J1939Tp_Internal_GetPgFromPgn(const J1939Tp_ChannelType* channel, const J1939Tp_Internal_PgnType Pgn, J1939Tp_PgType* Pg);\r
+static inline boolean J1939Tp_Internal_IsLastDt(J1939Tp_Internal_RxChannelInfoType* rxPgInfo);\r
+static inline void J1939Tp_Internal_TxConfirmation_TxChannel(J1939Tp_RxPduInfoType* RxPduInfo);\r
+/** @req J1939TP0096 */\r
+Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr);\r
static inline uint16 J1939Tp_Internal_GetRtsMessageSize(PduInfoType* pduInfo);\r
-static inline void J1939Tp_Internal_TxConfirmation_TxChannel(PduIdType NSduId);\r
-static inline Std_ReturnType J1939Tp_Internal_GetCmControlByte(PduInfoType* pduInfo, J1939Tp_Internal_ControlByteType* controlByte);\r
-static inline void J1939Tp_Internal_TxConfirmation_RxChannel(PduIdType NSduId);\r
+static inline boolean J1939Tp_Internal_WaitForCts(J1939Tp_Internal_TxChannelInfoType* TxChannelState);\r
+static inline boolean J1939Tp_Internal_WaitForEndOfMsgAck(J1939Tp_Internal_TxChannelInfoType* TxPgState);\r
+static inline Std_ReturnType J1939Tp_Internal_ConfGetPg(PduIdType NSduId, J1939Tp_PgType* Pg);\r
+static inline J1939Tp_Internal_TimerStatusType J1939Tp_Internal_IncAndCheckTimer(J1939Tp_Internal_TimerType* TimerInfo);\r
+\r
+static inline void J1939Tp_Internal_SendDt(J1939Tp_ChannelType* Channel);\r
+static inline void J1939Tp_Internal_SendRts(J1939Tp_ChannelType* Channel, const PduInfoType* TxInfoPtr);\r
+static inline void J1939Tp_Internal_SendEndOfMsgAck(J1939Tp_ChannelType* Channel);\r
+static inline void J1939Tp_Internal_SendCts(J1939Tp_ChannelType* Channel, PduInfoType* RtsPduInfoPtr);\r
+static inline void J1939Tp_Internal_SendConnectionAbort(PduIdType CmNPdu, J1939Tp_PgnType Pgn);\r
+static inline void J1939Tp_Internal_TxSessionStartTimer(J1939Tp_Internal_TxChannelInfoType* Tx,uint16 TimerExpire);\r
+static inline void J1939Tp_Internal_RxSessionStartTimer(J1939Tp_Internal_RxChannelInfoType* Rx,uint16 TimerExpire);\r
+static inline void J1939Tp_Internal_SetPgn(uint8* PgnBytes,J1939Tp_PgnType pgn );\r
+static inline J1939Tp_PgnType J1939Tp_Internal_GetPgn(uint8* PgnBytes);\r
+\r
+static inline void J1939Tp_Internal_ReportError(uint8 ApiId, uint8 ErrorId);\r
#endif\r