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(); }
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); }
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); }
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); }