/// <summary>
 /// 内部公开方法
 /// </summary>
 /// <param name="msgIn"></param>
 protected virtual void OnMsgRecieved(CommunicationProtocol.DataPacket msgIn)
 {
     if (MsgRecieved != null)
     {
         MsgRecieved(this, new MsgEventArgs()
         {
             msg = msgIn
         });
     }
 }
    /// <summary>
    /// 接收数据译码函数
    /// </summary>
    public void GetPortData()
    {
        //test function to display any log information from Serial Ports
        List <byte>  buffer      = new List <byte>();  //this gives easy access to handy functions in order to process buffer
        Queue <byte> FIFO_Buffer = new Queue <byte>(); //create FIFO type bufffer

        CommunicationProtocol.DataPacket packet = new CommunicationProtocol.DataPacket();
        packet.dataReady = false;
        DecodeState currentDecodeState = DecodeState.SearchForHeader1;
        bool        ThreadRunning      = true;

        while (controlPort.IsOpen && ThreadRunning)
        {
            try
            {
                int data = controlPort.ReadByte();
                if (data != -1)
                {
                    FIFO_Buffer.Enqueue((byte)data);
                }
                ProcessData(ref FIFO_Buffer, ref currentDecodeState, ref packet);

                if (packet.dataReady)
                {
                    //raise event
                    if (MsgRecieved != null)
                    {
                        MsgRecieved(this, new MsgEventArgs()
                        {
                            msg = packet
                        });                                                    //raise event
                    }
                    packet           = new CommunicationProtocol.DataPacket();
                    packet.dataReady = false;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                ThreadRunning = false;
            }
        }
    }
    /// <summary>
    /// 接收数据包格式处理
    /// </summary>
    /// <param name="dataStream"></param>
    /// <param name="state"></param>
    /// <param name="packet"></param>
    public void ProcessData(ref Queue <byte> dataStream, ref DecodeState state, ref CommunicationProtocol.DataPacket packet)
    {
        //Todo Process fifo data stream from headtracking port
        bool stopSerching = false;

        while (dataStream.Count > 0 && stopSerching == false)
        {
            switch (state)
            {
            case DecodeState.SearchForHeader1:
                if (dataStream.Count > 0)
                {
                    byte data = dataStream.Dequeue();
                    if (data == 0xeb)
                    {
                        state = DecodeState.SearchForHeader2;
                    }
                }

                break;

            case DecodeState.SearchForHeader2:
                if (dataStream.Count > 0)
                {
                    byte data = dataStream.Dequeue();
                    if (data == 0x90)
                    {
                        state = DecodeState.SearchForCmdType;
                    }
                }
                break;

            case DecodeState.SearchForCmdType:
                if (dataStream.Count > 0)
                {
                    byte data = dataStream.Dequeue();
                    packet.cmdType = (CommunicationProtocol.CMDTYPE)data;
                    state          = DecodeState.SearchForLen;
                }
                break;

            case DecodeState.SearchForLen:
                if (dataStream.Count > 0)
                {
                    byte data = dataStream.Dequeue();
                    packet.len = data;
                    state      = DecodeState.GetContent;
                }
                break;

            case DecodeState.GetContent:
                if (dataStream.Count >= packet.len)
                {
                    packet.payload = new byte[packet.len];
                    for (int i = 0; i < packet.len; i++)
                    {
                        packet.payload[i] = dataStream.Dequeue();
                    }
                    state = DecodeState.CheckEnder;
                }
                else
                {
                    stopSerching = true;
                }
                break;

            case DecodeState.CheckEnder:
                if (dataStream.Count > 0)
                {
                    byte data = dataStream.Dequeue();
                    if (data == 0xfe)
                    {
                        packet.dataReady = true;
                        state            = DecodeState.SearchForHeader1;
                        stopSerching     = true;
                    }
                    else
                    {
                        packet       = new CommunicationProtocol.DataPacket();
                        state        = DecodeState.SearchForHeader1;
                        stopSerching = true;
                    }
                }
                break;
            }
        }
    }