TimeWindowMessageCutter.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Edge.Core.Parser.BinaryParser.Util;
  2. using Edge.Core.Processor.Communicator;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using System.Text;
  7. namespace GroWattInverter
  8. {
  9. public class TimeWindowMessageCutter : IMessageCutter<byte[]>, IDisposable
  10. {
  11. /// <summary>
  12. /// each this time(from first byte received) elapsed, will fire a message out.
  13. /// </summary>
  14. private int timeWindowTimedoutValue = 1000;
  15. public byte[] Message { get; set; }
  16. public event EventHandler OnMessageCut;
  17. public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
  18. private List<byte> buffer = new List<byte>();
  19. private System.Timers.Timer timer;
  20. public TimeWindowMessageCutter()
  21. {
  22. this.timer = new System.Timers.Timer();
  23. this.timer.Interval = this.timeWindowTimedoutValue;
  24. this.timer.Elapsed += (s, a) =>
  25. {
  26. this.timer.Stop();
  27. this.Message = buffer.ToArray();
  28. if (this.Message.Length <= 6) OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg()
  29. {
  30. Message = $"Raw msg: 0x{this.Message.ToHexLogString()} does not meet the min length(valid Len must >6) requirment"
  31. });
  32. this.OnMessageCut?.Invoke(this, new EventArgs());
  33. this.buffer.Clear();
  34. };
  35. }
  36. public void Feed(byte[] data)
  37. {
  38. this.buffer.AddRange(data);
  39. if (!this.timer.Enabled) this.timer.Start();
  40. }
  41. public void Dispose()
  42. {
  43. this.timer?.Stop();
  44. }
  45. }
  46. }