using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump; using Edge.Core.Parser.BinaryParser.Util; using ProGauge_StartItaliana_Probe.MessageEntity; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Edge.Core.Processor.Communicator; namespace ProGauge_StartItaliana_Probe { public class MessageCutter : IMessageCutter { private readonly List buffer = new List(); //private List validMessageFirstChars = new List() { 'M', 'D', 'T', 'V', 'X', 'A' }; public byte[] Message { get; private 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]); // first 5 chars are address, should range from 00000 to 00015 if (this.buffer.Count >= 5 && (!int.TryParse(Encoding.ASCII.GetString(this.buffer.Take(5).ToArray()), out int parsedAddressValue) || (parsedAddressValue < 0 || parsedAddressValue > 15)) ) { this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() { Message = "MessageCutter, Unknown starter 5 bytes: 0x" + this.buffer.ToHexLogString() + ", will drop and clear buffer" }); this.buffer.Clear(); } if (this.buffer.Count >= 7 && this.buffer[this.buffer.Count - 2] == 0x0a && this.buffer[this.buffer.Count - 1] == 0x0d) { this.Message = this.buffer.ToArray(); var safe = this.OnMessageCut; safe?.Invoke(this, null); this.buffer.Clear(); } if (this.buffer.Count >= 60) { this.OnInvalidMessageRead?.Invoke(this, new MessageCutterInvalidMessageReadEventArg() { Message = "Long length(len: " + this.buffer.Count + ") message is still constructing in MsgCutter: 0x" + this.buffer.ToHexLogString() + ", will drop and clear buffer" }); this.buffer.Clear(); } } } } }