MessageCutter.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump;
  2. using Edge.Core.Parser.BinaryParser.Util;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using Edge.Core.Processor.Communicator;
  7. namespace VeederRoot_ATG_Console
  8. {
  9. public class MessageCutter : IMessageCutter<byte[]>
  10. {
  11. static NLog.Logger innerLogger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Communicator");
  12. private readonly List<byte> buffer = new List<byte>();
  13. public byte[] Message { get; set; }
  14. public event EventHandler OnMessageCut;
  15. public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
  16. public void Feed(byte[] data)
  17. {
  18. for (int i = 0; i < data.Length; i++)
  19. {
  20. this.buffer.Add(data[i]);
  21. //SOH
  22. if (this.buffer[0] != 0x01)
  23. {
  24. this.OnInvalidMessageRead?.Invoke(this,
  25. new MessageCutterInvalidMessageReadEventArg()
  26. {
  27. Message =
  28. "invalid byte[0]: 0x"
  29. + this.buffer[0].ToString("x2")
  30. + " clear buf and continue reading..."
  31. });
  32. this.buffer.Clear();
  33. continue;
  34. }
  35. //ETX
  36. if (this.buffer[this.buffer.Count - 1] == 0x03)
  37. {
  38. this.Message = this.buffer.ToArray();
  39. var safe = this.OnMessageCut;
  40. safe?.Invoke(this, null);
  41. this.buffer.Clear();
  42. }
  43. if (this.buffer.Count >= 500)
  44. innerLogger.Info("Long length(len: " + this.buffer.Count + ") message is still constructing in MsgCutter: 0x" + this.buffer.ToHexLogString());
  45. }
  46. }
  47. }
  48. }