DMBluetoothTagData.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. namespace InABox.DigitalMatter
  2. {
  3. public class DMBluetoothTagData : DMField
  4. {
  5. public override byte Type => 0x1E;
  6. public byte DataLength { get; set; }
  7. public byte LogReason { get; set; }
  8. public byte TagType { get; set; }
  9. public sbyte RSSI { get; set; }
  10. public uint TimeStamp { get; set; }
  11. public int Latitude { get; set; }
  12. public int Longitude { get; set; }
  13. public byte GPSAccuracy { get; set; }
  14. public DMBluetoothTag Tag { get; set; }
  15. public override bool IsValid()
  16. {
  17. return true;
  18. }
  19. protected override void DoDecode()
  20. {
  21. var header = TakeByte();
  22. DataLength = EncodeByte(DecodeByte(header, 0, 6));
  23. LogReason = EncodeByte(DecodeByte(header, 6, 2));
  24. TagType = TakeByte();
  25. RSSI = TakeInt8();
  26. TimeStamp = TakeUInt32();
  27. Latitude = TakeInt32();
  28. Longitude = TakeInt32();
  29. GPSAccuracy = TakeByte();
  30. var data = TakeBytes(DataLength);
  31. Tag = DMFactory.ParseBluetoothTag(TagType, data);
  32. }
  33. protected override void DoEncode()
  34. {
  35. AddByte(TagType);
  36. AddInt8(RSSI);
  37. AddUInt32(TimeStamp);
  38. AddInt32(Latitude);
  39. AddInt32(Longitude);
  40. AddByte(GPSAccuracy);
  41. var data = Tag.Encode();
  42. AddBytes(data);
  43. DataLength = (byte)data.Length;
  44. var header = EncodeByte(DecodeByte(DataLength, 0, 6));
  45. header = UpdateByte(header, 6, DecodeByte(LogReason, 0, 2));
  46. InsertByte(0, header);
  47. }
  48. public override string ToString()
  49. {
  50. return string.Format("{0} {1} {2:dd MMM yy hh-mm-ss} Lat: {3:F6} Lng: {4:F6} RSSI: {5}", Tag,
  51. LogReason == 1 ? "Found" : LogReason == 2 ? "Lost" : "Updated", TimeStampToDateTime(TimeStamp), (double)Latitude / 10000000.0F,
  52. (double)Longitude / 10000000.0F, RSSI);
  53. }
  54. }
  55. }