using Edge.Core.Processor; using Edge.Core.IndustryStandardInterface.Pump; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Edge.Core.Parser.BinaryParser.Util; using Edge.Core.Processor.Communicator; namespace Gilbarco_Pump { public class MessageCutter : IMessageCutter { public byte[] Message { get; private set; } public event EventHandler OnMessageCut; public event EventHandler OnInvalidMessageRead; private readonly List buffer = new List(); /// /// /// public void Feed(byte[] next) { for (int i = 0; i < next.Length; i++) { this.buffer.Add(next[i]); if (this.buffer[0] != 0xFA) { this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() { Message = "invalid byte[0]: 0x" + this.buffer[0].ToString("x2") + " clear buf and continue reading..." }); this.buffer.Clear(); continue; } //根据协议文档,该数从0x01递增到0x3F,然后再回到0x00,继续递增循环。 //注意注意,实际加油机会发送0x40进来,可能是油机的BUG,所以这里放开到0x40 if (this.buffer.Count >= 4 && (this.buffer[3] == 0 || this.buffer[3] > 0x40)) { this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() { Message = "invalid byte[3] of FrameNo.: 0x" + this.buffer[3].ToString("x2") + " clear buf and continue reading..." }); this.buffer.Clear(); continue; } if (this.buffer.Count >= 5 && this.buffer.Count == (this.buffer[4] + 6)) { this.Message = this.buffer.ToArray(); var safe = this.OnMessageCut; safe?.Invoke(this, null); this.buffer.Clear(); } if (this.buffer.Count >= 300) { this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() { Message = "Long length(len: " + this.buffer.Count + ") message is still constructing in MsgCutter: 0x" + this.buffer.ToHexLogString() }); this.buffer.Clear(); continue; } } } } }