]> rtime.felk.cvut.cz Git - arc.git/blobdiff - communication/J1939Tp/J1939Tp.c
implemeted bam transmission and reception
[arc.git] / communication / J1939Tp / J1939Tp.c
index 834d2fcc4a16be5783cf4f613c95cbffab0c8632..ba0f5adf94a03169a8c8d63fba047e55409d102f 100644 (file)
@@ -28,17 +28,16 @@ void J1939Tp_Init(const J1939Tp_ConfigType* ConfigPtr) {
        }\r
        #endif\r
        for (int i = 0; i < J1939TP_CHANNEL_COUNT; i++) {\r
-               int rxCount = 0;\r
-               int txCount = 0;\r
-               channelInfos[i].ChannelConfPtr = &(ConfigPtr->Channels[i]);\r
                if (ConfigPtr->Channels[i].Direction == J1939TP_TX) {\r
-                       channelInfos[i].TxState = &(txChannelInfos[txCount]);\r
+                       channelInfos[i].ChannelConfPtr = &(ConfigPtr->Channels[i]);\r
+                       channelInfos[i].TxState = &(txChannelInfos[i]);\r
+                       channelInfos[i].TxState->State = J1939TP_TX_IDLE;\r
                        channelInfos[i].RxState = 0;\r
-                       txCount++;\r
                } else if (ConfigPtr->Channels[i].Direction == J1939TP_RX) {\r
+                       channelInfos[i].ChannelConfPtr = &(ConfigPtr->Channels[i]);\r
                        channelInfos[i].TxState = 0;\r
-                       channelInfos[i].RxState = &(rxChannelInfos[rxCount]);\r
-                       rxCount++;\r
+                       channelInfos[i].RxState = &(rxChannelInfos[i]);\r
+                       channelInfos[i].RxState->State = J1939TP_RX_IDLE;\r
                } else {\r
                        return; // unexpected\r
                }\r
@@ -89,37 +88,52 @@ void J1939Tp_MainFunction(void) {
                                        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
                                                break;\r
-                                       default:\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
                                                break;\r
+                                       default:\r
+                                       break;\r
                                }\r
-                               break;\r
-                               if (timer == J1939TP_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
-                               return;\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
+                                               timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->RxState->TimerInfo));\r
                                        default:\r
                                                break;\r
                                }\r
-                       default:\r
-                               break;\r
                                if (timer == J1939TP_EXPIRED) {\r
+                                       timer = J1939TP_NOT_EXPIRED;\r
                                        ChannelInfoPtr->RxState->State = J1939TP_TX_IDLE;\r
-                                       J1939Tp_Internal_SendConnectionAbort(Channel->FcNPdu,ChannelInfoPtr->TxState->CurrentPgPtr->Pgn);\r
-                                       PduR_J1939TpRxIndication(ChannelInfoPtr->RxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+                                       if (Channel->Protocol == J1939TP_PROTOCOL_CMDT) {\r
+                                               J1939Tp_Internal_SendConnectionAbort(Channel->FcNPdu,ChannelInfoPtr->TxState->CurrentPgPtr->Pgn);\r
+                                               PduR_J1939TpRxIndication(ChannelInfoPtr->RxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+                                       }\r
                                }\r
-                               return;\r
+                       default:\r
+                               break;\r
                }\r
        }\r
 }\r
@@ -178,6 +192,9 @@ static inline void J1939Tp_Internal_RxIndication_Dt(PduInfoType* PduInfoPtr, J19
        PduIdType PduRSdu = ChannelInfoPtr->RxState->CurrentPgPtr->NSdu;\r
        uint8 requestSize = DT_DATA_SIZE;\r
        boolean lastMessage = false;\r
+       if (ChannelInfoPtr->RxState->State != J1939TP_RX_RECEIVING_DT) {\r
+               return;\r
+       }\r
        if (J1939Tp_Internal_IsLastDt(ChannelInfoPtr->RxState)) {\r
                lastMessage = true;\r
                J1939Tp_Internal_DtPayloadSizeType receivedBytes = ChannelInfoPtr->RxState->TotalReceivedDtCount*DT_DATA_SIZE;\r
@@ -198,34 +215,48 @@ static inline void J1939Tp_Internal_RxIndication_Dt(PduInfoType* PduInfoPtr, J19
 static inline void J1939Tp_Internal_RxIndication_Cm(PduInfoType* PduInfoPtr, J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr) {\r
        const J1939Tp_PgType* pg = 0;\r
        J1939Tp_PgnType pgn = J1939Tp_Internal_GetPgn(&(PduInfoPtr->SduDataPtr[CM_PGN_BYTE_1]));\r
+       uint8 pf = J1939Tp_Internal_GetPf(pgn);\r
+       J1939Tp_ProtocolType protocol = J1939Tp_Internal_GetPf(pf);\r
        if (J1939Tp_Internal_GetPgFromPgn(ChannelInfoPtr->ChannelConfPtr,pgn,&pg) != E_OK) {\r
                return;\r
        }\r
+       /** @req J1939TP0173 **/\r
+       if (protocol == J1939TP_PROTOCOL_BAM && pg->Channel->Protocol != protocol) {\r
+               return;\r
+       }\r
+       if (protocol == J1939TP_PROTOCOL_CMDT && pg->Channel->Protocol != protocol) {\r
+               J1939Tp_Internal_SendConnectionAbort(pg->Channel->CmNPdu,pgn);\r
+       }\r
        uint8 Command = PduInfoPtr->SduDataPtr[CM_BYTE_CONTROL];\r
-       switch (Command) {\r
-               case RTS_CONTROL_VALUE:\r
-                       if (ChannelInfoPtr->RxState->State == J1939TP_RX_IDLE) {\r
-                               /** @req J1939TP0043**/\r
-                               J1939Tp_Internal_DtPayloadSizeType messageSize = 0;\r
-                               messageSize = J1939Tp_Internal_GetRtsMessageSize(PduInfoPtr);\r
-                                       /** @req J1939TP0039**/\r
-                               PduLengthType* bufferSizePtr = 0;\r
-                               BufReq_ReturnType BufferRes = PduR_J1939TpStartOfReception(pg->NSdu,messageSize,bufferSizePtr);\r
-                               if (BufferRes != BUFREQ_OK) {\r
-                                       return;\r
-                               }\r
-                               ChannelInfoPtr->RxState->TotalReceivedDtCount = 0;\r
-                               ChannelInfoPtr->RxState->TotalDtToReceiveCount = PduInfoPtr->SduDataPtr[RTS_BYTE_NUM_PACKETS];\r
-                               ChannelInfoPtr->RxState->TotalMessageSize = messageSize;\r
-                               ChannelInfoPtr->RxState->State = J1939TP_RX_WAIT_CTS_CANIF_CONFIRM;\r
-                               ChannelInfoPtr->RxState->CurrentPgPtr = pg;\r
-                               J1939Tp_Internal_SendCts(ChannelInfoPtr,PduInfoPtr);\r
-                               J1939Tp_Internal_RxSessionStartTimer(ChannelInfoPtr->RxState,J1939TP_TX_CONF_TIMEOUT);\r
-                       }\r
-                       break;\r
-               default:\r
-                       break;\r
+       if (Command != BAM_CONTROL_VALUE || Command != RTS_CONTROL_VALUE) {\r
+               return;\r
+       }\r
+       if (ChannelInfoPtr->RxState->State != J1939TP_RX_IDLE) {\r
+               return;\r
        }\r
+       /** @req J1939TP0043**/\r
+       J1939Tp_Internal_DtPayloadSizeType messageSize = 0;\r
+       messageSize = J1939Tp_Internal_GetRtsMessageSize(PduInfoPtr);\r
+               /** @req J1939TP0039**/\r
+       PduLengthType* bufferSizePtr = 0;\r
+       BufReq_ReturnType BufferRes = PduR_J1939TpStartOfReception(pg->NSdu,messageSize,bufferSizePtr);\r
+       if (BufferRes != BUFREQ_OK) {\r
+               return;\r
+       }\r
+       ChannelInfoPtr->RxState->TotalReceivedDtCount = 0;\r
+       ChannelInfoPtr->RxState->TotalDtToReceiveCount = PduInfoPtr->SduDataPtr[BAM_RTS_BYTE_NUM_PACKETS];\r
+       ChannelInfoPtr->RxState->TotalMessageSize = messageSize;\r
+       ChannelInfoPtr->RxState->CurrentPgPtr = pg;\r
+       if (Command == RTS_CONTROL_VALUE) {\r
+               ChannelInfoPtr->RxState->State = J1939TP_RX_WAIT_CTS_CANIF_CONFIRM;\r
+               J1939Tp_Internal_RxSessionStartTimer(ChannelInfoPtr->RxState,J1939TP_TX_CONF_TIMEOUT);\r
+               J1939Tp_Internal_SendCts(ChannelInfoPtr,PduInfoPtr);\r
+\r
+       } else if (Command == BAM_CONTROL_VALUE) {\r
+               J1939Tp_Internal_RxSessionStartTimer(ChannelInfoPtr->RxState,J1939TP_T2_TIMEOUT_MS);\r
+               ChannelInfoPtr->RxState->State = J1939TP_RX_RECEIVING_DT;\r
+       }\r
+\r
 }\r
 static inline void J1939Tp_Internal_RxIndication_ReverseCm(PduInfoType* PduInfoPtr, J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr) {\r
        const J1939Tp_PgType* pg = 0;\r
@@ -316,19 +347,23 @@ static inline boolean J1939Tp_Internal_IsLastDt(J1939Tp_Internal_RxChannelInfoTy
        return (rxChannelInfo->TotalDtToReceiveCount == rxChannelInfo->TotalReceivedDtCount);\r
 }\r
 static inline void J1939Tp_Internal_TxConfirmation_TxChannel(J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr, const J1939Tp_RxPduInfoType* RxPduInfo) {\r
+       J1939Tp_Internal_TxChannelStateType State = ChannelInfoPtr->TxState->State;\r
        switch (RxPduInfo->PacketType ) {\r
                case J1939TP_REVERSE_CM:\r
                        break;\r
                case J1939TP_CM:\r
-                       if (ChannelInfoPtr->TxState->State == J1939TP_TX_WAIT_RTS_CANIF_CONFIRM) {\r
+                       if (State == J1939TP_TX_WAIT_RTS_CANIF_CONFIRM) {\r
                                ChannelInfoPtr->TxState->State = J1939TP_TX_WAITING_FOR_CTS;\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
                        }\r
                        break;\r
                case J1939TP_DT:\r
-                       if (ChannelInfoPtr->TxState->State == J1939TP_TX_WAIT_DT_CANIF_CONFIRM) {\r
+                       if (State == J1939TP_TX_WAIT_DT_CANIF_CONFIRM) {\r
                                ChannelInfoPtr->TxState->TotalSentDtCount++;\r
                                ChannelInfoPtr->TxState->SentDtCount++;\r
-                               if (J1939Tp_Internal_WaitForEndOfMsgAck(ChannelInfoPtr->TxState)) {\r
+                               if (J1939Tp_Internal_LastDtSent(ChannelInfoPtr->TxState)) {\r
                                        J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,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
@@ -340,9 +375,19 @@ static inline void J1939Tp_Internal_TxConfirmation_TxChannel(J1939Tp_Internal_Ch
                                        J1939Tp_Internal_SendDt(ChannelInfoPtr);\r
                                }\r
                        }\r
+                       else if (State == J1939TP_TX_WAIT_DT_BAM_CANIF_CONFIRM) {\r
+                               ChannelInfoPtr->TxState->TotalSentDtCount++;\r
+                               if (J1939Tp_Internal_LastDtSent(ChannelInfoPtr->TxState)) {\r
+                                       ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
+                                       PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_OK);\r
+                               } else {\r
+                                       ChannelInfoPtr->TxState->State = J1939TP_TX_WAITING_FOR_T1_TIMEOUT;\r
+                                       J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_T1_TIMEOUT_MS);\r
+                               }\r
+                       }\r
                        break;\r
                case J1939TP_DIRECT:\r
-                       if (ChannelInfoPtr->TxState->State == J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM) {\r
+                       if (State == J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM) {\r
                                ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
                                PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu, NTFRSLT_OK);\r
                        }\r
@@ -358,7 +403,24 @@ static inline Std_ReturnType J1939Tp_Internal_GetPg(PduIdType TxSduId,J1939Tp_In
        }\r
        return E_NOT_OK;\r
 }\r
-\r
+Std_ReturnType J1939Tp_CancelTransmitRequest(PduIdType TxSduId) {\r
+       /** @req J1939TP0179 **/\r
+       J1939Tp_Internal_PgInfoType* PgInfo;\r
+       if (J1939Tp_Internal_GetPg(TxSduId,&PgInfo) == E_NOT_OK) {\r
+               return E_NOT_OK;\r
+       }\r
+       PduR_J1939TpTxConfirmation(PgInfo->PgConfPtr->NSdu,NTFRSLT_E_CANCELATION_NOT_OK);\r
+       return E_OK;\r
+}\r
+Std_ReturnType J1939Tp_CancelReceiveRequest(PduIdType RxSduId) {\r
+       /** @req J1939TP0178 **/\r
+       J1939Tp_Internal_PgInfoType* PgInfo;\r
+       if (J1939Tp_Internal_GetPg(RxSduId,&PgInfo) == E_NOT_OK) {\r
+               return E_NOT_OK;\r
+       }\r
+       PduR_J1939TpTxConfirmation(PgInfo->PgConfPtr->NSdu,NTFRSLT_E_CANCELATION_NOT_OK);\r
+       return E_OK;\r
+}\r
 /** @req J1939TP0096 */\r
 Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr) {\r
        #if J1939TP_DEV_ERROR_DETECT\r
@@ -367,12 +429,16 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
        }\r
        #endif\r
        J1939Tp_Internal_PgInfoType* PgInfo;\r
-       //PgInfo = pgInfos;\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
@@ -385,6 +451,12 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
                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->TotalSentDtCount = 0;\r
+                               ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\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
@@ -399,21 +471,41 @@ Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr)
        }\r
        return E_OK;\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
+       cmBamData[BAM_RTS_BYTE_LENGTH_1] = (uint8)(TxInfoPtr->SduLength & 0x00FF);\r
+       cmBamData[BAM_RTS_BYTE_LENGTH_2] = (uint8)(TxInfoPtr->SduLength & 0xFF00);\r
+\r
+       J1939Tp_PgnType pgn = ChannelInfoPtr->TxState->CurrentPgPtr->Pgn;\r
+       cmBamData[BAM_RTS_BYTE_NUM_PACKETS] = J1939TP_Internal_GetNumDtPacketsToSend(TxInfoPtr->SduLength);\r
+       cmBamData[BAM_RTS_BYTE_SAE_ASSIGN] = 0xFF;\r
+       J1939Tp_Internal_SetPgn(&(cmBamData[BAM_RTS_BYTE_PGN_1]),pgn);\r
+\r
+       PduInfoType cmBamPdu;\r
+       cmBamPdu.SduLength = BAM_RTS_SIZE;\r
+       cmBamPdu.SduDataPtr = cmBamData;\r
+\r
+       CanIf_Transmit(ChannelInfoPtr->ChannelConfPtr->CmNPdu,&cmBamPdu);\r
+}\r
 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
+       return (((uint16)pduInfo->SduDataPtr[BAM_RTS_BYTE_LENGTH_1]) << 8) | pduInfo->SduDataPtr[BAM_RTS_BYTE_LENGTH_1];\r
 }\r
 \r
 static inline boolean J1939Tp_Internal_WaitForCts(J1939Tp_Internal_TxChannelInfoType* TxChannelState) {\r
        return TxChannelState->SentDtCount == TxChannelState->DtToSendBeforeCtsCount;\r
 }\r
 \r
-static inline boolean J1939Tp_Internal_WaitForEndOfMsgAck(J1939Tp_Internal_TxChannelInfoType* TxChannelState) {\r
+static inline uint8 J1939TP_Internal_GetNumDtPacketsToSend(uint16 messageSize) {\r
        uint8 packetsToSend = 0;\r
-       packetsToSend = (TxChannelState->TotalMessageSize)/DT_DATA_SIZE;\r
-       if (TxChannelState->TotalMessageSize % DT_DATA_SIZE != 0) {\r
+       packetsToSend = messageSize/DT_DATA_SIZE;\r
+       if (messageSize % DT_DATA_SIZE != 0) {\r
                packetsToSend = packetsToSend + 1;\r
        }\r
-       return packetsToSend == TxChannelState->TotalSentDtCount;\r
+       return packetsToSend;\r
+}\r
+static inline boolean J1939Tp_Internal_LastDtSent(J1939Tp_Internal_TxChannelInfoType* TxChannelState) {\r
+       return J1939TP_Internal_GetNumDtPacketsToSend(TxChannelState->TotalMessageSize) == TxChannelState->TotalSentDtCount;\r
 }\r
 \r
 static inline Std_ReturnType J1939Tp_Internal_ConfGetPg(PduIdType NSduId, const J1939Tp_PgType* Pg) {\r
@@ -433,7 +525,7 @@ static inline J1939Tp_Internal_TimerStatusType J1939Tp_Internal_IncAndCheckTimer
        return J1939TP_NOT_EXPIRED;\r
 }\r
 static inline uint8 J1939Tp_Internal_GetPf(J1939Tp_PgnType pgn) {\r
-       return (pgn && 0x0000FF00) >> 8;\r
+       return  (uint8)(pgn >> 8);\r
 }\r
 static J1939Tp_ProtocolType J1939Tp_Internal_GetProtocol(uint8 pf) {\r
        if (pf < 240) {\r
@@ -473,21 +565,18 @@ static inline void J1939Tp_Internal_SendDt(J1939Tp_Internal_ChannelInfoType* Cha
 }\r
 \r
 static inline void J1939Tp_Internal_SendRts(J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr, 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
-       cmRtsData[RTS_BYTE_LENGTH_2] = (uint8)(TxInfoPtr->SduLength & 0xFF00);\r
-       uint8 reminder = 0;\r
-       if (TxInfoPtr->SduLength % J1939TP_PACKET_SIZE != 0) {\r
-               reminder = 1;\r
-       }\r
+       uint8 cmRtsData[BAM_RTS_SIZE];\r
+       cmRtsData[BAM_RTS_BYTE_CONTROL] = 16;\r
+       cmRtsData[BAM_RTS_BYTE_LENGTH_1] = (uint8)(TxInfoPtr->SduLength & 0x00FF);\r
+       cmRtsData[BAM_RTS_BYTE_LENGTH_2] = (uint8)(TxInfoPtr->SduLength & 0xFF00);\r
+\r
        J1939Tp_PgnType pgn = ChannelInfoPtr->TxState->CurrentPgPtr->Pgn;\r
-       cmRtsData[RTS_BYTE_NUM_PACKETS] = (TxInfoPtr->SduLength / J1939TP_PACKET_SIZE) + reminder;\r
-       cmRtsData[RTS_BYTE_SAE_ASSIGN] = 0xFF;\r
-       J1939Tp_Internal_SetPgn(&(cmRtsData[RTS_BYTE_PGN_1]),pgn);\r
+       cmRtsData[BAM_RTS_BYTE_NUM_PACKETS] = J1939TP_Internal_GetNumDtPacketsToSend(TxInfoPtr->SduLength);\r
+       cmRtsData[BAM_RTS_BYTE_SAE_ASSIGN] = 0xFF;\r
+       J1939Tp_Internal_SetPgn(&(cmRtsData[BAM_RTS_BYTE_PGN_1]),pgn);\r
 \r
        PduInfoType cmRtsPdu;\r
-       cmRtsPdu.SduLength = RTS_SIZE;\r
+       cmRtsPdu.SduLength = BAM_RTS_SIZE;\r
        cmRtsPdu.SduDataPtr = cmRtsData;\r
 \r
        CanIf_Transmit(ChannelInfoPtr->ChannelConfPtr->CmNPdu,&cmRtsPdu);\r
@@ -524,9 +613,9 @@ static inline void J1939Tp_Internal_SendCts(J1939Tp_Internal_ChannelInfoType* Ch
        ctsData[CTS_BYTE_NEXT_PACKET] = CTS_START_SEQ_NUM;\r
        ctsData[CTS_BYTE_SAE_ASSIGN_1] = 0xFF;\r
        ctsData[CTS_BYTE_SAE_ASSIGN_2] = 0xFF;\r
-       ctsData[CTS_BYTE_PGN_1] = RtsPduInfoPtr->SduDataPtr[RTS_BYTE_PGN_1];\r
-       ctsData[CTS_BYTE_PGN_2] = RtsPduInfoPtr->SduDataPtr[RTS_BYTE_PGN_2];\r
-       ctsData[CTS_BYTE_PGN_3] = RtsPduInfoPtr->SduDataPtr[RTS_BYTE_PGN_3];\r
+       ctsData[CTS_BYTE_PGN_1] = RtsPduInfoPtr->SduDataPtr[BAM_RTS_BYTE_PGN_1];\r
+       ctsData[CTS_BYTE_PGN_2] = RtsPduInfoPtr->SduDataPtr[BAM_RTS_BYTE_PGN_2];\r
+       ctsData[CTS_BYTE_PGN_3] = RtsPduInfoPtr->SduDataPtr[BAM_RTS_BYTE_PGN_3];\r
 \r
        CanIf_Transmit(ChannelInfoPtr->ChannelConfPtr->FcNPdu,&ctsInfo);\r
 \r