]> rtime.felk.cvut.cz Git - arc.git/commitdiff
starting to rewrite structure because I cant identify channels for rx indication...
authorNiclas <devnull@localhost>
Thu, 22 Sep 2011 10:01:15 +0000 (12:01 +0200)
committerNiclas <devnull@localhost>
Thu, 22 Sep 2011 10:01:15 +0000 (12:01 +0200)
communication/J1939Tp/J1939Tp.c
communication/J1939Tp/J1939Tp_Internal.h
communication/J1939Tp/J1939Tp_Internal_Packets.h
include/J1939Tp_ConfigTypes.h

index 7db791cd0a8bcf7f976710e455284d62e019ae04..c273f25bfa7f880ab1dd34d950c2258e7da01982 100644 (file)
@@ -13,9 +13,7 @@ static J1939Tp_Internal_GlobalStateInfoType globalState = {
                .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
@@ -27,153 +25,57 @@ void J1939Tp_Init(const J1939Tp_ConfigType* ConfigPtr) {
                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
@@ -184,87 +86,255 @@ void J1939Tp_MainFunction(void) {
                                }\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
@@ -272,30 +342,32 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
                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
@@ -304,45 +376,24 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
 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
@@ -360,24 +411,11 @@ static J1939Tp_ProtocolType J1939Tp_Internal_GetProtocol(uint8 pf) {
                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
@@ -389,23 +427,23 @@ static void inline J1939Tp_Internal_SendDt(J1939Tp_Internal_PgStateInfoType* PgS
 \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
@@ -414,32 +452,30 @@ static void J1939Tp_Internal_SendRts(J1939Tp_Internal_PgStateInfoType* PgState,
        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
@@ -449,7 +485,7 @@ static void inline J1939Tp_Internal_SendEndOfMsgAck(J1939Tp_Internal_PgStateInfo
  * @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
@@ -462,9 +498,8 @@ static inline void J1939Tp_Internal_SendCts(J1939Tp_Internal_PgStateInfoType* Pg
        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
@@ -480,21 +515,35 @@ 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 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
index bca3bebe1acfd99c6df1eae019ac7c6b9f4353b7..f489d8ef8f2201ca5a5da4c08512e2e59d67a6a4 100644 (file)
@@ -16,6 +16,8 @@
 #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
@@ -40,87 +42,48 @@ typedef enum {
        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
index dd6f9e83112b2b7e5229ad2f26d0f29aa895d917..d9b4d1613f6a656ed93e48437b1ce23eec7d8b3a 100644 (file)
@@ -4,30 +4,33 @@
 #define CM_PGN_VALUE_1                 0x00\r
 #define CM_PGN_VALUE_2                 0xCE\r
 #define CM_PGN_VALUE_3                 0x00\r
-\r
+#define CM_PGN_BYTE_1                  5\r
+#define CM_PGN_BYTE_2                  6\r
+#define CM_PGN_BYTE_3                  7\r
+#define CM_BYTE_CONTROL                        0\r
 \r
 /* Rts message */\r
 #define RTS_SIZE                               8\r
-#define RTS_BYTE_CONTROL               0\r
+#define RTS_BYTE_CONTROL               CM_BYTE_CONTROL\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_BYTE_PGN_1                 CM_PGN_BYTE_1\r
+#define RTS_BYTE_PGN_2                 CM_PGN_BYTE_2\r
+#define RTS_BYTE_PGN_3                 CM_PGN_BYTE_3\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_CONTROL               CM_BYTE_CONTROL\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_BYTE_PGN_1                 CM_PGN_BYTE_1\r
+#define CTS_BYTE_PGN_2                 CM_PGN_BYTE_2\r
+#define CTS_BYTE_PGN_3                 CM_PGN_BYTE_3\r
 #define CTS_START_SEQ_NUM              0\r
 #define CTS_CONTROL_VALUE              17\r
 \r
 \r
 /* EndOfMsgAck message */\r
 #define ENDOFMSGACK_SIZE                                       8\r
-#define ENDOFMSGACK_BYTE_CONTROL                       0\r
+#define ENDOFMSGACK_BYTE_CONTROL                       CM_BYTE_CONTROL\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_BYTE_PGN_1                         CM_PGN_BYTE_1\r
+#define ENDOFMSGACK_BYTE_PGN_2                         CM_PGN_BYTE_2\r
+#define ENDOFMSGACK_BYTE_PGN_3                         CM_PGN_BYTE_3\r
 #define ENDOFMSGACK_CONTROL_VALUE                      19\r
 \r
 #define CONNABORT_SIZE                         8\r
@@ -65,9 +68,9 @@
 #define CONNABORT_BYTE_SAE_ASSIGN_2            2\r
 #define CONNABORT_BYTE_SAE_ASSIGN_3            3\r
 #define CONNABORT_BYTE_SAE_ASSIGN_4            4\r
-#define CONNABORT_BYTE_PGN_1                   5\r
-#define CONNABORT_BYTE_PGN_2                   6\r
-#define CONNABORT_BYTE_PGN_3                   7\r
+#define CONNABORT_BYTE_PGN_1                   CM_PGN_BYTE_1\r
+#define CONNABORT_BYTE_PGN_2                   CM_PGN_BYTE_2\r
+#define CONNABORT_BYTE_PGN_3                   CM_PGN_BYTE_3\r
 \r
 #define CONNABORT_CONTROL_VALUE                32\r
 \r
index 3281abe807912fe20291a72864b34359eba5f48e..1c76ccd28d45071d29e950dec40c9498b3e9513f 100644 (file)
@@ -29,10 +29,26 @@ typedef enum {
        J1939TP_TX\r
 } J1939Tp_DirectionType;\r
 \r
-/** This N-PDU represents the TP.CM frame that is used in reverese direction\r
- * for a J1939 transport protocol session using CMDT. TP.CM in reverse direction\r
- * is used for intermediate and final ack of received  data and to abort the connection
- */\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_TxChannelStateType;\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
+typedef struct {\r
+       uint32 Timer;\r
+       uint32 TimerExpire;\r
+} J1939Tp_Internal_TimerType;\r
+typedef uint32 J1939Tp_Internal_PgnType;\r
+typedef uint32 J1939Tp_Internal_DtPayloadSizeType;\r
 \r
 \r
 typedef struct J1939Tp_ChannelType_ J1939Tp_ChannelType;\r
@@ -47,17 +63,59 @@ struct J1939Tp_PgType_ {
        const J1939Tp_ChannelType*              Channel;\r
 };\r
 \r
+\r
+typedef struct {\r
+       J1939Tp_Internal_TxChannelStateType 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_PgType* CurrentPgPtr;\r
+} J1939Tp_Internal_TxChannelInfoType;\r
+\r
+typedef struct {\r
+       J1939Tp_Internal_RxChannelStateType State;\r
+       J1939Tp_Internal_TimerType TimerInfo;\r
+       uint8 TotalReceivedDtCount;\r
+       uint8 TotalDtToReceiveCount;\r
+       J1939Tp_Internal_DtPayloadSizeType TotalMessageSize;\r
+       J1939Tp_PgType* CurrentPgPtr;\r
+} J1939Tp_Internal_RxChannelInfoType;\r
+\r
+typedef struct {\r
+       J1939Tp_Internal_TxChannelInfoType*             TxState; /* setup in init */\r
+       J1939Tp_Internal_RxChannelInfoType*             RxState; /* setup in init */\r
+} J1939Tp_Internal_ChannelInfoType;\r
+\r
 struct J1939Tp_ChannelType_ {\r
-       const J1939Tp_ProtocolType      Protocol;\r
-       const PduIdType                         DtNPdu;\r
-       const PduIdType                         CmNPdu;\r
-       const PduIdType                         FcNPdu; /** only set when Protocol == J1939TP_PROTOCOL_CMDT */\r
-       const J1939Tp_DirectionType Direction;\r
+       const J1939Tp_ProtocolType                              Protocol;\r
+       const PduIdType                                                 DtNPdu;\r
+       const PduIdType                                                 CmNPdu;\r
+       const PduIdType                                                 FcNPdu; /** only set when Protocol == J1939TP_PROTOCOL_CMDT */\r
+       const J1939Tp_DirectionType                     Direction;\r
+       const uint16                                                    PgCount;\r
+       const J1939Tp_PgType*                                   Pgs;\r
 } ;\r
 \r
+typedef enum {\r
+       J1939TP_REVERSE_CM,\r
+       J1939TP_CM,\r
+       J1939TP_DT,\r
+       J1939TP_DIRECT\r
+} J1939Tp_RxPduType;\r
+\r
+typedef struct {\r
+       const J1939Tp_RxPduType         PacketType;\r
+       const uint8*                            ChannelIndex;\r
+} J1939Tp_RxPduInfoType;\r
+\r
 /** @req J1939TP0175 */\r
 typedef struct {\r
        const J1939Tp_PgType* Pgs;\r
+       const J1939Tp_RxPduInfoType RxPdus;\r
        const J1939Tp_ChannelType* Channels;\r
 } J1939Tp_ConfigType;\r
 \r