예제 #1
0
            private bool ParseBuffer(List <System.Byte> buffer)
            {
                if (buffer.Count < 2)
                {
                    return(false);
                }

                System.Byte[] byteArray = buffer.ToArray();
                MemoryStream  stream    = new MemoryStream(byteArray);
                BinaryReader  br        = new BinaryReader(stream);

                int messageSize = (int)br.ReadInt16();
                int packetSize  = 2 + messageSize;

                if (stream.Length >= packetSize)
                {
                    SDKMessageIn message = null;
                    try
                    {
                        message = new SDKMessageIn();
                        try
                        {
                            message.Unpack(stream);
                        }
                        catch (System.Exception e)
                        {
                            if (message.Size != messageSize)
                            {
                                throw new System.Exception("Could not parse message " + message.GetTag() + ": " +
                                                           "message size " + message.Size.ToString() +
                                                           " not equal to buffer size " + messageSize.ToString(),
                                                           e);
                            }
                            throw;
                        }

                        if (message.Size != messageSize)
                        {
                            throw new System.Exception("Could not parse message " + message.GetTag() + ": " +
                                                       "message size " + message.Size.ToString() +
                                                       " not equal to buffer size " + messageSize.ToString());
                        }
                    }
                    catch (System.Exception e)
                    {
                        System.Console.WriteLine(e.Message);
                        Close();
                        return(false);
                    }

                    ReceiveMessage(message);

                    buffer.RemoveRange(0, packetSize);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
예제 #2
0
            private void ReceiveMessage(SDKMessageIn messageIn)
            {
                var message = messageIn.Message;

                if (_verboseLogging)
                {
                    System.Console.WriteLine("Recieved Message - " + message.GetTag());
                }

                // since the property to access individual message data in a CLAD message shares its name
                // with the message's tag, we can use that name to get the property that retrieves message
                // data for this type, and execute it on this message
                object messageData = typeof(Anki.Cozmo.ExternalInterface.MessageEngineToGame).GetProperty(message.GetTag().ToString()).GetValue(message, null);

                Dictionary <object, iCallback> callbacks;

                if (_callbacks.TryGetValue(messageData.GetType(), out callbacks))
                {
                    iCallback[] callbacksToExectute = callbacks.Values.ToArray();
                    foreach (iCallback callback in callbacksToExectute)
                    {
                        callback.Execute(messageData);
                    }
                }

                if (!_robotIsConnected && message.GetTag() == Anki.Cozmo.ExternalInterface.MessageEngineToGame.Tag.RobotState)
                {
                    _robotIsConnected = true;
                    System.Console.WriteLine("Robot connected!");
                }
            }