Parser.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Edge.Core.Parser.BinaryParser;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. namespace VeederRoot_ATG_Console
  8. {
  9. /// <summary>
  10. /// Used for 2 kinds of message parsing:
  11. /// - VR ATG message, with format like <SOH>i201xxxxxxxxx<ETX>
  12. /// - DispenserInterface messages, with format like <SOH>Bxxxxxxx<ETX>
  13. /// </summary>
  14. public class Parser : ParserBase
  15. {
  16. public Parser() : base(new MessageTemplateLookup()) { }
  17. public int CaculateCheckSum(byte[] msg)
  18. {
  19. int checkSum = 0;
  20. for (int i = 0; i < msg.Length; i++)
  21. {
  22. checkSum += msg[i];
  23. }
  24. return 0x10000 - (checkSum % 0x10000);
  25. }
  26. //public byte[] CaculateCheckSumToAscII2Bytes(byte[] msg)
  27. //{
  28. // var checksum = this.CaculateCheckSum(msg);
  29. // var r = ASCIIEncoding.ASCII.GetBytes(checksum.ToString("X4"));
  30. // return r;
  31. //}
  32. //public override MessageTemplateBase Deserialize(byte[] rawData)
  33. //{
  34. // return base.Deserialize(rawData.Take(rawData.Length - 1).ToArray());
  35. //}
  36. public override byte[] Serialize(MessageTemplateBase message)
  37. {
  38. var serializedBytes = base.Serialize(message);
  39. if (message is MessageEntity.DispenserInterface.Outgoing.OutgoingMessageBase)
  40. {
  41. var dispenserIfMsg = message as MessageEntity.DispenserInterface.Outgoing.OutgoingMessageBase;
  42. var appendWithCheckSum = serializedBytes.Take(serializedBytes.Length - 1)
  43. .Concat(Encoding.ASCII.GetBytes(
  44. CaculateCheckSum(serializedBytes.Take(serializedBytes.Length - 1).ToArray()).ToString("X4")))
  45. .Concat(new byte[] { serializedBytes.Last() });
  46. return appendWithCheckSum.ToArray();
  47. }
  48. return serializedBytes;
  49. }
  50. }
  51. }