StopEventReportRequest.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Edge.Core.Parser.BinaryParser.Attributes;
  2. using Edge.Core.Parser.BinaryParser.MessageEntity;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. namespace VeederRoot_ATG_Console.MessageEntity.DispenserInterface.Outgoing
  8. {
  9. /// <summary>
  10. /// Report a fuel stop event to Veeder Root ATG console.
  11. /// 'fuel stop' indicates a pump finishied a fueling.
  12. /// <SOH>B000000012FE0A<EOT>
  13. /// Event ID = 0
  14. /// Transmission delay = 0 seconds
  15. /// Selected Fueling Position = 12
  16. ///
  17. ///
  18. /// <SOH>B100000501FE06<EOT>
  19. /// Event ID = 1
  20. /// Transmission delay = 5 seconds
  21. /// Selected Fueling Position = 1
  22. /// </summary>
  23. public class StopEventReportRequest : OutgoingMessageBase
  24. {
  25. public enum FuelingInfo
  26. {
  27. NoProductsDispensed = 0,
  28. SingleProductDispensed = 1,
  29. BlendedProductsDispendsed = 2,
  30. }
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. /// <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>
  35. /// <param name="errorFlag">Range: '00' to 'FF'</param>
  36. /// <param name="secondsDelay">0-9999</param>
  37. /// <param name="fuelingPositionId">0-99</param>
  38. /// <param name="stopFuelingMode">no fuel dispsed, or single product dispsed, or blended products dispsed?</param>
  39. /// <param name="meterAndTrxDetails">combined used with `stopFuelingMode`, Tuple`3` explained:
  40. /// 1st is meterId, Range 0-9
  41. /// 2nd is CumulativeVol, This field is required for all meter volume reports in a stop event report, DDDDDD.DD
  42. /// 3rd is TrxVol, dddd.ddd
  43. /// </param>
  44. public StopEventReportRequest(int eventId, byte errorFlag, int secondsDelay, byte fuelingPositionId,
  45. FuelingInfo fuelingInfo,
  46. List<Tuple<byte, double, double>> meterAndTrxDetails)
  47. {
  48. this.FunctionCodeRaw = "C";
  49. this.EventId = eventId;
  50. this.ErrorFlag = errorFlag;
  51. this.SecondsDelay = secondsDelay;
  52. this.FuelingPositionId = fuelingPositionId;
  53. this.MeterIdAndVolSetsRaw = new List<byte>();
  54. switch (fuelingInfo)
  55. {
  56. case FuelingInfo.NoProductsDispensed:
  57. this.MeterIdAndVolSetsRaw.AddRange(Encoding.ASCII.GetBytes("0"));
  58. break;
  59. case FuelingInfo.SingleProductDispensed:
  60. if (meterAndTrxDetails == null || meterAndTrxDetails.Count != 1)
  61. throw new ArgumentOutOfRangeException("FuelingInfo indicates SingleProductDispensed, " +
  62. "then meterAndTrxDetails should only have 1 item!");
  63. this.MeterIdAndVolSetsRaw.AddRange(Encoding.ASCII.GetBytes("1"));
  64. this.MeterIdAndVolSetsRaw.AddRange(
  65. Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item1.ToString()));
  66. this.MeterIdAndVolSetsRaw.AddRange(
  67. Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item2.ToString("0.00").PadLeft(9, '0')));
  68. this.MeterIdAndVolSetsRaw.AddRange(
  69. Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item3.ToString("0.000").PadLeft(8, '0')));
  70. break;
  71. case FuelingInfo.BlendedProductsDispendsed:
  72. if (meterAndTrxDetails == null || meterAndTrxDetails.Count != 2)
  73. throw new ArgumentOutOfRangeException("FuelingInfo indicates BlendedProductsDispendsed, " +
  74. "then meterAndTrxDetails should have 2 items!");
  75. this.MeterIdAndVolSetsRaw.AddRange(Encoding.ASCII.GetBytes("2"));
  76. this.MeterIdAndVolSetsRaw.AddRange(
  77. Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item1.ToString()));
  78. this.MeterIdAndVolSetsRaw.AddRange(
  79. Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item2.ToString("0.00")));
  80. this.MeterIdAndVolSetsRaw.AddRange(
  81. Encoding.ASCII.GetBytes(meterAndTrxDetails.First().Item3.ToString("0.000")));
  82. this.MeterIdAndVolSetsRaw.AddRange(
  83. Encoding.ASCII.GetBytes(meterAndTrxDetails.Skip(1).First().Item1.ToString()));
  84. this.MeterIdAndVolSetsRaw.AddRange(
  85. Encoding.ASCII.GetBytes(meterAndTrxDetails.Skip(1).First().Item2.ToString("0.00")));
  86. this.MeterIdAndVolSetsRaw.AddRange(
  87. Encoding.ASCII.GetBytes(meterAndTrxDetails.Skip(1).First().Item3.ToString("0.000")));
  88. break;
  89. }
  90. }
  91. /// <summary>
  92. /// </summary>
  93. [EnumerableFormat("%cascade", -9350)]
  94. public List<byte> MeterIdAndVolSetsRaw { get; set; }
  95. //[EnumerableFormat(4, -9300, EncodingType = EncodingType.BIN)]
  96. //public List<byte> CheckSumOfProceedingChars { get; set; }
  97. [Format(1, EncodingType.BIN, -9300)]
  98. public byte EOT { get; set; } = 0x04;
  99. }
  100. }