using System; using System.Collections.Generic; using System.Linq; 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.Shared { class Fueling : State { private byte sqNo; protected override void Enter(StateEntry stateEntry, ref Transition transition) { base.Enter(stateEntry, ref transition); MultiFusionsSupport.UpdateJyInfoToTargetFusionWhenFuelingStarted(Main.CurrentNozzleId, Main.DebugLogger); // should be busy } protected override void HandleEvent(StateEngineEvent stateEngineEvent, ref Transition transition) { base.HandleEvent(stateEngineEvent, ref transition); if (stateEngineEvent.Type is EventType) { switch ((EventType)stateEngineEvent.Type) { case EventType.NozzleReplaced: MultiFusionsSupport.CopyJyInfoToTargetFusion(Main.CurrentNozzleId, Main.DebugLogger); // should be free if (Main.CurrentEpsTrx != null ) { var epsTrxModel = EpsTransactionQuery.RefreshEpsTrx(Main.CurrentEpsTrx.Model.id); Main.DebugLogger.Add($"NozzleReplaced, CurrentEpsTrx.jihao = {Main.CurrentEpsTrx.Model.jihao}, " + $"epsTrxModel.jihao = {epsTrxModel.jihao}, CurrentNozzleId: {Main.CurrentNozzleId}"); var associateNozzles = Main.Eps.GetFp(Main.CurrentNozzleId)?.AssociatedNozzles.ToList(); if (epsTrxModel.jihao != Main.CurrentNozzleId && !associateNozzles.Contains(epsTrxModel.jihao)) { Main.DebugLogger.Add("nozzle Id not match, indoor pay"); Main.CurrentEpsTrx.Model.car_number = null; Main.CurrentEpsTrx = null; } } transition = new Transition(this, TransitionType.NozzleReplaced); stateEngineEvent.Handled = true; break; case EventType.DisplayResponseReceived: stateEngineEvent.Handled = true; break; case EventType.ReaderStateChanged: Main.DebugLogger.Add("Unexpected reader state change in Fueling"); var e = stateEngineEvent as GenericEvent; if (e != null && e.EventArgs != null) { if (e.EventArgs.CardReaderState.State == CardReaderState.CardInserted) { Main.DebugLogger.Add("Unexpected card inserted event in Fueling"); e.Handled = true; transition = new Transition(this, TransitionType.CardInserted); } else if (e.EventArgs.CardReaderState.State == CardReaderState.Idle) { Main.DebugLogger.Add("Unexpected card removed event in Fueling"); e.Handled = true; Main.RemovePendingBalanceResult(); return; } } break; case EventType.OnlineVerification: Main.DebugLogger.Add("Unexpected online verification in Fueling"); stateEngineEvent.Handled = true; var result = new CardOnlineVerificationResultRequest(VerificationResult.Failure, 0, "处理错误"); Main.SendCommand(result, out sqNo); break; case EventType.CardReaderAck: GenericEvent ackEvent = stateEngineEvent as GenericEvent; if (ackEvent != null && ackEvent.EventArgs != null) { if (ackEvent.EventArgs.Ack.MessageSeqNumber == sqNo) { Main.DebugLogger.Add("Card reader ack received in Fueling"); ackEvent.Handled = true; transition = new Transition(this, TransitionType.Done); } } break; } } } } }