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

传真(Fax)编程

开发平台:

C/C++

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