using Edge.Core.Configuration; using Edge.Core.IndustryStandardInterface.Pump; using Edge.Core.Processor; using Edge.Core.Processor.Dispatcher.Attributes; using Edge.Core.UniversalApi; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Wayne.FDCPOSLibrary; namespace Bogus_Pump { [MetaPartsDescriptor( "lang-zh-cn:加油机模拟器lang-en-us:Pumps Simulator", "lang-zh-cn:用于模拟多个通用加油机(多个Pumps), 自动提枪并等待授权, 然后自动加油,但也可以关闭自动模拟转而接收外部调用来模拟油机行为.lang-en-us:Used for simulate generic pumps, auto timely lift nozzle, wait for authorizing and then start fuelling", new[] { "lang-zh-cn:加油机lang-en-us:Pump" })] public class PumpHandlerGroupApp : IEnumerable, IFdcCommunicableController, IAppProcessor, IDisposable { private IEnumerable nozzleExtraInfos = null; private List pumpHandlers = new List(); public PumpHandlerGroupApp(int pumpsCount, byte nozzlesCountPerPump, bool enableFuelSimulation) { pumpHandlers.AddRange(Enumerable.Range(1, pumpsCount).Select(i => new PumpHandler(i, nozzlesCountPerPump, enableFuelSimulation))); } public string MetaConfigName { get; set; } public Func BroadcastMessageViaFdc { get; set; } public Func SendMessageViaFdc { get; set; } public Func> OnMessageReceivedViaFdc { get; set; } public void Dispose() { this.pumpHandlers?.ForEach(ph => ph.Dispose()); } public IEnumerator GetEnumerator() { return this.pumpHandlers.GetEnumerator(); } public void Init(IEnumerable processors) { } IEnumerator IEnumerable.GetEnumerator() { return this.pumpHandlers.GetEnumerator(); } public void OnFdcServerInit(Dictionary parameters) { if (parameters != null && parameters.TryGetValue("NozzleProductMapping", out object param)) { this.nozzleExtraInfos = param as IEnumerable; } } [UniversalApi] public async Task ChangePumpStateTo(int siteLevelNozzleId, LogicalDeviceState pumpNewState, int? amountWithoutDecimalPoint, int? volumeWithoutDecimalPoint, int? priceWithoutDecimalPoint) { var targetNozzleInfo = this.nozzleExtraInfos.FirstOrDefault(i => i.SiteLevelNozzleId == siteLevelNozzleId); if (targetNozzleInfo == null) return false; var targetPump = this.pumpHandlers.FirstOrDefault(ph => ph.PumpId == targetNozzleInfo.PumpId); if (targetPump == null) return false; targetPump.DrivenPumpStateTo((byte?)(targetNozzleInfo.NozzleLogicalId), pumpNewState, amountWithoutDecimalPoint, volumeWithoutDecimalPoint, priceWithoutDecimalPoint); return true; } [UniversalApi] public async Task RaisePumpNewTrx(int siteLevelNozzleId, int amountWithoutDecimalPoint, int volumeWithoutDecimalPoint, int priceWithoutDecimalPoint, int trxSeqNumber) { var targetNozzleInfo = this.nozzleExtraInfos.FirstOrDefault(i => i.SiteLevelNozzleId == siteLevelNozzleId); if (targetNozzleInfo == null) return false; var targetPump = this.pumpHandlers.FirstOrDefault(ph => ph.PumpId == targetNozzleInfo.PumpId); if (targetPump == null) return false; targetPump.DrivenPumpRaiseNewTrx((byte?)(targetNozzleInfo.NozzleLogicalId), amountWithoutDecimalPoint, volumeWithoutDecimalPoint, priceWithoutDecimalPoint, trxSeqNumber); return true; } [UniversalApi] public async Task DisplayTextOnPumpScreen(int[] screenIds, int areaId, string text) { if (BroadcastMessageViaFdc != null) { var p = new { source = "fc", data = new { screenIds = screenIds, areaId = areaId, text = text, } }; BroadcastMessageViaFdc(System.Text.Json.JsonSerializer.Serialize(p)); return true; } else return false; } } }