StateInst GetStateInst(COM_ReportState state, bool once = false) { StateInst tstate = new StateInst(); tstate.stateId_ = (int)state.stateId_; tstate.tick_ = state.tick_; tstate.turn_ = state.turn_; tstate.once_ = once; return(tstate); }
/// <summary> /// 状态转变事件函数 /// </summary> /// <param name="act"></param> private void instOnTransitionedAction(StateMachine <StateInst, TriggerInst> .Transition act) { nlogger.Debug("On StateInst Transitioned."); TriggerInst trigger = act.Trigger; StateInst source = act.Source; StateInst dest = act.Destination; // 状态清零 _instStateCounts = 0; // 触发事件 - 状态转变 StateChangedEvent?.Invoke(dest); }
/// <summary> /// 未定义事件函数 /// </summary> /// <param name="st"></param> /// <param name="tg"></param> private void instOnUnhandledTrigger(StateInst st, TriggerInst tg) { nlogger.Error("Inst Unhandled trigger: state."); }
/// <summary> /// 配置仪器相关的状态机 /// </summary> protected void ConfigInstStateless() { // new object _instMachine = new StateMachine <StateInst, TriggerInst>(() => _instState, s => _instState = s); _instTickTrigger = _instMachine.SetTriggerParameters <int>(TriggerInst.TimerTick); // on transition action _instMachine.OnTransitioned(instOnTransitionedAction); // on unhandled trigger _instMachine.OnUnhandledTrigger(instOnUnhandledTrigger); // StateInst.Idle // -> StateInst.Measure _instMachine.Configure(StateInst.Idle) .OnEntry(t => instIdleEntry()) .OnExit(t => instIdleExit()) .InternalTransition(_instTickTrigger, (tic, t) => instIdleTick(tic)) .Permit(TriggerInst.StartMeasure, StateInst.Measure) .Ignore(TriggerInst.StartStore) .Ignore(TriggerInst.Stop); // StateInst.Measure // -> StateInst.StoreData // -> StateInst.Idle _instMachine.Configure(StateInst.Measure) .OnEntry(t => instMeasureEntry()) .OnExit(t => instMeasureExit()) .InternalTransition(_instTickTrigger, (tic, t) => instMeasureTick(tic)) .Permit(TriggerInst.StartStore, StateInst.Store) .Permit(TriggerInst.Stop, StateInst.Idle); // StateInst.Store // -> StateInst.Idle _instMachine.Configure(StateInst.Store) .OnEntry(t => instStoreEntry()) .OnExit(t => instStoreExit()) .InternalTransition(_instTickTrigger, (tic, t) => instStoreTick(tic)) .Permit(TriggerInst.Stop, StateInst.Idle) .Ignore(TriggerInst.StartMeasure); }