private IoSample ParseIoSample(IPacketParser parser) { ushort digital = 0; var analog = new double[Pin.AnalogCount]; if (ContainsDigital) { Logger.LowDebug("Sample contains digital inputs"); digital = UshortUtils.ToUshort(parser.Read(), parser.Read()); } if (ContainsAnalog) { var analogCount = 0; for (var i = 0; i < analog.Length; i++) { if (!IsEnabled((Pin.Analog) i)) continue; var reading = UshortUtils.Parse10BitAnalog(parser.Read(), parser.Read()); analog[i] = AdcHelper.ToMilliVolts(reading); analogCount++; } Logger.LowDebug("Sample contains " + analogCount +" analog inputs"); } return new IoSample(analog, digital); }
protected override void ParseFramePayload(IPacketParser parser) { // eat sample size.. always 1 var size = parser.Read("ZNet RX IO Sample Size"); if (size != 1) { throw new XBeeParseException("Sample size is not supported if > 1 for ZNet I/O"); } DigitalChannelMask = UshortUtils.ToUshort(parser.Read("ZNet RX IO Sample Digital Mask 1"), parser.Read("ZNet RX IO Sample Digital Mask 2")); // TODO apparent bug: channel mask on ZigBee Pro firmware has DIO10/P0 as enabled even though it's set to 01 (RSSI). Digital value reports low. DigitalChannelMask &= 0x1CFF; //11100 zero out all but bits 3-5 AnalogChannelMask = parser.Read("ZNet RX IO Sample Analog Channel Mask"); AnalogChannelMask &= 0x8f; //10001111 zero out n/a bits if (ContainsDigital) { Digital = UshortUtils.ToUshort(parser.Read("ZNet RX IO DIO MSB"), parser.Read("ZNet RX IO DIO LSB")); } // parse 10-bit analog values Analog = new int[5]; for (var pin = Pin.A0; pin <= Pin.A3; pin++) { if (!IsAnalogEnabled(pin)) { continue; } Analog[(byte)pin] = UshortUtils.Parse10BitAnalog(parser.Read(), parser.Read()); } if (IsAnalogEnabled(Pin.SupplyVoltage)) { Analog[SupplyVoltageIndex] = UshortUtils.Parse10BitAnalog(parser.Read(), parser.Read()); } }