TcpHandler.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Xml.Linq;
  8. using Wayne.FDCPOSLibrary;
  9. using WayneChina_IcCardReader_SinoChem.MessageEntity;
  10. namespace WayneChina_IcCardReader_SinoChem
  11. {
  12. public class TcpHandler : IDeviceHandler<byte[], IcCardReaderMessageBase>
  13. {
  14. #region Logger
  15. static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("PumpHandler");
  16. #endregion
  17. public Guid Id => Guid.NewGuid();
  18. public IContext<byte[], IcCardReaderMessageBase> CardReaderContext { get; set; }
  19. public event EventHandler<CardReaderMessageEventArgs> OnCardReaderMessageReceived;
  20. #region Raw config string
  21. private string cardReaderConfig;
  22. #endregion
  23. #region Card reader config list
  24. private List<CardReaderConfig> readerList;
  25. #endregion
  26. #region Constructor
  27. public TcpHandler(int id, string cardReaderConfig)
  28. {
  29. DispenserId = id;
  30. this.cardReaderConfig = cardReaderConfig;
  31. readerList = ParseCardReaderConfig(cardReaderConfig);
  32. }
  33. private List<CardReaderConfig> ParseCardReaderConfig(string config)
  34. {
  35. var xml = System.Net.WebUtility.HtmlDecode(config);
  36. var readers = XDocument.Parse(xml)
  37. .Element("CardReaders")
  38. .Elements()
  39. .Select(FromXElement<CardReaderConfig>)
  40. .ToList();
  41. return readers;
  42. }
  43. #endregion
  44. public int DispenserId { get; }
  45. public void Init(IContext<byte[], IcCardReaderMessageBase> context)
  46. {
  47. CardReaderContext = context;
  48. }
  49. public void Write(IcCardReaderMessageBase message)
  50. {
  51. CardReaderContext.Outgoing.Write(message);
  52. }
  53. public Task Process(IContext<byte[], IcCardReaderMessageBase> context)
  54. {
  55. var sourcePumpId = GetPumpIdBySourceAddress(context.Incoming.Message.SourceAddress);
  56. OnCardReaderMessageReceived?.Invoke(this, new CardReaderMessageEventArgs(sourcePumpId, context.Incoming.Message));
  57. return Task.CompletedTask;
  58. }
  59. /// <summary>
  60. /// Get all supported pumps (Fueling Points) of this handler.
  61. /// </summary>
  62. public List<int> SupportedNozzles
  63. {
  64. get
  65. {
  66. return readerList.Select(r => r.PumpId).ToList();
  67. }
  68. }
  69. /// <summary>
  70. /// Get the card reader address of the pump (fueling point).
  71. /// </summary>
  72. /// <param name="id">The fueling point id.</param>
  73. /// <returns>Source address of the reader.</returns>
  74. public byte GetAddressForNozzleId(int id)
  75. {
  76. if (SupportedNozzles.Contains(id))
  77. {
  78. return (byte)readerList.FirstOrDefault(r => r.PumpId == id).Address;
  79. }
  80. return 0x0F;
  81. }
  82. public byte GetPumpIdBySourceAddress(byte srcAddr)
  83. {
  84. var readerConfig = readerList.FirstOrDefault(r => r.Address == srcAddr);
  85. if (readerConfig != null)
  86. return (byte)readerConfig.PumpId;
  87. return 0x0F;
  88. }
  89. #region Helper methods
  90. private T FromXElement<T>(XElement element) where T : class, new()
  91. {
  92. T value = new T();
  93. foreach (var attr in element.Attributes())
  94. {
  95. var prop = typeof(T).GetProperty(attr.Name.LocalName);
  96. value.SetPropertyValue(prop.Name, attr.Value);
  97. }
  98. return value;
  99. }
  100. #endregion
  101. }
  102. }