Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //==Coyote Medium LS Launch script==
- SET scriptVersion TO "v0.2.1". //Version control
- //~~CHANGELOG:~~
- //0.1.0
- // - First stable version
- //
- //0.2.0
- //--Major improvements--
- // - Added declared opMode to control vehicle version/operation mode
- // - Added staging control for Mk2 versions
- //--Minor improvements--
- // - Improved handling of engines and activations/shutdowns
- // - Improved Booster/1S/2S tanks and fuel level handling
- // - All fuel pumps will now be turned on before liftoff in order to keep
- // the boosters topped off in addition to the first and second stages
- // - Removed redundant timers; antenna activation now occurs on fairing sep
- // - Commented out unused "exit loop"; saved for later iteration that
- // utilizes fault checking
- // - Switched liftoff handling to action group that starts short countdown
- // - Changed script exit parameters; target apoapsis altitude is declared on
- // start and script closes when it is reached. A proper ascent should
- // allow for a healthy periapsis by this time.
- //
- //0.2.1
- //--Minor improvements--
- // - General cleanup of overall structure
- // - Improved commenting
- //FUTURE SUBVERSION TODO:
- // - Automatically determine opMode
- // - Automatically adjust throttle to impose g-force limit
- // - Fault checking
- // - Abort conditions and abort automation for future manned variant
- // - Expanded readouts
- // - Launch guidance assist (display vectors to aid manual control)
- // - Launch guidance automation (completely automate launch, one button
- // press to orbit)
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //~~~~~Parameter Declaration~~~~~
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- DECLARE PARAMETER opMode.
- DECLARE PARAMETER targetAlt.
- //~~~~~~~~~~~~~~~~~~~~~~~
- //~~~~~Splash Screen~~~~~
- //~~~~~~~~~~~~~~~~~~~~~~~
- SET TERMINAL:WIDTH TO 50.
- SET TERMINAL:HEIGHT TO 25.
- CLEARSCREEN.
- PRINT "==========COYOTE MLS " + opMode + " LAUNCH SCRIPT==========".
- PRINT "----------------------" + scriptVersion + "----------------------".
- WAIT 1.
- PRINT "Initializing...".
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //~~~~~Variable declaration / Setup~~~~~
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- SET S1Ready TO FALSE.
- SET SBSepLevel TO 0. //Percent of fuel desired for booster RTLS.
- SET S1SepLevel TO 0. //Percent of fuel desired for first stage RTLS.
- SET activeStage TO "1". //Variable to view active stage
- IF opMode = "Mk1" {
- SET S1Ready TO TRUE. //Allows stage 1 to stage; starts out true for Mk1 variants, false for Mk2 variants
- } ELSE IF opMode = "Mk1R" {
- SET S1SepLevel TO 15.
- SET S1Ready TO TRUE.
- } ELSE IF opMode = "Mk2" {
- SET activeStage TO "1B".
- } ELSE IF opMode = "Mk2RB" {
- SET SBSepLevel TO 15.
- SET activeStage TO "1B".
- } ELSE IF opMode = "Mk2" {
- SET SBSepLevel TO 15.
- SET S1SepLevel TO 20.
- SET activeStage TO "1B".
- }. //ELSE IF opMode
- SET updateRes TO 10. //Update resolution for readouts in number of refreshes per second
- //SET exitCond TO FALSE.
- SET fairingSep TO FALSE. //Variable to view fairing separation status; false = still attached
- SET nextLine TO 7. //Handles event log printing after liftoff
- SET countdown TO 10. //Length of countdown. Minimum of five seconds required.
- SET CDmessage TO " ". //Holds messages for countdown loop
- //~~Timers for use in staging control~~
- SET BECOtimer TO 10000. //Marks BECO time
- SET S1ECOtimer TO 10000. //Marks S1ECO time
- //=====Parts on the ship=====
- //~~Engines~~
- LIST ENGINES IN engineList.
- SET S1Alpha TO LIST(). //First stage engine 1
- SET S1Bravo TO LIST(). //First stage engines 2,3
- SET S1Charlie TO LIST(). //First stage engines 4,5,6,7
- SET S1All TO LIST(). //First stage all engines
- SET S2Alpha TO LIST(). //Second stage engine 1
- SET LBAlpha TO LIST(). //Left booster engine 1
- SET LBBravo TO LIST(). //Left booster engine 2,3
- SET LBCharlie TO LIST(). //Left booster engine 4,5,6,7
- SET LBAll TO LIST(). //Left booster all engines
- SET RBAlpha TO LIST(). //Right booster engine 1
- SET RBBravo TO LIST(). //Right booster engine 2,3
- SET RBCharlie TO LIST(). //Right booster engine 4,5,6,7
- SET RBAll TO LIST(). //Right booster all engines
- SET engAll TO LIST(). //All first stage and side booster engines
- FOR eng IN engineList { //Loop to assign engines to all engine lists
- IF eng:TAG = "S1Alpha" { //First stage engine 1
- S1Alpha:ADD(eng).
- S1All:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "S1Bravo" { //First stage engine 2,3
- S1Bravo:ADD(eng).
- S1All:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "S1Charlie" { //First stage engine 4,5,6,7
- S1Charlie:ADD(eng).
- S1All:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "S2Alpha" { //Second stage engine 1
- S2Alpha:ADD(eng).
- } ELSE IF eng:TAG = "LBAlpha" { //Left booster engine 1
- LBAlpha:ADD(eng).
- LBAll:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "LBBravo" { //Left booster engine 2,3
- LBBravo:ADD(eng).
- LBAll:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "LBCharlie" { //Left booster engine 4,5,6,7
- LBCharlie:ADD(eng).
- LBAll:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "RBAlpha" { //Right booster engine 1
- RBAlpha:ADD(eng).
- LBAll:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "RBBravo" { //Right booster engine 2,3
- RBBravo:ADD(eng).
- LBAll:ADD(eng).
- engAll:ADD(eng).
- } ELSE IF eng:TAG = "RBCharlie" { //Right booster engine 4,5,6,7
- RBCharlie:ADD(eng).
- LBAll:ADD(eng).
- engAll:ADD(eng).
- }. //IF-ELSE eng
- }. //FOR engineList
- SET interStage TO SHIP:PARTSTAGGED("intstage")[0]. //Interstage fairing and decoupler between first and second stage
- SET fairingShell TO SHIP:PARTSTAGGED("fairinghalf"). //Both fairing halves
- IF opMode = "Mk2RB" OR opMode = "Mk2R" {
- SET SBAnt TO SHIP:PARTSTAGGED("antSB"). //Small omnidirectional antennae for booster communication
- }. //IF opMode antenna
- IF opMode = "Mk1R" OR opMode = "Mk2R" {
- SET S1Ant TO SHIP:PARTSTAGGED("antS1")[0]. //Small omnidirectional antenna for first stage communication
- SET S1finHinges TO SHIP:PARTSTAGGED("S1FinHinge").
- }. //IF opMode antenna
- SET S2Ant TO SHIP:PARTSTAGGED("antS2")[0]. //Small omnidirectional antenna for second stage communication
- SET lClamps TO SHIP:PARTSDUBBED("launchclamp1"). //Launch clamps holding first stage/boosters down
- FOR part IN lClamps {
- part:GETMODULE("RefuelingPump"):DOEVENT("Toggle Pump"). //Turn on fuel pump to keep stage topped off
- }. //FOR lClamps pump
- SET S2Tank TO SHIP:PARTSTAGGED("S2Tank")[0].
- SET S1Tank TO SHIP:PARTSTAGGED("S1Tank")[0].
- IF opMode = "Mk1" OR opMode = "Mk1R" {
- FOR res IN S1Tank:RESOURCES {
- IF res:NAME = "LQDOXYGEN" {
- SET S1LOX TO res.
- SET loxCap TO S1LOX:CAPACITY.
- LOCK loxAmount TO S1LOX:AMOUNT.
- }. //IF res
- }. //FOR res
- } ELSE IF opMode = "Mk2" OR opMode = "Mk2RB" OR opMode = "Mk2R" {
- SET SBDecouplers TO SHIP:PARTSTAGGED("SBDecoup").
- SET LBTank[0] TO SHIP:PARTSTAGGED("LBTankA")[0].
- SET LBTank[1] TO SHIP:PARTSTAGGED("LBTankB")[0].
- SET RBTank[0] TO SHIP:PARTSTAGGED("RBTankA")[0].
- SET RBTank[1] TO SHIP:PARTSTAGGED("RBTankB")[0].
- FOR res IN LBTank[0]:RESOURCES {
- IF res:NAME = "LQDOXYGEN" {
- SET LBLOX[0] TO res.
- }. //IF res
- }. //FOR res
- FOR res IN LBTank[1]:RESOURCES {
- IF res:NAME = "LQDOXYGEN" {
- SET LBLOX[1] TO res.
- }. //IF res
- }. //FOR res
- FOR res IN RBTank[0]:RESOURCES {
- IF res:NAME = "LQDOXYGEN" {
- SET RBLOX[0] TO res.
- }. //IF res
- }. //FOR res
- FOR res IN RBTank[1]:RESOURCES {
- IF res:NAME = "LQDOXYGEN" {
- SET RBLOX[1] TO res.
- }. //IF res
- }. //FOR res
- SET loxCap TO (LBLOX[0]:CAPACITY + LBLOX[1]:CAPACITY + RBLOX[0]:CAPACITY + RBLOX[1]:CAPACITY).
- LOCK loxAmount TO MIN((LBLOX[0]:AMOUNT + LBLOX[1]:AMOUNT),(RBLOX[0]:AMOUNT + RBLOX[1]:AMOUNT)).
- }. //IF-ELSE loxCap
- LOCK loxRemaining TO (loxAmount / (loxCap + 0.01)). //Locks percentage of fuel left in stage +0.01 to avoid divide by zero/NaN
- PRINT "Awaiting launch. Press Action Group 0 to start " + countdown + "-second countdown".
- //~~~~~~~~~~~~~~~~~~~~~~~~~
- //~~~~~Launch sequence~~~~~
- //~~~~~~~~~~~~~~~~~~~~~~~~~
- //UNTIL exitCond = TRUE { //**EXIT LOOP - BREAK OR SET exitCond TO TRUE TO EXIT PROGRAM** - Temporary solution until proper EXIT is coded for kOS. Tabbing format ignored for this.
- AG10 OFF.
- WAIT UNTIL AG10.
- PRINT "Countdown sequence started".
- UNTIL countdown = 0 { //Countdown loop
- IF countdown = 5 {
- FOR eng IN engAll {
- eng:GETMODULE("ModuleEngines"):DOEVENT("Activate Engine").
- }. //FOR eng
- SET message TO " Main Engine Start".
- SET BEItime to TIME:SECONDS. //Records BEI time
- } ELSE IF countdown = 2 {
- SET message TO " All engines healthy".
- SAS ON.
- } ELSE IF countdown = 1 {
- SET message TO " Releasing clamps".
- } ELSE {
- SET message TO " ".
- }. //IF countdown message
- PRINT "T-" + countdown + message.
- SET countdown TO countdown - 1.
- WAIT 1.
- }. //UNTIL countdown
- FOR PART IN lClamps { //Loop to release launch clamps
- PART:GETMODULE("launchclamp"):DOEVENT("release clamp").
- }. //FOR lClamps release
- SET launchTime TO TIME:SECONDS. //Records liftoff time
- LOCK missionClock TO ROUND((TIME:SECONDS - launchTime), 1). //Sets missionClock to T-0 and starts counting, rounded to tenths of a second
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //~~~~~Side Booster Staging control~~~~~
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- IF opMode = "Mk2" OR opMode = "Mk2RB" OR opMode = "Mk2R" { //Controls staging for Mk2 variants
- WHEN loxRemaining <= (SBSepLevel / 100) THEN {
- FOR eng IN LBAll {
- eng:GETMODULE("ModuleEngines"):DOEVENT("Shutdown Engine").
- }. //FOR eng
- FOR eng IN RBAll {
- eng:GETMODULE("ModuleEngines"):DOEVENT("Shutdown Engine").
- }. //FOR eng
- FOR part IN S2finHinges {
- PART:GETMODULE("MuMechToggle"):DOACTION("move -",TRUE).
- }. //FOR finhinge move
- FOR part IN SBAnt {
- SBAnt:GETMODULE("ModuleRTAntenna"):DOEVENT("Activate").
- }.
- PRINT "T+" + missionClock + " Boosters at sep level. Staging" AT(0,nextLine).
- SET nextLine TO nextLine + 1.
- SET BECOtimer to missionClock.
- WHEN missionClock >= (BECOtimer + 1.5) THEN {
- IF opMode = "Mk2RB" OR opMode = "Mk2R" {
- FOR part IN S2finHinges {
- PART:GETMODULE("MuMechToggle"):DOACTION("move -",FALSE).
- }. //FOR finhinge stop
- }. //IF
- WHEN missionClock >= (BECOtimer + 2.5) THEN {
- FOR part IN SBDecouplers {
- part:GETMODULE("&*&*&MODULE GOES HERE&*&*&*"):DOEVENT("Decouple").
- }. //FOR part
- SET S1Ready TO TRUE. //Primes the first stage WHEN-THEN
- }. //WHEN missionClock decouple
- }.//WHEN missionClock fins stop
- }. //WHEN loxRemaining
- }. //IF opMode
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //~~~~~Center Core Staging Control~~~~~
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- WHEN S1Ready = TRUE AND loxRemaining <= (S1SepLevel / 100) THEN { //Checks to see if first stage is at sep level, shutdown engines and extend fins if true
- FOR eng IN S1All {
- eng:GETMODULE("ModuleEngines"):DOEVENT("Shutdown Engine").
- }. //FOR eng shutdown
- IF opMode = "Mk1R" OR opMode = "Mk2R" {
- FOR part IN S1finHinges {
- PART:GETMODULE("MuMechToggle"):DOACTION("move -",TRUE).
- }. //FOR finhinge move
- S1Ant:GETMODULE("ModuleRTAntenna"):DOEVENT("Activate").
- }. //IF opMode
- RCS ON.
- SAS ON.
- PRINT "T+" + missionClock + " Stage 1 at sep level, staging" AT(0,nextLine).
- SET nextLine TO nextLine + 1.
- SET S1ECOtimer to missionClock. //Marks the time at which S1ECO occurred
- WHEN missionClock >= (S1ECOtimer + 1.5) THEN { //Checks to see if 1.5 seconds has passed since S1ECO, quit extending fins if true
- IF opMode = "Mk1R" OR opMode = "Mk2R" {
- FOR part IN finHinges {
- PART:GETMODULE("MuMechToggle"):DOACTION("move -",FALSE).
- }. //FOR finhinge stop
- PRINT "T+" + missionClock + " Fins extended" AT(0,nextLine).
- SET nextLine TO nextLine + 1.
- }. //IF opMode
- WHEN missionClock >= (S1ECOtimer + 2.5) THEN { //Checks to see if 2.5 seconds have passed since S1ECO, stage sep if true
- interStage:GETMODULE("ModuleDecouple"):DOEVENT("Decouple").
- PRINT "T+" + missionClock + " Staging confirmed" AT(0,nextLine).
- SET nextLine TO nextLine + 1.
- SET activeStage TO 2. //Denotes that stage 2 is now the active stage
- SET loxCap TO S2Tank:RESOURCES[1]:CAPACITY.
- LOCK loxAmount TO S2Tank:RESOURCES[1]:AMOUNT.
- WHEN missionClock >= (S1ECOtimer + 7.5) THEN { //Checks to see if 5 seconds have passed since stage sep, MEI if true
- FOR eng IN S2Alpha {
- eng:GETMODULE("ModuleEngines"):DOEVENT("Activate Engine").
- }.
- PRINT "T+" + missionClock + " MEI" AT(0,nextLine).
- SET nextLine TO nextLine + 1.
- WHEN SHIP:ALTITUDE > 60000 THEN { //Fairing sep at 60km or 3 seconds after stage 2 ignition, both conditions need satisfied
- WHEN missionClock >= (S1ECOtimer + 10.5) THEN { //Checks to see if 3 seconds have passed since MEI (8 since sep), fairing sep + antenna activate if true
- FOR PART IN fairingShell {
- PART:GETMODULE("ProceduralFairingDecoupler"):DOEVENT("Jettison").
- }. //FOR loop
- SET fairingSep TO TRUE. //Readout will update to confirm fairing sep status
- S2Ant:GETMODULE("ModuleRTAntenna"):DOEVENT("Activate"). //Activate small omni on second stage
- PRINT "T+" + missionClock + " Fairing separation confirmed" AT(0,nextLine).
- SET nextLine TO nextLine + 1.
- }. //WHEN fairingTimer
- }. //WHEN SHIP:ALTITUDE
- }. //WHEN stage2StartTimer
- }. //WHEN BECOtimer decouple
- }. //WHEN BECOtimer finHinges
- }. //WHEN loxRemaining
- //~~~~~~~~~~~~~~~~~~
- //~~~~~Readouts~~~~~
- //~~~~~~~~~~~~~~~~~~
- CLEARSCREEN.
- PRINT "============COYOTE MEDIUM LAUNCH SYSTEM===========" AT(0,0).
- PRINT "ASL: " AT(0,2). //Altitude above sea level readout at 6,2
- PRINT "VEL: " AT(16,2). //Surface or orbital velocity readout at 22,2
- PRINT "CLK: " AT(33,2). //Mission clock readout at 39,2
- PRINT "STG: " AT(0,3). //Current stage readout at 6,3
- PRINT "SFL: " AT(16,3). //Stage fuel level readout at 22,3
- PRINT "FRG: " AT(33,3). //Fairing status readout at 39,3
- PRINT "-------------------EVENT LOG----------------------" AT(0,5).
- PRINT "T-" + ROUND(ABS(BEItime - launchTime),2) + " BEI" AT(0,nextLine). //Time of BEI, will be negative
- SET nextLine TO nextLine + 1.
- PRINT "T+0.0 Liftoff" AT(0,nextLine).
- SET nextLine TO nextLine + 1.
- UNTIL APOAPSIS > (targetAlt * 1000) { //Exits script when apoapsis reaches target alt
- PRINT FLOOR(SHIP:ALTITUDE) + " " AT(6,2).
- IF ALTITUDE <=50000 { //Prints surface velocity below 50km, orbital above
- PRINT ROUND(VELOCITY:SURFACE:MAG,1) + " " AT(22,2).
- } ELSE {
- PRINT ROUND(VELOCITY:ORBIT:MAG,1) + " " AT(22,2).
- }. //IF-ELSE
- PRINT missionClock AT(39,2).
- PRINT activeStage AT(6,3).
- PRINT ROUND((loxRemaining * 100), 1) + "% " AT(22,3).
- IF fairingSep = FALSE { //Prints ATCHD or SPRTD depending on whether the fairings are still on
- PRINT "ATCHD" + " " AT(39,3).
- } ELSE {
- PRINT "SPRTD" + " " AT(39,3).
- }. //IF-ELSE
- WAIT (1 / updateRes). //Update resolution turned into fraction
- }. //UNTIL
- //SET exitCond TO TRUE. //Required at the end of the EXIT loop to keep it from actually looping
- //}. //UNTIL **EXIT**
- SET SHIP:CONTROL:PILOTMAINTHROTTLE TO 0.
- CLEARSCREEN.
- PRINT "Manual Control Restored, Program Exiting...".
- WAIT 2.
- CLEARSCREEN.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement