using Edge.Core.Parser.BinaryParser; using Edge.Core.Parser.BinaryParser.MessageEntity; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace VeederRoot_ATG_Console { /// /// Used for 2 kinds of message parsing: /// - VR ATG message, with format like i201xxxxxxxxx /// - DispenserInterface messages, with format like Bxxxxxxx /// public class Parser : ParserBase { public Parser() : base(new MessageTemplateLookup()) { } public int CaculateCheckSum(byte[] msg) { int checkSum = 0; for (int i = 0; i < msg.Length; i++) { checkSum += msg[i]; } return 0x10000 - (checkSum % 0x10000); } //public byte[] CaculateCheckSumToAscII2Bytes(byte[] msg) //{ // var checksum = this.CaculateCheckSum(msg); // var r = ASCIIEncoding.ASCII.GetBytes(checksum.ToString("X4")); // return r; //} //public override MessageTemplateBase Deserialize(byte[] rawData) //{ // return base.Deserialize(rawData.Take(rawData.Length - 1).ToArray()); //} public override byte[] Serialize(MessageTemplateBase message) { var serializedBytes = base.Serialize(message); if (message is MessageEntity.DispenserInterface.Outgoing.OutgoingMessageBase) { var dispenserIfMsg = message as MessageEntity.DispenserInterface.Outgoing.OutgoingMessageBase; var appendWithCheckSum = serializedBytes.Take(serializedBytes.Length - 1) .Concat(Encoding.ASCII.GetBytes( CaculateCheckSum(serializedBytes.Take(serializedBytes.Length - 1).ToArray()).ToString("X4"))) .Concat(new byte[] { serializedBytes.Last() }); return appendWithCheckSum.ToArray(); } return serializedBytes; } } }