| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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<byte[]>
- {
- public byte[] Message { get; private set; }
- public event EventHandler OnMessageCut;
- public event EventHandler<MessageCutterInvalidMessageReadEventArg> OnInvalidMessageRead;
- private readonly List<byte> buffer = new List<byte>();
- /// <summary>
- ///
- /// </summary>
- 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;
- }
- }
- }
- }
- }
|