Exemplo n.º 1
0
    public void Start(FocusPart focus_part)
    {
        running       = true;
        force_docking = false;

        conn = new Connection(
            name: "My Example Program",
            address: IPAddress.Parse("127.0.0.1"),
            rpcPort: 50000,
            streamPort: 50001);
        sc     = conn.SpaceCenter();
        vessel = sc.ActiveVessel;
        orbit  = vessel.Orbit;
        body   = orbit.Body;

        UpdateCommonData(out Thread common_data_thread);
        StartThreads(focus_part, out List <Thread> threads);
        foreach (Thread thread in threads)
        {
            thread.Join();
        }

        running = false;
        common_data_thread.Join();

        conn.Dispose();
    }
Exemplo n.º 2
0
    private bool SplitBoosters(FocusPart focus_part)
    {
        // Splite booster
        if (!WaitTankFuelLessThanThreshold(conn, tank_south, BOOSTER_SPLIT_FUEL))
        {
            return(false);
        }

        try
        {
            engine_main.ThrustLimit  = 1f;
            engine_north.ThrustLimit = 0f;
            engine_south.ThrustLimit = 0f;
            engine_main.GimbalLimit  = 1f;
            engine_north.GimbalLimit = 1f;
            engine_south.GimbalLimit = 1f;
            Thread.Sleep(1000);
            vessel.Control.ActivateNextStage();

            vessel_north = engine_north.Part.Vessel;
            vessel_south = engine_south.Part.Vessel;

            switch (focus_part)
            {
            case FocusPart.BOOSTER_NORTH: sc.ActiveVessel = vessel_north; break;

            case FocusPart.BOOSTER_SOUTH: sc.ActiveVessel = vessel_south; break;

            default: break;
            }

            vessel_north.Control.Throttle = 0f;
            vessel_south.Control.Throttle = 0f;
            engine_north.ThrustLimit      = 1f;
            engine_south.ThrustLimit      = 1f;
        }
        catch (Exception)
        {
            return(false);
        }

        return(true);
    }
Exemplo n.º 3
0
    private bool SplitFirstStage(FocusPart focus_part)
    {
        if (!WaitTankFuelLessThanThreshold(conn, tank_main, FIRST_STAGE_SPLIT_FUEL))
        {
            return(false);
        }

        try
        {
            engine_load.ThrustLimit = 0f;
            engine_main.ThrustLimit = 0f;
            Thread.Sleep(1000);
            vessel.Control.ActivateNextStage();

            force_docking = true;

            vessel_main = engine_main.Part.Vessel;
            if (focus_part == FocusPart.FIRST_STAGE)
            {
                sc.ActiveVessel = vessel_main;
            }
            vessel_main.Control.RCS      = true;
            vessel_main.Control.Throttle = 0f;
            vessel_main.Control.Forward  = -1f;
            vessel.Control.RCS           = true;
            vessel.Control.Forward       = 1f;
            Thread.Sleep(3000);
            vessel_main.Control.Forward = 0f;
            vessel.Control.Forward      = 0f;
            engine_load.ThrustLimit     = 1f;
            engine_main.ThrustLimit     = 1f;
        }
        catch (Exception)
        {
            return(false);
        }

        return(true);
    }
Exemplo n.º 4
0
    private bool StartThreads(FocusPart focus_part, out List <Thread> threads)
    {
        threads = new List <Thread>();

        // Parts
        engine_load  = vessel.Parts.Engines.Where(p => p.Part.Tag == "engine_load").ToList().First();
        engine_main  = vessel.Parts.Engines.Where(p => p.Part.Tag == "engine_main").ToList().First();
        engine_north = vessel.Parts.Engines.Where(p => p.Part.Tag == "engine_north").ToList().First();
        engine_south = vessel.Parts.Engines.Where(p => p.Part.Tag == "engine_south").ToList().First();
        tank_north   = vessel.Parts.WithTag("tank_north").ToList().First();
        tank_south   = vessel.Parts.WithTag("tank_south").ToList().First();
        tank_main    = vessel.Parts.WithTag("tank_main").ToList().First();

        if (!LaunchAndDocking(out Thread launch_thread))
        {
            return(false);
        }
        threads.Add(launch_thread);

        if (!SplitBoosters(focus_part) ||
            !RecycleBoosters(out Thread recycle_north_thread, out Thread recycle_south_thread))
        {
            return(false);
        }
        threads.Add(recycle_north_thread);
        threads.Add(recycle_south_thread);

        if (!SplitFirstStage(focus_part) ||
            !RecycleFirstStage(out Thread recycle_main_thread))
        {
            return(false);
        }
        threads.Add(recycle_main_thread);

        return(true);
    }