State_Machine.c
上传用户:gxz1972
上传日期:2019-09-13
资源大小:323k
文件大小:19k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. //-----------------------------------------------------------------------------
  2. // USB_ISR.c
  3. //-----------------------------------------------------------------------------
  4. // Copyright 2007 Vson Technology, Inc.
  5. // http://www.usbmcu.com
  6. //
  7. // Program Description:
  8. //
  9. //
  10. //
  11. //
  12. //
  13. // MCU:            C8051F347
  14. // Tool chain:     Keil C51 7.50 / Keil EVAL C51
  15. //                 Silicon Laboratories IDE version 2.6
  16. // Command Line:   
  17. // Project Name:   TR1000
  18. //
  19. //
  20. // Release 1.0
  21. //    -All changes by Brin Cai
  22. //    -24 JUL 2007
  23. //
  24. //
  25. //update date: 2007.08.13 ADC solution bit change(10bit--->12bit)
  26. //-----------------------------------------------------------------------------
  27. // Includes
  28. //-----------------------------------------------------------------------------
  29. #include "Include_H.h"
  30. //-----------------------------------------------------------------------------
  31. // State_Machine
  32. //-----------------------------------------------------------------------------
  33. //
  34. // Return Value : None
  35. // Parameters   : None
  36. //
  37. // Determine new state and act on current state
  38. //-----------------------------------------------------------------------------
  39. void State_Machine(void)
  40. {
  41.    
  42.   
  43.    switch (M_State)
  44.    {
  45.       case
  46.          USB_RESET_STATUS:
  47.  EA = 0;
  48.  USBReset();
  49.          M_State = WAIT_OPEN_DEVICE_STATUS;
  50.  EA = 1;
  51.          break;
  52.   
  53.   case
  54.          EP0_HANDLER_STATUS:                  // Stay in Wait State
  55.  EA = 0;
  56.  Endpoint0();
  57.  EA = 1;
  58.          break;
  59.   case
  60.          WAIT_OPEN_DEVICE_STATUS:                  // Stay in Wait State
  61.          break;
  62.       case
  63.          DEVICE_IDLE_STATUS:                  // Stay in Idle State
  64.          break;
  65.       
  66.   
  67.   case
  68.          RX_CONFIG_DATA_FROM_HOST_STATUS:   // Receive the Config Data
  69.  
  70.          //if (bitInterruptFlag == 1)
  71.  {
  72.    EA = 0;
  73.    RxConfigDataFromHost();//BulkOrInterruptOut(&gEp2OutStatus);//EP2 Out Status
  74.    EA = 1;
  75.            M_State = TX_CONFIG_RESPONSE_TO_HOST_STATUS;
  76.  }
  77.          break;
  78.   case
  79.          TX_CONFIG_RESPONSE_TO_HOST_STATUS:   // Response Host After receive the Config Data
  80.          //if (bitInterruptFlag == 1)
  81.  {
  82.    EA = 0;
  83.    TxConfigResponse2Host(0x00);
  84.    EA = 1;
  85.    M_State = DEVICE_IDLE_STATUS;
  86.    //bitInterruptFlag = 0;
  87.          }
  88.  break;
  89.       case
  90.          TX_TEACHER_KEY_DATA_TO_HOST_STATUS:   // transmit key data to the host
  91.          if (gbitRfReceivedDataFlag == 1)
  92.  {
  93.    EA = 0;
  94.    TxTeacherKeyData2Host();
  95.    EA = 1;
  96.    //M_State = TX_TOUCHPAD_DATA_TO_HOST_STATUS;
  97.    gbitRfReceivedDataFlag = 0;
  98.          }
  99.  break;
  100.       case
  101.          TX_TOUCHPAD_DATA_TO_HOST_STATUS:   // transmit touch pad data to the host
  102.          //if (bitInterruptFlag == 1)
  103.  if (gbitRfReceivedDataFlag == 1)
  104.  {
  105.    EA = 0;
  106.    TxTouchPadData2Host();
  107.    EA = 1;
  108.    //M_State = TX_CONFIG_RESPONSE_TO_HOST_STATUS;
  109.    gbitRfReceivedDataFlag = 0;
  110.          }
  111.          break;
  112.        case
  113.          TX_STUDENT_KEY_DATA_TO_HOST_STATUS:   // transmit key data to the host
  114.          if (gbitRfReceivedDataFlag == 1)
  115.  {
  116.    EA = 0;
  117.    TxStudentKeyData2Host();
  118.    EA = 1;
  119.    //M_State = TX_TOUCHPAD_DATA_TO_HOST_STATUS;
  120.    gbitRfReceivedDataFlag = 0;
  121.          }
  122.  break;
  123.        case
  124.          TX_STUDENT_EXAM_DATA_TO_HOST_STATUS:   // transmit key data to the host
  125.          if (gbitRfReceivedDataFlag == 1)
  126.  {
  127.    EA = 0;
  128.    TxStudentExamData2Host();
  129.    EA = 1;
  130.    //M_State = TX_TOUCHPAD_DATA_TO_HOST_STATUS;
  131.    gbitRfReceivedDataFlag = 0;
  132.          }
  133.  break;
  134.       default:
  135.          //M_State = ERROR_STATUS;           // Unknown State, stay in Error State
  136.          break;
  137.    }//switch
  138.  
  139. }
  140. void TxConfigResponse2Host(unsigned char ResponseResult)
  141. {
  142.    data BYTE i;
  143.    sbitLED = 0;
  144.    for (i = 0; i < 64; i++)
  145.    {
  146.      gaucTxData2HostBuffer[i]=0;
  147.    }
  148.    gaucTxData2HostBuffer[0] = 0x00;
  149.    gaucTxData2HostBuffer[1] = 0x04;//单包传输 最后一个分包 12 字节
  150.    gaucTxData2HostBuffer[2] = ResponseResult;
  151.    gaucTxData2HostBuffer[3] = 2;
  152.    gaucTxData2HostBuffer[4] = 0;
  153.    gaucTxData2HostBuffer[5] = 0;
  154.    gaucTxData2HostBuffer[6] = 7;
  155.    gaucTxData2HostBuffer[7] = 1;
  156.    gaucTxData2HostBuffer[8] = 0;
  157.    gaucTxData2HostBuffer[9] = 1;
  158.    gaucTxData2HostBuffer[10] = 0;
  159.    gaucTxData2HostBuffer[11] = 0x55;
  160.    // Place Config response packet (0x00) on the OUT FIFO
  161.    BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64);
  162.    sbitLED = 1;
  163. }
  164. void TxTeacherKeyData2Host(void)
  165. {
  166.    data BYTE i;
  167.    sbitLED = 0;
  168.    for (i = 0; i < 64; i++)
  169.    {
  170.      gaucTxData2HostBuffer[i]=0;
  171.    }
  172.    /*
  173.    gaucTxData2HostBuffer[0] = 0x01;
  174.    gaucTxData2HostBuffer[1] = 0x30;//单包传输 最后一个分包 12 字节
  175.    gaucTxData2HostBuffer[2] = 0xaa;
  176.    gaucTxData2HostBuffer[3] = 0x55;
  177.    gaucTxData2HostBuffer[4] = 0xaa;
  178.    gaucTxData2HostBuffer[5] = 0x55;
  179.    gaucTxData2HostBuffer[6] = 0x00;
  180.    gaucTxData2HostBuffer[7] = 0x01;
  181.    gaucTxData2HostBuffer[8] = 0xaa;
  182.    gaucTxData2HostBuffer[9] = 0x55;
  183.    gaucTxData2HostBuffer[10] = 0xaa;
  184.    gaucTxData2HostBuffer[11] = 0x55;
  185.    gaucTxData2HostBuffer[12] = 0x00;
  186.    gaucTxData2HostBuffer[13] = 0x01;
  187.    */
  188.    gaucTxData2HostBuffer[0] = 0x01;
  189.    gaucTxData2HostBuffer[1] = 0x14;
  190.    if ((gaucRxDataFromRfBuffer[COUNT_BASE + (COUNT_BASE + RF_PADLOAD)*0 + 0] & BIT7) == BIT7)
  191.       {
  192.     gaucTxData2HostBuffer[2] = 0x80;
  193.   }
  194.    else
  195.       {
  196.     gaucTxData2HostBuffer[2] = 0x00;
  197.   }
  198.    
  199.    gaucTxData2HostBuffer[3] = gaucRxDataFromRfBuffer[2] & 0x7f;
  200.    gaucTxData2HostBuffer[4] = gaucRxDataFromRfBuffer[3];
  201.    gaucTxData2HostBuffer[5] = gaucRxDataFromRfBuffer[4];
  202.    gaucTxData2HostBuffer[6] = gaucRxDataFromRfBuffer[7];
  203.    gaucTxData2HostBuffer[7] = gaucRxDataFromRfBuffer[8];
  204.    
  205.    if (gaucRxDataFromRfBuffer[6] != gucPacketCount)
  206.    {
  207.       BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64);
  208.       gucPacketCount = gaucRxDataFromRfBuffer[6];
  209.    }
  210.    sbitLED = 1;
  211.      
  212. }
  213. void TxTouchPadData2Host(void)
  214. {
  215.    data BYTE i;
  216.    sbitLED = 0;
  217.    for (i = 0; i < 64; i++)
  218.    {
  219.      gaucTxData2HostBuffer[i]=0;
  220.    }
  221.    /*
  222.    gaucTxData2HostBuffer[0] = 0x02;
  223.    gaucTxData2HostBuffer[1] = 0x14;
  224.    gaucTxData2HostBuffer[2] = 0x00;
  225.    gaucTxData2HostBuffer[3] = 0x01;
  226.    gaucTxData2HostBuffer[4] = 0x00;
  227.    gaucTxData2HostBuffer[5] = 0x01;
  228.    gaucTxData2HostBuffer[6] = 0x00;
  229.    */
  230.    gaucTxData2HostBuffer[0] = 0x02;
  231.    gaucTxData2HostBuffer[1] = 0x14;
  232.    if ((gaucRxDataFromRfBuffer[COUNT_BASE + (COUNT_BASE + RF_PADLOAD)*0 + 0] & BIT7) == BIT7)
  233.       {
  234.     gaucTxData2HostBuffer[2] = 0x80;
  235.   }
  236.    else
  237.       {
  238.     gaucTxData2HostBuffer[2] = 0x00;
  239.   }
  240.    gaucTxData2HostBuffer[3] = gaucRxDataFromRfBuffer[2] & 0x7f;
  241.    gaucTxData2HostBuffer[4] = gaucRxDataFromRfBuffer[3];
  242.    gaucTxData2HostBuffer[5] = gaucRxDataFromRfBuffer[4];
  243.    gaucTxData2HostBuffer[6] = gaucRxDataFromRfBuffer[5] & 0x0f;//0x03;//(10bit-->12bit)
  244.    gaucTxData2HostBuffer[7] = gaucRxDataFromRfBuffer[6];
  245.    gaucTxData2HostBuffer[8] = gaucRxDataFromRfBuffer[7] & 0x0f;//0x03;//(10bit-->12bit)
  246.    gaucTxData2HostBuffer[9] = gaucRxDataFromRfBuffer[8];
  247.    if ((gaucRxDataFromRfBuffer[5] & BIT6) == BIT6)
  248.      gaucTxData2HostBuffer[10] = 0x01;
  249.    else
  250.      gaucTxData2HostBuffer[10] = 0x00;
  251.    if ((gaucRxDataFromRfBuffer[5] & BIT5) == BIT5)
  252.      gaucTxData2HostBuffer[10] |= BIT1;
  253.    else
  254.      gaucTxData2HostBuffer[10] &= ~BIT1;
  255.    
  256.    //BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64);
  257.    if (gaucTxData2HostBuffer[3] != gucPacketCount)
  258.    {
  259.       BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64);
  260.       gucPacketCount = gaucTxData2HostBuffer[3];
  261.    }
  262.    sbitLED = 1;
  263. }
  264. /*
  265. //=============================================================================================
  266. void TxStudentKeyData2Host(void)
  267. {
  268.    data BYTE i;
  269.    sbitLED = 0;
  270.    
  271.    
  272.    gaucTxData2HostBuffer[0] = 0x03; //student key data
  273.    gaucTxData2HostBuffer[1] = 0x14;
  274.    if ((gaucRxDataFromRfBuffer[COUNT_BASE + (COUNT_BASE + RF_PADLOAD)*0 + 0] & BIT7) == BIT7)
  275.       {
  276.     gaucTxData2HostBuffer[2] = 0x80;
  277.   }
  278.    else
  279.       {
  280.     gaucTxData2HostBuffer[2] = 0x00;
  281.   }
  282.    
  283.    //最高位用于区别学生机和教师机 bit7-- 1:教师机地址 0:学生机地址
  284.    gaucTxData2HostBuffer[3] = gaucRxDataFromRfBuffer[2] & 0x7f; 
  285.    gaucTxData2HostBuffer[4] = gaucRxDataFromRfBuffer[3];
  286.    gaucTxData2HostBuffer[5] = gaucRxDataFromRfBuffer[4];
  287.    //收集数据阶段
  288.    if ((gaucRxDataFromRfBuffer[5] & 0x3f) != gucPacketCount)
  289.    {
  290.        if (gaucRxDataFromRfBuffer[6] != 0)
  291.    {
  292. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[6];
  293.        }
  294.    if (gaucRxDataFromRfBuffer[7] != 0)
  295.    {
  296. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[7];
  297.        }
  298.    if (gaucRxDataFromRfBuffer[8] != 0)
  299.    {
  300. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[8];
  301.        }
  302.     
  303.    //收据数据阶段,最后一个包不存储包序号
  304.    //if ((gaucRxDataFromRfBuffer[5] & BIT7) == BIT7) //bit7=1 有后续包
  305.    {
  306.   gucPacketCount = (gaucRxDataFromRfBuffer[5] & 0x3f);
  307.    }
  308.    
  309.    
  310.    //发送数据阶段:有最后一个包标志,且包序号不同,则发送数据
  311.    if ((gaucRxDataFromRfBuffer[5] & BIT7) != BIT7)
  312.    {
  313.    //if ((gaucRxDataFromRfBuffer[5] & 0x3f) != gucPacketCount)
  314.    {
  315.       BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64);
  316.       //gucPacketCount = (gaucRxDataFromRfBuffer[5] & 0x3f);
  317.   gucStudentKeyDataCount = 6;
  318.   for (i = 0; i < 64; i++)
  319.    {
  320.      gaucTxData2HostBuffer[i]=0;
  321.    }
  322.    }
  323.    }//if
  324.    }
  325.    
  326.    
  327.    
  328.    sbitLED = 1;
  329.      
  330. }//end of void TxStudentKeyData2Host(void)
  331. */
  332. //=============================================================================================
  333. void TxStudentKeyData2Host(void)
  334. {
  335.    data BYTE i;
  336.    
  337.    bit bitNewDataPacketFlag = 0;
  338.    
  339.    sbitLED = 0;
  340.    
  341.    
  342.    //收集数据阶段
  343.    bitNewDataPacketFlag = CompareStudentIdandPacketCount();
  344.    
  345.    //bitNewDataPacketFlag = 1;
  346.    if ( bitNewDataPacketFlag )
  347.    {
  348.        bitNewDataPacketFlag = 0;
  349.    InsertNewId();
  350.    if ( (gaucRxDataFromRfBuffer[5] & BIT7) == BIT7 ) //不是最后一包
  351.    {
  352.    SaveFirtstPacketData();     
  353.    }//if
  354.    
  355.    
  356.    //发送数据阶段:有最后一个包标志,且包序号不同,则发送数据
  357.    else
  358.    //if ( (gaucRxDataFromRfBuffer[5] & BIT7) != BIT7 ) //是最后一包
  359.    {
  360.    
  361.    for (i = 0; i < 64; i++)
  362.     {
  363.     gaucTxData2HostBuffer[i]=0;
  364.     }
  365.    gucStudentKeyDataCount = 6;
  366.    gaucTxData2HostBuffer[0] = 0x03; //student key data
  367.    gaucTxData2HostBuffer[1] = 0x14;
  368.    if ((gaucRxDataFromRfBuffer[COUNT_BASE + (COUNT_BASE + RF_PADLOAD)*0 + 0] & BIT7) == BIT7)
  369.       {
  370.     gaucTxData2HostBuffer[2] = 0x80;
  371.   }
  372.    else
  373.       {
  374.     gaucTxData2HostBuffer[2] = 0x00;
  375.   }
  376.    
  377.    //最高位用于区别学生机和教师机 bit7-- 1:教师机地址 0:学生机地址
  378.    gaucTxData2HostBuffer[3] = gaucRxDataFromRfBuffer[2] & 0x7f; 
  379.    gaucTxData2HostBuffer[4] = gaucRxDataFromRfBuffer[3];
  380.    gaucTxData2HostBuffer[5] = gaucRxDataFromRfBuffer[4];
  381.    
  382.    if (0 != gaucStudentIdBuffer[gpucStudentIdBufferPoint][3])
  383.    {
  384. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucStudentIdBuffer[gpucStudentIdBufferPoint][3];
  385.        }
  386.    if (0 != gaucStudentIdBuffer[gpucStudentIdBufferPoint][4])
  387.    {
  388. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucStudentIdBuffer[gpucStudentIdBufferPoint][4];
  389.        }
  390.    if (0 != gaucStudentIdBuffer[gpucStudentIdBufferPoint][5])
  391.    {
  392. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucStudentIdBuffer[gpucStudentIdBufferPoint][5];
  393.        }
  394.    if (gaucRxDataFromRfBuffer[6] != 0)
  395.    {
  396. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[6];
  397.        }
  398.    if (gaucRxDataFromRfBuffer[7] != 0)
  399.    {
  400. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[7];
  401.        }
  402.    if (gaucRxDataFromRfBuffer[8] != 0)
  403.    {
  404. gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[8];
  405.        }
  406.    
  407.    gaucTxData2HostBuffer[13] = (gaucRxDataFromRfBuffer[5] & 0x3f);
  408.   
  409.       BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64);
  410.       
  411.     ClearCurrentFirstPacketData();
  412.    }//else
  413.    }//if
  414.    
  415.    
  416.    
  417.    sbitLED = 1;
  418.      
  419. }//end of void TxStudentKeyData2Host(void)
  420. //=============================================================================================
  421. void TxStudentExamData2Host(void)
  422. {
  423.    data BYTE i;
  424.    sbitLED = 0;
  425.    
  426.    
  427.    gaucTxData2HostBuffer[0] = 0x04; //student Exam data
  428.    //gaucTxData2HostBuffer[1] = 0x14;
  429.    if ((gaucRxDataFromRfBuffer[COUNT_BASE + (COUNT_BASE + RF_PADLOAD)*0 + 0] & BIT7) == BIT7)
  430.       {
  431.     gaucTxData2HostBuffer[2] = 0x80;
  432.   }
  433.    else
  434.       {
  435.     gaucTxData2HostBuffer[2] = 0x00;
  436.   }
  437.    if (gucStudentKeyDataCount == 6) //数据包的第一个数据记录学生机ID号
  438.    {
  439.        gaucTxData2HostBuffer[3] = gaucRxDataFromRfBuffer[2] & 0x7f;
  440.    gaucTxData2HostBuffer[4] = gaucRxDataFromRfBuffer[3];
  441.    gaucTxData2HostBuffer[5] = gaucRxDataFromRfBuffer[4];
  442.    }
  443.    if (gaucTxData2HostBuffer[5] != gaucRxDataFromRfBuffer[4]) //ID变化,学生交卷被其他学生干扰
  444.    {
  445.     gucStudentKeyDataCount = 6; //重新收集数据
  446. for (i = 0; i < 64; i++)
  447. {
  448.   gaucTxData2HostBuffer[i]=0;
  449. }
  450.    }
  451.    
  452.    if ((gaucRxDataFromRfBuffer[5] & 0x3f) != gucPacketCount) //包序号相同,则丢弃
  453.    {
  454.        gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[5] & 0x3f;//| 0xc0;
  455.    gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[6];
  456.    gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[7];
  457.    gaucTxData2HostBuffer[gucStudentKeyDataCount++] = gaucRxDataFromRfBuffer[8];
  458.    
  459.    if ((gaucRxDataFromRfBuffer[5] & BIT7) == BIT7) //bit7=1 有后续包
  460.    {
  461.   gucPacketCount = (gaucRxDataFromRfBuffer[5] & 0x3f); //有后续包,则记录包序号
  462.   if (gucStudentKeyDataCount == 62)
  463.           {
  464.               gbitBulkMultiPackageTxFlag = 1;
  465.   gaucTxData2HostBuffer[1] = 61;
  466.               gaucTxData2HostBuffer[1] <<= 2;
  467.   gaucTxData2HostBuffer[1] |= BIT0; //bit 0--0:单包传输,    1:分包传输
  468.   gaucTxData2HostBuffer[1] |= BIT1; //bit 1--0:最后一个分包,1:有后续包
  469.   BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64); //上传数据
  470.       gucPacketCount = (gaucRxDataFromRfBuffer[5] & 0x3f); //记录包序号
  471.   gucStudentKeyDataCount = 6; //下一包数据从gaucTxData2HostBuffer[6]开始存储
  472.   for (i = 0; i < 64; i++)
  473.    {
  474.      gaucTxData2HostBuffer[i]=0;
  475.    }//for
  476.           }//if 
  477.    }//if
  478.    
  479.    
  480.    }//if
  481.    
  482.    if ((gaucRxDataFromRfBuffer[5] & BIT7) != BIT7) //包序号第7位,bit7=0-无后续包 bit7=1-有后续包
  483.    {
  484.    if ((gaucRxDataFromRfBuffer[5] & 0x3f) != gucPacketCount) //无后续包且包序号不等,则上传数据
  485.    {
  486.       gaucTxData2HostBuffer[1] = 61;
  487.           gaucTxData2HostBuffer[1] <<= 2;
  488.   if (gbitBulkMultiPackageTxFlag == 1)
  489.   {
  490.      gaucTxData2HostBuffer[1] |= BIT0; //bit 0--0:单包传输,    1:分包传输
  491.           }
  492.           else 
  493.   {
  494.      gaucTxData2HostBuffer[1] &= ~BIT0; //bit 0--0:单包传输,    1:分包传输
  495.           }
  496.       gaucTxData2HostBuffer[1] &= ~BIT1; //bit 1--0:最后一个分包,1:有后续包
  497.   BulkOrInterruptIn (&gEp1InStatus, (BYTE*)&gaucTxData2HostBuffer, 64); //上传数据
  498.       gucPacketCount = (gaucRxDataFromRfBuffer[5] & 0x3f); //记录包序号
  499.   gucStudentKeyDataCount = 6; //下一包数据从gaucTxData2HostBuffer[6]开始存储
  500.   for (i = 0; i < 64; i++)
  501.    {
  502.      gaucTxData2HostBuffer[i]=0;
  503.    }
  504.    }
  505.    }
  506.    
  507.    sbitLED = 1;
  508.      
  509. }//end of void TxStudentExamData2Host(void)
  510. //=============================================================================================
  511. //接收频道配置数据:4 Byte
  512. //=============================================================================================
  513. void RxConfigDataFromHost(void)
  514. {
  515.    data BYTE i;
  516.    BulkOrInterruptOut(&gEp2OutStatus);//EP2 Out Status
  517.    if (gaucTempStorage[0] == 0x00 )
  518.    {
  519.        for (i=0; i<4; i++)  
  520.    {
  521.   gaucRfConfigData0[i] = gaucTempStorage[i+2];
  522.           gaucRfConfigData0[i] <<= 1;
  523.           gaucRfConfigData0[i] |= BIT0;//接收模式
  524.    }
  525.    
  526.    RF_DATA_PORT_OUT_INITIAL;
  527.    //Initial();
  528.    nRF2401Configuration();
  529.    RF_DATA_PORT_IN_INITIAL;
  530.    }
  531. }//end of RxConfigDataFromHost
  532. //=============================================================================================
  533. //比较ID号和包序号 返回值:1.bitNewDataPacketFlag 2. 缓冲器指针gpucStudentIdBufferPoint
  534. //=============================================================================================
  535. bit CompareStudentIdandPacketCount(void)
  536. {
  537.    data BYTE i;
  538.    //data BYTE j;
  539.    bit bitNewDataPacketFlag = 0;
  540.    
  541.    for (i=0; i<cstStuIdBufIndexMax; i++)
  542.    {
  543.      
  544.  if ( (0 == gaucStudentIdBuffer[i][0]) && (0 == gaucStudentIdBuffer[i][1]) )
  545.  {
  546.     //比较到队尾,没有相等的,说明是新数据
  547. gpucStudentIdBufferPoint = i;
  548.     bitNewDataPacketFlag = 1;
  549. break;
  550.  }//if
  551.  
  552.      else
  553.  {
  554.     if (     (gaucStudentIdBuffer[i][0] == gaucRxDataFromRfBuffer[3]) 
  555.      &&  (gaucStudentIdBuffer[i][1] == gaucRxDataFromRfBuffer[4]) )
  556.     {
  557.        if (gaucStudentIdBuffer[i][2] == (gaucRxDataFromRfBuffer[5] & 0x3f) )
  558.      {  
  559.    bitNewDataPacketFlag = 0;
  560.        break;
  561.               }
  562.             else
  563.   {
  564.     bitNewDataPacketFlag = 1;
  565. gpucStudentIdBufferPoint = i;
  566.         break;
  567.   }
  568.     }
  569.  
  570.  }//else
  571.  
  572.    }//for
  573.    
  574.    return bitNewDataPacketFlag;
  575. }//end of CompareStudentIdandPacketCount
  576. //=============================================================================================
  577. //插入新Id和数据
  578. //=============================================================================================
  579. void InsertNewId(void)
  580. {
  581.    //data BYTE i;
  582.    //data BYTE j;
  583.    
  584.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][0] = gaucRxDataFromRfBuffer[3]; //ID号 高字节
  585.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][1] = gaucRxDataFromRfBuffer[4]; //ID号 低字节
  586.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][2] = gaucRxDataFromRfBuffer[5] & 0x3f; //包序号
  587. }//end of InsertNewIdandData
  588. void SaveFirtstPacketData(void) //分包传输时,保存第一包数据
  589. {
  590.    //data BYTE i;
  591.    //data BYTE j;
  592.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][3] = gaucRxDataFromRfBuffer[6]; //data
  593.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][4] = gaucRxDataFromRfBuffer[7]; //data
  594.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][5] = gaucRxDataFromRfBuffer[8]; //data
  595. }//end of InsertNewIdandData
  596. void ClearCurrentFirstPacketData(void)
  597. {
  598.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][3] = 0; //data
  599.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][4] = 0; //data
  600.    gaucStudentIdBuffer[gpucStudentIdBufferPoint][5] = 0; //data
  601. }
  602. void ClearStudentIdBuffer(void)
  603. {
  604.    data BYTE i;
  605.    data BYTE j;
  606.    for (i=0; i<cstStuIdBufIndexMax; i++)
  607.    {
  608.      for (j=0; j<6; j++)
  609.  {
  610.     gaucStudentIdBuffer[i][j] = 0;
  611.  }
  612.    }
  613. } //end of ClearStudentIdBuffer
  614. /*
  615. void ClearCurrentStudentIdandData(void)
  616. {
  617.    data BYTE i;
  618.    for (i=0; i<6; i++)
  619.    {
  620.     gaucStudentIdBuffer[gpucStudentIdBufferPoint][i] = 0;
  621.    }
  622. }
  623. */
  624. //-----------------------------------------------------------------------------
  625. // End Of File
  626. //-----------------------------------------------------------------------------