#include "PduR.h"\r
#include <string.h>\r
\r
+/* Globally fulfilled requirements */\r
+/** @req J1939TP0123 */\r
+/** @req J1939TP0165 */\r
+/** @req J1939TP0097 */\r
/** @req J1939TP0019 */\r
static J1939Tp_Internal_GlobalStateInfoType globalState = {\r
.State = J1939TP_OFF,\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
}\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)) {\r
- PgState->Tx->DtToSendBeforeCtsCount = NumPacketsToSend;\r
- PgState->Tx->SentDtCount = 0;\r
- J1939Tp_Internal_TxSetStatePg(RxPduId, J1939TP_TX_WAIT_DT_CANIF_CONFIRM);\r
- J1939Tp_Internal_SendDt(RxPduId, PgState);\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
- J1939Tp_Internal_TxSetStatePg(RxPduId, J1939TP_TX_IDLE);\r
+ PgState->Tx->State = J1939TP_TX_IDLE;\r
}\r
+ break;\r
default:\r
break;\r
}\r
switch (PgState->Rx->State) {\r
case J1939TP_RX_IDLE:\r
if (J1939Tp_Internal_ReceiveRts(NSduId, PduInfoPtr) == E_OK) {\r
- J1939Tp_Internal_RxSetStatePg(NSduId,J1939TP_TX_WAIT_CTS_CANIF_CONFIRM);\r
- J1939Tp_Internal_SendCts(NSduId,PduInfoPtr);\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
break;\r
case J1939TP_RX_RECEIVING_DT:\r
break;\r
}\r
}\r
-static void inline J1939Tp_Internal_SendEndOfMsgAck(PduIdType NSduId) {\r
- J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(NSduId);\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_SAE_ASSIGN] = 0xFF;\r
- J1939Tp_Internal_SetPgn(&(endofmsgData[ENDOFMSGACK_BYTE_PGN_1]),PgState->PgConfPtr->Pgn);\r
- PduIdType CmNPdu = PgState->PgConfPtr->Channel->CmNPdu;\r
- CanIf_Transmit(CmNPdu,&endofmsgInfo);\r
-\r
\r
-}\r
static boolean inline J1939Tp_Internal_IsLastDt(J1939Tp_Internal_RxPgInfo* rxPgInfo) {\r
return (rxPgInfo->TotalDtToReceiveCount == rxPgInfo->TotalReceivedDtCount);\r
}\r
lastMessage = true;\r
J1939Tp_Internal_DtPayloadSizeType receivedBytes = PgState->Rx->TotalReceivedDtCount*DT_DATA_SIZE;\r
requestSize = PgState->Rx->TotalMessageSize - receivedBytes;\r
- J1939Tp_Internal_RxSetStatePg(NSduId,J1939TP_TX_WAIT_ENDOFMSGACK_CANIF_CONFIRM);\r
- J1939Tp_Internal_SendEndOfMsgAck(NSduId);\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
}\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
return E_OK;\r
}\r
\r
-/**\r
- * Send a response to the incoming RTS
- * @param NSduId
- * @param RtsPduInfoPtr needs to be a valid RTS message
- */\r
-static inline void J1939Tp_Internal_SendCts(PduIdType NSduId, PduInfoType* RtsPduInfoPtr) {\r
- PduInfoType ctsInfo;\r
- uint8 ctsData[CTS_SIZE];\r
- ctsInfo.SduLength = CTS_SIZE;\r
- ctsInfo.SduDataPtr = ctsData;\r
- ctsData[CTS_BYTE_CONTROL] = CTS_CONTROL_VALUE;\r
- ctsData[CTS_BYTE_NUM_PACKETS] = J1939TP_PACKETS_PER_BLOCK;\r
- ctsData[CTS_BYTE_NEXT_PACKET] = CTS_START_SEQ_NUM;\r
- ctsData[CTS_BYTE_SAE_ASSIGN_1] = 0xFF;\r
- ctsData[CTS_BYTE_SAE_ASSIGN_2] = 0xFF;\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 = J1939Tp_Internal_GetPg(NSduId)->PgConfPtr->Channel->CmNPdu;\r
- CanIf_Transmit(CmNPdu,&ctsInfo);\r
-\r
-}\r
\r
void J1939Tp_MainFunction(void) {\r
for (int i = 0; i < J1939TP_PG_COUNT; i++) {\r
- J1939Tp_Internal_PgStateInfoType* txPgState = J1939Tp_Internal_GetPg(i);\r
- switch (txPgState->Tx->State) {\r
- case J1939TP_TX_WAITING_FOR_CTS:\r
- J1939Tp_Internal_IncAndCheckT3Timer(i,txPgState->Tx);\r
- break;\r
- case J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK:\r
- J1939Tp_Internal_IncAndCheckT3Timer(i,txPgState->Tx);\r
+ J1939Tp_Internal_PgStateInfoType* PgState = J1939Tp_Internal_GetPg(i);\r
+ J1939Tp_Internal_TimerStatusType timer = J1939TP_NOT_EXPIRED;\r
+ switch (PgState->PgConfPtr->Channel->Direction) {\r
+ case J1939TP_TX:\r
+ switch (PgState->Tx->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
+ timer = J1939Tp_Internal_IncAndCheckTimer(&(PgState->Tx->TimerInfo));\r
+ break;\r
+ default:\r
+ break;\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
+ }\r
+ return;\r
+ case J1939TP_RX:\r
+ switch (PgState->Rx->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
+ 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
+ }\r
+ return;\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_TX_WAIT_CTS_CANIF_CONFIRM:\r
- J1939Tp_Internal_TxSetStatePg(NSduId, J1939TP_RX_RECEIVING_DT);\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
break;\r
default:\r
break;\r
switch (pgState->Tx->State) {\r
case J1939TP_TX_WAIT_DT_CANIF_CONFIRM:\r
if (J1939Tp_Internal_WaitForEndOfMsgAck(pgState->Tx)) {\r
- J1939Tp_Internal_ResetT3(pgState);\r
- J1939Tp_Internal_TxSetStatePg(NSduId, J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK);\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_TxSetStatePg(NSduId, J1939TP_TX_WAITING_FOR_CTS);\r
+ J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_T3_TIMEOUT_MS);\r
+ pgState->Tx->State = J1939TP_TX_WAITING_FOR_CTS;\r
} else {\r
- J1939Tp_Internal_SendDt(NSduId,pgState);\r
+ J1939Tp_Internal_TxSessionStartTimer(pgState->Tx,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_SendDt(pgState);\r
}\r
break;\r
case J1939TP_TX_WAIT_RTS_CANIF_CONFIRM:\r
- J1939Tp_Internal_TxSetStatePg(NSduId,J1939TP_TX_WAITING_FOR_CTS);\r
+ pgState->Tx->State = J1939TP_TX_WAITING_FOR_CTS;\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
J1939Tp_Internal_ReportError(J1939TP_TRANSMIT_ID,J1939TP_E_UNINIT);\r
}\r
#endif\r
+ J1939Tp_Internal_PgStateInfoType* pgState = J1939Tp_Internal_GetPg(TxSduId);\r
if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
PduInfoType* ToSendTxInfoPtr;\r
PduR_J1939TpProvideTxBuffer(TxSduId, &ToSendTxInfoPtr, TxInfoPtr->SduLength);\r
- if (CanIf_Transmit(TxSduId,ToSendTxInfoPtr) == E_OK) {\r
- PduR_J1939TpTxConfirmation(TxSduId, NTFRSLT_OK);\r
- } else {\r
- PduR_J1939TpTxConfirmation(TxSduId, NTFRSLT_E_NOT_OK);\r
- }\r
+ PduIdType CanIfPdu = pgState->PgConfPtr->DirectNPdu;\r
+ pgState->Tx->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
+ CanIf_Transmit(CanIfPdu,ToSendTxInfoPtr);\r
} else {\r
J1939Tp_PgnType pgn = J1939Tp_Internal_ConfGetPg(TxSduId)->Pgn;\r
uint8 pf = J1939Tp_Internal_GetPf(pgn);\r
case J1939TP_PROTOCOL_BAM:\r
break;\r
case J1939TP_PROTOCOL_CMDT:\r
- J1939Tp_Internal_SendRts(TxSduId,TxInfoPtr);\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_ResetT3(txPgState);\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
- J1939Tp_Internal_TxSetStatePg(TxSduId,J1939TP_TX_WAIT_RTS_CANIF_CONFIRM);\r
break;\r
}\r
}\r
return TxPgState->TotalMessageSize == TxPgState->TotalBytesSent;\r
}\r
\r
-static inline void J1939Tp_Internal_TxSetStatePg(PduIdType NSduId,J1939Tp_Internal_TxPgStateType state) {\r
- PgStates[NSduId].Tx->State = state;\r
-}\r
-static inline void J1939Tp_Internal_RxSetStatePg(PduIdType NSduId,J1939Tp_Internal_RxPgStateType state) {\r
- PgStates[NSduId].Rx->State = state;\r
-}\r
+\r
static inline J1939Tp_Internal_PgStateInfoType* J1939Tp_Internal_GetPg(PduIdType NSduId) {\r
return &(PgStates[NSduId]);\r
}\r
}\r
return true;\r
}\r
-static inline void J1939Tp_Internal_IncAndCheckT3Timer(PduIdType pduId, J1939Tp_Internal_TxPgInfo* txPgState) {\r
- txPgState->T3 += (J1939TP_MAIN_FUNCTION_PERIOD*1000);\r
- if (txPgState->T3 > J1939TP_T3_TIMEOUT_MS) {\r
- txPgState->State = J1939TP_TX_IDLE;\r
- PduR_J1939TpTxConfirmation(J1939Tp_Internal_ConfGetPg(pduId)->NSdu,NTFRSLT_E_NOT_OK);\r
- /* TODO: Call det here */\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_EXPIRED;\r
}\r
+ return J1939TP_NOT_EXPIRED;\r
}\r
static uint8 J1939Tp_Internal_GetPf(J1939Tp_PgnType pgn) {\r
return (pgn && 0x0000FF00) >> 8;\r
return J1939TP_PROTOCOL_BAM;\r
}\r
}\r
-static inline boolean J1939Tp_Internal_CheckValidCts(PduInfoType* PduInfoPtr,uint8* NumPackets) {\r
+static inline boolean J1939Tp_Internal_CheckValidCts(PduInfoType* PduInfoPtr,uint8* NumPackets, uint8* NextPacket) {\r
/*\r
if (PduInfoPtr->SduLength != CTS_SIZE) {\r
return false;\r
if (PduInfoPtr->SduDataPtr[CTS_BYTE_CONTROL] != CTS_CONTROL_VALUE) {\r
return false;\r
}\r
- if (PduInfoPtr->SduDataPtr[CTS_BYTE_NUM_PACKETS] < 1) {\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(PduIdType TxPduId, J1939Tp_Internal_PgStateInfoType* PgState) {\r
+static void inline J1939Tp_Internal_SendDt(J1939Tp_Internal_PgStateInfoType* PgState) {\r
uint8 requestLength = DT_DATA_SIZE;\r
uint8 bytesLeftToSend = PgState->Tx->TotalMessageSize - PgState->Tx->TotalSentDtCount * DT_DATA_SIZE;\r
if (bytesLeftToSend < DT_DATA_SIZE){\r
\r
BufReq_ReturnType allocateBufferRes;\r
PduInfoType* dataPduInfoBuffer;\r
- PduIdType Pdur_NSdu = J1939Tp_Internal_ConfGetPg(TxPduId)->NSdu;\r
+ PduIdType Pdur_NSdu = PgState->PgConfPtr->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
memcpy(&(dtPduInfoBuffer.SduDataPtr[DT_BYTE_DATA_1]), dataPduInfoBuffer, requestLength);\r
- PduIdType CanIf_NSdu = J1939Tp_Internal_ConfGetPg(TxPduId)->Channel->DtNPdu;\r
+ PduIdType CanIf_NSdu = PgState->PgConfPtr->Channel->DtNPdu;\r
CanIf_Transmit(CanIf_NSdu, &dtPduInfoBuffer);\r
PgState->Tx->TotalBytesSent += requestLength;\r
PgState->Tx->TotalSentDtCount++;\r
}\r
\r
}\r
-static void J1939Tp_Internal_SendRts(PduIdType TxSduId, const PduInfoType* TxInfoPtr) {\r
+\r
+static void J1939Tp_Internal_SendRts(J1939Tp_Internal_PgStateInfoType* PgState, 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
- const J1939Tp_PgType* pg = J1939Tp_Internal_ConfGetPg(TxSduId);\r
- J1939Tp_PgnType pgn = pg->Pgn;\r
+ J1939Tp_PgnType pgn = PgState->PgConfPtr->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
PduInfoType cmRtsPdu;\r
cmRtsPdu.SduLength = RTS_SIZE;\r
cmRtsPdu.SduDataPtr = cmRtsData;\r
- CanIf_Transmit(J1939Tp_Internal_ConfGetTxChannel(TxSduId)->CmNPdu,&cmRtsPdu);\r
+\r
+ CanIf_Transmit(PgState->PgConfPtr->Channel->CmNPdu,&cmRtsPdu);\r
+}\r
+\r
+static void inline J1939Tp_Internal_SendEndOfMsgAck(J1939Tp_Internal_PgStateInfoType* PgState) {\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_SAE_ASSIGN] = 0xFF;\r
+ J1939Tp_Internal_SetPgn(&(endofmsgData[ENDOFMSGACK_BYTE_PGN_1]),PgState->PgConfPtr->Pgn);\r
+ PduIdType CmNPdu = PgState->PgConfPtr->Channel->CmNPdu;\r
+\r
+ CanIf_Transmit(CmNPdu,&endofmsgInfo);\r
+}\r
+\r
+/**\r
+ * Send a response to the incoming RTS\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
+ PduInfoType ctsInfo;\r
+ uint8 ctsData[CTS_SIZE];\r
+ ctsInfo.SduLength = CTS_SIZE;\r
+ ctsInfo.SduDataPtr = ctsData;\r
+ ctsData[CTS_BYTE_CONTROL] = CTS_CONTROL_VALUE;\r
+ ctsData[CTS_BYTE_NUM_PACKETS] = J1939TP_PACKETS_PER_BLOCK;\r
+ ctsData[CTS_BYTE_NEXT_PACKET] = CTS_START_SEQ_NUM;\r
+ ctsData[CTS_BYTE_SAE_ASSIGN_1] = 0xFF;\r
+ ctsData[CTS_BYTE_SAE_ASSIGN_2] = 0xFF;\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
+\r
+}\r
+static inline void J1939Tp_Internal_SendConnectionAbort(PduIdType CmNPdu, J1939Tp_PgnType Pgn) {\r
+ PduInfoType connAbortInfo;\r
+ uint8 connAbortData[CONNABORT_SIZE];\r
+ connAbortInfo.SduLength = CONNABORT_SIZE;\r
+ connAbortInfo.SduDataPtr = connAbortData;\r
+ connAbortData[CONNABORT_BYTE_CONTROL] = CTS_CONTROL_VALUE;\r
+ connAbortData[CONNABORT_BYTE_SAE_ASSIGN_1] = 0xFF;\r
+ connAbortData[CONNABORT_BYTE_SAE_ASSIGN_2] = 0xFF;\r
+ connAbortData[CONNABORT_BYTE_SAE_ASSIGN_3] = 0xFF;\r
+ connAbortData[CONNABORT_BYTE_SAE_ASSIGN_4] = 0xFF;\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
+ Tx->TimerInfo.Timer = 0;\r
+ Tx->TimerInfo.TimerExpire = TimerExpire;\r
+}\r
+static void inline J1939Tp_Internal_RxSessionStartTimer(J1939Tp_Internal_RxPgInfo* Rx,uint16 TimerExpire) {\r
+ Rx->TimerInfo.Timer = 0;\r
+ Rx->TimerInfo.TimerExpire = TimerExpire;\r
}\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
}\r
-static inline void J1939Tp_Internal_ResetT3(J1939Tp_Internal_PgStateInfoType* pgState) {\r
- pgState->Tx->T3 = 0;\r
+static inline void J1939Tp_Internal_ResetTimer(J1939Tp_Internal_PgStateInfoType* pgState) {\r
+ pgState->Tx->TimerInfo.Timer = 0;\r
}\r
\r
static inline void J1939Tp_Internal_ReportError(uint8 ApiId, uint8 ErrorId) {\r
\r
#ifndef J1939TP_INTERNAL_H_\r
#define J1939TP_INTERNAL_H_\r
-\r
+#include "J1939Tp_Internal_Packets.h"\r
#define PGN_BYTE_COUNT 3\r
/** Service Ids */\r
#define J1939TP_TRANSMIT_ID 0x05\r
\r
#define J1939TP_PACKET_SIZE 7\r
\r
-#define CM_PGN_VALUE_1 0x00\r
-#define CM_PGN_VALUE_2 0xCE\r
-#define CM_PGN_VALUE_3 0x00\r
-\r
-\r
-/* Rts message */\r
-#define RTS_SIZE 8\r
-#define RTS_BYTE_CONTROL 0\r
-#define RTS_BYTE_LENGTH_1 1\r
-#define RTS_BYTE_LENGTH_2 2\r
-#define RTS_BYTE_NUM_PACKETS 3\r
-#define RTS_BYTE_SAE_ASSIGN 4\r
-#define RTS_BYTE_PGN_1 5\r
-#define RTS_BYTE_PGN_2 6\r
-#define RTS_BYTE_PGN_3 7\r
-#define RTS_CONTROL_VALUE 16\r
-\r
-/* Cts message */\r
-#define CTS_SIZE 8\r
-#define CTS_BYTE_CONTROL 0\r
-#define CTS_BYTE_NUM_PACKETS 1\r
-#define CTS_BYTE_NEXT_PACKET 2\r
-#define CTS_BYTE_SAE_ASSIGN_1 3\r
-#define CTS_BYTE_SAE_ASSIGN_2 4\r
-#define CTS_BYTE_PGN_1 5\r
-#define CTS_BYTE_PGN_2 6\r
-#define CTS_BYTE_PGN_3 7\r
-#define CTS_START_SEQ_NUM 0\r
-#define CTS_CONTROL_VALUE 17\r
-\r
-/* Dt message */\r
-#define DT_SIZE 8\r
-#define DT_DATA_SIZE 7\r
-#define DT_BYTE_SEQ_NUM 0\r
-#define DT_BYTE_DATA_1 1\r
-#define DT_BYTE_DATA_2 2\r
-#define DT_BYTE_DATA_3 3\r
-#define DT_BYTE_DATA_4 4\r
-#define DT_BYTE_DATA_5 5\r
-#define DT_BYTE_DATA_6 6\r
-#define DT_BYTE_DATA_7 7\r
-\r
-#define DT_PGN_VALUE_1 0x00\r
-#define DT_PGN_VALUE_2 0xEB\r
-#define DT_PGN_VALUE_3 0x00\r
-\r
-/* EndOfMsgAck message */\r
-#define ENDOFMSGACK_SIZE 8\r
-#define ENDOFMSGACK_BYTE_CONTROL 0\r
-#define ENDOFMSGACK_BYTE_TOTAL_MSG_SIZE_1 1\r
-#define ENDOFMSGACK_BYTE_TOTAL_MSG_SIZE_2 2\r
-#define ENDOFMSGACK_BYTE_NUM_PACKETS 3\r
-#define ENDOFMSGACK_BYTE_SAE_ASSIGN 4\r
-#define ENDOFMSGACK_BYTE_PGN_1 5\r
-#define ENDOFMSGACK_BYTE_PGN_2 6\r
-#define ENDOFMSGACK_BYTE_PGN_3 7\r
-#define ENDOFMSGACK_CONTROL_VALUE 19\r
-\r
-\r
-#define J1939TP_T4_TIMEOUT_MS 1050\r
-#define J1939TP_T3_TIMEOUT_MS 1250\r
-#define J1939TP_T2_TIMEOUT_MS 1250\r
-#define J1939TP_T1_TIMEOUT_MS 750\r
+\r
\r
/** @req J1939TP0019 */\r
\r
J1939TP_ON,\r
J1939TP_OFF\r
} J1939Tp_Internal_GlobalStateType;\r
-\r
+typedef enum {\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
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_TX_WAIT_CTS_CANIF_CONFIRM,\r
+ J1939TP_RX_WAIT_CTS_CANIF_CONFIRM,\r
J1939TP_RX_RECEIVING_DT,\r
- J1939TP_TX_WAIT_ENDOFMSGACK_CANIF_CONFIRM,\r
-\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
\r
typedef struct {\r
J1939Tp_Internal_TxPgStateType State;\r
- uint32 T3;\r
+ J1939Tp_Internal_TimerType TimerInfo;\r
uint8 SentDtCount;\r
uint8 DtToSendBeforeCtsCount;\r
J1939Tp_Internal_DtPayloadSizeType TotalMessageSize;\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
-static inline void J1939Tp_Internal_TxSetStatePg(PduIdType txPduId,J1939Tp_Internal_TxPgStateType state);\r
-static inline void J1939Tp_Internal_RxSetStatePg(PduIdType NSduId,J1939Tp_Internal_RxPgStateType state);\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 void J1939Tp_Internal_IncAndCheckT3Timer(PduIdType pduId,J1939Tp_Internal_TxPgInfo* pgState);\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);\r
-static void inline J1939Tp_Internal_SendDt(PduIdType RxPduId,J1939Tp_Internal_PgStateInfoType* PgState);\r
-static void J1939Tp_Internal_SendRts(PduIdType TxSduId, const PduInfoType* TxInfoPtr);\r
-static inline void J1939Tp_Internal_ResetT3(J1939Tp_Internal_PgStateInfoType* pgState);\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
-static inline void J1939Tp_Internal_SendCts(PduIdType NSduId, PduInfoType* RtsPduInfoPtr);\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
static inline uint16 J1939Tp_Internal_GetRtsMessageSize(PduInfoType* pduInfo);\r