pgInfos[i].PgConfPtr = &(ConfigPtr->Pgs[i]);\r
uint8 channelIndex = ConfigPtr->Pgs[i].Channel - ConfigPtr->Channels;\r
pgInfos[i].ChannelInfoPtr = &(channelInfos[channelIndex]);\r
-\r
+ pgInfos[i].TxState = J1939TP_PG_TX_IDLE;\r
}\r
J1939Tp_ConfigPtr = ConfigPtr;\r
globalState.State = J1939TP_ON; /** @req J1939TP0022 */\r
Irq_Save(state);\r
/** @req J1939TP0030 */\r
if (globalState.State == J1939TP_ON) {\r
- for (int i = 0; i < J1939TP_CHANNEL_COUNT; i++) {\r
+ for (uint16 i = 0; i < J1939TP_CHANNEL_COUNT; i++) {\r
J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = &(channelInfos[i]);\r
const J1939Tp_ChannelType* Channel = ChannelInfoPtr->ChannelConfPtr;\r
J1939Tp_Internal_TimerStatusType timer = J1939TP_NOT_EXPIRED;\r
if (timer == J1939TP_EXPIRED) {\r
timer = J1939TP_NOT_EXPIRED;\r
switch (ChannelInfoPtr->TxState->State) {\r
- case J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM:\r
- PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
- break;\r
case J1939TP_TX_WAITING_FOR_CTS:\r
case J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK:\r
case J1939TP_TX_WAIT_DT_CANIF_CONFIRM:\r
break;\r
case J1939TP_TX_WAITING_FOR_T1_TIMEOUT:\r
ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DT_BAM_CANIF_CONFIRM;\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_TX_CONF_TIMEOUT);\r
if (J1939Tp_Internal_SendDt(ChannelInfoPtr) == E_NOT_OK) {\r
ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
}\r
}\r
}\r
+ for (uint16 i = 0; i < J1939TP_PG_COUNT; i++) {\r
+ if (pgInfos[i].TxState != J1939TP_PG_TX_IDLE) {\r
+ if (J1939Tp_Internal_IncAndCheckTimer(&(pgInfos[i].TimerInfo)) == J1939TP_EXPIRED) {\r
+ pgInfos[i].TxState = J1939TP_PG_TX_IDLE;\r
+ PduR_J1939TpRxIndication(pgInfos[i].PgConfPtr->DirectNPdu,NTFRSLT_E_NOT_OK);\r
+ }\r
+ }\r
+ }\r
Irq_Restore(state);\r
}\r
\r
ChannelInfoPtr->RxState->State = J1939TP_RX_IDLE;\r
PduR_J1939TpRxIndication(PduRSdu,NTFRSLT_OK);\r
} else {\r
- J1939Tp_Internal_RxSessionStartTimer(ChannelInfoPtr->RxState,J1939TP_T1_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->RxState->TimerInfo),J1939TP_T1_TIMEOUT_MS);\r
}\r
}\r
\r
if (J1939Tp_Internal_GetPgFromPgn(ChannelInfoPtr->ChannelConfPtr,pgn,&pg) != E_OK) {\r
return;\r
}\r
- /** @req J1939TP0173 **/\r
- if (protocol == J1939TP_PROTOCOL_BAM && pg->Channel->Protocol != protocol) {\r
- return;\r
- }\r
- if (protocol == J1939TP_PROTOCOL_CMDT && pg->Channel->Protocol != protocol) {\r
- J1939Tp_Internal_SendConnectionAbort(pg->Channel->CmNPdu,pgn);\r
- }\r
uint8 Command = PduInfoPtr->SduDataPtr[CM_BYTE_CONTROL];\r
\r
/** @req J1939TP0043**/\r
PduLengthType remainingBuffer = 0;\r
if (PduR_J1939TpStartOfReception(pg->NSdu, messageSize, &remainingBuffer) == BUFREQ_OK) {\r
ChannelInfoPtr->RxState->State = J1939TP_RX_WAIT_CTS_CANIF_CONFIRM;\r
- J1939Tp_Internal_RxSessionStartTimer(ChannelInfoPtr->RxState,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->RxState->TimerInfo),J1939TP_TX_CONF_TIMEOUT);\r
J1939Tp_Internal_SendCts(ChannelInfoPtr,pgn,CTS_START_SEQ_NUM,J1939TP_PACKETS_PER_BLOCK);\r
} else {\r
J1939Tp_Internal_SendConnectionAbort(pg->Channel->CmNPdu,pgn);\r
} else if (Command == BAM_CONTROL_VALUE) {\r
PduLengthType remainingBuffer = 0;\r
if (PduR_J1939TpStartOfReception(pg->NSdu, messageSize, &remainingBuffer) == BUFREQ_OK) {\r
- J1939Tp_Internal_RxSessionStartTimer(ChannelInfoPtr->RxState,J1939TP_T2_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->RxState->TimerInfo),J1939TP_T2_TIMEOUT_MS);\r
ChannelInfoPtr->RxState->State = J1939TP_RX_RECEIVING_DT;\r
}\r
}\r
if (NumPacketsToSend == 0) {\r
// Receiver wants to keep the connection open but cant receive packets\r
/** @req J1939TP0195 */\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_T4_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_T4_TIMEOUT_MS);\r
} else if(J1939Tp_Internal_IsDtPacketAlreadySent(NextPacket,ChannelInfoPtr->TxState->SentDtCount)) {\r
PduR_J1939TpTxConfirmation(pg->NSdu,NTFRSLT_E_NOT_OK);\r
/** @req J1939TP0190 */\r
PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
J1939Tp_Internal_SendConnectionAbort(ChannelInfoPtr->ChannelConfPtr->CmNPdu,ChannelInfoPtr->TxState->CurrentPgPtr->Pgn);\r
} else {\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_TX_CONF_TIMEOUT);\r
}\r
}\r
}\r
switch (RxPduInfo->PacketType ) {\r
case J1939TP_REVERSE_CM:\r
if (ChannelInfoPtr->RxState->State == J1939TP_RX_WAIT_CTS_CANIF_CONFIRM) {\r
- J1939Tp_Internal_RxSessionStartTimer(ChannelInfoPtr->RxState,J1939TP_T2_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->RxState->TimerInfo),J1939TP_T2_TIMEOUT_MS);\r
ChannelInfoPtr->RxState->State = J1939TP_RX_RECEIVING_DT;\r
}\r
break;\r
}\r
static inline void J1939Tp_Internal_TxConfirmation_TxChannel(J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr, const J1939Tp_RxPduInfoType* RxPduInfo) {\r
J1939Tp_Internal_TxChannelStateType State = ChannelInfoPtr->TxState->State;\r
+ J1939Tp_Internal_PgInfoType* PgInfo = J1939Tp_GetPgInfo(RxPduInfo->PgPtr);\r
switch (RxPduInfo->PacketType ) {\r
case J1939TP_REVERSE_CM:\r
break;\r
case J1939TP_CM:\r
if (State == J1939TP_TX_WAIT_RTS_CANIF_CONFIRM) {\r
ChannelInfoPtr->TxState->State = J1939TP_TX_WAITING_FOR_CTS;\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_T3_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_T3_TIMEOUT_MS);\r
} else if (State == J1939TP_TX_WAIT_BAM_CANIF_CONFIRM) {\r
ChannelInfoPtr->TxState->State = J1939TP_TX_WAITING_FOR_T1_TIMEOUT;\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_T1_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_T1_TIMEOUT_MS);\r
}\r
break;\r
case J1939TP_DT:\r
if (State == J1939TP_TX_WAIT_DT_CANIF_CONFIRM) {\r
ChannelInfoPtr->TxState->SentDtCount++;\r
if (J1939Tp_Internal_LastDtSent(ChannelInfoPtr->TxState)) {\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_T3_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_T3_TIMEOUT_MS);\r
ChannelInfoPtr->TxState->State = J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK;\r
} else if (J1939Tp_Internal_WaitForCts(ChannelInfoPtr->TxState)) {\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_T3_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_T3_TIMEOUT_MS);\r
ChannelInfoPtr->TxState->State = J1939TP_TX_WAITING_FOR_CTS;\r
} else {\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_TX_CONF_TIMEOUT);\r
J1939Tp_Internal_SendDt(ChannelInfoPtr);\r
}\r
}\r
PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_OK);\r
} else {\r
ChannelInfoPtr->TxState->State = J1939TP_TX_WAITING_FOR_T1_TIMEOUT;\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_T1_TIMEOUT_MS);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_T1_TIMEOUT_MS);\r
}\r
}\r
break;\r
case J1939TP_DIRECT:\r
- if (State == J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM) {\r
- ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
+ if (PgInfo->TxState == J1939TP_PG_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM) {\r
+ PgInfo->TxState = J1939TP_PG_TX_IDLE;\r
PduR_J1939TpTxConfirmation(RxPduInfo->PgPtr->DirectNPdu, NTFRSLT_OK);\r
}\r
break;\r
PduR_J1939TpTxConfirmation(PgInfo->PgConfPtr->NSdu,NTFRSLT_E_CANCELATION_NOT_OK);\r
return E_OK;\r
}\r
+\r
/** @req J1939TP0096 */\r
Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr) {\r
imask_t state;\r
if (r == E_OK) {\r
const J1939Tp_PgType* Pg = PgInfo->PgConfPtr;\r
J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = PgInfo->ChannelInfoPtr;\r
- /** @req J1939TP0101 **/\r
- if (ChannelInfoPtr->TxState->State != J1939TP_TX_IDLE) {\r
- r = E_NOT_OK;\r
+ if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
+ r = J1939Tp_Internal_DirectTransmit(TxInfoPtr, PgInfo);\r
}\r
- if (r == E_OK) {\r
- if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
- PduInfoType ToSendTxInfoPtr;\r
- uint8 dataPtr[TxInfoPtr->SduLength];\r
- ToSendTxInfoPtr.SduLength = TxInfoPtr->SduLength;\r
- ToSendTxInfoPtr.SduDataPtr = dataPtr;\r
- PduLengthType remainingBytes;\r
- if (PduR_J1939TpCopyTxData(Pg->NSdu, &ToSendTxInfoPtr, 0, &remainingBytes) == BUFREQ_OK) {\r
- PduIdType CanIfPdu = Pg->DirectNPdu;\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
- ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
- CanIf_Transmit(CanIfPdu,&ToSendTxInfoPtr);\r
- } else {\r
- r = E_NOT_OK;\r
- }\r
- } else {\r
- //uint8 pf = J1939Tp_Internal_GetPf(Pg->Pgn);\r
- //J1939Tp_ProtocolType protocol = J1939Tp_Internal_GetProtocol(pf);\r
+ else {\r
+ if (ChannelInfoPtr->TxState->State != J1939TP_TX_IDLE) {\r
+ /** @req J1939TP0101 **/\r
+ r = E_NOT_OK;\r
+ }\r
+ if (r == E_OK) {\r
switch (ChannelInfoPtr->ChannelConfPtr->Protocol) { /** @req J1939TP0039*/\r
case J1939TP_PROTOCOL_BAM:\r
ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_BAM_CANIF_CONFIRM;\r
ChannelInfoPtr->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
ChannelInfoPtr->TxState->SentDtCount = 0;\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_TX_CONF_TIMEOUT);\r
J1939Tp_Internal_SendBam(ChannelInfoPtr,TxInfoPtr);\r
break;\r
case J1939TP_PROTOCOL_CMDT:\r
ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
ChannelInfoPtr->TxState->SentDtCount = 0;\r
J1939Tp_Internal_SendRts(ChannelInfoPtr,TxInfoPtr);\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_StartTimer(&(ChannelInfoPtr->TxState->TimerInfo),J1939TP_TX_CONF_TIMEOUT);\r
break;\r
}\r
}\r
Irq_Restore(state);\r
return r;\r
}\r
+\r
+static inline Std_ReturnType J1939Tp_Internal_DirectTransmit(const PduInfoType* TxInfoPtr, J1939Tp_Internal_PgInfoType* PgInfo) {\r
+ Std_ReturnType r = E_OK;\r
+ if (PgInfo->TxState != J1939TP_PG_TX_IDLE) {\r
+ r = E_NOT_OK;\r
+ } else {\r
+ PduInfoType ToSendTxInfoPtr;\r
+ uint8 dataPtr[TxInfoPtr->SduLength];\r
+ ToSendTxInfoPtr.SduLength = TxInfoPtr->SduLength;\r
+ ToSendTxInfoPtr.SduDataPtr = dataPtr;\r
+ PduLengthType remainingBytes;\r
+ const J1939Tp_PgType* Pg = PgInfo->PgConfPtr;\r
+ if (PduR_J1939TpCopyTxData(Pg->NSdu, &ToSendTxInfoPtr, 0, &remainingBytes) == BUFREQ_OK) {\r
+ PduIdType CanIfPdu = Pg->DirectNPdu;\r
+ J1939Tp_Internal_StartTimer(&(PgInfo->TimerInfo),J1939TP_TX_CONF_TIMEOUT);\r
+ PgInfo->TxState = J1939TP_PG_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
+ r = CanIf_Transmit(CanIfPdu,&ToSendTxInfoPtr);\r
+ if (r != E_OK) {\r
+ PgInfo->TxState = J1939TP_PG_TX_IDLE;\r
+ }\r
+ } else {\r
+ r = E_NOT_OK;\r
+ }\r
+ }\r
+ return r;\r
+}\r
+\r
+\r
static inline void J1939Tp_Internal_SendBam(J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr,const PduInfoType* TxInfoPtr) {\r
uint8 cmBamData[BAM_RTS_SIZE];\r
cmBamData[BAM_RTS_BYTE_CONTROL] = BAM_CONTROL_VALUE;\r
J1939Tp_Internal_SetPgn(&(connAbortData[CONNABORT_BYTE_PGN_1]),Pgn);\r
CanIf_Transmit(CmNPdu,&connAbortInfo);\r
}\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 inline void J1939Tp_Internal_RxSessionStartTimer(J1939Tp_Internal_RxChannelInfoType* Rx,uint16 TimerExpire) {\r
- Rx->TimerInfo.Timer = 0;\r
- Rx->TimerInfo.TimerExpire = TimerExpire;\r
+static inline void J1939Tp_Internal_StartTimer(J1939Tp_Internal_TimerType* TimerInfo,uint16 TimerExpire) {\r
+ TimerInfo->Timer = 0;\r
+ TimerInfo->TimerExpire = TimerExpire;\r
}\r
+\r
/**\r
* set three bytes to a 18 bit pgn value\r
* @param PgnBytes must be three uint8 bytes\r
pgn = pgn | ((uint32)PgnBytes[0]);\r
return pgn;\r
}\r
-\r
+static inline J1939Tp_Internal_PgInfoType* J1939Tp_GetPgInfo(const J1939Tp_PgType* Pg) {\r
+ return &(pgInfos[Pg - J1939Tp_ConfigPtr->Pgs]);\r
+}\r
static inline void J1939Tp_Internal_ReportError(uint8 ApiId, uint8 ErrorId) {\r
#if (CANSM_DEV_ERROR_DETECT == STD_ON)\r
Det_ReportError(MODULE_ID_J1939TP, 0, ApiId, ApiId);\r