@lazyglobal off. RunOncePath("/lib/ui"). RunOncePath("/lib/navigation"). RunOncePath("/lib/throttle"). RunOncePath("/lib/stabilize_rocket"). RunOncePath("/lib/launch_rocket"). RunOncePath("/lib/sensors"). RunOncePath("/lib/reentry"). clearguis(). global done is false. on AG9 { set done to true. return true. } // Top-level menu structure. local iface is gui(250, 300). set iface:X to 200. set iface:Y to 700. local top is iface:AddVLayout(). local rows is list(MakeRow(top), MakeRow(top), MakeRow(top)). local stk is iface:AddStack(). // Buttons and menus. AddStockButtons(rows[0], "rocket"). MakeMenu( stk, MakeButton(rows[0], "SENS"), List( List("Pressure", "RO", "-1"), List("Temperature", "RO", "-1"), List("Acceleration", "RO", "-1"), List("Gravity", "RO", "-1"), List("Light", "RO", "-1") ), "Refresh", refreshSensors@, refreshSensors@ ). MakeMenu( stk, MakeButton(rows[0], "GRND"), List( List("Burn Distance", "RO", "-1"), List("Stopping Time", "RO", "-1"), List("Stopping Distance", "RO", "-1"), List("Stopping dV", "RO", "-1") ), "", { parameter options. }, { parameter options. set options["Burn Distance"]:TEXT to TargetBurnDistance():TOSTRING. set options["Stopping dV"]:TEXT to SHIP:VELOCITY:SURFACE:MAG:TOSTRING. set options["Stopping Time"]:TEXT to BurnTime(SHIP:VELOCITY:SURFACE:MAG):TOSTRING. set options["Stopping Distance"]:TEXT to StoppingDistance():TOSTRING. } ). MakeMenu( stk, MakeButton(rows[1], "REENTRY"), List( List("Retract Antennae", "BOOL", true) ), "Execute", { parameter options. PerformReentry(options["Retract Antennae"]:PRESSED). } ). MakeButton(rows[1], "HOVER", { Hover(). }). MakeButton(rows[1], "LAND", { Land(). }). MakeMenu( stk, MakeButton(rows[2], "LNCH"), List( List("Target Apoapsis", "SCALAR", "80000"), List("Initial Pitch", "SCALAR", "20"), List("Pitch Time", "SCALAR", "45"), List("Atmo TWR", "SCALAR", "2.0"), List("Minimum Pitch", "SCALAR", "5"), List("Autostage", "BOOL", true) ), "Execute", { parameter options. Launch( options["Target Apoapsis"]:TEXT:ToNumber(), options["Atmo TWR"]:TEXT:ToNumber(), options["Minimum Pitch"]:TEXT:ToNumber(), options["Initial Pitch"]:TEXT:ToNumber(), options["Pitch Time"]:TEXT:ToNumber(), options["Autostage"]:PRESSED ). } ). MakeMenu( stk, MakeButton(rows[2], "NODE"), List( List("Node dV", "RO", "0"), List("Node Burn Time", "RO", "0") ), "Execute", { parameter options. ExecNode(). }, { parameter options. if HASNODE { set options["Node dV"]:TEXT to NEXTNODE:DELTAV:MAG:ToString. set options["Node Burn Time"]:TEXT to BurnTime(NEXTNODE:DELTAV:MAG):ToString. } else { set options["Node dV"]:TEXT to "No Node". set options["Node Burn Time"]:TEXT to "No Node". } } ). MakeMenu( stk, MakeButton(rows[2], "TWR"), List( List("Target TWR", "SCALAR", "1.6") ), "Lock TWR", { parameter options. local done is false. print "Locking throttle to target TWR.". local tgt is options["Target TWR"]:TEXT:ToNumber(). lock THROTTLE to ThrottleToTWR(tgt). wait until done. print "Throttle unlocked.". set done to false. } ). MakeMenu( stk, MakeButton(rows[2], "CONF"), List( List("Torque Epsilon Max", "SCALAR", "0.001"), List("Max Stopping Time", "SCALAR", "2.0") ), "Apply", { parameter options. set STEERINGMANAGER:TORQUEEPSILONMAX to options["Torque Epsilon Max"]:TEXT:ToNumber(). set STEERINGMANAGER:MAXSTOPPINGTIME to options["Max Stopping Time"]:TEXT:ToNumber(). } ). iface:show(). wait until false. function refreshSensors { parameter options. set options["Pressure"]:TEXT to ReadSensor("PRES"):TOSTRING. set options["Temperature"]:TEXT to ReadSensor("TEMP"):TOSTRING. set options["Acceleration"]:TEXT to ReadSensor("ACC"):TOSTRING. set options["Gravity"]:TEXT to ReadSensor("GRAV"):TOSTRING. set options["Light"]:TEXT to ReadSensor("LIGHT"):TOSTRING. }