MessageCutter.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump;
  2. using Edge.Core.Parser.BinaryParser.Util;
  3. using ProGauge_StartItaliana_Probe.MessageEntity;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using Edge.Core.Processor.Communicator;
  9. namespace ProGauge_StartItaliana_Probe
  10. {
  11. public class MessageCutter : IMessageCutter<byte[]>
  12. {
  13. private readonly List<byte> buffer = new List<byte>();
  14. //private List<char> validMessageFirstChars = new List<char>() { 'M', 'D', 'T', 'V', 'X', 'A' };
  15. public byte[] Message { get; private set; }
  16. public event EventHandler OnMessageCut;
  17. public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
  18. public void Feed(byte[] data)
  19. {
  20. for (int i = 0; i < data.Length; i++)
  21. {
  22. this.buffer.Add(data[i]);
  23. // first 5 chars are address, should range from 00000 to 00015
  24. if (this.buffer.Count >= 5
  25. && (!int.TryParse(Encoding.ASCII.GetString(this.buffer.Take(5).ToArray()), out int parsedAddressValue)
  26. || (parsedAddressValue < 0 || parsedAddressValue > 15))
  27. )
  28. {
  29. this.OnInvalidMessageRead?.Invoke(this,
  30. new MessageCutterInvalidMessageReadEventArg()
  31. {
  32. Message = "MessageCutter, Unknown starter 5 bytes: 0x" + this.buffer.ToHexLogString() + ", will drop and clear buffer"
  33. });
  34. this.buffer.Clear();
  35. }
  36. if (this.buffer.Count >= 7
  37. && this.buffer[this.buffer.Count - 2] == 0x0a
  38. && this.buffer[this.buffer.Count - 1] == 0x0d)
  39. {
  40. this.Message = this.buffer.ToArray();
  41. var safe = this.OnMessageCut;
  42. safe?.Invoke(this, null);
  43. this.buffer.Clear();
  44. }
  45. if (this.buffer.Count >= 60)
  46. {
  47. this.OnInvalidMessageRead?.Invoke(this,
  48. new MessageCutterInvalidMessageReadEventArg()
  49. {
  50. Message = "Long length(len: " + this.buffer.Count +
  51. ") message is still constructing in MsgCutter: 0x" + this.buffer.ToHexLogString() + ", will drop and clear buffer"
  52. });
  53. this.buffer.Clear();
  54. }
  55. }
  56. }
  57. }
  58. }