using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using Wayne.FDCPOSLibrary; using WayneChina_IcCardReader_SinoChem.MessageEntity; namespace WayneChina_IcCardReader_SinoChem { public class TcpHandler : IDeviceHandler { #region Logger static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("PumpHandler"); #endregion public Guid Id => Guid.NewGuid(); public IContext CardReaderContext { get; set; } public event EventHandler OnCardReaderMessageReceived; #region Raw config string private string cardReaderConfig; #endregion #region Card reader config list private List readerList; #endregion #region Constructor public TcpHandler(int id, string cardReaderConfig) { DispenserId = id; this.cardReaderConfig = cardReaderConfig; readerList = ParseCardReaderConfig(cardReaderConfig); } private List ParseCardReaderConfig(string config) { var xml = System.Net.WebUtility.HtmlDecode(config); var readers = XDocument.Parse(xml) .Element("CardReaders") .Elements() .Select(FromXElement) .ToList(); return readers; } #endregion public int DispenserId { get; } public void Init(IContext context) { CardReaderContext = context; } public void Write(IcCardReaderMessageBase message) { CardReaderContext.Outgoing.Write(message); } public Task Process(IContext context) { var sourcePumpId = GetPumpIdBySourceAddress(context.Incoming.Message.SourceAddress); OnCardReaderMessageReceived?.Invoke(this, new CardReaderMessageEventArgs(sourcePumpId, context.Incoming.Message)); return Task.CompletedTask; } /// /// Get all supported pumps (Fueling Points) of this handler. /// public List SupportedNozzles { get { return readerList.Select(r => r.PumpId).ToList(); } } /// /// Get the card reader address of the pump (fueling point). /// /// The fueling point id. /// Source address of the reader. public byte GetAddressForNozzleId(int id) { if (SupportedNozzles.Contains(id)) { return (byte)readerList.FirstOrDefault(r => r.PumpId == id).Address; } return 0x0F; } public byte GetPumpIdBySourceAddress(byte srcAddr) { var readerConfig = readerList.FirstOrDefault(r => r.Address == srcAddr); if (readerConfig != null) return (byte)readerConfig.PumpId; return 0x0F; } #region Helper methods private T FromXElement(XElement element) where T : class, new() { T value = new T(); foreach (var attr in element.Attributes()) { var prop = typeof(T).GetProperty(attr.Name.LocalName); value.SetPropertyValue(prop.Name, attr.Value); } return value; } #endregion } }