📄 jtransp.c
字号:
*/
void HandleRxTransportDataPG(void)
{
unsigned char i, j;
unsigned char rem;
/* Search open channel */
for (i=0; i<NR_OF_TP_CH; i++)
{
/* Broadcast announce message */
if ((gTPRxCnxn[i].mState==BAM_RX_STATE_DATA) && /* is channel open BAM */
(gTPRxCnxn[i].mSource==gRxPGTable[RX_PGN_TPDT].mSource) && /* check source address */
((gRxPGTable[RX_PGN_TPDT].mPDUS==gDeviceAddress) || /* check dest. address = my addr or */
(gRxPGTable[RX_PGN_TPDT].mPDUS==J1939GLOBALADDRESS))) /* global addr. */
{
/* Received sequence */
if ((gTPRxCnxn[i].mSequence) == ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
{
/* now copy data */
if (gTPRxCnxn[i].mSequence==gTPRxCnxn[i].mPackets) /* last packet */
{
/* get the reminder to set the last bytes of the secuence */
rem = (gTPRxCnxn[i].mBytes % 7)?(gTPRxCnxn[i].mBytes % 7):7;
for (j=0; j<rem ;j++)
{
*((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
}
gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPGState = PG_RX_FULL; /* PG alread received */
gTPRxCnxn[i].mState = BAM_STATE_CLOSE; /* release channel */
break;
}
else /* next packet */
{
/* o.k. copy data */
for (j=0; j<7; j++)
{
*((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
}
gTPRxCnxn[i].mSequence++; /* next packet received */
gTPRxCnxn[i].mTimer = Tim_GetCurrentTime(); /* set timer to 250ms timeout */
break;
}
}
else if ((gTPRxCnxn[i].mSequence+1) != ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
{
gTPRxCnxn[i].mState = BAM_STATE_CLOSE; /* release channel */
break;
}
break;
}
/* Connection mode data transfer */
else if ((gTPRxCnxn[i].mState==CMDT_RX_STATE_DATA) && /* is channel open in connection mode data transfer */
(gTPRxCnxn[i].mSource==gRxPGTable[RX_PGN_TPDT].mSource) && /* check source address */
(gRxPGTable[RX_PGN_TPDT].mPDUS==gDeviceAddress)) /* check dest. address = my addr */
{
/* Received sequence */
if ((gTPRxCnxn[i].mSequence) == ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
{
if (gTPRxCnxn[i].mSequence==gTPRxCnxn[i].mPackets) /* last packet(fragment) */
{
rem = (gTPRxCnxn[i].mBytes % 7)?(gTPRxCnxn[i].mBytes % 7):7;
/* now copy received data not neccesarily 7 bytes*/
for (j=0; j<rem;j++)
{
*((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
}
/* Send End of message acknowledge */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_EndOfMsgAck;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = (gTPRxCnxn[i].mBytes & 0xFF);
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = (gTPRxCnxn[i].mBytes >> 8);
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = gTPRxCnxn[i].mSequence;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
if(gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF > 239)
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUS;
else
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = 0;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
gTxPGTable[TX_PGN_TPCM].mPDUS = gTPRxCnxn[i].mSource; /* dest. addr. */
gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPGState = PG_RX_FULL; /* PG alread received */
gTPRxCnxn[i].mState = CMDT_STATE_CLOSE; /* release channel */
break;
}
else /* middle or first packet */
{
/* o.k. copy 7 databytes */
for (j=0; j<7; j++)
{
*((unsigned char*)gRxPGTable[gTPRxCnxn[i].mRxPGTable].mData + ((gTPRxCnxn[i].mSequence-1)*7+j)) = ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mData[j];
}
gTPRxCnxn[i].mSequence++; /* next packet received */
/*gTPRxCnxn[i].mState = CMDT_RX_STATE_OPEN;*/
gTPRxCnxn[i].mTimer = Tim_GetCurrentTime(); /* set timer to 1250ms timeout */
if ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_FREE) || (gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_TX))
{
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_CTS;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = gTPRxCnxn[i].mSequence; /* start with first packet */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = 1; /* send next packet */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = 0xFF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
if(gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF > 239)
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUS;
else
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = 0;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
gTxPGTable[TX_PGN_TPCM].mPDUS = gTPRxCnxn[i].mSource; /* dest. addr. */
gTPRxCnxn[i].mState = CMDT_RX_STATE_DATA;
gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
}
else
{
/* should not happend, not implemented */
}
break;
}
}
else if ((gTPRxCnxn[i].mSequence+1) != ((struct VJ1939PGN_DATA_EB00*)gRxPGTable[RX_PGN_TPDT].mData)->mSequence)
{
/* Send Abort */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_ABORT; /*TPCM_EndOfMsgAck*/
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = 0xFF; /* reserved */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = 0xFF; /* reserved */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = 0xFF; /* reserved */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUS;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gRxPGTable[gTPRxCnxn[i].mRxPGTable].mPDUF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
gTxPGTable[TX_PGN_TPCM].mPDUS = gTPRxCnxn[i].mSource; /* dest. addr. */
gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
gTPRxCnxn[i].mState = CMDT_STATE_CLOSE; /* release channel */
break;
}
}
}
}
/*!
\brief Initializer for TX CMDT Protocol
\param i - Table index of the TX PG table
*/
void OpenTxCMDTTransport(unsigned char i)
{
if ((gTPTxCnxn.mState == CMDT_STATE_CLOSE) && ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_FREE)||(gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_TX))
&& (gTxPGTable[i].mDataLength <= MAX_TP_DATA_LENGTH))
{
/* Initialize transport struct */
gTPTxCnxn.mState = CMDT_TX_STATE_OPEN; /* release channel */
gTPTxCnxn.mSource = gTxPGTable[i].mPDUS; /*!!changed!! [i].mPriority; *//* dest. address */
gTPTxCnxn.mBytes = gTxPGTable[i].mDataLength; /* total number of bytes */
gTPTxCnxn.mSequence = 1; /* actual sequence number */
gTPTxCnxn.mPackets = (gTPTxCnxn.mBytes / 7) + ((gTPTxCnxn.mBytes % 7)?1:0); /* total number of packets */
gTPTxCnxn.mPToSend = 0; /* packets to send/receive between CTS */
gTPTxCnxn.mRxPGTable = i; /* PG receive table */
/* Send RTS */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_RTS;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = (unsigned char)(gTPTxCnxn.mBytes & 0xFF);
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = (unsigned char)(gTPTxCnxn.mBytes >> 8);
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = gTPTxCnxn.mPackets;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = 0; /* !!changed!!*//*gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUS;*/
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
gTxPGTable[TX_PGN_TPCM].mPDUS = gTPTxCnxn.mSource; /* dest. addr. */
gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
gTPTxCnxn.mState = CMDT_TX_STATE_OPEN; /* release channel */
gTPTxCnxn.mTimer = Tim_GetCurrentTime(); /* timer for timeout = 1250ms*/
}
}
/*!
\brief Initializer for TX BAM Protocol
\param i - Table index of the TX PG table
*/
void OpenTxBAMTransport(unsigned char i)
{
if ((gTPTxCnxn.mState == BAM_STATE_CLOSE) && ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_FREE) || ((gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_TX)))
&& (gTxPGTable[i].mDataLength <= MAX_TP_DATA_LENGTH))
{
/* Initialize transport struct */
gTPTxCnxn.mSource = J1939GLOBALADDRESS; /*!!changed!! gTxPGTable[i].mPriority;*/ /* dest. address */
gTPTxCnxn.mBytes = gTxPGTable[i].mDataLength; /* total number of bytes */
gTPTxCnxn.mSequence = 1; /* actual sequence number */
gTPTxCnxn.mPackets = (gTPTxCnxn.mBytes / 7) + ((gTPTxCnxn.mBytes % 7)?1:0); /* total number of packets */
gTPTxCnxn.mPToSend = 0; /* packets to send/receive between CTS */
gTPTxCnxn.mRxPGTable = i; /* PG receive table */
/* Send BAM */
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mControl = TPCM_BAM;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesLsb = (unsigned char)(gTPTxCnxn.mBytes & 0xFF);
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mBytesMsb = (unsigned char)(gTPTxCnxn.mBytes >> 8);
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPackets = gTPTxCnxn.mPackets;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mReserved = 0xFF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNlsb = gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUS;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGN = gTxPGTable[gTPTxCnxn.mRxPGTable].mPDUF;
((struct VJ1939PGN_DATA_EC00*)gTxPGTable[TX_PGN_TPCM].mData)->mPGNmsb = 0;
gTxPGTable[TX_PGN_TPCM].mSource = gDeviceAddress; /* source addr. */
gTxPGTable[TX_PGN_TPCM].mPDUS = gTPTxCnxn.mSource; /* dest. addr. */
gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_REQ; /* ready to transmit */
gTPTxCnxn.mState = BAM_TX_STATE_WAIT; /* release channel */
gTPTxCnxn.mTimer = Tim_GetCurrentTime(); /* timer for timeout = 50ms*/
}
}
/*!
\file
\brief Basic routines for the J1939 transport protocols BAM (Broadcast Announce Message)
and CMDT (Connection Mode Data Transfer).
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -