/** * 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."); }
public ZToolPacket ParsePacket() { Exception exception; Done = false; BytesRead = 0; try { ZToolPacket response; // int byteLength = this.read("Length"); _length = Read("Length"); // log.debug("data length is " + ByteUtils.formatByte(length.getLength())); byte[] frameData; byte apiIdMSB = Read("API PROFILE_ID_HOME_AUTOMATION MSB"); byte apiIdLSB = Read("API PROFILE_ID_HOME_AUTOMATION LSB"); DoubleByte apiId = new DoubleByte(apiIdMSB, apiIdLSB); // TODO Remove generic never used // generic = true; if (generic) { // log.info("Parsing data as generic"); int i = 0; frameData = new byte[_length]; // Read all data bytes without parsing while (i < frameData.Length) { frameData[i] = Read("Data " + i + "-th"); i++; } response = new ZToolPacket(apiId, frameData); } else { frameData = ReadRemainingBytes(); response = ParsePayload(apiId, frameData); } // response.setFCS(this.read("Checksum")); int fcs = Read("Checksum"); // setDone(true); if (fcs != response.FCS) { // log.debug("Checksum of packet failed: received =" + fcs + " expected = " + response.getFCS()); throw new ZToolParseException("Packet checksum failed"); } if (!Done) { // TODO this is not the answer! throw new ZToolParseException("Packet stream is not finished yet we seem to think it is"); } return(response); } catch (Exception e) { _logger.Error("Packet parsing failed due to exception.", e); exception = e; } ZToolPacket exceptionResponse = new ErrorPacket(); if (exception != null) { exceptionResponse.Error = true; exceptionResponse.ErrorMsg = exception.Message; } return(exceptionResponse); }