}\r
\r
void J1939Tp_RxIndication(PduIdType RxPduId, PduInfoType* PduInfoPtr) {\r
+ imask_t state;\r
+ Irq_Save(state);\r
/** @req J1939TP0030 */\r
- if (globalState.State == J1939TP_OFF) {\r
- return;\r
- }\r
- const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
- if (J1939Tp_Internal_GetRxPduInfo(RxPduId, &RxPduInfo) != E_OK) {\r
- return;\r
- }\r
- /*if (J1939Tp_Internal_ValidatePacketType(RxPduInfo) == E_NOT_OK) {\r
- return;\r
- }*/\r
- J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
- switch (RxPduInfo->PacketType ) {\r
- case J1939TP_REVERSE_CM:\r
- J1939Tp_Internal_RxIndication_ReverseCm(PduInfoPtr,ChannelInfoPtr);\r
- break;\r
- case J1939TP_DT:\r
- J1939Tp_Internal_RxIndication_Dt(PduInfoPtr,ChannelInfoPtr);\r
- break;\r
- case J1939TP_CM:\r
- J1939Tp_Internal_RxIndication_Cm(PduInfoPtr,ChannelInfoPtr);\r
- break;\r
- case J1939TP_DIRECT:\r
- J1939Tp_Internal_RxIndication_Direct(PduInfoPtr,ChannelInfoPtr);\r
- break;\r
- default:\r
- return;\r
+ if (globalState.State == J1939TP_ON) {\r
+ const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
+ if (J1939Tp_Internal_GetRxPduInfo(RxPduId, &RxPduInfo) == E_OK) {\r
+ J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
+ switch (RxPduInfo->PacketType ) {\r
+ case J1939TP_REVERSE_CM:\r
+ J1939Tp_Internal_RxIndication_ReverseCm(PduInfoPtr,ChannelInfoPtr);\r
+ break;\r
+ case J1939TP_DT:\r
+ J1939Tp_Internal_RxIndication_Dt(PduInfoPtr,ChannelInfoPtr);\r
+ break;\r
+ case J1939TP_CM:\r
+ J1939Tp_Internal_RxIndication_Cm(PduInfoPtr,ChannelInfoPtr);\r
+ break;\r
+ case J1939TP_DIRECT:\r
+ J1939Tp_Internal_RxIndication_Direct(PduInfoPtr,ChannelInfoPtr);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
}\r
+ Irq_Restore(state);\r
}\r
\r
\r
void J1939Tp_MainFunction(void) {\r
+ imask_t state;\r
+ Irq_Save(state);\r
/** @req J1939TP0030 */\r
- if (globalState.State == J1939TP_OFF) {\r
- return;\r
- }\r
- for (int 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
- switch (Channel->Direction) {\r
- case J1939TP_TX:\r
- switch (ChannelInfoPtr->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
- case J1939TP_TX_WAIT_DT_CANIF_CONFIRM:\r
- case J1939TP_TX_WAIT_RTS_CANIF_CONFIRM:\r
- timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
- if (timer == J1939TP_EXPIRED) {\r
- timer = J1939TP_NOT_EXPIRED;\r
- ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
- if (ChannelInfoPtr->TxState->CurrentPgPtr != 0) {\r
- J1939Tp_Internal_SendConnectionAbort(Channel->CmNPdu,ChannelInfoPtr->TxState->CurrentPgPtr->Pgn);\r
- PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+ if (globalState.State == J1939TP_ON) {\r
+ for (int 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
+ switch (Channel->Direction) {\r
+ case J1939TP_TX:\r
+ switch (ChannelInfoPtr->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
+ case J1939TP_TX_WAIT_DT_CANIF_CONFIRM:\r
+ case J1939TP_TX_WAIT_RTS_CANIF_CONFIRM:\r
+ timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
+ if (timer == J1939TP_EXPIRED) {\r
+ timer = J1939TP_NOT_EXPIRED;\r
+ ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
+ if (ChannelInfoPtr->TxState->CurrentPgPtr != 0) {\r
+ J1939Tp_Internal_SendConnectionAbort(Channel->CmNPdu,ChannelInfoPtr->TxState->CurrentPgPtr->Pgn);\r
+ PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+ }\r
}\r
- }\r
- break;\r
- case J1939TP_TX_WAITING_FOR_T1_TIMEOUT:\r
- timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
- if (timer == J1939TP_EXPIRED) {\r
- timer = J1939TP_NOT_EXPIRED;\r
- ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DT_BAM_CANIF_CONFIRM;\r
- J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
- J1939Tp_Internal_SendDt(ChannelInfoPtr);\r
+ break;\r
+ case J1939TP_TX_WAITING_FOR_T1_TIMEOUT:\r
+ timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
+ if (timer == J1939TP_EXPIRED) {\r
+ timer = J1939TP_NOT_EXPIRED;\r
+ ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DT_BAM_CANIF_CONFIRM;\r
+ J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+ J1939Tp_Internal_SendDt(ChannelInfoPtr);\r
\r
- }\r
+ }\r
+ break;\r
+ default:\r
break;\r
- default:\r
- break;\r
- }\r
+ }\r
\r
- break;;\r
- case J1939TP_RX:\r
- switch (ChannelInfoPtr->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(&(ChannelInfoPtr->RxState->TimerInfo));\r
- default:\r
- break;\r
- }\r
- if (timer == J1939TP_EXPIRED) {\r
- timer = J1939TP_NOT_EXPIRED;\r
- ChannelInfoPtr->RxState->State = J1939TP_RX_IDLE;\r
- if (Channel->Protocol == J1939TP_PROTOCOL_CMDT) {\r
- J1939Tp_Internal_SendConnectionAbort(Channel->FcNPdu,ChannelInfoPtr->RxState->CurrentPgPtr->Pgn);\r
- PduR_J1939TpRxIndication(ChannelInfoPtr->RxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+ break;;\r
+ case J1939TP_RX:\r
+ switch (ChannelInfoPtr->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(&(ChannelInfoPtr->RxState->TimerInfo));\r
+ default:\r
+ break;\r
}\r
- }\r
- default:\r
- break;\r
+ if (timer == J1939TP_EXPIRED) {\r
+ timer = J1939TP_NOT_EXPIRED;\r
+ ChannelInfoPtr->RxState->State = J1939TP_RX_IDLE;\r
+ if (Channel->Protocol == J1939TP_PROTOCOL_CMDT) {\r
+ J1939Tp_Internal_SendConnectionAbort(Channel->FcNPdu,ChannelInfoPtr->RxState->CurrentPgPtr->Pgn);\r
+ PduR_J1939TpRxIndication(ChannelInfoPtr->RxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+ }\r
+ }\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
+ Irq_Restore(state);\r
}\r
void J1939Tp_TxConfirmation(PduIdType RxPdu) {\r
+ imask_t state;\r
+ Irq_Save(state);\r
/** @req J1939TP0030 */\r
- if (globalState.State == J1939TP_OFF) {\r
- return;\r
- }\r
- const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
- if (J1939Tp_Internal_GetRxPduInfo(RxPdu, &RxPduInfo) != E_OK) {\r
- return;\r
- }\r
-\r
- const J1939Tp_ChannelType* Channel = J1939Tp_Internal_GetChannel(RxPduInfo);\r
- J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
- switch (Channel->Direction) {\r
- case J1939TP_TX:\r
- J1939Tp_Internal_TxConfirmation_TxChannel(ChannelInfoPtr, RxPduInfo);\r
- break;\r
- case J1939TP_RX:\r
- J1939Tp_Internal_TxConfirmation_RxChannel(ChannelInfoPtr, RxPduInfo);\r
- break;\r
- default:\r
- break;\r
+ if (globalState.State == J1939TP_ON) {\r
+ const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
+ if (J1939Tp_Internal_GetRxPduInfo(RxPdu, &RxPduInfo) == E_OK) {\r
+ const J1939Tp_ChannelType* Channel = J1939Tp_Internal_GetChannel(RxPduInfo);\r
+ J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
+ switch (Channel->Direction) {\r
+ case J1939TP_TX:\r
+ J1939Tp_Internal_TxConfirmation_TxChannel(ChannelInfoPtr, RxPduInfo);\r
+ break;\r
+ case J1939TP_RX:\r
+ J1939Tp_Internal_TxConfirmation_RxChannel(ChannelInfoPtr, RxPduInfo);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
}\r
-\r
+ Irq_Restore(state);\r
}\r
static inline const J1939Tp_ChannelType* J1939Tp_Internal_GetChannel(const J1939Tp_RxPduInfoType* RxPduInfo) {\r
return &(J1939Tp_ConfigPtr->Channels[RxPduInfo->ChannelIndex]);\r
}\r
/** @req J1939TP0096 */\r
Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr) {\r
+ imask_t state;\r
+ Irq_Save(state);\r
#if J1939TP_DEV_ERROR_DETECT\r
if (globalState.State == J1939TP_OFF) {\r
J1939Tp_Internal_ReportError(J1939TP_TRANSMIT_ID,J1939TP_E_UNINIT);\r
}\r
#endif\r
+ Std_ReturnType r = E_OK;\r
/** @req J1939TP0030 */\r
- if (globalState.State == J1939TP_OFF) {\r
- return E_NOT_OK;\r
- }\r
- J1939Tp_Internal_PgInfoType* PgInfo;\r
-\r
- if (J1939Tp_Internal_GetPg(TxSduId,&PgInfo) == E_NOT_OK) {\r
- return E_NOT_OK;\r
- }\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
- return E_NOT_OK;\r
- }\r
- if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
- PduInfoType* ToSendTxInfoPtr;\r
- PduR_J1939TpProvideTxBuffer(Pg->NSdu, &ToSendTxInfoPtr, TxInfoPtr->SduLength);\r
- PduIdType CanIfPdu = Pg->DirectNPdu;\r
- ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
- ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
- CanIf_Transmit(CanIfPdu,ToSendTxInfoPtr);\r
- } else {\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
- 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_SendBam(ChannelInfoPtr,TxInfoPtr);\r
- break;\r
- case J1939TP_PROTOCOL_CMDT:\r
- ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_RTS_CANIF_CONFIRM;\r
- ChannelInfoPtr->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
- ChannelInfoPtr->TxState->PduRPdu = TxSduId;\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
- break;\r
+ if (globalState.State == J1939TP_ON) {\r
+ J1939Tp_Internal_PgInfoType* PgInfo;\r
+ r = J1939Tp_Internal_GetPg(TxSduId,&PgInfo);\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
+ }\r
+ if (r == E_OK) {\r
+ if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
+ PduInfoType* ToSendTxInfoPtr;\r
+ PduR_J1939TpProvideTxBuffer(Pg->NSdu, &ToSendTxInfoPtr, TxInfoPtr->SduLength);\r
+ PduIdType CanIfPdu = Pg->DirectNPdu;\r
+ ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
+ ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
+ CanIf_Transmit(CanIfPdu,ToSendTxInfoPtr);\r
+ } else {\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
+ 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_SendBam(ChannelInfoPtr,TxInfoPtr);\r
+ break;\r
+ case J1939TP_PROTOCOL_CMDT:\r
+ ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_RTS_CANIF_CONFIRM;\r
+ ChannelInfoPtr->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
+ ChannelInfoPtr->TxState->PduRPdu = TxSduId;\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
+ break;\r
+ }\r
+ }\r
+ }\r
}\r
}\r
- return E_OK;\r
+ Irq_Restore(state);\r
+ return r;\r
}\r
static inline void J1939Tp_Internal_SendBam(J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr,const PduInfoType* TxInfoPtr) {\r
uint8 cmBamData[BAM_RTS_SIZE];\r