Пример #1
0
        /// <summary>
        /// This method is call when data was readed from the socket input buffer
        /// </summary>
        /// <param name="bytesRead"></param>
        /// <param name="readPacket"></param>
        private void OnDataReadCompletion(UInt32 bytesRead, DataReader readPacket)
        {
            if (readPacket == null)
            {
                if (Verbose)
                {
                    Debug.WriteLine("DataReader is null");
                }
            }
            else if (readPacket.UnconsumedBufferLength != 0)
            {
                Byte[] numArray = new Byte[bytesRead];
                readPacket.ReadBytes(numArray);
                ResponsePacket response = ParseResponse(numArray);

                if (response != null)
                {
                    DispatchResponse(response);

                    if (Verbose)
                    {
                        Debug.WriteLine("Nouveau message : {0}", BitConverter.ToString(response.ToArray()));
                    }
                }

                ReadBuffer(16);
            }
            else
            {
                if (OnDisconnection != null)
                {
                    OnDisconnection();
                }

                if (Verbose)
                {
                    Debug.WriteLine("Received zero bytes from the socket. Server must have closed the connection.");
                    Debug.WriteLine("Try disconnecting and reconnecting to the server");
                }
            }
        }
Пример #2
0
        internal ResponsePacket ParseResponse(byte[] data)
        {
            ResponsePacket response = null;

            _data.AddRange(data);
            if (_data.Count >= 6)
            {
                if (_data[0] != 255 || _data[1] != 255)
                {
                    // Bad message case
                    if (_data[0] != 255 || _data[1] != 254)
                    {
                        // No Sphero Message
                        // Clean data until the next message
                        int nextMessageIndex = _data.IndexOf(255);
                        if (nextMessageIndex >= 0)
                            _data.RemoveRange(0, nextMessageIndex);
                        else
                            _data.Clear();
                    }

                    // Asynchronous message case

                    byte lengthMSB = _data[3], lengthLSB = _data[4];
                    int length = BitConverter.ToUInt16(new byte[] { lengthLSB, lengthMSB }, 0) + 5;
                    if (_data.Count >= length)
                    {

                        byte[] responseArray = new byte[length];
                        _data.CopyTo(0, responseArray, 0, length);
                        _data.RemoveRange(0, length);

                        AsyncResponsePacket packet = new AsyncResponsePacket(responseArray);
                        DispatchAsyncResponse(packet);
                    }

                }
                else
                {
                    // Acknowledgement
                    int length = 5 + _data[4];
                    if (_data.Count >= length)
                    {
                        byte[] responseArray = new byte[length];
                        _data.CopyTo(0, responseArray, 0, length);
                        _data.RemoveRange(0, length);
                        response = new ResponsePacket(responseArray);
                    }

                }
            }


            return response;
        }
Пример #3
0
        internal void DispatchResponse(ResponsePacket response)
        {
           if(_responseDictionnary.ContainsKey(response.SequenceNumber))
           {
               if (_responseDictionnary[response.SequenceNumber] != null)
                   _responseDictionnary[response.SequenceNumber](response);

               _responseDictionnary.Remove(response.SequenceNumber);
           }
        }