Advertisement
space_is_hard

CMLS LS 0.2.1

Mar 24th, 2015
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.29 KB | None | 0 0
  1. //==Coyote Medium LS Launch script==
  2.  
  3. SET scriptVersion TO "v0.2.1".      //Version control
  4.  
  5. //~~CHANGELOG:~~
  6. //0.1.0
  7. // - First stable version
  8. //
  9. //0.2.0
  10. //--Major improvements--
  11. // - Added declared opMode to control vehicle version/operation mode
  12. // - Added staging control for Mk2 versions
  13. //--Minor improvements--
  14. // - Improved handling of engines and activations/shutdowns
  15. // - Improved Booster/1S/2S tanks and fuel level handling
  16. // - All fuel pumps will now be turned on before liftoff in order to keep
  17. //   the boosters topped off in addition to the first and second stages
  18. // - Removed redundant timers; antenna activation now occurs on fairing sep
  19. // - Commented out unused "exit loop"; saved for later iteration that
  20. //   utilizes fault checking
  21. // - Switched liftoff handling to action group that starts short countdown
  22. // - Changed script exit parameters; target apoapsis altitude is declared on
  23. //   start and script closes when it is reached. A proper ascent should
  24. //   allow for a healthy periapsis by this time.
  25. //
  26. //0.2.1
  27. //--Minor improvements--
  28. // - General cleanup of overall structure
  29. // - Improved commenting
  30.  
  31. //FUTURE SUBVERSION TODO:
  32. // - Automatically determine opMode
  33. // - Automatically adjust throttle to impose g-force limit
  34. // - Fault checking
  35. // - Abort conditions and abort automation for future manned variant
  36. // - Expanded readouts
  37. // - Launch guidance assist (display vectors to aid manual control)
  38. // - Launch guidance automation (completely automate launch, one button
  39. //   press to orbit)
  40.  
  41. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  42. //~~~~~Parameter Declaration~~~~~
  43. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  44.  
  45. DECLARE PARAMETER opMode.
  46. DECLARE PARAMETER targetAlt.
  47.  
  48. //~~~~~~~~~~~~~~~~~~~~~~~
  49. //~~~~~Splash Screen~~~~~
  50. //~~~~~~~~~~~~~~~~~~~~~~~
  51.  
  52. SET TERMINAL:WIDTH TO 50.
  53. SET TERMINAL:HEIGHT TO 25.
  54. CLEARSCREEN.
  55.  
  56. PRINT "==========COYOTE MLS " + opMode + " LAUNCH SCRIPT==========".
  57. PRINT "----------------------" + scriptVersion + "----------------------".
  58. WAIT 1.
  59.  
  60. PRINT "Initializing...".
  61.  
  62. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  63. //~~~~~Variable declaration / Setup~~~~~
  64. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  65.  
  66. SET S1Ready TO FALSE.
  67. SET SBSepLevel TO 0.        //Percent of fuel desired for booster RTLS.
  68. SET S1SepLevel TO 0.        //Percent of fuel desired for first stage RTLS.
  69. SET activeStage TO "1".     //Variable to view active stage
  70.  
  71. IF opMode = "Mk1" {
  72.     SET S1Ready TO TRUE.        //Allows stage 1 to stage; starts out true for Mk1 variants, false for Mk2 variants
  73.    
  74. } ELSE IF opMode = "Mk1R" {
  75.     SET S1SepLevel TO 15.
  76.     SET S1Ready TO TRUE.
  77.    
  78. } ELSE IF opMode = "Mk2" {
  79.     SET activeStage TO "1B".
  80.    
  81. } ELSE IF opMode = "Mk2RB" {
  82.     SET SBSepLevel TO 15.
  83.     SET activeStage TO "1B".
  84.    
  85. } ELSE IF opMode = "Mk2" {
  86.     SET SBSepLevel TO 15.
  87.     SET S1SepLevel TO 20.
  88.     SET activeStage TO "1B".
  89. }. //ELSE IF opMode
  90.  
  91. SET updateRes TO 10.        //Update resolution for readouts in number of refreshes per second
  92. //SET exitCond TO FALSE.
  93. SET fairingSep TO FALSE.        //Variable to view fairing separation status; false = still attached
  94. SET nextLine TO 7.      //Handles event log printing after liftoff
  95. SET countdown TO 10.        //Length of countdown. Minimum of five seconds required.
  96. SET CDmessage TO " ".       //Holds messages for countdown loop
  97.  
  98. //~~Timers for use in staging control~~
  99. SET BECOtimer TO 10000.     //Marks BECO time
  100. SET S1ECOtimer TO 10000.        //Marks S1ECO time
  101.  
  102. //=====Parts on the ship=====
  103.  
  104. //~~Engines~~
  105.  
  106. LIST ENGINES IN engineList.
  107.  
  108. SET S1Alpha TO LIST().      //First stage engine 1
  109. SET S1Bravo TO LIST().      //First stage engines 2,3
  110. SET S1Charlie TO LIST().        //First stage engines 4,5,6,7
  111. SET S1All TO LIST().        //First stage all engines
  112.  
  113. SET S2Alpha TO LIST().      //Second stage engine 1
  114.  
  115. SET LBAlpha TO LIST().      //Left booster engine 1
  116. SET LBBravo TO LIST().      //Left booster engine 2,3
  117. SET LBCharlie TO LIST().        //Left booster engine 4,5,6,7
  118. SET LBAll TO LIST().        //Left booster all engines
  119. SET RBAlpha TO LIST().      //Right booster engine 1
  120. SET RBBravo TO LIST().      //Right booster engine 2,3
  121. SET RBCharlie TO LIST().        //Right booster engine 4,5,6,7
  122. SET RBAll TO LIST().        //Right booster all engines
  123.  
  124. SET engAll TO LIST().       //All first stage and side booster engines
  125.  
  126. FOR eng IN engineList {     //Loop to assign engines to all engine lists
  127.     IF eng:TAG = "S1Alpha" {        //First stage engine 1
  128.         S1Alpha:ADD(eng).
  129.         S1All:ADD(eng).
  130.         engAll:ADD(eng).
  131.  
  132.     } ELSE IF eng:TAG = "S1Bravo" {     //First stage engine 2,3
  133.         S1Bravo:ADD(eng).
  134.         S1All:ADD(eng).
  135.         engAll:ADD(eng).
  136.  
  137.     } ELSE IF eng:TAG = "S1Charlie" {       //First stage engine 4,5,6,7
  138.         S1Charlie:ADD(eng).
  139.         S1All:ADD(eng).
  140.         engAll:ADD(eng).
  141.  
  142.     } ELSE IF eng:TAG = "S2Alpha" {     //Second stage engine 1
  143.         S2Alpha:ADD(eng).
  144.  
  145.     } ELSE IF eng:TAG = "LBAlpha" {     //Left booster engine 1
  146.         LBAlpha:ADD(eng).
  147.         LBAll:ADD(eng).
  148.         engAll:ADD(eng).
  149.  
  150.     } ELSE IF eng:TAG = "LBBravo" {     //Left booster engine 2,3
  151.         LBBravo:ADD(eng).
  152.         LBAll:ADD(eng).
  153.         engAll:ADD(eng).
  154.  
  155.     } ELSE IF eng:TAG = "LBCharlie" {       //Left booster engine 4,5,6,7
  156.         LBCharlie:ADD(eng).
  157.         LBAll:ADD(eng).
  158.         engAll:ADD(eng).
  159.  
  160.     } ELSE IF eng:TAG = "RBAlpha" {     //Right booster engine 1
  161.         RBAlpha:ADD(eng).
  162.         LBAll:ADD(eng).
  163.         engAll:ADD(eng).
  164.  
  165.     } ELSE IF eng:TAG = "RBBravo" {     //Right booster engine 2,3
  166.         RBBravo:ADD(eng).
  167.         LBAll:ADD(eng).
  168.         engAll:ADD(eng).
  169.  
  170.     } ELSE IF eng:TAG = "RBCharlie" {       //Right booster engine 4,5,6,7
  171.         RBCharlie:ADD(eng).
  172.         LBAll:ADD(eng).
  173.         engAll:ADD(eng).
  174.  
  175.     }. //IF-ELSE eng   
  176. }. //FOR engineList
  177.  
  178. SET interStage TO SHIP:PARTSTAGGED("intstage")[0].      //Interstage fairing and decoupler between first and second stage
  179. SET fairingShell TO SHIP:PARTSTAGGED("fairinghalf").        //Both fairing halves
  180.  
  181. IF opMode = "Mk2RB" OR opMode = "Mk2R" {
  182.     SET SBAnt TO SHIP:PARTSTAGGED("antSB").     //Small omnidirectional antennae for booster communication
  183. }. //IF opMode antenna
  184. IF opMode = "Mk1R" OR opMode = "Mk2R" {
  185.     SET S1Ant TO SHIP:PARTSTAGGED("antS1")[0].      //Small omnidirectional antenna for first stage communication
  186.     SET S1finHinges TO SHIP:PARTSTAGGED("S1FinHinge").
  187. }. //IF opMode antenna
  188. SET S2Ant TO SHIP:PARTSTAGGED("antS2")[0].      //Small omnidirectional antenna for second stage communication
  189.  
  190. SET lClamps TO SHIP:PARTSDUBBED("launchclamp1").        //Launch clamps holding first stage/boosters down
  191. FOR part IN lClamps {
  192.     part:GETMODULE("RefuelingPump"):DOEVENT("Toggle Pump").     //Turn on fuel pump to keep stage topped off
  193. }. //FOR lClamps pump
  194.  
  195. SET S2Tank TO SHIP:PARTSTAGGED("S2Tank")[0].
  196. SET S1Tank TO SHIP:PARTSTAGGED("S1Tank")[0].
  197. IF opMode = "Mk1" OR opMode = "Mk1R" {
  198.     FOR res IN S1Tank:RESOURCES {
  199.         IF res:NAME = "LQDOXYGEN" {
  200.             SET S1LOX TO res.
  201.             SET loxCap TO S1LOX:CAPACITY.
  202.             LOCK loxAmount TO S1LOX:AMOUNT.
  203.            
  204.         }. //IF res
  205.     }. //FOR res
  206.    
  207. } ELSE IF opMode = "Mk2" OR opMode = "Mk2RB" OR opMode = "Mk2R" {
  208.     SET SBDecouplers TO SHIP:PARTSTAGGED("SBDecoup").
  209.    
  210.     SET LBTank[0] TO SHIP:PARTSTAGGED("LBTankA")[0].
  211.     SET LBTank[1] TO SHIP:PARTSTAGGED("LBTankB")[0].
  212.     SET RBTank[0] TO SHIP:PARTSTAGGED("RBTankA")[0].
  213.     SET RBTank[1] TO SHIP:PARTSTAGGED("RBTankB")[0].
  214.    
  215.     FOR res IN LBTank[0]:RESOURCES {
  216.         IF res:NAME = "LQDOXYGEN" {
  217.             SET LBLOX[0] TO res.
  218.         }. //IF res
  219.     }. //FOR res
  220.    
  221.     FOR res IN LBTank[1]:RESOURCES {
  222.         IF res:NAME = "LQDOXYGEN" {
  223.             SET LBLOX[1] TO res.
  224.         }. //IF res
  225.     }. //FOR res
  226.    
  227.     FOR res IN RBTank[0]:RESOURCES {
  228.         IF res:NAME = "LQDOXYGEN" {
  229.             SET RBLOX[0] TO res.
  230.         }. //IF res
  231.     }. //FOR res
  232.    
  233.     FOR res IN RBTank[1]:RESOURCES {
  234.         IF res:NAME = "LQDOXYGEN" {
  235.             SET RBLOX[1] TO res.
  236.         }. //IF res
  237.     }. //FOR res
  238.    
  239.     SET loxCap TO (LBLOX[0]:CAPACITY + LBLOX[1]:CAPACITY + RBLOX[0]:CAPACITY + RBLOX[1]:CAPACITY).
  240.     LOCK loxAmount TO MIN((LBLOX[0]:AMOUNT + LBLOX[1]:AMOUNT),(RBLOX[0]:AMOUNT + RBLOX[1]:AMOUNT)).
  241.    
  242. }. //IF-ELSE loxCap
  243. LOCK loxRemaining TO (loxAmount / (loxCap + 0.01)).     //Locks percentage of fuel left in stage +0.01 to avoid divide by zero/NaN
  244.  
  245. PRINT "Awaiting launch. Press Action Group 0 to start " + countdown + "-second countdown".
  246.  
  247.  
  248.  
  249. //~~~~~~~~~~~~~~~~~~~~~~~~~
  250. //~~~~~Launch sequence~~~~~
  251. //~~~~~~~~~~~~~~~~~~~~~~~~~
  252.  
  253. //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.
  254.  
  255. AG10 OFF.
  256. WAIT UNTIL AG10.
  257. PRINT "Countdown sequence started".
  258.  
  259. UNTIL countdown = 0 {       //Countdown loop
  260.     IF countdown = 5 {
  261.         FOR eng IN engAll {
  262.             eng:GETMODULE("ModuleEngines"):DOEVENT("Activate Engine").
  263.         }. //FOR eng
  264.         SET message TO " Main Engine Start".
  265.         SET BEItime to TIME:SECONDS.        //Records BEI time
  266.  
  267.     } ELSE IF countdown = 2 {
  268.         SET message TO " All engines healthy".
  269.         SAS ON.
  270.  
  271.     } ELSE IF countdown = 1 {
  272.         SET message TO " Releasing clamps".
  273.  
  274.     } ELSE {
  275.         SET message TO " ".
  276.    
  277.     }. //IF countdown message      
  278.  
  279.     PRINT "T-" + countdown + message.
  280.     SET countdown TO countdown - 1.
  281.     WAIT 1.
  282.    
  283. }. //UNTIL countdown
  284.  
  285. FOR PART IN lClamps {       //Loop to release launch clamps
  286.     PART:GETMODULE("launchclamp"):DOEVENT("release clamp").
  287. }. //FOR lClamps release
  288.  
  289.  
  290. SET launchTime TO TIME:SECONDS.     //Records liftoff time
  291. LOCK missionClock TO ROUND((TIME:SECONDS - launchTime), 1).     //Sets missionClock to T-0 and starts counting, rounded to tenths of a second
  292.  
  293. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  294. //~~~~~Side Booster Staging control~~~~~
  295. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  296.  
  297. IF opMode = "Mk2" OR opMode = "Mk2RB" OR opMode = "Mk2R" {      //Controls staging for Mk2 variants
  298.     WHEN loxRemaining <= (SBSepLevel / 100) THEN {
  299.         FOR eng IN LBAll {
  300.             eng:GETMODULE("ModuleEngines"):DOEVENT("Shutdown Engine").
  301.         }. //FOR eng
  302.        
  303.         FOR eng IN RBAll {
  304.             eng:GETMODULE("ModuleEngines"):DOEVENT("Shutdown Engine").
  305.         }. //FOR eng
  306.        
  307.         FOR part IN S2finHinges {
  308.             PART:GETMODULE("MuMechToggle"):DOACTION("move -",TRUE).
  309.         }. //FOR finhinge move
  310.        
  311.         FOR part IN SBAnt {
  312.             SBAnt:GETMODULE("ModuleRTAntenna"):DOEVENT("Activate").
  313.         }.
  314.        
  315.         PRINT "T+" + missionClock + " Boosters at sep level. Staging" AT(0,nextLine).
  316.         SET nextLine TO nextLine + 1.
  317.         SET BECOtimer to missionClock.
  318.        
  319.         WHEN missionClock >= (BECOtimer + 1.5) THEN {
  320.             IF opMode = "Mk2RB" OR opMode = "Mk2R" {
  321.                 FOR part IN S2finHinges {
  322.                     PART:GETMODULE("MuMechToggle"):DOACTION("move -",FALSE).
  323.                 }. //FOR finhinge stop
  324.             }. //IF
  325.        
  326.             WHEN missionClock >= (BECOtimer + 2.5) THEN {
  327.                 FOR part IN SBDecouplers {
  328.                     part:GETMODULE("&*&*&MODULE GOES HERE&*&*&*"):DOEVENT("Decouple").
  329.                 }. //FOR part
  330.                
  331.                 SET S1Ready TO TRUE.        //Primes the first stage WHEN-THEN
  332.             }. //WHEN missionClock decouple
  333.         }.//WHEN missionClock fins stop
  334.        
  335.     }. //WHEN loxRemaining
  336. }. //IF opMode
  337.  
  338. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  339. //~~~~~Center Core Staging Control~~~~~
  340. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  341.  
  342. 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
  343.     FOR eng IN S1All {
  344.         eng:GETMODULE("ModuleEngines"):DOEVENT("Shutdown Engine").
  345.     }. //FOR eng shutdown
  346.  
  347.  
  348.    
  349.     IF opMode = "Mk1R" OR opMode = "Mk2R" {
  350.         FOR part IN S1finHinges {
  351.             PART:GETMODULE("MuMechToggle"):DOACTION("move -",TRUE).
  352.         }. //FOR finhinge move
  353.         S1Ant:GETMODULE("ModuleRTAntenna"):DOEVENT("Activate").
  354.        
  355.     }. //IF opMode
  356.    
  357.     RCS ON.
  358.     SAS ON.
  359.     PRINT "T+" + missionClock + " Stage 1 at sep level, staging" AT(0,nextLine).
  360.     SET nextLine TO nextLine + 1.
  361.     SET S1ECOtimer to missionClock.     //Marks the time at which S1ECO occurred
  362.    
  363.     WHEN missionClock >= (S1ECOtimer + 1.5) THEN {      //Checks to see if 1.5 seconds has passed since S1ECO, quit extending fins if true
  364.         IF opMode = "Mk1R" OR opMode = "Mk2R" {
  365.             FOR part IN finHinges {
  366.                 PART:GETMODULE("MuMechToggle"):DOACTION("move -",FALSE).
  367.             }. //FOR finhinge stop
  368.            
  369.             PRINT "T+" + missionClock + " Fins extended" AT(0,nextLine).
  370.             SET nextLine TO nextLine + 1.
  371.            
  372.         }. //IF opMode
  373.        
  374.         WHEN missionClock >= (S1ECOtimer + 2.5) THEN {      //Checks to see if 2.5 seconds have passed since S1ECO, stage sep if true
  375.             interStage:GETMODULE("ModuleDecouple"):DOEVENT("Decouple").
  376.             PRINT "T+" + missionClock + " Staging confirmed" AT(0,nextLine).
  377.             SET nextLine TO nextLine + 1.
  378.             SET activeStage TO 2.       //Denotes that stage 2 is now the active stage
  379.             SET loxCap TO S2Tank:RESOURCES[1]:CAPACITY.
  380.             LOCK loxAmount TO S2Tank:RESOURCES[1]:AMOUNT.
  381.        
  382.             WHEN missionClock >= (S1ECOtimer + 7.5) THEN {      //Checks to see if 5 seconds have passed since stage sep, MEI if true
  383.                 FOR eng IN S2Alpha {
  384.                     eng:GETMODULE("ModuleEngines"):DOEVENT("Activate Engine").
  385.                 }.
  386.                
  387.                 PRINT "T+" + missionClock + " MEI" AT(0,nextLine).
  388.                 SET nextLine TO nextLine + 1.
  389.    
  390.                 WHEN SHIP:ALTITUDE > 60000 THEN {       //Fairing sep at 60km or 3 seconds after stage 2 ignition, both conditions need satisfied
  391.            
  392.                     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
  393.    
  394.                         FOR PART IN fairingShell {
  395.                             PART:GETMODULE("ProceduralFairingDecoupler"):DOEVENT("Jettison").
  396.                         }. //FOR loop
  397.                         SET fairingSep TO TRUE.     //Readout will update to confirm fairing sep status
  398.                         S2Ant:GETMODULE("ModuleRTAntenna"):DOEVENT("Activate").     //Activate small omni on second stage
  399.                         PRINT "T+" + missionClock + " Fairing separation confirmed" AT(0,nextLine).
  400.                         SET nextLine TO nextLine + 1.
  401.                    
  402.                     }. //WHEN fairingTimer
  403.                 }. //WHEN SHIP:ALTITUDE
  404.             }. //WHEN stage2StartTimer
  405.         }. //WHEN BECOtimer decouple
  406.     }. //WHEN BECOtimer finHinges
  407. }. //WHEN loxRemaining
  408.  
  409.  
  410. //~~~~~~~~~~~~~~~~~~
  411. //~~~~~Readouts~~~~~
  412. //~~~~~~~~~~~~~~~~~~
  413.  
  414. CLEARSCREEN.
  415.  
  416. PRINT "============COYOTE MEDIUM LAUNCH SYSTEM===========" AT(0,0).
  417.  
  418. PRINT "ASL: " AT(0,2).      //Altitude above sea level readout at 6,2
  419. PRINT "VEL: " AT(16,2).     //Surface or orbital velocity readout at 22,2
  420. PRINT "CLK: " AT(33,2).     //Mission clock readout at 39,2
  421.  
  422. PRINT "STG: " AT(0,3).      //Current stage readout at 6,3
  423. PRINT "SFL: " AT(16,3).     //Stage fuel level readout at 22,3
  424. PRINT "FRG: " AT(33,3).     //Fairing status readout at 39,3
  425.  
  426. PRINT "-------------------EVENT LOG----------------------" AT(0,5).
  427.  
  428. PRINT "T-" + ROUND(ABS(BEItime - launchTime),2) + " BEI" AT(0,nextLine).        //Time of BEI, will be negative
  429. SET nextLine TO nextLine + 1.
  430. PRINT "T+0.0 Liftoff" AT(0,nextLine).
  431. SET nextLine TO nextLine + 1.
  432.  
  433. UNTIL APOAPSIS > (targetAlt * 1000) {       //Exits script when apoapsis reaches target alt
  434.  
  435.     PRINT FLOOR(SHIP:ALTITUDE) + "   " AT(6,2).
  436.  
  437.     IF ALTITUDE <=50000 {       //Prints surface velocity below 50km, orbital above
  438.         PRINT ROUND(VELOCITY:SURFACE:MAG,1) + "   " AT(22,2).
  439.     } ELSE {
  440.         PRINT ROUND(VELOCITY:ORBIT:MAG,1) + "   " AT(22,2).
  441.     }. //IF-ELSE
  442.  
  443.     PRINT missionClock AT(39,2).
  444.     PRINT activeStage AT(6,3).
  445.     PRINT ROUND((loxRemaining * 100), 1) + "%  " AT(22,3).
  446.  
  447.     IF fairingSep = FALSE {         //Prints ATCHD or SPRTD depending on whether the fairings are still on
  448.         PRINT "ATCHD" + "   " AT(39,3).
  449.     } ELSE {
  450.         PRINT "SPRTD" + "   " AT(39,3).
  451.     }. //IF-ELSE
  452.    
  453.     WAIT (1 / updateRes).       //Update resolution turned into fraction
  454. }. //UNTIL
  455.  
  456. //SET exitCond TO TRUE.     //Required at the end of the EXIT loop to keep it from actually looping
  457. //}. //UNTIL **EXIT**
  458.  
  459. SET SHIP:CONTROL:PILOTMAINTHROTTLE TO 0.
  460. CLEARSCREEN.
  461. PRINT "Manual Control Restored, Program Exiting...".
  462. WAIT 2.
  463. CLEARSCREEN.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement