123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- 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<byte[], IcCardReaderMessageBase>
- {
- #region Logger
- static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("PumpHandler");
- #endregion
- public Guid Id => Guid.NewGuid();
- public IContext<byte[], IcCardReaderMessageBase> CardReaderContext { get; set; }
- public event EventHandler<CardReaderMessageEventArgs> OnCardReaderMessageReceived;
- #region Raw config string
- private string cardReaderConfig;
- #endregion
- #region Card reader config list
- private List<CardReaderConfig> readerList;
- #endregion
- #region Constructor
- public TcpHandler(int id, string cardReaderConfig)
- {
- DispenserId = id;
- this.cardReaderConfig = cardReaderConfig;
- readerList = ParseCardReaderConfig(cardReaderConfig);
- }
- private List<CardReaderConfig> ParseCardReaderConfig(string config)
- {
- var xml = System.Net.WebUtility.HtmlDecode(config);
- var readers = XDocument.Parse(xml)
- .Element("CardReaders")
- .Elements()
- .Select(FromXElement<CardReaderConfig>)
- .ToList();
- return readers;
- }
- #endregion
- public int DispenserId { get; }
- public void Init(IContext<byte[], IcCardReaderMessageBase> context)
- {
- CardReaderContext = context;
- }
- public void Write(IcCardReaderMessageBase message)
- {
- CardReaderContext.Outgoing.Write(message);
- }
- public Task Process(IContext<byte[], IcCardReaderMessageBase> context)
- {
- var sourcePumpId = GetPumpIdBySourceAddress(context.Incoming.Message.SourceAddress);
- OnCardReaderMessageReceived?.Invoke(this, new CardReaderMessageEventArgs(sourcePumpId, context.Incoming.Message));
- return Task.CompletedTask;
- }
- /// <summary>
- /// Get all supported pumps (Fueling Points) of this handler.
- /// </summary>
- public List<int> SupportedNozzles
- {
- get
- {
- return readerList.Select(r => r.PumpId).ToList();
- }
- }
- /// <summary>
- /// Get the card reader address of the pump (fueling point).
- /// </summary>
- /// <param name="id">The fueling point id.</param>
- /// <returns>Source address of the reader.</returns>
- 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<T>(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
- }
- }
|