internal void DispatchAsyncResponse(AsyncResponsePacket response) { switch (response.ResponseCode) { case AsynchronousId.POWER_NOTIFICATION: if (_core != null) { _core.RaisePowerNotification(_core, (PowerState)response.Data[0]); } break; case AsynchronousId.SENSOR_DATA_STREAMING: if (_sphero != null) { SensorData sensorData = new SensorData(_sphero.Mask, _sphero.Mask2, response.Data); _sphero.RaiseSensorDataNotification(sensorData); } break; case AsynchronousId.SSB_DATA: string data = Encoding.UTF8.GetString(response.Data, 0, response.Data.Length); Debug.WriteLine("Async SSB message : {0}", BitConverter.ToString(response.ToArray())); break; case AsynchronousId.XP_UPDATE: if (_sphero != null) { _sphero.RaiseXpNotification(response.Data[0]); } break; case AsynchronousId.BOOST_UPDATE: if (_sphero != null) { _sphero.RaiseBoostNotification(response.Data[0]); } break; case AsynchronousId.COLLISION_DETECTED: if (_sphero != null) { _sphero.RaiseCollisionDetected(new Collisions.CollisionData(response.Data)); } break; default: if (Verbose) { Debug.WriteLine("Async message : {0}", BitConverter.ToString(response.ToArray())); } break; } }
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); }
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; }
internal void DispatchAsyncResponse(AsyncResponsePacket response) { switch(response.ResponseCode) { case AsynchronousId.POWER_NOTIFICATION: if(_core != null) { _core.RaisePowerNotification(_core, (PowerState)response.Data[0]); } break; case AsynchronousId.SENSOR_DATA_STREAMING: if (_sphero != null) { SensorData sensorData = new SensorData(_sphero.Mask, _sphero.Mask2, response.Data); _sphero.RaiseSensorDataNotification(sensorData); } break; case AsynchronousId.SSB_DATA: string data = Encoding.UTF8.GetString(response.Data, 0, response.Data.Length); Debug.WriteLine("Async SSB message : {0}", BitConverter.ToString(response.ToArray())); break; case AsynchronousId.XP_UPDATE: if (_sphero != null) { _sphero.RaiseXpNotification(response.Data[0]); } break; case AsynchronousId.BOOST_UPDATE: if (_sphero != null) { _sphero.RaiseBoostNotification(response.Data[0]); } break; case AsynchronousId.COLLISION_DETECTED: if (_sphero != null) { _sphero.RaiseCollisionDetected(new Collisions.CollisionData(response.Data)); } break; default: if (Verbose) Debug.WriteLine("Async message : {0}", BitConverter.ToString(response.ToArray())); break; } }