PumpRealTimeStateEvent.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using Edge.Core.Parser.BinaryParser.Attributes;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. namespace LanTian_Sinopec_PumpIcCardReader
  8. {
  9. /// <summary>
  10. /// 加油机发送实时信息命令
  11. /// 加油机将实时信息发送给 PC 机;在加油机主动方式下,加油机定时与 PC 机进行的握手通讯;
  12. /// 加油机发送实时信息命令31H
  13. /// </summary>
  14. public class PumpRealTimeStateEvent : KaJiLianDongV11MessageTemplateBase
  15. {
  16. [Format(1, EncodingType.BIN, 1)]
  17. public byte SubMessageCount { get; set; }
  18. // minus 3 which include
  19. [EnumerableFormat("DataLength", "-2", 2, EncodingType = EncodingType.BIN)]
  20. public List<byte> SubMessageRaw { get; set; }
  21. public override string ToLogString()
  22. {
  23. var result = "PumpRealTimeStateEvent, SubMessageCount= " + this.SubMessageCount.ToString() + "." + System.Environment.NewLine;
  24. if (this.NozzleOperatingStates != null && this.NozzleOperatingStates.Any())
  25. foreach (var n in this.NozzleOperatingStates)
  26. result += n.ToLogString() + Environment.NewLine;
  27. if (this.CardInsertedStates != null && this.CardInsertedStates.Any())
  28. foreach (var c in this.CardInsertedStates)
  29. result += c.ToLogString() + Environment.NewLine;
  30. return result;
  31. //var offset = 0;
  32. //for (int i = 0; i < SubMessageCount; i++)
  33. //{
  34. // //1:卡插入;2:抬枪或加油中
  35. // if (SubMessageRaw[offset] == 1)
  36. // {
  37. // var restLen = SubMessageRaw[offset + 2];
  38. // Parser parser = new Parser();
  39. // var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(3 + restLen).ToArray(),
  40. // (MessageTemplateBase)Activator.CreateInstance(typeof(PumpStateChangeCardInsertedSubState))) as PumpStateChangeCardInsertedSubState;
  41. // offset += 3 + restLen;
  42. // result += "CardInserted: cardNo->" + cardSubMsg.ASN卡应用号 + ", nozzleNo->" + cardSubMsg.MZN枪号 +
  43. // ", cardBalance->" + cardSubMsg.BAL余额.ToString();
  44. // }
  45. // else if (SubMessageRaw[offset] == 2)
  46. // {
  47. // Parser parser = new Parser();
  48. // var nozzleSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(11).ToArray(),
  49. // (MessageTemplateBase)Activator.CreateInstance(typeof(PumpStateChangeNozzleOperatingSubState))) as PumpStateChangeNozzleOperatingSubState;
  50. // offset += 11;
  51. // result += "NozzleChanged: nozzleNo->" + nozzleSubMsg.MZN枪号 + ", vol->" + nozzleSubMsg.VOL升数 + ", amount->" + nozzleSubMsg.AMN数额
  52. // + ", price->" + nozzleSubMsg.PRC价格;
  53. // }
  54. // else
  55. // {
  56. // throw new ArgumentException("只有两种状态需要上传信息。1:卡插入;2:抬枪或加油中, there're neither 1 nor 2 in msg");
  57. // }
  58. //}
  59. //return result;
  60. }
  61. public List<CardInsertedState> CardInsertedStates
  62. {
  63. get
  64. {
  65. return this.ParseSubMessages(this.SubMessageRaw, this.SubMessageCount).Item1;
  66. }
  67. }
  68. public List<NozzleOperatingState> NozzleOperatingStates
  69. {
  70. get
  71. {
  72. return this.ParseSubMessages(this.SubMessageRaw, this.SubMessageCount).Item2;
  73. }
  74. }
  75. private Tuple<List<CardInsertedState>, List<NozzleOperatingState>> ParseSubMessages(List<byte> SubMessageRaw, byte SubMessageCount)
  76. {
  77. var combinedResult =
  78. new Tuple<List<CardInsertedState>, List<NozzleOperatingState>>(
  79. new List<CardInsertedState>(),
  80. new List<NozzleOperatingState>());
  81. var offset = 0;
  82. for (int i = 0; i < SubMessageCount; i++)
  83. {
  84. //1:卡插入;2:抬枪或加油中
  85. if (SubMessageRaw[offset] == 1)
  86. {
  87. var restLen = SubMessageRaw[offset + 2];
  88. Parser parser = new Parser();
  89. var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(3 + restLen).ToArray(),
  90. (MessageTemplateBase)Activator.CreateInstance(typeof(CardInsertedState)));
  91. combinedResult.Item1.Add(cardSubMsg as CardInsertedState);
  92. offset += 3 + restLen;
  93. }
  94. else if (SubMessageRaw[offset] == 2)
  95. {
  96. Parser parser = new Parser();
  97. var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(11).ToArray(),
  98. (MessageTemplateBase)Activator.CreateInstance(typeof(NozzleOperatingState)));
  99. combinedResult.Item2.Add(cardSubMsg as NozzleOperatingState);
  100. offset += 11;
  101. }
  102. else
  103. {
  104. throw new ArgumentException("只有两种状态需要上传信息。1:卡插入;2:抬枪或加油中, there're neither 1 nor 2 in msg");
  105. }
  106. }
  107. return combinedResult;
  108. }
  109. }
  110. }