public void Parse(byte[] data)
{
if (buffer == null)
{
buffer = data;
}
else
{
buffer = buffer.Combine(data);
}
if (!CanStartWith(buffer))
{
if (CanStartWith(data))
{
buffer = data;
}
else
{
var tmp = buffer;
buffer = null;
throw new Exception("Wrong data: " + tmp.ToHex(' '));
}
}
Message m;
while (buffer != null && (m = TryCreate(buffer)) != null)
{
if (GetPacketLength(m) == buffer.Length)
{
buffer = null;
}
else
{
buffer = buffer.Skip(GetPacketLength(m));
}
try
{
var e = MessageReceived;
if (e != null)
{
e(m);
}
}
catch (Exception ex)
{
Logger.Error(ex, "processing message by MessageParser");
}
}
}
public static void Register(BluetoothWT32 wt32) { if (client != null) { throw new Exception("InternalCommunications already registered."); } client = wt32; var wt32Parser = new MessageParser(); wt32Parser.MessageReceived += m => { if (m is InternalMessage) { ProcessInternalMessage((InternalMessage)m); } else { Manager.EnqueueMessage(m); } }; wt32.BTCommandReceived += (s, l, c) => { if (l == wt32.SPPLink) { try { wt32Parser.Parse(c); } catch (Exception ex) { Logger.Error(ex, "iBus from WT32", "BT <"); } } }; Manager.AfterMessageReceived += (m) => { if (HasConnection) { try { wt32.SendCommand(m.Message.Packet, wt32.SPPLink, "iBus data"); } catch (Exception ex) { Logger.Error(ex, "iBus to WT32", "> BT"); } } }; }