Parser.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Edge.Core.Parser.BinaryParser;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using Edge.Core.Parser.BinaryParser.Util;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace HengShan_Pump_NonIC
  10. {
  11. public class Parser : ParserBase
  12. {
  13. protected static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Communicator");
  14. public Parser() : base(new MessageTemplateLookup())
  15. {
  16. }
  17. public override byte[] Serialize(MessageTemplateBase message)
  18. {
  19. List<byte> bytesWithXRL = null;
  20. try
  21. {
  22. bytesWithXRL = base.Serialize(message).ToList();
  23. if (message.GetType().GetProperty("XRL") != null)
  24. {
  25. ProcessXRLInMsgBody(ref bytesWithXRL);
  26. }
  27. return bytesWithXRL.ToArray();
  28. }
  29. catch (Exception exxx)
  30. {
  31. string logStr = message?.GetType().Name ?? "";
  32. if (message != null)
  33. try { logStr += System.Environment.NewLine + message.ToLogString(); }
  34. catch { }
  35. if (bytesWithXRL != null && bytesWithXRL.Any())
  36. try { logStr += System.Environment.NewLine + bytesWithXRL.ToHexLogString(); }
  37. catch { }
  38. logger.Info("Serialize HengShanNonIC message: " + logStr + System.Environment.NewLine
  39. + " exceptioned, detail: " + exxx);
  40. throw;
  41. }
  42. }
  43. private void ProcessXRLInMsgBody(ref List<byte> bytesWithXRL)
  44. {
  45. var bytesUsedToComputeXRL = bytesWithXRL.GetRange(2, bytesWithXRL.Count - 3).ToArray();
  46. byte XRL = 0;
  47. foreach (var b in bytesUsedToComputeXRL)
  48. {
  49. XRL = (byte)(XRL ^ b);
  50. }
  51. if (XRL == 0xFF)
  52. XRL = 0xEE;
  53. bytesWithXRL[bytesWithXRL.Count - 1] = XRL;
  54. }
  55. }
  56. }