123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.Linq;
- using System.Text;
- namespace VeederRoot_ATG_Console.MessageEntity.Incoming
- {
- /// <summary>
- /// i|IA01,Probe Type and Serial Number
- /// </summary>
- public class QueryInTankDiagnosticReportResponse : 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<ProbeInfo> Probes
- {
- get
- {
- if (base.FunctionCode.Item1 == MessageFormat.Display)
- return null;
- // skip 10 bytes of current date and time
- var rawDataBody = base.DataFieldAndOptionalCheckSumAndETX.Skip(10)
- //and exclude tail of -> && + 4 bytes check sum + ETX <- which is total 7 bytes.
- .Take(base.DataFieldAndOptionalCheckSumAndETX.Count - 10 - 7);
- var result = new List<ProbeInfo>();
- int elapsed = 0;
- while (true)
- {
- var buffer = rawDataBody.Skip(elapsed);
- if (!buffer.Any()) break;
- result.Add(new ProbeInfo(buffer.Take(27).ToArray()));
- elapsed += 27;
- }
- 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:probeLength:probeSerialNo.)-> "
- + (this.Probes != null && this.Probes.Any() ?
- this.Probes.Select(p => p.TankNumber + ":" + p.ProbeLength + ":" + p.ProbeSerialNumber).Aggregate((acc, n) => acc + ", " + n)
- : "");
- }
- public class ProbeInfo
- {
- public enum ProbeType
- {
- CAP0 = 1,
- CAP1 = 2,
- MAG1 = 3,
- }
- private byte[] bytes;
- public ProbeInfo(byte[] bytes)
- {
- if (bytes == null || bytes.Length != 27)
- throw new ArgumentException("must not null and length must equals 27");
- this.bytes = bytes;
- }
- public int TankNumber
- {
- get
- {
- var r = int.Parse(Encoding.ASCII.GetString(this.bytes.Take(2).ToArray()));
- return r;
- }
- }
- public char? ProductCode
- {
- get
- {
- return
- Encoding.ASCII.GetString(
- this.bytes.Skip(2).Take(1).ToArray())[0];
- }
- }
- public ProbeType Type
- {
- get
- {
- var _ = Enum.Parse(typeof(ProbeType),
- Encoding.ASCII.GetString(this.bytes.Skip(3).Take(2).ToArray()));
- return (ProbeType)_;
- }
- }
- public string CircuitCode
- {
- get
- {
- return Encoding.ASCII.GetString(this.bytes.Skip(5).Take(4).ToArray());
- }
- }
- public double ProbeLength
- {
- get
- {
- var asciiEncodedBytes = Util.ConvertHexBcdStrToBytes(this.bytes.Skip(9).Take(8).ToArray());
- var dataValue =
- Util.ConvertIEEEWith4BytesToDouble(asciiEncodedBytes.ToArray());
- return dataValue;
- }
- }
- public string ProbeSerialNumber
- {
- get
- {
- return Encoding.ASCII.GetString(this.bytes.Skip(17).Take(6).ToArray());
- }
- }
- public string ProbeDateCode
- {
- get
- {
- return Encoding.ASCII.GetString(this.bytes.Skip(23).Take(4).ToArray());
- }
- }
- }
- }
- }
|