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;
}
}