using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump; using Edge.Core.Parser.BinaryParser.Util; using System; using System.Collections.Generic; using System.Text; using Edge.Core.Processor.Communicator; namespace VeederRoot_ATG_Console { public class MessageCutter : IMessageCutter { static NLog.Logger innerLogger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Communicator"); private readonly List buffer = new List(); public byte[] Message { get; set; } public event EventHandler OnMessageCut; public event EventHandler OnInvalidMessageRead; public void Feed(byte[] data) { for (int i = 0; i < data.Length; i++) { this.buffer.Add(data[i]); //SOH if (this.buffer[0] != 0x01) { 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; } //ETX if (this.buffer[this.buffer.Count - 1] == 0x03) { this.Message = this.buffer.ToArray(); var safe = this.OnMessageCut; safe?.Invoke(this, null); this.buffer.Clear(); } if (this.buffer.Count >= 500) innerLogger.Info("Long length(len: " + this.buffer.Count + ") message is still constructing in MsgCutter: 0x" + this.buffer.ToHexLogString()); } } } }