📄 j1939.c
字号:
*((unsigned char*)gTxPGTable[gTPTxCnxn.mRxPGTable].mData+i+(7*(gTPTxCnxn.mSequence-1)));
}
if (gTPTxCnxn.mSequence==gTPTxCnxn.mPackets) /* last packet */
{
for (i=(gTPTxCnxn.mBytes%7);(i<7)&&(i>0);i++)
{
((struct VJ1939PGN_DATA_EB00*)gTxPGTable[TX_PGN_TPDT].mData)->mData[i] = 0xFF; /* fill reserved */
}
gTPTxCnxn.mState = BAM_STATE_CLOSE;
gTxPGTable[gTPTxCnxn.mRxPGTable].mPGState = PG_TX_FREE; /* Free buffer */
/* inform application that buffer is free again! */
}
else
{
gTPTxCnxn.mSequence++;
gTPTxCnxn.mState = BAM_TX_STATE_WAIT;
gTPTxCnxn.mTimer = Tim_GetCurrentTime();
}
}
}
/* Now check system transmit PGs */
/* Break after first transmission so only one PG is processed */
/* This is neccesary because we have only one send buffer for */
/* system PGs. */
if (gTxPGTable[TX_PGN_ACK].mPGState == PG_TX_REQ) /* Acknowledge command */
{
gCB_SendSysPG(&gTxPGTable[TX_PGN_ACK]); /* Transmit PG */
}
else if(gTxPGTable[TX_PGN_ACK].mPGState == PG_TX_XMT)
{
/* transmission delayed */
/* UserFunctionTransmissionDelay() */
}
else if(gTxPGTable[TX_PGN_ACK].mPGState == PG_TX_TX)
{
gTxPGTable[TX_PGN_ACK].mPGState = PG_TX_FREE;
} /* ACK */
else if (gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_REQ) /* Transport command */
{
gCB_SendSysPG(&gTxPGTable[TX_PGN_TPCM]); /* Transmit PG */
}
else if(gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_XMT)
{
/* transmission delayed */
/* UserFunctionTransmissionDelay() */
}
else if(gTxPGTable[TX_PGN_TPCM].mPGState == PG_TX_TX)
{
gTxPGTable[TX_PGN_TPCM].mPGState = PG_TX_FREE; /* free buffer */
/* start timer for timeout */
for (i=0; i<NR_OF_TP_CH; i++)
{
if (gTPRxCnxn[i].mSource == gTxPGTable[TX_PGN_TPCM].mPDUS)
{
gTPRxCnxn[i].mTimer = Tim_GetCurrentTime();/*CMDT_TIMEOUT_2;*/ /* set timer to 1250ms timeout */
break;
}
} /* for */
} /* TPCM */
else if (gTxPGTable[TX_PGN_TPDT].mPGState == PG_TX_REQ) /* Transport data */
{
gCB_SendSysPG(&gTxPGTable[TX_PGN_TPDT]); /* Transmit PG */
}
else if (gTxPGTable[TX_PGN_TPDT].mPGState == PG_TX_XMT)
{
/* transmission delayed */
/* UserFunctionTransmissionDelay() */
}
else if (gTxPGTable[TX_PGN_TPDT].mPGState == PG_TX_TX)
{
gTxPGTable[TX_PGN_TPDT].mPGState = PG_TX_FREE; /* free buffer */
/* start timer for timeout */
for (i=0; i<NR_OF_TP_CH; i++)
{
if (gTPRxCnxn[i].mSource == gTxPGTable[TX_PGN_TPCM].mPDUS)
{
gTPRxCnxn[i].mTimer = Tim_GetCurrentTime(); /* set timer to 1250ms timeout */
break;
}
} /* for */
} /* TPDT */
/* Now check user defined received PGs */
/* Check receive cyclic PGs for timeout */
/* Break after first reception so only one PG is processed */
for (i=RX_PGN_USER; i<NR_OF_RX_PG; i++)
{
if (gRxPGTable[i].mEnable) /* Process PG */
{
if (gRxPGTable[i].mPGState == PG_RX_FULL) /* PG received? */
{
J1939AppRxIndication(&gRxPGTable[i]); /* Inform application */
gRxPGTable[i].mTimer = Tim_GetCurrentTime(); /* Reset Timer */
gRxPGTable[i].mPGState = PG_RX_FREE; /* Free buffer */
break;
}
else if (gRxPGTable[i].mTransType == TT_CYCLIC) /* Cyclic reception */
{
if (Tim_CheckTimeOut(gRxPGTable[i].mTimer,Tim_GetCurrentTime(),gRxPGTable[i].mTransRate)) /* Timeout? */
{
J1939AppRxTimeoutIndication(&gRxPGTable[i]/*.mPGN*/); /* Inform application */
gRxPGTable[i].mTimer = Tim_GetCurrentTime(); /* Reset Timer */
/* break; */ /* No break because of a missing PG would stop whole reception */
}
}
}
}
/* Check and send cyclic/async user PGs */
/* Note mPGState flag is ignored, so the Data should be valid if cyclic */
/* Note only one PG is processed */
for (i=TX_PGN_USER; i<NR_OF_TX_PG; i++)
{
if (gTxPGTable[i].mEnable) /* Process PG? */
{
if (gTxPGTable[i].mTransType == TT_CYCLIC) /* Cyclic trasmission */
{
if ((Tim_CheckTimeOut(gTxPGTable[i].mTimer,Tim_GetCurrentTime(),gTxPGTable[i].mTransRate))
&& (gTxPGTable[i].mPGState == PG_TX_REQ))
/* Check timer */
{
gCB_SendUserPG(&gTxPGTable[i]);
break;
}
else if(gTxPGTable[i].mPGState == PG_TX_XMT)
{
/* transmission delayed */
/* UserFunctionTransmissionDelay() */
}
else if (gTxPGTable[i].mPGState == PG_TX_TX)
{
gTxPGTable[i].mPGState = PG_TX_REQ; /* Free buffer */
gTxPGTable[i].mTimer = Tim_GetCurrentTime(); /* Reset Timer */
break;
}
}
else if (gTxPGTable[i].mTransType == TT_ASYNC) /* Async transmission */
{
if (gTxPGTable[i].mPGState == PG_TX_REQ)
{
gCB_SendUserPG(&gTxPGTable[i]); /* Transmit PG */
break;
}
else if(gTxPGTable[i].mPGState == PG_TX_XMT)
{
/* transmission delayed */
/* UserFunctionTransmissionDelay() */
}
else if(gTxPGTable[i].mPGState == PG_TX_TX)
{
gTxPGTable[i].mPGState = PG_TX_FREE; /* Free buffer */
break;
}
}
else if ((gTxPGTable[i].mTransType == TT_BAM) && (gTxPGTable[i].mPGState == PG_TX_REQ))
{
OpenTxBAMTransport(i);
} /* TT_BAM */
else if ((gTxPGTable[i].mTransType == TT_CMDT) && (gTxPGTable[i].mPGState == PG_TX_REQ))
{
OpenTxCMDTTransport(i);
} /* TT_CMDT */
}
} /* for */
} /* if (Address claimed) */
/* check here if a response of an ADDRESS CLAIM PG has to be handled */
/* This section is placed here because a CANNOT CLAIM ADDRES has to be
sent also in not claimed state
*/
if (gTxPGTable[TX_PGN_ADDRESS_CLAIMED].mPGState == PG_TX_REQ) /* Address Claim PG */
{
gCB_SendSysPG(&gTxPGTable[TX_PGN_ADDRESS_CLAIMED]); /* Transmit PG */
}
else if(gTxPGTable[TX_PGN_ADDRESS_CLAIMED].mPGState == PG_TX_XMT)
{
/* transmission delayed */
/* UserFunctionTransmissionDelay() */
}
else if(gTxPGTable[TX_PGN_ADDRESS_CLAIMED].mPGState == PG_TX_TX)
{
gTxPGTable[TX_PGN_ADDRESS_CLAIMED].mPGState = PG_TX_FREE;
} /* ADC */
/* Check timeout for the TX BAM protocol */
if ((gTPTxCnxn.mState == BAM_TX_STATE_WAIT)
&&(Tim_CheckTimeOut(gTPTxCnxn.mTimer,Tim_GetCurrentTime(),BAM_TX_TIMEOUT)))
{
gTPTxCnxn.mState = BAM_TX_STATE_DATA;
}
/* check timeout for the TX TPCM protocol */
if ((gTPTxCnxn.mState == CMDT_TX_STATE_OPEN)
&&(Tim_CheckTimeOut(gTPTxCnxn.mTimer,Tim_GetCurrentTime(),CMDT_TIMEOUT_4)))
{
gTPTxCnxn.mState = CMDT_STATE_CLOSE;
gTxPGTable[gTPTxCnxn.mRxPGTable].mPGState = PG_TX_FREE; /* free buffer */
/* inform application that buffer is free again! */
}
/* check timeout for the TX TPCM protocol */
if ((gTPTxCnxn.mState == CMDT_TX_STATE_DATA)
&&(Tim_CheckTimeOut(gTPTxCnxn.mTimer,Tim_GetCurrentTime(), CMDT_TIMEOUT_3)))
{
gTPTxCnxn.mState = CMDT_STATE_CLOSE;
gTxPGTable[gTPTxCnxn.mRxPGTable].mPGState = PG_TX_FREE; /* free buffer */
/* inform application that buffer is free again! */
}
/* check timeout of the RX TP protocols */
for (i=0; i<NR_OF_TP_CH; i++)
{
if ((gTPRxCnxn[i].mState == BAM_RX_STATE_DATA) &&
(Tim_CheckTimeOut(gTPRxCnxn[i].mTimer,Tim_GetCurrentTime(),BAM_RX_TIMEOUT)))
{
/* Timeout, delete connection */
/* Send abort if CMDT else send error */
gTPRxCnxn[i].mState = BAM_STATE_CLOSE;
}
/*checking CMDT data timeout*/
if ((gTPRxCnxn[i].mState == CMDT_RX_STATE_DATA)
&& (Tim_CheckTimeOut(gTPRxCnxn[i].mTimer,Tim_GetCurrentTime(),CMDT_TIMEOUT_2)))
{
/* Timeout, delete connection */
/* Send abort if CMDT else send error */
gTPRxCnxn[i].mState = CMDT_STATE_CLOSE;
}
} /* for */
/* and at least, we check the CAN status */
if(gCan_GetCanStatus()== CAN_STS_BUS_OFF)
{
gCANBusOff = 1;
}
} /* J1939 Stack */
/*!
\file
\brief Main function of the J1939 stack. Contains only the function J1939Stack()
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -