private void InjectEvent(KFSMState state, KFSMEvent injectedEvent) { state.AddEvent(injectedEvent); OnCleanup += () => { // ((List<KFSMEvent>)Refl.GetValue(state, "stateEvents")).Remove(injectedEvent); // List<KFSMState> kfsmstatelist = (List<KFSMState>)Refl.GetValue(state, GET_STATEEVENTS); #if false foreach (var kfsmstate in kfsmstatelist) { if (kfsmstate == state) { state. kfsmstatelist.Remove(injectedEvent); Log.Info("Removed event " + injectedEvent.name + " from state " + state.name); return; } } #endif }; Log.Info("Injected event " + injectedEvent.name + " into state " + state.name); }
private void SelectRootInjectEvent(KFSMState state, KFSMEvent injectedEvent) { state.AddEvent(injectedEvent); OnCleanup += () => { // ((List<KFSMEvent>)Refl.GetValue(state, "stateEvents")).Remove(injectedEvent); // List<KFSMState> kfsmstatelist = (List<KFSMState>)Refl.GetValue(state, EditorExtensions.c.GET_STATEEVENTS); state.StateEvents.Remove(injectedEvent); Log.dbg("Removed event {0} from state {1}", injectedEvent.name, state.name); #if false foreach (var kfsmstate in kfsmstatelist) { if (kfsmstate == state) { kfsmstatelist.Remove(kfsmstate); Log.Info("Removed event " + injectedEvent.name + " from state " + state.name); return; } } #endif }; Log.dbg("Injected event {0} into state {1}", injectedEvent.name, state.name); }
/// <summary> /// Intiialize the maneuver pilot FSM. /// </summary> private void ManeuverPilotInitialize() { KFSMState idleState = new KFSMState("Idle"); idleState.updateMode = KFSMUpdateMode.FIXEDUPDATE; KFSMState coastState = new KFSMState("Coasting"); coastState.updateMode = KFSMUpdateMode.FIXEDUPDATE; MASFlyState flyState = new MASFlyState("Flying", this); flyState.updateMode = KFSMUpdateMode.FIXEDUPDATE; flyState.OnEnter = flyState.OnEnterImpl; flyState.OnFixedUpdate = flyState.OnFixedUpdateImpl; KFSMEvent stopPilot = new KFSMEvent("Stop Pilot"); stopPilot.updateMode = KFSMUpdateMode.FIXEDUPDATE; stopPilot.OnCheckCondition = (KFSMState currentState) => { bool stopThisPilot = (maneuverPilotEngaged == false || attitudePilotEngaged == false || node == null); if (stopThisPilot) { CancelAutopilots(); //Utility.LogMessage(this, "StopPilot event: Transitioning"); } return(stopThisPilot); }; stopPilot.GoToStateOnEvent = idleState; KFSMEvent startPilot = new KFSMEvent("Start Pilot"); startPilot.updateMode = KFSMUpdateMode.FIXEDUPDATE; startPilot.OnCheckCondition = (KFSMState currentState) => { return(maneuverPilotEngaged); }; startPilot.GoToStateOnEvent = coastState; KFSMEvent flyPilot = new KFSMEvent("Fly Pilot"); flyPilot.updateMode = KFSMUpdateMode.FIXEDUPDATE; flyPilot.OnCheckCondition = (KFSMState currentState) => { if (maneuverPilotEngaged) // Should be redundant? { double burnTime = NodeBurnTime(); if (burnTime > 0.0 && burnTime * 0.5 >= -maneuverNodeTime) { #if VERBOSE_AUTOPILOT_LOGGING Utility.LogMessage(this, "FlyPilot event: Transitioning"); #endif return(true); } } return(false); }; flyPilot.GoToStateOnEvent = flyState; KFSMEvent doneFlying = new KFSMEvent("Done Event"); doneFlying.updateMode = KFSMUpdateMode.FIXEDUPDATE; doneFlying.OnCheckCondition = (KFSMState currentState) => { if (maneuverNodeDeltaV < 0.15) { CancelAutopilots(); if (vessel.patchedConicSolver != null) { vessel.patchedConicSolver.maneuverNodes.Clear(); } try { FlightInputHandler.state.mainThrottle = 0.0f; } catch { } #if VERBOSE_AUTOPILOT_LOGGING Utility.LogMessage(this, "Done flying..."); #endif return(true); } return(false); }; doneFlying.GoToStateOnEvent = idleState; idleState.AddEvent(startPilot); coastState.AddEvent(stopPilot); coastState.AddEvent(flyPilot); flyState.AddEvent(stopPilot); flyState.AddEvent(doneFlying); maneuverPilot.AddState(idleState); maneuverPilot.AddState(coastState); maneuverPilot.AddState(flyState); maneuverPilot.StartFSM(idleState); }
private void InitMachine() { Log.Info("InitMachine"); // if (saveLoadWinPos == null) // saveLoadWinPos = new SaveLoadWinPos(); // Create the states initial = new InitialState("Init", _machine); settings = new SettingState("Settings", _machine); sequence = new SequenceState("Sequence", _machine); launch = new LaunchState("Launch", _machine); launched = new LaunchedState("Launched", _machine); finish = new KFSMState("Finish"); // Add events to the states var go2Finish = new KFSMEvent("Finish") { GoToStateOnEvent = finish, updateMode = KFSMUpdateMode.MANUAL_TRIGGER }; var go2Settings = new KFSMEvent("Settings") { GoToStateOnEvent = settings, updateMode = KFSMUpdateMode.MANUAL_TRIGGER }; initial.AddEvent(go2Settings); var go2Init = new KFSMEvent("Init") { GoToStateOnEvent = initial, updateMode = KFSMUpdateMode.MANUAL_TRIGGER }; settings.AddEvent(go2Init); sequence.AddEvent(go2Init); finish.AddEvent(go2Init); var go2Sequence = new KFSMEvent("Sequence") { GoToStateOnEvent = sequence, updateMode = KFSMUpdateMode.MANUAL_TRIGGER }; initial.AddEvent(go2Sequence); var go2Launch = new KFSMEvent("Launch") { GoToStateOnEvent = launch, updateMode = KFSMUpdateMode.MANUAL_TRIGGER }; initial.AddEvent(go2Launch); launch.AddEvent(go2Init); launch.AddEvent(go2Finish); var go2Launched = new KFSMEvent("Launched") { GoToStateOnEvent = launched, updateMode = KFSMUpdateMode.MANUAL_TRIGGER }; launch.AddEvent(go2Launched); initial.AddEvent(go2Finish); launched.AddEvent(go2Finish); // Add states to the state machine _machine.AddState(initial); _machine.AddState(settings); _machine.AddState(sequence); _machine.AddState(launch); _machine.AddState(finish); }