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; using System.Text; using System.Threading.Tasks; using Wayne_Pump_Dart.MessageEntity; namespace Wayne_Pump_Dart { public class Parser : ParserBase { public Parser() : base(new MessageTemplateLookup()) { } public override byte[] Serialize(MessageTemplateBase message) { //ADR CTRL NO LNG 1 2 … CRC-1 CRC-2 ETX SF var bytesWithoutCrc16 = base.Serialize(message).ToList(); var wayneDartMsg = message as MessageBase; if (wayneDartMsg.ControlCharacter == ControlCharacter.DATA) { var crc16 = bytesWithoutCrc16.ToArray().ComputeChecksumBytesCrc16().Reverse().ToArray(); var processedBody = this.ProcessCodeTransparency(bytesWithoutCrc16); var processedCrc = this.ProcessCodeTransparency(crc16.ToList()); var _ = processedBody.Concat(processedCrc).Concat(new byte[] { 0x03, 0xFA }); return _.ToArray(); } else if (wayneDartMsg.ControlCharacter == ControlCharacter.POLL || wayneDartMsg.ControlCharacter == ControlCharacter.ACK) return bytesWithoutCrc16.Concat(new byte[] { 0xFA }).ToArray(); throw new InvalidOperationException("unhandled ControlCharacter of " + wayneDartMsg.ControlCharacter); //return bytesWithoutCrc16.Concat(new byte[] { 0x03, 0xFA }).ToArray(); } public override MessageTemplateBase Deserialize(byte[] rawData) { if (rawData.Length > 4) { // exclude last 4 byte which are (2 bytes CRC + 1 byte EOT + 1byte 0xFA) return base.Deserialize(rawData.Take(rawData.Length - 4).ToArray()); } else { // exclude last 1 byte of 0xFA return base.Deserialize(rawData.Take(rawData.Length - 1).ToArray()); } } /// /// Code transparency for 8 bit data is achieved by Data Link escape (DLE) inser-tion. /// DLE insertion is needed when any data byte or CRC has the value SF (stop flag). /// Transmitting device transmit DLE before SF is transmitted in the data field. /// Receiving device checks when receiving SF, if previous received character was DLE. /// If so DLE is over written by the received SF in the line buffer. /// Inserted DLE:s are not included in the CRC-calculation. /// /// /// private byte[] ProcessCodeTransparency(List original) { //====record 0xFA position============ var indexs = new List(); for (int i = 0; i < original.Count; i++) { if (original[i] == 0xFA) { indexs.Add(i); } } //=====end===== if (!indexs.Any()) return original.ToArray(); //var originalLen = original.Skip(2).Take(2).GetBCD(); //var newLen = (originalLen).GetBCDBytes(2); //original[2] = newLen[0]; //original[3] = newLen[1]; byte[] _ = new byte[original.Count]; original.CopyTo(_); var newList = _.ToList(); for (int i = 0; i < indexs.Count; i++) { newList.Insert(indexs[i] + i, 0x10); } return newList.ToArray(); } //private static byte[] ProcessDoubleHexFAInCRC(byte[] originalCrc) //{ // var result = new List(); // result.Add(originalCrc[0]); // if (originalCrc[0] == 0xFA) // { // result.Add(0xFA); // } // result.Add(originalCrc[1]); // if (originalCrc[1] == 0xFA) // { // result.Add(0xFA); // } // return result.ToArray(); //} //public override MessageTemplateBase Deserialize(byte[] rawData) //{ // // skip first 0xFA // return base.Deserialize(rawData.Skip(1).ToArray()); //} //public override MessageTemplateBase Deserialize(byte[] rawData, MessageTemplateBase withTemplate) //{ // // skip first 0xFA // return base.Deserialize(rawData.Skip(1).ToArray(), withTemplate); //} } }