/** * Run method executed by the parser thread. */ public void Run() { _logger.Trace("ZToolPacketParser parserThread started"); while (!_cancellationToken.IsCancellationRequested) { try { byte?val = _port.Read(); if (val == ZToolPacket.START_BYTE) { // inputStream.mark(256); ZToolPacketStream packetStream = new ZToolPacketStream(_port); ZToolPacket response = packetStream.ParsePacket(); _logger.Trace("Response is {Type} -> {Response}", response.GetType().Name, response); if (response.Error) { _logger.Debug("Received a BAD PACKET {Response}", response.ToString()); // inputStream.reset(); continue; } _packetHandler.HandlePacket(response); } else if (val != null) { // Log if not end of stream. _logger.Debug("Discarded stream: expected start byte but received {Value}", val); } } catch (IOException e) { if (!_cancellationToken.IsCancellationRequested) { _packetHandler.Error(e); _cancellationToken.Cancel(); } } } _logger.Debug("ZToolPacketParser parserThread exited."); }