Parser.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. using Wayne_Pump_Dart.MessageEntity;
  10. namespace Wayne_Pump_Dart
  11. {
  12. public class Parser : ParserBase
  13. {
  14. public Parser() : base(new MessageTemplateLookup())
  15. {
  16. }
  17. public override byte[] Serialize(MessageTemplateBase message)
  18. {
  19. //ADR CTRL NO LNG 1 2 … CRC-1 CRC-2 ETX SF
  20. var bytesWithoutCrc16 = base.Serialize(message).ToList();
  21. var wayneDartMsg = message as MessageBase;
  22. if (wayneDartMsg.ControlCharacter == ControlCharacter.DATA)
  23. {
  24. var crc16 = bytesWithoutCrc16.ToArray().ComputeChecksumBytesCrc16().Reverse().ToArray();
  25. var processedBody = this.ProcessCodeTransparency(bytesWithoutCrc16);
  26. var processedCrc = this.ProcessCodeTransparency(crc16.ToList());
  27. var _ = processedBody.Concat(processedCrc).Concat(new byte[] { 0x03, 0xFA });
  28. return _.ToArray();
  29. }
  30. else if (wayneDartMsg.ControlCharacter == ControlCharacter.POLL
  31. || wayneDartMsg.ControlCharacter == ControlCharacter.ACK)
  32. return bytesWithoutCrc16.Concat(new byte[] { 0xFA }).ToArray();
  33. throw new InvalidOperationException("unhandled ControlCharacter of " + wayneDartMsg.ControlCharacter);
  34. //return bytesWithoutCrc16.Concat(new byte[] { 0x03, 0xFA }).ToArray();
  35. }
  36. public override MessageTemplateBase Deserialize(byte[] rawData)
  37. {
  38. if (rawData.Length > 4)
  39. {
  40. // exclude last 4 byte which are (2 bytes CRC + 1 byte EOT + 1byte 0xFA)
  41. return base.Deserialize(rawData.Take(rawData.Length - 4).ToArray());
  42. }
  43. else
  44. {
  45. // exclude last 1 byte of 0xFA
  46. return base.Deserialize(rawData.Take(rawData.Length - 1).ToArray());
  47. }
  48. }
  49. /// <summary>
  50. /// Code transparency for 8 bit data is achieved by Data Link escape (DLE) inser-tion.
  51. /// DLE insertion is needed when any data byte or CRC has the value SF (stop flag).
  52. /// Transmitting device transmit DLE before SF is transmitted in the data field.
  53. /// Receiving device checks when receiving SF, if previous received character was DLE.
  54. /// If so DLE is over written by the received SF in the line buffer.
  55. /// Inserted DLE:s are not included in the CRC-calculation.
  56. /// </summary>
  57. /// <param name="original"></param>
  58. /// <returns></returns>
  59. private byte[] ProcessCodeTransparency(List<byte> original)
  60. {
  61. //====record 0xFA position============
  62. var indexs = new List<int>();
  63. for (int i = 0; i < original.Count; i++)
  64. {
  65. if (original[i] == 0xFA)
  66. {
  67. indexs.Add(i);
  68. }
  69. }
  70. //=====end=====
  71. if (!indexs.Any()) return original.ToArray();
  72. //var originalLen = original.Skip(2).Take(2).GetBCD();
  73. //var newLen = (originalLen).GetBCDBytes(2);
  74. //original[2] = newLen[0];
  75. //original[3] = newLen[1];
  76. byte[] _ = new byte[original.Count];
  77. original.CopyTo(_);
  78. var newList = _.ToList();
  79. for (int i = 0; i < indexs.Count; i++)
  80. {
  81. newList.Insert(indexs[i] + i, 0x10);
  82. }
  83. return newList.ToArray();
  84. }
  85. //private static byte[] ProcessDoubleHexFAInCRC(byte[] originalCrc)
  86. //{
  87. // var result = new List<byte>();
  88. // result.Add(originalCrc[0]);
  89. // if (originalCrc[0] == 0xFA)
  90. // {
  91. // result.Add(0xFA);
  92. // }
  93. // result.Add(originalCrc[1]);
  94. // if (originalCrc[1] == 0xFA)
  95. // {
  96. // result.Add(0xFA);
  97. // }
  98. // return result.ToArray();
  99. //}
  100. //public override MessageTemplateBase Deserialize(byte[] rawData)
  101. //{
  102. // // skip first 0xFA
  103. // return base.Deserialize(rawData.Skip(1).ToArray());
  104. //}
  105. //public override MessageTemplateBase Deserialize(byte[] rawData, MessageTemplateBase withTemplate)
  106. //{
  107. // // skip first 0xFA
  108. // return base.Deserialize(rawData.Skip(1).ToArray(), withTemplate);
  109. //}
  110. }
  111. }