using Edge.Core.Parser.BinaryParser.Attributes; using Edge.Core.Parser.BinaryParser.MessageEntity; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace VeederRoot_ATG_Console.MessageEntity.DispenserInterface.Outgoing { /// /// Report a fuel stop event to Veeder Root ATG console. /// 'fuel stop' indicates a pump finishied a fueling. /// B000000012FE0A /// Event ID = 0 /// Transmission delay = 0 seconds /// Selected Fueling Position = 12 /// /// /// B100000501FE06 /// Event ID = 1 /// Transmission delay = 5 seconds /// Selected Fueling Position = 1 /// public class StopEventReportRequest : OutgoingMessageBase { public enum FuelingInfo { NoProductsDispensed = 0, SingleProductDispensed = 1, BlendedProductsDispendsed = 2, } /// /// /// /// must range from 0 - 9, rotation control is needed, Start Events and Stop Events contain event IDs to help the dispenser interface module identify transmissions that are repeated as a result of communication errors. Once an event report (start or end) is successfully transmitted, the Event Message ID must change so the next event report (start or end) will get a new ID in the range 0 - 9. An event report must keep the same ID until it is successfully transmitted. The status report does not require an ID /// Range: '00' to 'FF' /// 0-9999 /// 0-99 /// no fuel dispsed, or single product dispsed, or blended products dispsed? /// combined used with `stopFuelingMode`, Tuple`3` explained: /// 1st is meterId, Range 0-9 /// 2nd is CumulativeVol, This field is required for all meter volume reports in a stop event report, DDDDDD.DD /// 3rd is TrxVol, dddd.ddd /// public StopEventReportRequest(int eventId, byte errorFlag, int secondsDelay, byte fuelingPositionId, FuelingInfo fuelingInfo, List> meterAndTrxDetails) { this.FunctionCodeRaw = "C"; this.EventId = eventId; this.ErrorFlag = errorFlag; this.SecondsDelay = secondsDelay; this.FuelingPositionId = fuelingPositionId; this.MeterIdAndVolSetsRaw = new List(); switch (fuelingInfo) { case FuelingInfo.NoProductsDispensed: this.MeterIdAndVolSetsRaw.AddRange(Encoding.ASCII.GetBytes("0")); break; case FuelingInfo.SingleProductDispensed: if (meterAndTrxDetails == null || meterAndTrxDetails.Count != 1) throw new ArgumentOutOfRangeException("FuelingInfo indicates SingleProductDispensed, " + "then meterAndTrxDetails should only have 1 item!"); this.MeterIdAndVolSetsRaw.AddRange(Encoding.ASCII.GetBytes("1")); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item1.ToString())); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item2.ToString("0.00").PadLeft(9, '0'))); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item3.ToString("0.000").PadLeft(8, '0'))); break; case FuelingInfo.BlendedProductsDispendsed: if (meterAndTrxDetails == null || meterAndTrxDetails.Count != 2) throw new ArgumentOutOfRangeException("FuelingInfo indicates BlendedProductsDispendsed, " + "then meterAndTrxDetails should have 2 items!"); this.MeterIdAndVolSetsRaw.AddRange(Encoding.ASCII.GetBytes("2")); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item1.ToString())); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item2.ToString("0.00"))); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item3.ToString("0.000"))); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.Skip(1).First().Item1.ToString())); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.Skip(1).First().Item2.ToString("0.00"))); this.MeterIdAndVolSetsRaw.AddRange( Encoding.ASCII.GetBytes(meterAndTrxDetails.Skip(1).First().Item3.ToString("0.000"))); break; } } /// /// [EnumerableFormat("%cascade", -9350)] public List MeterIdAndVolSetsRaw { get; set; } //[EnumerableFormat(4, -9300, EncodingType = EncodingType.BIN)] //public List CheckSumOfProceedingChars { get; set; } [Format(1, EncodingType.BIN, -9300)] public byte EOT { get; set; } = 0x04; } }