123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- 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
- {
- /// <summary>
- /// Report a fuel stop event to Veeder Root ATG console.
- /// 'fuel stop' indicates a pump finishied a fueling.
- /// <SOH>B000000012FE0A<EOT>
- /// Event ID = 0
- /// Transmission delay = 0 seconds
- /// Selected Fueling Position = 12
- ///
- ///
- /// <SOH>B100000501FE06<EOT>
- /// Event ID = 1
- /// Transmission delay = 5 seconds
- /// Selected Fueling Position = 1
- /// </summary>
- public class StopEventReportRequest : OutgoingMessageBase
- {
- public enum FuelingInfo
- {
- NoProductsDispensed = 0,
- SingleProductDispensed = 1,
- BlendedProductsDispendsed = 2,
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="eventId">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</param>
- /// <param name="errorFlag">Range: '00' to 'FF'</param>
- /// <param name="secondsDelay">0-9999</param>
- /// <param name="fuelingPositionId">0-99</param>
- /// <param name="stopFuelingMode">no fuel dispsed, or single product dispsed, or blended products dispsed?</param>
- /// <param name="meterAndTrxDetails">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
- /// </param>
- public StopEventReportRequest(int eventId, byte errorFlag, int secondsDelay, byte fuelingPositionId,
- FuelingInfo fuelingInfo,
- List<Tuple<byte, double, double>> meterAndTrxDetails)
- {
- this.FunctionCodeRaw = "C";
- this.EventId = eventId;
- this.ErrorFlag = errorFlag;
- this.SecondsDelay = secondsDelay;
- this.FuelingPositionId = fuelingPositionId;
- this.MeterIdAndVolSetsRaw = new List<byte>();
- 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;
- }
- }
- /// <summary>
- /// </summary>
- [EnumerableFormat("%cascade", -9350)]
- public List<byte> MeterIdAndVolSetsRaw { get; set; }
- //[EnumerableFormat(4, -9300, EncodingType = EncodingType.BIN)]
- //public List<byte> CheckSumOfProceedingChars { get; set; }
- [Format(1, EncodingType.BIN, -9300)]
- public byte EOT { get; set; } = 0x04;
- }
- }
|