MessageCutter.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Edge.Core.Processor;
  2. using Edge.Core.IndustryStandardInterface.Pump;
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using Edge.Core.Parser.BinaryParser.Util;
  10. using Edge.Core.Processor.Communicator;
  11. namespace Gilbarco_Pump
  12. {
  13. public class MessageCutter : IMessageCutter<byte[]>
  14. {
  15. public byte[] Message { get; private set; }
  16. public event EventHandler OnMessageCut;
  17. public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
  18. private readonly List<byte> buffer = new List<byte>();
  19. /// <summary>
  20. ///
  21. /// </summary>
  22. public void Feed(byte[] next)
  23. {
  24. for (int i = 0; i < next.Length; i++)
  25. {
  26. this.buffer.Add(next[i]);
  27. if (this.buffer[0] != 0xFA)
  28. {
  29. this.OnInvalidMessageRead?.Invoke(this,
  30. new MessageCutterInvalidMessageReadEventArg()
  31. {
  32. Message =
  33. "invalid byte[0]: 0x"
  34. + this.buffer[0].ToString("x2")
  35. + " clear buf and continue reading..."
  36. });
  37. this.buffer.Clear();
  38. continue;
  39. }
  40. //根据协议文档,该数从0x01递增到0x3F,然后再回到0x00,继续递增循环。
  41. //注意注意,实际加油机会发送0x40进来,可能是油机的BUG,所以这里放开到0x40
  42. if (this.buffer.Count >= 4
  43. && (this.buffer[3] == 0 || this.buffer[3] > 0x40))
  44. {
  45. this.OnInvalidMessageRead?.Invoke(this,
  46. new MessageCutterInvalidMessageReadEventArg()
  47. {
  48. Message =
  49. "invalid byte[3] of FrameNo.: 0x"
  50. + this.buffer[3].ToString("x2")
  51. + " clear buf and continue reading..."
  52. });
  53. this.buffer.Clear();
  54. continue;
  55. }
  56. if (this.buffer.Count >= 5 &&
  57. this.buffer.Count == (this.buffer[4] + 6))
  58. {
  59. this.Message = this.buffer.ToArray();
  60. var safe = this.OnMessageCut;
  61. safe?.Invoke(this, null);
  62. this.buffer.Clear();
  63. }
  64. if (this.buffer.Count >= 300)
  65. {
  66. this.OnInvalidMessageRead?.Invoke(this,
  67. new MessageCutterInvalidMessageReadEventArg()
  68. {
  69. Message = "Long length(len: " + this.buffer.Count + ") message is still constructing in MsgCutter: 0x" + this.buffer.ToHexLogString()
  70. });
  71. this.buffer.Clear();
  72. continue;
  73. }
  74. }
  75. }
  76. }
  77. }