123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Configuration;
- using System.IO.Ports;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using Timer = System.Timers.Timer;
- using System.Collections;
- using Edge.Core.Processor;
- using Edge.Core.IndustryStandardInterface.Pump;
- using Wayne.FDCPOSLibrary;
- using System.Xml;
- using Edge.Core.Database.Models;
- using System.Threading.Tasks;
- using Edge.Core.Processor.Communicator;
- using Edge.Core.Processor.Dispatcher.Attributes;
- using Microsoft.Extensions.Logging;
- using Microsoft.Extensions.Logging.Abstractions;
- using Stateless;
- using Edge.Core.Configuration;
- using Microsoft.Extensions.DependencyInjection;
- namespace Gilbarco_Pump
- {
- #region Ctor parameters
- public class PumpGroupConfig
- {
-
-
-
-
- public byte FccCommAddress { get; set; } = 0xE0;
-
-
-
-
- public byte DispenserCommBoardAddress { get; set; }
- public List<PumpConfig> PumpConfigs { get; set; }
- }
- public class PumpConfig
- {
-
-
-
- public byte PumpId { get; set; }
-
-
-
-
- public byte DispenserSideNozzleId { get; set; }
- }
- #endregion
-
-
-
- [MetaPartsRequired(typeof(HalfDuplexActivePollingDeviceProcessor<,>))]
- [MetaPartsRequired(typeof(ComPortCommunicator<>))]
- [MetaPartsRequired(typeof(TcpClientCommunicator<>))]
- [MetaPartsDescriptor(
- "lang-zh-cn:吉尔巴克加油机lang-en-us:Gilbarco dispenser",
- "用于驱动 吉尔巴克 加油机",
- new[] { "lang-zh-cn:加油机lang-en-us:Pump" })]
- public class PumpGroupHandler : IEnumerable<IFdcPumpController>, IDeviceHandler<byte[], MessageTemplateBase>
- {
- private IServiceProvider services;
- private ILogger logger = NullLogger.Instance;
- public PumpGroupConfig pumpGroupConfig;
- protected IEnumerable<NozzleExtraInfo> nozzleExtraInfos;
- protected IContext<byte[], MessageTemplateBase> context;
- protected IEnumerable<StatePumpHandler> pumpHandlers;
- private object rotateFrameNo_Guard = new object();
-
-
- private byte rotateFrameNo = 0;
-
-
-
- public byte GenerateNewFrameNo()
- {
- lock (this.rotateFrameNo_Guard)
- {
-
- if (this.rotateFrameNo > 0x3E)
- this.rotateFrameNo = 0;
- return (byte)(++this.rotateFrameNo);
- }
- }
- [ParamsJsonSchemas("PumpGroupHandlerCtorParamsJsonSchemas")]
- public PumpGroupHandler(PumpGroupConfig pumpGroupConfig, IServiceProvider services)
- {
- this.pumpGroupConfig = pumpGroupConfig;
- this.services = services;
- var loggerFactory = services.GetRequiredService<ILoggerFactory>();
- this.logger = loggerFactory.CreateLogger("PumpHandler");
- this.pumpHandlers =
- pumpGroupConfig.PumpConfigs.Select(pc =>
- new StatePumpHandler(this, pc.PumpId, pc.DispenserSideNozzleId, services)).ToList();
- }
- public void OnFdcServerInit(Dictionary<string, object> parameters)
- {
- if (parameters != null && parameters.TryGetValue("NozzleProductMapping", out object param))
- {
- this.nozzleExtraInfos = param as IEnumerable<NozzleExtraInfo>;
- }
- }
- public void Init(IContext<byte[], MessageTemplateBase> context)
- {
- this.context = context;
- var timeWindowWithActivePollingOutgoing =
- this.context.Outgoing as TimeWindowWithActivePollingOutgoing<byte[], MessageTemplateBase>;
-
- timeWindowWithActivePollingOutgoing.PollingMsgProducer =
- () =>
- {
- return null;
- };
- this.pumpHandlers.ToList().ForEach(p => p.Init(this.context));
- this.context.Incoming.OnLongTimeNoSeeMessage += (_, __) =>
- {
- this.pumpHandlers.ToList().ForEach(p => p.TriggerPumpOffline());
- };
- this.context.Incoming.LongTimeNoSeeMessageTimeout = 6000;
- }
- public async Task Process(IContext<byte[], MessageTemplateBase> context)
- {
- this.context = context;
- foreach (var ph in this.pumpHandlers)
- await ph.Process(context);
- }
- public IEnumerator<IFdcPumpController> GetEnumerator()
- {
- return this.pumpHandlers.GetEnumerator();
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.pumpHandlers.GetEnumerator();
- }
- }
- }
|