using Edge.Core.Parser.BinaryParser.Attributes; using System; using System.Collections.Generic; namespace PetroChinaOnlineWatchPlugin.MessageEntity.Outgoing { public abstract class IfsfMessageDataOut { [Format(1, EncodingType.BIN, -9890)] public byte DataIdentifier { get; set; } [Format(1, EncodingType.BIN, -9880)] public int DataLength { get; protected set; } protected List BcdToBytes(decimal data, int bcdDigits) { byte bin8Data = 0; bin8Data = (byte)(data < 0 ? (bin8Data | 0x80) : (bin8Data & 0x00)); string strBcd = Math.Abs(data).ToString(); int index = strBcd.IndexOf('.'); bin8Data = (byte)(bin8Data + (index >= 0 ? index : strBcd.Length)); var buffer = new List() { bin8Data }; //2 digits per byte int divisor = 2; strBcd = strBcd.Replace(".", "").PadRight(bcdDigits, '0'); for (int i = 0; i < strBcd.Length;) { byte d = Convert.ToByte(strBcd.Substring(i, divisor), 16); buffer.Add(d); i += divisor; } return buffer; } } public class DateTimeMessage : IfsfMessageDataOut { [Format(7, EncodingType.BcdString, -9870)] public string Data { get; protected set; } public DateTimeMessage(byte dataId, object objData) { base.DataIdentifier = dataId; string strData = objData.ToString(); DateTime data = DateTime.Parse(string.IsNullOrEmpty(strData) ? "2000-01-01 00:00:00" : strData); Data = data.ToString("yyyyMMddHHmmss"); base.DataLength = Data.Length / 2; } public override string ToString() { return $"{DataIdentifier} {DataLength} {Data}"; } } public class Bin8Bcd4Message : IfsfMessageDataOut { [EnumerableFormat("%cascade", -9870)] public List Bcd4Data { get; protected set; } public Bin8Bcd4Message(byte dataId, object objData) { base.DataIdentifier = dataId; string strData = objData.ToString(); decimal data = decimal.Parse(string.IsNullOrEmpty(strData) ? "0" : strData); Bcd4Data = BcdToBytes(data, 4); base.DataLength = Bcd4Data.Count; } public override string ToString() { return $"{DataIdentifier} {DataLength} {Bcd4Data}"; } } public class Bin8Bcd6Message : IfsfMessageDataOut { [EnumerableFormat("%cascade", -9870)] public List Bcd6Data { get; protected set; } public Bin8Bcd6Message(byte dataId, object objData) { base.DataIdentifier = dataId; string strData = objData.ToString(); decimal data = decimal.Parse(string.IsNullOrEmpty(strData) ? "0" : strData); Bcd6Data = BcdToBytes(data, 6); base.DataLength = Bcd6Data.Count; } public override string ToString() { return $"{DataIdentifier} {DataLength} {Bcd6Data}"; } } public class Bin8Bcd8Message : IfsfMessageDataOut { [EnumerableFormat("%cascade", -9870)] public List Bcd8Data { get; protected set; } public Bin8Bcd8Message(byte dataId, object objData) { base.DataIdentifier = dataId; string strData = objData.ToString(); decimal data = decimal.Parse(string.IsNullOrEmpty(strData) ? "0" : strData); Bcd8Data = BcdToBytes(data, 8); base.DataLength = Bcd8Data.Count; } public override string ToString() { return $"{DataIdentifier} {DataLength} {Bcd8Data}"; } } public class Bcd4Message : IfsfMessageDataOut { [Format(2, EncodingType.BCD, -9870)] public int Bcd4Data { get; protected set; } public Bcd4Message(byte dataId, object objData) { base.DataIdentifier = dataId; string strData = objData.ToString(); int data = int.Parse(string.IsNullOrEmpty(strData) ? "0" : strData); Bcd4Data = data; base.DataLength = 2; } public override string ToString() { return $"{DataIdentifier} {DataLength} {Bcd4Data}"; } } public class Bin8Message : IfsfMessageDataOut { [Format(1, EncodingType.BIN, -9870)] public byte Bin8Data { get; protected set; } public Bin8Message(byte dataId, object objData) { base.DataIdentifier = dataId; string strData = objData.ToString(); byte data = byte.Parse(string.IsNullOrEmpty(strData) ? "0" : strData); Bin8Data = data; base.DataLength = 1; } public override string ToString() { return $"{DataIdentifier} {DataLength} {Bin8Data}"; } } }