]> rtime.felk.cvut.cz Git - arc.git/commitdiff
j1939tp should now be able to transmit direct pgs independent of the channel state
authornier <devnull@localhost>
Mon, 24 Oct 2011 10:18:16 +0000 (12:18 +0200)
committernier <devnull@localhost>
Mon, 24 Oct 2011 10:18:16 +0000 (12:18 +0200)
communication/Com/Com.c
communication/Com/Com_Com.c
communication/J1939Tp/J1939Tp.c
communication/J1939Tp/J1939Tp_Internal.h
include/J1939Tp_ConfigTypes.h

index 8c77cc89fe354d09bda1a0fdaa5c77e72374b6dd..fb96ef7bc0bef62d3ef15abd8c4d670e5b4596bf 100644 (file)
@@ -221,7 +221,6 @@ BufReq_ReturnType Com_CopyTxData(PduIdType PduId, PduInfoType* PduInfoPtr, Retry
        boolean dirOk = ComConfig->ComIPdu[PduId].ComIPduDirection == SEND;\r
        boolean sizeOk = IPdu->ComIPduSize >= Com_BufferPduState[PduId].currentPosition + PduInfoPtr->SduLength;\r
        if (dirOk && sizeOk) {\r
-               Com_BufferPduState[PduId].locked = true;\r
                void* source = GET_ArcIPdu(PduId)->ComIPduDataPtr;\r
                memcpy(PduInfoPtr->SduDataPtr,source + Com_BufferPduState[PduId].currentPosition, PduInfoPtr->SduLength);\r
                Com_BufferPduState[PduId].currentPosition += PduInfoPtr->SduLength;\r
index 5571d89f22bda6c0e3f8d5cc66b967e73ddc876a..c5337ead02b7a91087b6189968595b2a3d22b7fe 100644 (file)
@@ -192,10 +192,9 @@ void Com_TpRxIndication(PduIdType PduId, NotifResultType Result) {
                return;\r
        }\r
        // unlock buffer\r
-       if (isPduBufferLocked(PduId)) {\r
-               Com_BufferPduState[PduId].locked = false;\r
-               Com_BufferPduState[PduId].currentPosition = 0;\r
-       }\r
+       Com_BufferPduState[PduId].locked = false;\r
+       Com_BufferPduState[PduId].currentPosition = 0;\r
+\r
        if (Result == NTFRSLT_OK) {\r
                Com_RxProcessSignals(IPdu,Arc_IPdu);\r
        }\r
@@ -203,10 +202,10 @@ void Com_TpRxIndication(PduIdType PduId, NotifResultType Result) {
 \r
 void Com_TxConfirmation(PduIdType ComTxPduId) {\r
        PDU_ID_CHECK(ComTxPduId, 0x15);\r
-       if (isPduBufferLocked(ComTxPduId)) {\r
-               Com_BufferPduState[ComTxPduId].locked = false;\r
-               Com_BufferPduState[ComTxPduId].currentPosition = 0;\r
-       }\r
+\r
+       Com_BufferPduState[ComTxPduId].locked = false;\r
+       Com_BufferPduState[ComTxPduId].currentPosition = 0;\r
+\r
        (void)ComTxPduId; // Nothing to be done. This is just to avoid Lint warning.\r
 }\r
 \r
index c6aad633842a5210a8aa3ac3238418e75e721e5b..6c63beb6af1331306ef5358a91e11345706e8699 100644 (file)
@@ -74,7 +74,7 @@ void J1939Tp_Init(const J1939Tp_ConfigType* ConfigPtr) {
                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
@@ -118,7 +118,7 @@ void J1939Tp_MainFunction(void) {
        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
@@ -127,9 +127,6 @@ void J1939Tp_MainFunction(void) {
                                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
@@ -142,7 +139,7 @@ void J1939Tp_MainFunction(void) {
                                                        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
@@ -174,6 +171,14 @@ void J1939Tp_MainFunction(void) {
                        }\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
@@ -303,7 +308,7 @@ static inline void J1939Tp_Internal_RxIndication_Dt(PduInfoType* PduInfoPtr, J19
                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
@@ -322,13 +327,6 @@ static inline void J1939Tp_Internal_RxIndication_Cm(PduInfoType* PduInfoPtr, J19
        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
@@ -344,7 +342,7 @@ static inline void J1939Tp_Internal_RxIndication_Cm(PduInfoType* PduInfoPtr, J19
                        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
@@ -352,7 +350,7 @@ static inline void J1939Tp_Internal_RxIndication_Cm(PduInfoType* PduInfoPtr, J19
                } 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
@@ -376,7 +374,7 @@ static inline void J1939Tp_Internal_RxIndication_ReverseCm(PduInfoType* PduInfoP
                                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
@@ -390,7 +388,7 @@ static inline void J1939Tp_Internal_RxIndication_ReverseCm(PduInfoType* PduInfoP
                                                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
@@ -418,7 +416,7 @@ static inline void J1939Tp_Internal_TxConfirmation_RxChannel(J1939Tp_Internal_Ch
        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
@@ -461,29 +459,30 @@ static inline boolean J1939Tp_Internal_IsLastDt(J1939Tp_Internal_RxChannelInfoTy
 }\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
@@ -494,13 +493,13 @@ static inline void J1939Tp_Internal_TxConfirmation_TxChannel(J1939Tp_Internal_Ch
                                        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
@@ -533,6 +532,7 @@ Std_ReturnType J1939Tp_CancelReceiveRequest(PduIdType RxSduId) {
        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
@@ -550,35 +550,22 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
                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
@@ -588,7 +575,7 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
                                                        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
@@ -598,6 +585,34 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
        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
@@ -759,14 +774,11 @@ static inline void J1939Tp_Internal_SendConnectionAbort(PduIdType CmNPdu, J1939T
        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
@@ -789,7 +801,9 @@ static inline J1939Tp_PgnType J1939Tp_Internal_GetPgn(uint8* PgnBytes) {
        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
index 6b6557611bc27b26da9cc8e493071af07371ff88..e8a5126c9f890f107e1704aa82104887ea76731e 100644 (file)
@@ -64,9 +64,16 @@ typedef struct {
        J1939Tp_Internal_RxChannelInfoType*             RxState; /* setup in init */\r
 } J1939Tp_Internal_ChannelInfoType;\r
 \r
+typedef enum {\r
+       J1939TP_PG_TX_IDLE,\r
+       J1939TP_PG_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM,\r
+} J1939Tp_Internal_PgDirectState;\r
+\r
 typedef struct {\r
        J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr;\r
        const J1939Tp_PgType* PgConfPtr;\r
+       J1939Tp_Internal_PgDirectState TxState;\r
+       J1939Tp_Internal_TimerType TimerInfo;\r
 } J1939Tp_Internal_PgInfoType;\r
 \r
 typedef struct {\r
@@ -109,11 +116,12 @@ static inline void J1939Tp_Internal_SendRts(J1939Tp_Internal_ChannelInfoType* Ch
 static inline void J1939Tp_Internal_SendEndOfMsgAck(J1939Tp_Internal_ChannelInfoType* Channel);\r
 static inline void J1939Tp_Internal_SendCts(J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr, J1939Tp_PgnType Pgn, uint8 NextPacketSeqNum,uint8 NumPackets);\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_StartTimer(J1939Tp_Internal_TimerType* TimerInfo,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
 static inline uint8 J1939TP_Internal_GetNumDtPacketsToSend(uint16 messageSize);\r
+static inline Std_ReturnType J1939Tp_Internal_DirectTransmit(const PduInfoType* TxInfoPtr, J1939Tp_Internal_PgInfoType* PgInfo);\r
+static inline J1939Tp_Internal_PgInfoType* J1939Tp_GetPgInfo(const J1939Tp_PgType* Pg);\r
 \r
 static inline void J1939Tp_Internal_ReportError(uint8 ApiId, uint8 ErrorId);\r
 #endif\r
index 0da8541df70fe4be45a0f39ac82fd780dbd04015..b8107ad2597d8369d840ca7361534a6a7785febe 100644 (file)
@@ -33,19 +33,20 @@ typedef enum {
        J1939TP_TX_IDLE,\r
        J1939TP_TX_WAIT_BAM_CANIF_CONFIRM,\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_WAIT_DT_BAM_CANIF_CONFIRM,\r
        J1939TP_TX_WAITING_FOR_T1_TIMEOUT,\r
        J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK\r
 } J1939Tp_Internal_TxChannelStateType;\r
+\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_RxChannelStateType;\r
+\r
 typedef struct {\r
        uint32 Timer;\r
        uint32 TimerExpire;\r