using SinochemCarplateService.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Serialization; using Wayne.Lib; using Wayne.Lib.StateEngine; using Wayne.Lib.StateEngine.Generic; using WayneChina_IcCardReader_SinoChem.MessageEntity.Incoming; using WayneChina_IcCardReader_SinoChem.MessageEntity.Outgoing; namespace SinochemInternetPlusApp.States { class Idle : TimeoutState { int screen = 0; private int idleRequestId; private int trxOpRequestId; private List trxList; private byte? sqNo = null; private byte sqNo1; public Idle() { } protected override void Enter(StateEntry stateEntry, ref Transition transition) { base.Enter(stateEntry, ref transition); if (Main.CardReaderDisabled) { Main.OpenCardReader(out sqNo); if (sqNo.HasValue) Main.IdleStateCardReaderSqNo = sqNo.Value; } if (Main.Eps.CarPlateHandler != null) { int remainder = screen % 5; if (remainder == 0) { //Send Welcome Message var text = CreateDisplayIdleCommand(); DebugLog(text); Main.Eps.CarPlateHandler.BroadcastMessageViaFdc(text); if (!Main.ContainsRequestId(idleRequestId)) { DebugLog($"Adding RequestId: {idleRequestId} to the list in Idle"); Main.AddRequestId(idleRequestId); } } else if (remainder == 1) { var text = CreateDisplayWelcomeCommand(); DebugLog(text); Main.Eps.CarPlateHandler.BroadcastMessageViaFdc(text); } else { var text = CreateDisplayTrxListCommand(remainder); DebugLog(text); Main.Eps.CarPlateHandler.BroadcastMessageViaFdc(text); if (remainder == 4) { var text1 = CreateDisplayTrxResultCommand(screen); DebugLog(text1); Main.Eps.CarPlateHandler.BroadcastMessageViaFdc(text1); } } //used for 15" screen test //screen++; } } protected override void HandleNonTimeoutEvent(StateEngineEvent stateEngineEvent, ref Transition transition) { if (stateEngineEvent.Type is EventType) { switch ((EventType)stateEngineEvent.Type) { case EventType.NozzleLifted: var nlEvent = stateEngineEvent as GenericEvent; Main.CurrentNozzleId = nlEvent.EventArgs.NozzleId; transition = new Transition(this, TransitionType.NozzleLifted); stateEngineEvent.Handled = true; break; case EventType.CarPlateScanned: Main.DebugLogger.Add("Recieved new car license plate number"); ////Show Welcome Message & Pending for Fueling var genericEvent = stateEngineEvent as GenericEvent; //Main.CurrentNozzleId var bindNozzleId= Convert.ToInt32(genericEvent.EventArgs.gun); Main.NewEpsTrx = EpsTransaction.CreateEpsTrx(bindNozzleId, EpsTransactionMode.CarPlateMode, Main.DebugLogger); Main.NewEpsTrx.Model.car_number = genericEvent.EventArgs.car_Number; Main.NewEpsTrx.Model.cardNo_masked = genericEvent.EventArgs.card_No; Main.NewEpsTrx.Model.youpin = genericEvent.EventArgs.oilName; Main.NewEpsTrx.Model.ttc = genericEvent.EventArgs.ttc; Main.NewEpsTrx.Model.balance_before_trx = genericEvent.EventArgs.amount; Main.NewEpsTrx.Model.token = genericEvent.EventArgs.token; Main.NewEpsTrx.Model.tid = genericEvent.EventArgs.tid; Main.NewEpsTrx.Model.xf_date = DateTime.Parse(DateTime.Now.Date.ToString("yyyy-MM-dd")); Main.NewEpsTrx.SaveToDb(); Main.ClearAllRequestIds(); transition = new Transition(this, TransitionType.CarPlateScanned); stateEngineEvent.Handled = true; break; case EventType.ShutdownRequest: transition = new Transition(this, TransitionType.Shutdown); stateEngineEvent.Handled = true; break; case EventType.DisplayResponseReceived: { var e = stateEngineEvent as GenericEvent; if (e != null && e.EventArgs != null) { if (idleRequestId == e.EventArgs.DispResponse.RequestId || trxOpRequestId == e.EventArgs.DispResponse.RequestId) { e.Handled = true; var reqId = e.EventArgs.DispResponse.RequestId; if (Main.ContainsRequestId(reqId)) { Main.RemoveRequestId(reqId); DebugLog($"Removed RequestId : {reqId} from the list"); } } } } break; case EventType.ReaderStateChanged: { var e = stateEngineEvent as GenericEvent; if (e != null && e.EventArgs != null) { if (e.EventArgs.CardReaderState.State == CardReaderState.CardInserted) { e.Handled = true; transition = new Transition(this, TransitionType.CardInserted); } else if (e.EventArgs.CardReaderState.State == CardReaderState.Idle) { e.Handled = true; Main.RemovePendingBalanceResult(); return; } } } break; case EventType.CardReaderAck: { var e = stateEngineEvent as GenericEvent; if (sqNo.HasValue) { e.Handled = true; sqNo = null; Main.CardReaderDisabled = false; } else { if (e.EventArgs.Ack.MessageSeqNumber == sqNo1) { DebugLog("Ack for the wrong online verification"); } //Meaningless ack from card reader, handle it anyway... DebugLog("Received an ack which is not expected..."); stateEngineEvent.Handled = true; sqNo = null; } } break; case EventType.FuelingDone: var fdEvent = stateEngineEvent as GenericEvent; if (fdEvent != null && fdEvent.EventArgs != null) { var nozzleId = fdEvent.EventArgs.NozzleId; var liushuino = fdEvent.EventArgs.FuelingSqNo; var amount = fdEvent.EventArgs.Amount; var authId = fdEvent.EventArgs.AuthId; DebugLog(string.Format($"Floating fuel trx, liushuihao({liushuino}), amount({amount}), authId({authId})")); MultiFusionsSupport.CopyXiaofei2ToTargetFusion(nozzleId, Convert.ToString(liushuino), Main.DebugLogger); fdEvent.Handled = true; } break; case EventType.OnlineVerification: Main.DebugLogger.Add("Unexpected online verification in Idle"); stateEngineEvent.Handled = true; var result = new CardOnlineVerificationResultRequest(VerificationResult.Failure, 0, "处理错误"); Main.SendCommand(result, out sqNo1); break; default: DebugLog("ATTENTION unhandled event " + stateEngineEvent); stateEngineEvent.Handled = true; break; } } //Main.ActiveTrx = EpsTransactionQuery.GetValidCarPlateEpsTrxModels( // Main.GetAllNozzlesOnThisSide(), // ConfigurationValues.AlreadyDoneEpsTrxCountPerDisplay, // Main.DebugLogger); //if (Main.NewEpsTrx != null) // Main.NewEpsTrx.Model.AvailableNozzleGrade = Main.Eps.NozzleMappingGradeName(); } protected override void Timeout(ref Transition transition) { transition = new Transition(this, TransitionType.Done); } protected override int TimeoutInterval => TimeoutValues.GetValueInMilliSec(TimeoutValues.FuelingPoint.Idle, 15); private string CreateDisplayIdleCommand() { Display display; string cmdText = ""; XmlSerializer serializer = new XmlSerializer(typeof(Display)); MemoryStream ms; StreamReader sr; display = new Display { ScreenType = ScreenType.Idle, RequestId = Main.Eps.GetNextRequestId(), TimeoutSpecified = true, Timeout = TimeoutValues.GetValueInSec(TimeoutValues.Misc.BigScreenBackToIdle, 300) }; idleRequestId = display.RequestId; display.CompanyContactInfo = new DisplayCompanyContactInfo { Tel = "010-59569575", Address = "世界500强企业\n中国第四大国家石油公司" }; display.StationInfo = new DisplayStationInfo { StationNo = Main.StationNo, StationName = Main.StationName }; display.PumpInfo = new DisplayPumpInfo { Id = 1, NozzleId = Main.AssociatedNozzles.First() }; ms = new MemoryStream(); serializer.Serialize(ms, display); ms.Position = 0; sr = new StreamReader(ms, true); cmdText = sr.ReadToEnd(); return cmdText; } #region Used for 15" screen debug private string CreateDisplayWelcomeCommand() { Display display; string cmdText = ""; XmlSerializer serializer = new XmlSerializer(typeof(Display)); MemoryStream ms; StreamReader sr; display = new Display(); display.ScreenType = ScreenType.Welcome; display.TimeoutSpecified = true; display.Timeout = 10; display.PumpInfo = new DisplayPumpInfo { Id = 1, NozzleId = 1 }; display.MemberInfo = new DisplayMemberInfo { LicensePlateNo = "京NS1695",//epsTrxModel.car_number, Id = "" //epsTrxModel.card_no }; ms = new MemoryStream(); serializer.Serialize(ms, display); ms.Position = 0; sr = new StreamReader(ms, true); cmdText = sr.ReadToEnd(); return cmdText; } private string CreateDisplayTrxListCommand(int screen) { Display display; string cmdText = ""; XmlSerializer serializer = new XmlSerializer(typeof(Display)); MemoryStream ms; StreamReader sr; display = new Display(); display.ScreenType = ScreenType.ShowTrxList; display.TimeoutSpecified = true; display.Timeout = 10; display.PumpInfo = new DisplayPumpInfo { Id = 1, NozzleId = 1 }; var state = TrxStatus.ReadyForFillingStart; if (screen == 2) { state = TrxStatus.ReadyForFillingStart; display.Timeout = 30; } else if (screen == 3) state = TrxStatus.PendingForPayment; else if (screen == 4) state = TrxStatus.Success; display.TrxList = new DisplayTrx[trxList.Count]; for (int i = 0; i < trxList.Count; i++) { display.TrxList[i] = Main.Eps.ConvertEpsTrxModelToDisplayTrx(trxList[i]); } display.TrxList[0].State = state; ms = new MemoryStream(); serializer.Serialize(ms, display); ms.Position = 0; sr = new StreamReader(ms, true); cmdText = sr.ReadToEnd(); return cmdText; } private string CreateDisplayTrxResultCommand(int i) { Display display; string cmdText = ""; XmlSerializer serializer = new XmlSerializer(typeof(Display)); MemoryStream ms; StreamReader sr; display = new Display(); display.ScreenType = ScreenType.TrxResult; display.TimeoutSpecified = true; display.Timeout = 10; display.PumpInfo = new DisplayPumpInfo { Id = 1, NozzleId = 1 }; display.TrxList = new DisplayTrx[] { new DisplayTrx { Id = "200", State = TrxStatus.Success, MemberInfo = new DisplayTrxMemberInfo { LicensePlateNo = "京NS1695",//epsTrxModel.car_number, Id = "1234567"//epsTrxModel.card_no }, FillingInfo = new DisplayTrxFillingInfo { PumpId = 1, NozzleId = 1, ProductNo = 1, ProductDiscription = "92#", Amount = 105, Volume = 18.90m } } }; ms = new MemoryStream(); serializer.Serialize(ms, display); ms.Position = 0; sr = new StreamReader(ms, true); cmdText = sr.ReadToEnd(); ms.Close(); sr.Close(); return cmdText; } #endregion } }