using Edge.Core.Parser.BinaryParser.MessageEntity; using Edge.Core.Parser.BinaryParser.Attributes; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Edge.Core.Parser.BinaryParser.Util; namespace Wayne_Pump_Dart.MessageEntity { public enum ControlCharacter { POLL = 0x20, DATA = 0x30, ACK = 0xC0, NAK = 0x50, EOT = 0x70, AckPoll = 0xE0, } public class MessageBase : MessageTemplateBase { /// /// physical pump side address, must range from 0x50 to 0x6F /// [Format(1, EncodingType.BIN, -9999)] [Range(0x50, 0x6F, "Wayne Dart pump address must be range from {1} to {2}, but actual is {0}")] public byte Adrs { get; set; } [Format(1, EncodingType.BIN, -9950)] public byte CtrlCharAndBlockSeqNoRaw { get; set; } /// /// high 4 bits of ControlCharacterAndBlockSeqNumberRaw. /// public ControlCharacter ControlCharacter { get { var r = Enum.ToObject(typeof(ControlCharacter), CtrlCharAndBlockSeqNoRaw & 0xF0); return (ControlCharacter)r; } set { this.CtrlCharAndBlockSeqNoRaw = this.CtrlCharAndBlockSeqNoRaw.SetBit(4, 7, (int)value >> 4); } } /// /// from low 4 bits of ControlCharacterAndBlockSeqNumberRaw, range from 0x00 to 0x0F. /// public byte BlockSeqNumber { get { return (byte)(CtrlCharAndBlockSeqNoRaw & 0x0F); } set { this.CtrlCharAndBlockSeqNoRaw = this.CtrlCharAndBlockSeqNoRaw.SetBit(0, 3, (int)value); } } [EnumerableFormat("%cascade", -9920)] public List TransactionDatas { get; set; } //[EnumerableFormat(4, 9999)] //public virtual List CRC_ETX_SF { get; set; } public override string ToLogString() { if (this.ControlCharacter == ControlCharacter.EOT) return "EOT(Adrs: 0x" + this.Adrs.ToString("X").PadLeft(2, '0') + ", SeqNo: 0x" + this.BlockSeqNumber.ToString("X").PadLeft(2, '0') + ")"; else if (this.ControlCharacter == ControlCharacter.ACK) return "ACK(Adrs: 0x" + this.Adrs.ToString("X").PadLeft(2, '0') + ", SeqNo: 0x" + this.BlockSeqNumber.ToString("X").PadLeft(2, '0') + ")"; else return base.ToLogString(); } } public class TransactionData : IFormattable { [Format(1, EncodingType.BIN, -9999)] public byte TransactionNumber { get; set; } [Format(1, EncodingType.BIN, -9990)] public int Length { get; set; } [EnumerableFormat("Length", -9950)] public List RawData { get; set; } public string ToString(string format, IFormatProvider formatProvider) { /* these TransactioNumber have different meanings for request and response, here the implementation is only for response(from pump to FC) */ // Pump status if (this.TransactionNumber == 1) { switch (this.RawData.First()) { case 0: return "PUMP NOT PROGRAMMED"; case 1: return "RESET"; case 2: return "AUTHORIZED"; case 4: return "FILLING"; case 5: return "FILLING COMPLETED"; case 6: return "MAX AMOUNT/VOLUME REACHED"; case 7: return "SWITCHED OFF"; case 8: return "SUSPENDED"; } } // Filled volume and amount else if (this.TransactionNumber == 2) { return "Filled volume and amount"; } // Nozzle status and filling price else if (this.TransactionNumber == 3) { return "Nozzle status and filling price"; } // Total Counters else if (this.TransactionNumber == 0x65) { return "Total Counters"; } return ""; } } }