// Overridden from IGaugeProtocol public override GaugePacket ParsePacket(byte[] packetIn) { byte[] packet = Trim(packetIn); using (BinaryReader r = new BinaryReader(new MemoryStream(packet))) { int len = packet.Length; if (len < 8 || len % 6 != 2) { /////should not throw exeptions //throw new ArgumentException("Cannot parse: bad packet size {" + len + "}"); } var v = r.ReadByte(); if (v != 1 && v != 2) { /////should not throw exeptions //throw new ArgumentException("Cannot parse: invalid version code"); } int battery = r.ReadByte(); int maxGaugeCount = (len - 2) / 6; var readings = new List <GaugeReading>(); for (int i = 0; i < maxGaugeCount; i++) { int exponent = r.ReadByte(); int encodedReading = r.ReadInt32BE(); int unitCode = r.ReadByte(); if (unitCode == 0) { break; } Unit unit = UnitLookup.GetUnit(unitCode); var gr = new GaugeReading() { removed = removedGaugeValue == encodedReading, sensorType = UnitLookup.GetSensorTypeFromCode(unitCode), reading = unit.OfScalar(encodedReading / System.Math.Pow(10, exponent)), }; if (gr.removed) { gr.reading = unit.OfScalar(0); } readings.Add(gr); } return(new GaugePacket(version, battery, readings.ToArray())); } }
/// <summary> /// Parses the provided packet. If the packet cannot be parsed, this method will /// throw an argument exception. /// </summary> /// <param name="packet">The packet to parse.</param> /// <returns></returns> /// <param name="packetIn">Packet in.</param> public GaugePacket ParsePacket(byte[] packetIn) { var packet = System.Text.Encoding.UTF8.GetString(packetIn, 0, packetIn.Length); packet = packet.Trim(); var tokens = packet.Split(new char[] { ' ' }); var battery = int.Parse(tokens[2]); var serialNumber = GaugeSerialNumber.Parse(tokens[5]); var meas = double.Parse(tokens[8]); Unit ru; GaugeReading gr; if (EDeviceModel.AV760 == serialNumber.deviceModel) { ru = vacuumUnitLookup[tokens[9].ToLower()]; gr = new GaugeReading() { removed = false, sensorType = ESensorType.Vacuum, reading = ru.OfScalar(meas), }; } else { ru = pressureUnitLookup[tokens[9].ToLower()]; gr = new GaugeReading() { removed = false, sensorType = ESensorType.Pressure, reading = ru.OfScalar(meas), }; } return(new GaugePacket(version, battery, new GaugeReading[] { gr })); }