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;
namespace Gilbarco_Pump
{
public class Parser : ParserBase
{
public Parser() : base(MessageTemplateLookup.Default)
{
}
public override byte[] Serialize(Edge.Core.Parser.BinaryParser.MessageEntity.MessageTemplateBase message)
{
var fullBytes = base.Serialize(message).ToList();
var validatingParts = fullBytes.Skip(1).Take(fullBytes.Count - 1);
// skip the first of 0xFA.
var checksum = CaculateCheckSum(validatingParts.ToArray());
var _ = fullBytes.Concat(new byte[] { checksum });
return _.ToArray();
}
public override Edge.Core.Parser.BinaryParser.MessageEntity.MessageTemplateBase Deserialize(byte[] rawData)
{
var m = base.Deserialize(rawData.Take(rawData.Length - 1).ToArray()) as Gilbarco_Pump.MessageTemplateBase;
m.CheckSum = rawData.Last();
return m;
}
///
/// 转义字符:0FAH;在数据里每两个 0FAH 替换为一个 0FAH;在目标地址、源地址、帧号/控制、
///有效数据长度中不能出现 0FAH,转义字符不计入 CRC 中,CRC 中采用转义。
///
///
///
public static byte[] ProcessDoubleHexFAInMsgBody(List original)
{
//====record 0xFA position============
var indexs = new List();
for (int i = 6; i < original.Count; i++)
{
if (original[i] == 0xFA)
{
indexs.Add(i);
}
}
//=====end=====
if (!indexs.Any()) return original.ToArray();
var originalLen = original.Skip(4).Take(2).GetBCD();
//var newLen = (originalLen + indexs.Count).GetBCDBytes(2);
var newLen = (originalLen).GetBCDBytes(2);
original[4] = newLen[0];
original[5] = 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, 0xFA);
}
return newList.ToArray();
}
public 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 static byte CaculateCheckSum(byte[] bytes)
{
var lowerSum = 0;
var higherSum = 0;
for (int i = 0; i < bytes.Length; i++)
{
lowerSum += bytes[i] & 0x0F;
higherSum += (bytes[i] & 0xF0) >> 4;
}
return (byte)(lowerSum ^ higherSum);
}
}
}