Handler.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. using WayneChina_IcCardReader_SinoChem.MessageEntity;
  6. using WayneChina_IcCardReader_SinoChem.MessageEntity.Incoming;
  7. namespace WayneChina_IcCardReader_SinoChem
  8. {
  9. public class Handler : IDeviceHandler<byte[], IcCardReaderMessageBase>, IFdcCommunicableController
  10. {
  11. static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("PumpHandler");
  12. #region Fields
  13. private int nozzleIdA;
  14. private int nozzleIdB;
  15. private object syncObj = new object();
  16. private readonly int addressA;
  17. private readonly int addressB;
  18. #endregion
  19. #region Interface implementation, UNUSED for now
  20. public Guid Id => Guid.NewGuid();
  21. public Func<string, bool> BroadcastMessageViaFdc { get; set; }
  22. public Func<string, Tuple<string, global::Wayne.FDCPOSLibrary.OverallResult>> OnMessageReceivedViaFdc { get; set; }
  23. public Func<string, string, string, bool> SendMessageViaFdc { get; set; }
  24. #endregion
  25. #region Event Handler
  26. public event EventHandler<CardReaderMessageEventArgs> OnCardReaderMessageReceived;
  27. #endregion
  28. #region Constructor
  29. public Handler(int bindingNozzleIdA, int bindingNozzleIdB, int addressA, int addressB, int numberOfPumpsPerSide, string hasBigScreen)
  30. {
  31. nozzleIdA = bindingNozzleIdA;
  32. nozzleIdB = bindingNozzleIdB;
  33. this.addressA = addressA;
  34. this.addressB = addressB;
  35. NumberOfNozzlesPerSide = numberOfPumpsPerSide;
  36. HasBigScreen = Convert.ToBoolean(hasBigScreen);
  37. }
  38. #endregion
  39. #region Methods
  40. public void Init(IContext<byte[], IcCardReaderMessageBase> context)
  41. {
  42. CardReaderContext = context;
  43. }
  44. public void Write(IcCardReaderMessageBase readerMessage)
  45. {
  46. if (CardReaderContext != null)
  47. {
  48. lock (syncObj)
  49. {
  50. CardReaderContext.Outgoing.Write(readerMessage);
  51. }
  52. }
  53. }
  54. public Task Process(IContext<byte[], IcCardReaderMessageBase> context)
  55. {
  56. int targetNozzleId = -1;
  57. if (context.Incoming.Message.SourceAddress == addressA)
  58. {
  59. targetNozzleId = nozzleIdA;
  60. }
  61. else if (context.Incoming.Message.SourceAddress == addressB)
  62. {
  63. targetNozzleId = nozzleIdB;
  64. }
  65. OnCardReaderMessageReceived?.Invoke(this, new CardReaderMessageEventArgs(targetNozzleId, context.Incoming.Message));
  66. return Task.CompletedTask;
  67. }
  68. public byte GetAddressForNozzleId(int id)
  69. {
  70. if (SupportedNozzles.Contains(id))
  71. {
  72. if (id == nozzleIdA)
  73. return (byte)addressA;
  74. if (id == nozzleIdB)
  75. return (byte)addressB;
  76. }
  77. return 0xFF;
  78. }
  79. #endregion
  80. #region Properties
  81. public int HandlerId
  82. {
  83. get { return Math.Max(nozzleIdA, nozzleIdB) / 2; }
  84. }
  85. public int AddressA
  86. {
  87. get { return addressA; }
  88. }
  89. public int AddressB
  90. {
  91. get { return addressB; }
  92. }
  93. public List<int> SupportedNozzles
  94. {
  95. get
  96. {
  97. return new List<int> { nozzleIdA, nozzleIdB };
  98. }
  99. }
  100. public IContext<byte[], IcCardReaderMessageBase> CardReaderContext { get; set; }
  101. #endregion
  102. public int NumberOfNozzlesPerSide { get; }
  103. public bool HasBigScreen { get; }
  104. }
  105. }