Exemple #1
0
        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);
        }
Exemple #4
0
        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);
        }