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 LanTian_Sinopec_PumpIcCardReader { /// /// 加油机发送实时信息命令 /// 加油机将实时信息发送给 PC 机;在加油机主动方式下,加油机定时与 PC 机进行的握手通讯; /// 加油机发送实时信息命令31H /// public class PumpRealTimeStateEvent : KaJiLianDongV11MessageTemplateBase { [Format(1, EncodingType.BIN, 1)] public byte SubMessageCount { get; set; } // minus 3 which include [EnumerableFormat("DataLength", "-2", 2, EncodingType = EncodingType.BIN)] public List SubMessageRaw { get; set; } public override string ToLogString() { var result = "PumpRealTimeStateEvent, SubMessageCount= " + this.SubMessageCount.ToString() + "." + System.Environment.NewLine; if (this.NozzleOperatingStates != null && this.NozzleOperatingStates.Any()) foreach (var n in this.NozzleOperatingStates) result += n.ToLogString() + Environment.NewLine; if (this.CardInsertedStates != null && this.CardInsertedStates.Any()) foreach (var c in this.CardInsertedStates) result += c.ToLogString() + Environment.NewLine; return result; //var offset = 0; //for (int i = 0; i < SubMessageCount; i++) //{ // //1:卡插入;2:抬枪或加油中 // if (SubMessageRaw[offset] == 1) // { // var restLen = SubMessageRaw[offset + 2]; // Parser parser = new Parser(); // var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(3 + restLen).ToArray(), // (MessageTemplateBase)Activator.CreateInstance(typeof(PumpStateChangeCardInsertedSubState))) as PumpStateChangeCardInsertedSubState; // offset += 3 + restLen; // result += "CardInserted: cardNo->" + cardSubMsg.ASN卡应用号 + ", nozzleNo->" + cardSubMsg.MZN枪号 + // ", cardBalance->" + cardSubMsg.BAL余额.ToString(); // } // else if (SubMessageRaw[offset] == 2) // { // Parser parser = new Parser(); // var nozzleSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(11).ToArray(), // (MessageTemplateBase)Activator.CreateInstance(typeof(PumpStateChangeNozzleOperatingSubState))) as PumpStateChangeNozzleOperatingSubState; // offset += 11; // result += "NozzleChanged: nozzleNo->" + nozzleSubMsg.MZN枪号 + ", vol->" + nozzleSubMsg.VOL升数 + ", amount->" + nozzleSubMsg.AMN数额 // + ", price->" + nozzleSubMsg.PRC价格; // } // else // { // throw new ArgumentException("只有两种状态需要上传信息。1:卡插入;2:抬枪或加油中, there're neither 1 nor 2 in msg"); // } //} //return result; } public List CardInsertedStates { get { return this.ParseSubMessages(this.SubMessageRaw, this.SubMessageCount).Item1; } } public List NozzleOperatingStates { get { return this.ParseSubMessages(this.SubMessageRaw, this.SubMessageCount).Item2; } } private Tuple, List> ParseSubMessages(List SubMessageRaw, byte SubMessageCount) { var combinedResult = new Tuple, List>( new List(), new List()); var offset = 0; for (int i = 0; i < SubMessageCount; i++) { //1:卡插入;2:抬枪或加油中 if (SubMessageRaw[offset] == 1) { var restLen = SubMessageRaw[offset + 2]; Parser parser = new Parser(); var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(3 + restLen).ToArray(), (MessageTemplateBase)Activator.CreateInstance(typeof(CardInsertedState))); combinedResult.Item1.Add(cardSubMsg as CardInsertedState); offset += 3 + restLen; } else if (SubMessageRaw[offset] == 2) { Parser parser = new Parser(); var cardSubMsg = parser.Deserialize(SubMessageRaw.Skip(offset).Take(11).ToArray(), (MessageTemplateBase)Activator.CreateInstance(typeof(NozzleOperatingState))); combinedResult.Item2.Add(cardSubMsg as NozzleOperatingState); offset += 11; } else { throw new ArgumentException("只有两种状态需要上传信息。1:卡插入;2:抬枪或加油中, there're neither 1 nor 2 in msg"); } } return combinedResult; } } }