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); } }
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!"); } }