⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 j1939.c

📁 在Freescale16位单片机MC9s12dp256上移植了J1939源码和操作系统(ucOSII)。
💻 C
📖 第 1 页 / 共 2 页
字号:
              *((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 + -