MessageCutter.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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.Linq;
  6. using System.Text;
  7. using Edge.Core.Processor.Communicator;
  8. namespace LanTian_Pump_664_Or_886
  9. {
  10. public class MessageCutter : IMessageCutter<byte[]>
  11. {
  12. private readonly List<byte> buffer = new List<byte>();
  13. //private List<char> validMessageFirstChars = new List<char>() { 'M', 'D', 'T', 'V', 'X', 'A' };
  14. public byte[] Message { get; private set; }
  15. public event EventHandler OnMessageCut;
  16. public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
  17. public void Feed(byte[] data)
  18. {
  19. for (int i = 0; i < data.Length; i++)
  20. {
  21. this.buffer.Add(data[i]);
  22. if (this.buffer[0] != 0xF5)
  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. if (this.buffer.Count >= 2
  36. && this.buffer[1] != 0x01)
  37. {
  38. this.OnInvalidMessageRead?.Invoke(this,
  39. new MessageCutterInvalidMessageReadEventArg()
  40. {
  41. Message =
  42. "invalid byte[1]: 0x"
  43. + this.buffer[1].ToString("x2")
  44. + " clear buf and continue reading..."
  45. });
  46. this.buffer.Clear();
  47. continue;
  48. }
  49. if (this.buffer.Count >= 3
  50. && ((this.buffer[2] & 0xF0) != 0xA0))
  51. {
  52. this.OnInvalidMessageRead?.Invoke(this,
  53. new MessageCutterInvalidMessageReadEventArg()
  54. {
  55. Message =
  56. "invalid byte[2]: 0x"
  57. + this.buffer[2].ToString("x2")
  58. + " clear buf and continue reading..."
  59. });
  60. this.buffer.Clear();
  61. continue;
  62. }
  63. if (this.buffer.Count >= 5 &&
  64. this.buffer.Count == ((this.buffer[2] & 0x0F) + 3))
  65. {
  66. this.Message = this.buffer.ToArray();
  67. var safe = this.OnMessageCut;
  68. safe?.Invoke(this, null);
  69. this.buffer.Clear();
  70. }
  71. if (this.buffer.Count >= 500)
  72. {
  73. this.OnInvalidMessageRead?.Invoke(this,
  74. new MessageCutterInvalidMessageReadEventArg()
  75. {
  76. Message = "Long length(len: " + this.buffer.Count + ") message is still constructing in MsgCutter: 0x" + this.buffer.ToHexLogString()
  77. });
  78. this.buffer.Clear();
  79. continue;
  80. }
  81. }
  82. }
  83. }
  84. }