using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; using Wayne.Lib.StateEngine; using Wayne.Lib.StateEngine.Generic; namespace SinochemInternetPlusApp.States.CarPlateMode { public class SendWelcomeScreen : TimeoutState { private byte sqNo; private bool bigScreenReplied = false; private bool cardReaderReplied = false; private int? requestId; protected override void Enter(StateEntry stateEntry, ref Transition transition) { base.Enter(stateEntry, ref transition); Main.CurrentEpsTrx.UpdateTrxStatusToDb(EpsTrxStatus.BeforeFueling); bigScreenReplied = false; cardReaderReplied = false; DebugLog($"为车牌号: {Main.CurrentEpsTrx.Model.car_number}, 卡号: {Main.CurrentEpsTrx.Model.card_no} 发送欢迎屏幕"); if (Main.Eps.CarPlateHandler != null) { string text = CreateDisplayWelcomeCommand(Main.CurrentEpsTrx.Model); DebugLog(text); Main.Eps.CarPlateHandler.BroadcastMessageViaFdc(text); if (requestId.HasValue) { DebugLog($"Adding RequestId: {requestId.Value} to the list"); Main.AddRequestId(requestId.Value); } } Main.SendICCardDisplay(Main.CurrentEpsTrx.Model.car_number, out sqNo); } protected override void HandleNonTimeoutEvent(StateEngineEvent stateEngineEvent, ref Transition transition) { if (stateEngineEvent.Type.Equals(EventType.DisplayResponseReceived)) { var e = stateEngineEvent as GenericEvent; if (e != null && e.EventArgs != null) { if (requestId.HasValue && requestId.Value == e.EventArgs.DispResponse.RequestId) { e.Handled = true; bigScreenReplied = true; if (Main.ContainsRequestId(requestId.Value)) { DebugLog($"Removed RequestId: {requestId.Value} from the list"); Main.RemoveRequestId(requestId.Value); } requestId = null; } } } var ackEvent = stateEngineEvent as GenericEvent; if (ackEvent != null && ackEvent.EventArgs != null) { if (ackEvent.EventArgs.Ack.MessageSeqNumber == sqNo) { ackEvent.Handled = true; cardReaderReplied = true; } } if (bigScreenReplied && cardReaderReplied) { //Main.PrepareCardReaderResetToCarPlateIdle(); transition = new Transition(this, TransitionType.Done); } } protected override void Timeout(ref Transition transition) { transition = new Transition(this, TransitionType.Timeout); } protected override int TimeoutInterval => TimeoutValues.GetValueInMilliSec(TimeoutValues.FuelingPoint.CarPlateMode_SendWelcomeScreen, 20); private string CreateDisplayWelcomeCommand(EpsTransactionModel epsTrxModel) { Display display; string cmdText = ""; XmlSerializer serializer = new XmlSerializer(typeof(Display)); MemoryStream ms; StreamReader sr; display = new Display(); display.ScreenType = ScreenType.Welcome; display.RequestId = Main.Eps.GetNextRequestId(); requestId = display.RequestId; display.MemberInfo = new DisplayMemberInfo { LicensePlateNo = epsTrxModel.car_number, Id = "" // empty for now }; display.PumpInfo = new DisplayPumpInfo { Id = 1, NozzleId = epsTrxModel.jihao }; ms = new MemoryStream(); serializer.Serialize(ms, display); ms.Position = 0; sr = new StreamReader(ms, true); cmdText = sr.ReadToEnd(); ms.Close(); sr.Close(); return cmdText; } } }