using Edge.Core.Parser.BinaryParser; using Edge.Core.Parser.BinaryParser.MessageEntity; using Edge.Core.Parser.BinaryParser.Util; using System; using System.Collections.Generic; using System.Linq; namespace HengShan_Pump_NonIC_Plus { public class Parser : ParserBase { protected static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Communicator"); public Parser() : base(new MessageTemplateLookup()) { } public override byte[] Serialize(MessageTemplateBase message) { List bytesWithXRL = null; try { bytesWithXRL = base.Serialize(message).ToList(); if (message.GetType().GetProperty("XRL") != null) { bytesWithXRL[bytesWithXRL.Count - 1] = ProcessXRLInMsgBody(bytesWithXRL); ProcessXRLInMsgBody(bytesWithXRL); } return bytesWithXRL.ToArray(); } catch (Exception exxx) { string logStr = message?.GetType().Name ?? ""; if (message != null) try { logStr += System.Environment.NewLine + message.ToLogString(); } catch { } if (bytesWithXRL != null && bytesWithXRL.Any()) try { logStr += System.Environment.NewLine + bytesWithXRL.ToHexLogString(); } catch { } logger.Info("Serialize HengShanNonIC message: " + logStr + System.Environment.NewLine + " exceptioned, detail: " + exxx); throw; } } public override MessageTemplateBase Deserialize(byte[] rawData) { var pendingForXrlBytes = rawData.SkipLast(1).ToList(); var xrlOri = rawData.Skip(pendingForXrlBytes.Count).First(); var xrl = ProcessXRLInMsgBody(pendingForXrlBytes); return base.Deserialize(pendingForXrlBytes.ToArray()); } private byte ProcessXRLInMsgBody(List bytesWithXRL) { var bytesUsedToComputeXRL = bytesWithXRL.GetRange(3, bytesWithXRL.Count - 3).ToArray(); byte XRL = 0; foreach (var b in bytesUsedToComputeXRL) { XRL = (byte)(XRL ^ b); } if (XRL == 0x9F) XRL = 0xEE; return XRL; } } }