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)
: "");
}
}
}