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