static void iBus_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
ISerialPort port = (ISerialPort)sender;
if (port.AvailableBytes == 0)
{
Logger.Warning("Available bytes lost! " + port.ToString());
return;
}
lock (bufferSync)
{
byte[] data = port.ReadAvailable();
#if DEBUG
//Logger.Info(data.ToHex(' '), "<!");
#endif
/*#if DEBUG // TODO remove #if after tests
* if (messageBufferLength > 0)
* {
* Logger.Warning("WD");
* var elapsed = (DateTime.Now - lastMessage).GetTotalMilliseconds();
* if (elapsed > messageReadTimeout)
* {
* Logger.Warning("Buffer skip: timeout ("+elapsed+"ms) data: " + messageBuffer.SkipAndTake(0, messageBufferLength).ToHex(" "));
* messageBufferLength = 0;
* }
* }
#endif*/
if (messageBufferLength + data.Length > messageBuffer.Length)
{
Logger.Info("Buffer overflow. Extending it. " + port.ToString());
byte[] newBuffer = new byte[messageBuffer.Length * 2];
Array.Copy(messageBuffer, newBuffer, messageBufferLength);
messageBuffer = newBuffer;
}
if (data.Length == 1)
{
messageBuffer[messageBufferLength++] = data[0];
}
else
{
Array.Copy(data, 0, messageBuffer, messageBufferLength, data.Length);
messageBufferLength += data.Length;
}
while (messageBufferLength >= Message.PacketLengthMin)
{
Message m = Message.TryCreate(messageBuffer, messageBufferLength);
if (m == null)
{
if (!Message.CanStartWith(messageBuffer, messageBufferLength))
{
Logger.Warning("Buffer skip: non-iBus data detected: " + messageBuffer[0].ToHex());
SkipBuffer(1);
continue;
}
return;
}
ProcessMessage(m);
//#if DEBUG
//m.PerformanceInfo.TimeEnqueued = DateTime.Now;
//#endif
//messageReadQueue.Enqueue(m);
SkipBuffer(m.PacketLength);
}
lastMessage = DateTime.Now;
}
}