PumpStateChangeRequest.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 FuRen_Sinopec_IcCardReader
  8. {
  9. /// <summary>
  10. /// 加油机发送实时信息命令
  11. /// 加油机将实时信息发送给 PC 机;在加油机主动方式下,加油机定时与 PC 机进行的握手通讯;
  12. /// 加油机发送实时信息命令31H
  13. /// </summary>
  14. public class PumpStateChangeCommand : 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 = "PumpStateChangeCommand, SubMessageCount= " + this.SubMessageCount.ToString() + "." + System.Environment.NewLine;
  24. if (this.StateNozzleOperatingSubMessages != null && this.StateNozzleOperatingSubMessages.Any())
  25. foreach (var n in this.StateNozzleOperatingSubMessages)
  26. result += n.ToLogString() + Environment.NewLine;
  27. if (this.StateCardInsertedSubMessages != null && this.StateCardInsertedSubMessages.Any())
  28. foreach (var c in this.StateCardInsertedSubMessages)
  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<PumpStateChangeCardInsertedSubState> StateCardInsertedSubMessages
  62. {
  63. get
  64. {
  65. return this.ParseSubMessages(this.SubMessageRaw, this.SubMessageCount).Item1;
  66. }
  67. }
  68. public List<PumpStateChangeNozzleOperatingSubState> StateNozzleOperatingSubMessages
  69. {
  70. get
  71. {
  72. return this.ParseSubMessages(this.SubMessageRaw, this.SubMessageCount).Item2;
  73. }
  74. }
  75. private Tuple<List<PumpStateChangeCardInsertedSubState>, List<PumpStateChangeNozzleOperatingSubState>> ParseSubMessages(List<byte> SubMessageRaw, byte SubMessageCount)
  76. {
  77. var combinedResult =
  78. new Tuple<List<PumpStateChangeCardInsertedSubState>, List<PumpStateChangeNozzleOperatingSubState>>(
  79. new List<PumpStateChangeCardInsertedSubState>(),
  80. new List<PumpStateChangeNozzleOperatingSubState>()
  81. );
  82. var offset = 0;
  83. for (int i = 0; i < SubMessageCount; i++)
  84. {
  85. //1:卡插入;2:抬枪或加油中
  86. if (SubMessageRaw[offset] == 1)
  87. {
  88. var restLen = SubMessageRaw[offset + 2];
  89. Parser parser = new Parser();
  90. var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(3 + restLen).ToArray(),
  91. (MessageTemplateBase)Activator.CreateInstance(typeof(PumpStateChangeCardInsertedSubState)));
  92. combinedResult.Item1.Add(cardSubMsg as PumpStateChangeCardInsertedSubState);
  93. offset += 3 + restLen;
  94. }
  95. else if (SubMessageRaw[offset] == 2)
  96. {
  97. Parser parser = new Parser();
  98. var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(11).ToArray(),
  99. (MessageTemplateBase)Activator.CreateInstance(typeof(PumpStateChangeNozzleOperatingSubState)));
  100. combinedResult.Item2.Add(cardSubMsg as PumpStateChangeNozzleOperatingSubState);
  101. offset += 11;
  102. }
  103. else
  104. {
  105. throw new ArgumentException("只有两种状态需要上传信息。1:卡插入;2:抬枪或加油中, there're neither 1 nor 2 in msg");
  106. }
  107. }
  108. return combinedResult;
  109. }
  110. }
  111. }