PumpGroupHandler.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using Censtar_31064V105OrV106_Pump.MessageEntity;
  2. using Censtar_31064V105OrV106_Pump.MessageEntity.Outgoing;
  3. using Edge.Core.IndustryStandardInterface.Pump;
  4. using Edge.Core.Parser.BinaryParser.MessageEntity;
  5. using Edge.Core.Processor;
  6. using Edge.Core.UniversalApi;
  7. using Microsoft.Extensions.DependencyInjection;
  8. using Microsoft.Extensions.Logging;
  9. using Microsoft.Extensions.Logging.Abstractions;
  10. using System;
  11. using System.Collections;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Text.Json;
  16. using System.Text.Json.Serialization;
  17. using System.Threading.Tasks;
  18. namespace Censtar_31064V105OrV106_Pump
  19. {
  20. public class PumpGroupHandler : IEnumerable<IFdcPumpController>, IDeviceHandler<byte[], MessageTemplateBase>
  21. {
  22. public enum DispenserModelEnum
  23. {
  24. Model_31064V105 = 0,
  25. Model_31064V106 = 1
  26. }
  27. /// <summary>
  28. /// 加油后是否加锁标志
  29. /// </summary>
  30. //public enum DispenserPostFuelingLockModeEnum
  31. //{
  32. // 加油后加锁_不可解锁,
  33. // 加油后加锁_可解锁,
  34. // 加油后不加锁,
  35. // 室外解锁密码_3位长度密码,
  36. //}
  37. /// <summary>
  38. /// 控制加油枪授权出油的方式
  39. /// </summary>
  40. public enum DispenserAuthorizeModeEnum
  41. {
  42. /// <summary>
  43. /// 感觉像是提枪就出油???
  44. /// </summary>
  45. 开放 = 0,
  46. /// <summary>
  47. /// 加油机需要获得 “开机信号” 才可以出油。
  48. /// </summary>
  49. 监控 = 1,
  50. }
  51. /// <summary>
  52. /// seems one dispenser is a basic comm unit??
  53. /// </summary>
  54. public class DispenserParameter
  55. {
  56. public DispenserModelEnum? DispenserModel { get; set; } = DispenserModelEnum.Model_31064V105;
  57. public SetPostFuelingLockTypeRequest.LockTypeEnum? DispenserPostFuelingLockMode { get; set; } = SetPostFuelingLockTypeRequest.LockTypeEnum.加油后不加锁;
  58. public DispenserAuthorizeModeEnum? DispenserAuthorizeMode { get; set; } = DispenserAuthorizeModeEnum.监控;
  59. public class PumpParameter
  60. {
  61. /// <summary>
  62. /// seems the dispendser side has no this concept??
  63. /// </summary>
  64. public int PumpId { get; set; }
  65. public int? AmountDecimalDigits { get; set; } = 2;
  66. public int? VolumeDecimalDigits { get; set; } = 2;
  67. public int? PriceDecimalDigits { get; set; } = 2;
  68. public int? VolumeTotalizerDecimalDigits { get; set; } = 2;
  69. public IEnumerable<NozzleParameter> NozzleParameters { get; set; }
  70. }
  71. public class NozzleParameter
  72. {
  73. public byte NozzleNumber { get; set; }
  74. }
  75. public IEnumerable<PumpParameter> PumpParameters { get; set; }
  76. }
  77. private IContext<byte[], MessageTemplateBase> context;
  78. private List<StatePumpHandler> pumpHandlers;
  79. private IServiceProvider services;
  80. static ILogger logger = NullLogger.Instance;
  81. public PumpGroupHandler(DispenserParameter dispenserParameter, IServiceProvider services)
  82. {
  83. this.CreatePumpHanlders(dispenserParameter);
  84. }
  85. public PumpGroupHandler(string rawUglyEncodedCommaJsonStr_Of_DispenserParameter, IServiceProvider services)
  86. {
  87. var loggerFactory = services.GetRequiredService<ILoggerFactory>();
  88. logger = loggerFactory.CreateLogger("PumpHandler");
  89. this.services = services;
  90. var jsonSerializerOptions = new JsonSerializerOptions()
  91. {
  92. WriteIndented = true,
  93. };
  94. jsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
  95. var decoded = rawUglyEncodedCommaJsonStr_Of_DispenserParameter.Replace("____UglyEncodedComma____", ",");
  96. var dispenserParameter = JsonSerializer.Deserialize<DispenserParameter>(decoded, jsonSerializerOptions);
  97. this.CreatePumpHanlders(dispenserParameter);
  98. }
  99. private void CreatePumpHanlders(DispenserParameter dispenserParameter)
  100. {
  101. this.pumpHandlers = new List<StatePumpHandler>();
  102. this.pumpHandlers.AddRange(
  103. dispenserParameter.PumpParameters.Select(pp =>
  104. new StatePumpHandler(pp, services)
  105. {
  106. DispenserModel = dispenserParameter.DispenserModel.Value,
  107. DispenserAuthorizeMode = dispenserParameter.DispenserAuthorizeMode.Value,
  108. DispenserPostFuelingLockMode = dispenserParameter.DispenserPostFuelingLockMode.Value,
  109. AmountDecimalDigits = pp.AmountDecimalDigits.Value,
  110. PriceDecimalDigits = pp.PriceDecimalDigits.Value,
  111. VolumeDecimalDigits = pp.VolumeDecimalDigits.Value,
  112. VolumeTotalizerDecimalDigits = pp.VolumeTotalizerDecimalDigits.Value
  113. }));
  114. }
  115. public IEnumerator<IFdcPumpController> GetEnumerator()
  116. {
  117. return this.pumpHandlers.GetEnumerator();
  118. }
  119. public void Init(IContext<byte[], MessageTemplateBase> context)
  120. {
  121. this.context = context;
  122. this.pumpHandlers.ForEach(p => p.Init(this.context));
  123. var timeWindowWithActivePollingOutgoing =
  124. this.context.Outgoing as TimeWindowWithActivePollingOutgoing<byte[], MessageTemplateBase>;
  125. int previousPolledHandlerIndex = 0;
  126. var nozzlePhysicalIds = this.pumpHandlers.SelectMany(ph => ph.Nozzles.Select(n => n.PhysicalId)).ToList();
  127. timeWindowWithActivePollingOutgoing.PollingMsgProducer = () =>
  128. {
  129. if (this.pumpHandlers.Count <= previousPolledHandlerIndex)
  130. previousPolledHandlerIndex = 0;
  131. var nextNozzlePhysicalId = nozzlePhysicalIds[previousPolledHandlerIndex++];
  132. return new ReadRealTimeData() { NozzleNumber = nextNozzlePhysicalId };
  133. };
  134. }
  135. public Task Process(IContext<byte[], MessageTemplateBase> context)
  136. {
  137. this.context = context;
  138. var msg = ((MessageBase)(context.Incoming.Message));
  139. var ph = this.pumpHandlers.FirstOrDefault(ph => ph.Nozzles.Select(n => n.PhysicalId).Contains(msg.NozzleNumber));
  140. if (ph == null)
  141. {
  142. logger.LogInformation("PumpGroupHandler does not contain pumpHandler with NozzlePhyscialId: 0x"
  143. + msg.NozzleNumber.ToString("X2"));
  144. return Task.CompletedTask;
  145. }
  146. return ph.Process(context);
  147. }
  148. [UniversalApi]
  149. public Task<bool> ChangeFuelPriceAsync(int pumpId, int newPriceWithoutDecimalPoint, byte logicalNozzleId)
  150. {
  151. return this.pumpHandlers.FirstOrDefault(ph => ph.PumpId == pumpId)?.ChangeFuelPriceAsync(newPriceWithoutDecimalPoint, logicalNozzleId);
  152. }
  153. [UniversalApi]
  154. public Task<System.Tuple<int, int>> QueryTotalizerAsync(int pumpId, byte logicalNozzleId)
  155. {
  156. return this.pumpHandlers.FirstOrDefault(ph => ph.PumpId == pumpId)?.QueryTotalizerAsync(logicalNozzleId);
  157. }
  158. IEnumerator IEnumerable.GetEnumerator()
  159. {
  160. return this.pumpHandlers.GetEnumerator();
  161. }
  162. }
  163. }