using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; namespace VeederRoot_ATG_Console.MessageEntity.Incoming { /// /// i|I607,油罐直径 /// public class QueryOrSetTankDiameterResponse : IncomingMessageBase { public DateTime? CurrentDateAndTime { get { if (base.FunctionCode.Item1 == MessageFormat.Display) return null; return DateTime.ParseExact( Encoding.ASCII.GetString(base.DataFieldAndOptionalCheckSumAndETX.Take(10).ToArray()), "yyMMddHHmm", CultureInfo.InvariantCulture); } } public int? TankNumberInFunctionCode { get { if (base.FunctionCode.Item1 == MessageFormat.Display) return null; var r = int.Parse(base.FunctionCode.Item3); return r; } } public IEnumerable> Diameters { get { if (base.FunctionCode.Item1 == MessageFormat.Display) return null; var result = new List>(); int elapsed = 10; while (true) { if (base.DataFieldAndOptionalCheckSumAndETX.Skip(elapsed).Count() < 10) break; var target = base.DataFieldAndOptionalCheckSumAndETX.Skip(elapsed).Take(10).ToArray(); var tankNumber = int.Parse(Encoding.ASCII.GetString(target.Take(2).ToArray())); var asciiEncodedBytes = Util.ConvertHexBcdStrToBytes(target.Skip(2).Take(8).ToArray()); var diameterInches = Util.ConvertIEEEWith4BytesToDouble(asciiEncodedBytes.ToArray()); elapsed += 10; result.Add(new Tuple(tankNumber, diameterInches)); } return result; } } public override string ToLogString() { if (base.FunctionCode.Item1 == MessageFormat.Display) return Encoding.ASCII.GetString(base.DataFieldAndOptionalCheckSumAndETX.ToArray()); return "Current DateTime: " + this.CurrentDateAndTime.Value.ToString("yyyy-MM-dd HH:mm") + ", TankNumber: " + (this?.TankNumberInFunctionCode ?? -1) + " with Diameters list(tankNumber:diameter)-> " + (this.Diameters != null && this.Diameters.Any() ? this.Diameters.Select(p => p.Item1 + ":" + p.Item2).Aggregate((acc, n) => acc + ", " + n) : ""); } } }