QueryOrSetTankDiameterResponse.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Text;
  6. namespace VeederRoot_ATG_Console.MessageEntity.Incoming
  7. {
  8. /// <summary>
  9. /// i|I607,油罐直径
  10. /// </summary>
  11. public class QueryOrSetTankDiameterResponse : IncomingMessageBase
  12. {
  13. public DateTime? CurrentDateAndTime
  14. {
  15. get
  16. {
  17. if (base.FunctionCode.Item1 == MessageFormat.Display)
  18. return null;
  19. return DateTime.ParseExact(
  20. Encoding.ASCII.GetString(base.DataFieldAndOptionalCheckSumAndETX.Take(10).ToArray()),
  21. "yyMMddHHmm", CultureInfo.InvariantCulture);
  22. }
  23. }
  24. public int? TankNumberInFunctionCode
  25. {
  26. get
  27. {
  28. if (base.FunctionCode.Item1 == MessageFormat.Display)
  29. return null;
  30. var r = int.Parse(base.FunctionCode.Item3);
  31. return r;
  32. }
  33. }
  34. public IEnumerable<Tuple<int, double>> Diameters
  35. {
  36. get
  37. {
  38. if (base.FunctionCode.Item1 == MessageFormat.Display)
  39. return null;
  40. var result = new List<Tuple<int, double>>();
  41. int elapsed = 10;
  42. while (true)
  43. {
  44. if (base.DataFieldAndOptionalCheckSumAndETX.Skip(elapsed).Count() < 10) break;
  45. var target = base.DataFieldAndOptionalCheckSumAndETX.Skip(elapsed).Take(10).ToArray();
  46. var tankNumber = int.Parse(Encoding.ASCII.GetString(target.Take(2).ToArray()));
  47. var asciiEncodedBytes = Util.ConvertHexBcdStrToBytes(target.Skip(2).Take(8).ToArray());
  48. var diameterInches = Util.ConvertIEEEWith4BytesToDouble(asciiEncodedBytes.ToArray());
  49. elapsed += 10;
  50. result.Add(new Tuple<int, double>(tankNumber, diameterInches));
  51. }
  52. return result;
  53. }
  54. }
  55. public override string ToLogString()
  56. {
  57. if (base.FunctionCode.Item1 == MessageFormat.Display)
  58. return Encoding.ASCII.GetString(base.DataFieldAndOptionalCheckSumAndETX.ToArray());
  59. return "Current DateTime: " + this.CurrentDateAndTime.Value.ToString("yyyy-MM-dd HH:mm")
  60. + ", TankNumber: " + (this?.TankNumberInFunctionCode ?? -1)
  61. + " with Diameters list(tankNumber:diameter)-> "
  62. + (this.Diameters != null && this.Diameters.Any() ?
  63. this.Diameters.Select(p => p.Item1 + ":" + p.Item2).Aggregate((acc, n) => acc + ", " + n)
  64. : "");
  65. }
  66. }
  67. }