Advertisement
KindarConrath

Reactor Code + Turbine

Jun 3rd, 2015
537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 16.98 KB | None | 0 0
  1. ---------------------------------------------------
  2. -- Big Reactors Control Code                     --
  3. -- Designer: Direwolf20                          --
  4. -- Additional: Kindar_Conrath                    --
  5. -- Required Parts: Advanced Computer, Reactor,   --
  6. --           Advanced Monitor (Recommend 4x3),   --
  7. --  EnderIO Capacitor Bank (Any Size, Any Number)--
  8. -- Optional Parts: Turbine (1-8)                 --
  9. ---------------------------------------------------
  10.  
  11. os.loadAPI("button")
  12.  
  13. p = peripheral.find("tile_blockcapacitorbank_name")
  14. m = peripheral.find("monitor")
  15. r = peripheral.find("BigReactors-Reactor")
  16. t, t2, t3, t4, t5, t6, t7, t8 = peripheral.find("BigReactors-Turbine")       -- find up to 8 turbines
  17.  
  18. local turbines = { t, t2, t3, t4, t5, t6, t7, t8 }  -- put each turbine in a table
  19. local numTurbines = table.getn(turbines)
  20. local steamReactor = r.isActivelyCooled()
  21. local menuType = "Reactor"
  22.  
  23. local numCapacitors = 24
  24. local turnOnAt = 50
  25. local turnOffAt = 90
  26.  
  27. local targetSpeed = 1782
  28.  
  29. local div = 3                       --Divisor for power usage
  30.  
  31. local energy = 0
  32. local energyStored = 0
  33. local energyMax = 0
  34. local energyStoredPercent = 0
  35. local timerCode
  36. local mode = "Automatic"
  37. local RFProduction = 0
  38. local fuelUse = 0
  39. local coreTemp = 0
  40. local reactorOnline = false
  41. local rodLevel = 0
  42.  
  43. local turbineOnline = false
  44. local turbineRotorSpeed = 0
  45. local turbineRFGen = 0
  46. local turbineFluidRate = 0
  47. local turbineInductor = false
  48.  
  49. local OptFuelRodLevel = 0
  50.  
  51. function autoMenu()
  52.    m.setTextScale(1)
  53.    button.clearTable()
  54.    button.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
  55.    button.setTable("Manual", manualMode, "", 15, 25, 6, 6)
  56.    
  57.    if steamReactor then
  58.       button.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
  59.       button.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
  60.    end
  61.    button.screen()
  62.    checkMode()
  63.    menuMode()
  64. end
  65.  
  66. function manualMenu()
  67.    m.setTextScale(1)
  68.    button.clearTable()
  69.    button.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
  70.    button.setTable("Manual", manualMode, "", 15, 25, 6, 6)
  71.    button.setTable("Online", online, "", 3, 13, 8, 8)
  72.    button.setTable("Offline", offline, "", 15, 25, 8, 8)
  73.    button.setTable("0", setRods, 0, 11,14, 10, 10)
  74.    button.setTable("10", setRods, 10, 5,8, 12, 12)
  75.    button.setTable("20", setRods, 20, 11,14, 12, 12)
  76.    button.setTable("30", setRods, 30, 17,20, 12, 12)
  77.    button.setTable("40", setRods, 40, 5,8, 14, 14)
  78.    button.setTable("50", setRods, 50, 11,14, 14, 14)
  79.    button.setTable("60", setRods, 60, 17,20, 14, 14)
  80.    button.setTable("70", setRods, 70, 5,8, 16, 16)
  81.    button.setTable("80", setRods, 80, 11,14, 16, 16)
  82.    button.setTable("90", setRods, 90, 17,20, 16, 16)
  83.    button.setTable("+", rodPlus, "", 23, 25, 12, 12)
  84.    button.setTable("-", rodMinus, "", 23, 25, 16, 16)
  85.  
  86.    if steamReactor then
  87.       button.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
  88.       button.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
  89.      
  90.    end
  91.    button.screen()
  92.    checkMode()
  93.    reactorOnOff()
  94.    menuMode()
  95. end
  96.  
  97. function turbineAutoMenu()
  98.    m.setTextScale(1)
  99.    button.clearTable()
  100.    button.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
  101.    button.setTable("Manual", manualMode, "", 15, 25, 6, 6)
  102.    button.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
  103.    button.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
  104.    button.screen()
  105.    checkMode()
  106.    menuMode()
  107. end
  108.  
  109. function turbineManualMenu()
  110.    m.setTextScale(1)
  111.    button.clearTable()
  112.    button.setTable("Automatic", autoMode, "", 3, 13, 6, 6)
  113.    button.setTable("Manual", manualMode, "", 15, 25, 6, 6)
  114.    button.setTable("Reactor", reactorMenu, "", 5, 18, 19, 19)
  115.    button.setTable("Turbine", turbineMenu, "", 22, 35, 19, 19)
  116.    button.setTable("Online", setTurbineOnline, "", 3, 13, 8, 8)
  117.    button.setTable("Offline", setTurbineOffline, "", 15, 25, 8, 8)
  118.    button.setTable("Coils On", coilsOn, "", 3, 13, 10, 10)
  119.    button.setTable("Coils Off", coilsOff, "", 15, 25, 10, 10)
  120.    button.screen()
  121.    checkMode()
  122.    turbineOnOff()
  123.    coilsOnOff()
  124.    menuMode()
  125. end
  126.  
  127. function reactorMenu()
  128.    menuType = "Reactor"
  129.    displayScreen()
  130. end
  131.  
  132. function turbineMenu()
  133.    menuType = "Turbine"
  134.    displayScreen()
  135. end
  136.  
  137. function online()
  138.    r.setActive(true)
  139.    --button.flash("Online")
  140. end
  141.  
  142. function offline()
  143.    r.setActive(false)
  144.    --button.flash("Offline")
  145. end
  146.  
  147. function setTurbineOnline()
  148.    for i, b in pairs(turbines) do
  149.       b.setActive(true)
  150.    end
  151.    --button.flash("Online")
  152. end
  153.  
  154. function setTurbineOffline()
  155.    for i, b in pairs(turbines) do
  156.       b.setActive(false)
  157.    end
  158.    --button.flash("Offline")
  159. end
  160.  
  161. function reactorOnOff()
  162.    button.setButton("Online", r.getActive())
  163.    button.setButton("Offline", not r.getActive())
  164. end
  165.  
  166. function turbineOnOff()
  167.    button.setButton("Online", t.getActive())
  168.    button.setButton("Offline", not t.getActive())
  169. end
  170.  
  171. function coilsOnOff()
  172.    button.setButton("Coils On", t.getInductorEngaged())
  173.    button.setButton("Coils Off", not t.getInductorEngaged())
  174. end
  175.  
  176. function coilsOn()
  177.    for i, b in pairs(turbines) do
  178.       b.setInductorEngaged(true)
  179.    end
  180. end
  181.  
  182. function coilsOff()
  183.    for i, b in pairs(turbines) do
  184.       b.setInductorEngaged(false)
  185.    end
  186. end
  187.  
  188. function menuMode()
  189.    if steamReactor then
  190.    if menuType == "Reactor" then
  191.      button.setButton("Reactor", true)
  192.      button.setButton("Turbine", false)
  193.    else
  194.      button.setButton("Reactor", false)
  195.      button.setButton("Turbine", true)
  196.    end
  197.    end
  198. end
  199.  
  200. function setRods(setLevel)
  201.    print("Setting Rod Level: "..setLevel)
  202.    button.flash(tostring(setLevel))
  203.    r.setAllControlRodLevels(setLevel)
  204.    fuelRodLevel()
  205. end
  206.  
  207. function rodPlus()
  208.    button.flash("+")
  209.    r.setAllControlRodLevels(rodLevel+1)
  210.    fuelRodLevel()
  211. end
  212.  
  213. function rodMinus()
  214.    button.flash("-")
  215.    r.setAllControlRodLevels(rodLevel-1)
  216.    fuelRodLevel()
  217. end
  218.  
  219. function checkMode()
  220.    button.toggleButton(mode)
  221. end
  222.    
  223. function manualMode()
  224.    mode = "Manual"
  225.    manualMenu()
  226. end
  227.  
  228. function autoMode()
  229.    mode = "Automatic"
  230.    displayScreen()
  231. end
  232.  
  233. function comma_value(amount)
  234.    local formatted = amount
  235.    local swap = false
  236.    if formatted < 0 then
  237.       formatted = formatted*-1
  238.       swap = true
  239.    end
  240.    while true do
  241.       formatted, k = string.gsub(formatted, "^(%d+)(%d%d%d)", '%1,%2')
  242.       if k == 0 then
  243.          break
  244.       end
  245.    end
  246.    if swap then
  247.      formatted = "-"..formatted
  248.    end
  249.    return formatted
  250. end
  251.  
  252. function displayEn()
  253.    m.clear()
  254.    m.setCursorPos(1,1)
  255.    --print("Energy Use: "..energy)
  256.    m.write("Energy Use: ")
  257.    if energy < 0 then
  258.       m.setTextColor(colors.red)
  259.    else
  260.       m.setTextColor(colors.green)
  261.    end
  262.    m.write(comma_value(math.floor(energy)).. "RF/t")
  263.    m.setTextColor(colors.white)
  264.    m.setCursorPos(1,2)
  265.    m.write("Energy Stored: "..energyStoredPercent.."%")
  266.    if menuType == "Reactor" then
  267.       m.setCursorPos(1,3)
  268.       m.write("Reactor is: ")
  269.       if reactorOnline then
  270.        m.setTextColor(colors.green)
  271.        m.write("Online")
  272.       else
  273.        m.setTextColor(colors.red)
  274.        m.write("Offline")
  275.       end
  276.       m.setTextColor(colors.white)
  277.       m.setCursorPos(24,1)
  278.       if steamReactor then
  279.          m.write("Steam: ")
  280.          m.setTextColor(colors.green)
  281.          m.write(comma_value(math.floor(RFProduction)).."MB/t")
  282.       else
  283.          m.write("RF Gen: ")
  284.          m.setTextColor(colors.green)
  285.          m.write(comma_value(math.floor(RFProduction)).."RF/t")
  286.       end
  287.       m.setTextColor(colors.white)
  288.       m.setCursorPos(24,2)
  289.       m.write("Core Temp: "..math.floor(coreTemp).."c")
  290.       m.setCursorPos(24,3)
  291.       m.write("Fuel Use: "..fuelUse.."MB/t")  
  292.   else
  293.       m.setCursorPos(1,3)
  294.       m.write("Turbine is: ")
  295.       if turbineOnline then
  296.        m.setTextColor(colors.green)
  297.        m.write("Online")
  298.       else
  299.        m.setTextColor(colors.red)
  300.        m.write("Offline")
  301.       end
  302.       m.setCursorPos(1,4)
  303.       m.setTextColor(colors.white)
  304.       m.write("Reactor is: ")
  305.       if reactorOnline then
  306.          m.setTextColor(colors.green)
  307.          m.write("Online")
  308.       else
  309.          m.setTextColor(colors.red)
  310.          m.write("Offline")
  311.       end
  312.       m.setTextColor(colors.white)
  313.       m.setCursorPos(22,1)
  314.       m.write("RFGen: ")
  315.       m.setTextColor(colors.green)
  316.       m.write(comma_value(math.floor(turbineRFGen*numTurbines)).."RF/t")
  317.       m.setTextColor(colors.white)
  318.       m.setCursorPos(22,2)
  319.       m.write("Rotor: "..comma_value(math.floor(turbineRotorSpeed)).." RPM")
  320.       m.setCursorPos(22,3)
  321.       m.write("Steam: "..comma_value(turbineFluidRate*numTurbines).."MB/t")  
  322.   end
  323.  
  324. end
  325.  
  326. function checkEn()
  327.    local tempEnergy = 0
  328.    energyStored = p.getEnergyStored()
  329.    energyMax = p.getMaxEnergyStored()
  330.    energyStoredPercent = math.floor((energyStored/energyMax)*100)
  331.    RFProduction = r.getEnergyProducedLastTick()
  332.    fuelUse = r.getFuelConsumedLastTick()
  333.    fuelUse = math.floor(fuelUse*100)
  334.    fuelUse = fuelUse/100
  335.    coreTemp = r.getFuelTemperature()
  336.    reactorOnline = r.getActive()
  337.    tempEnergy = p.getEnergyStored()
  338.    sleep(0.1)
  339.    energy = (p.getEnergyStored()-tempEnergy)/div
  340.    energy = energy*numCapacitors
  341.    if steamReactor then
  342.      turbineOnline = t.getActive()
  343.      turbineRotorSpeed = t.getRotorSpeed()
  344.      turbineRFGen = t.getEnergyProducedLastTick()
  345.      turbineFluidRate = t.getFluidFlowRate()
  346.    end
  347. end
  348.  
  349. function fuelRodLevel()
  350.    rodLevel = r.getControlRodLevel(0)
  351.    --print(rodLevel)
  352.    m.setCursorPos(30,5)
  353.    m.write(tostring(rodLevel).."%")
  354.    m.setBackgroundColor(colors.white)
  355.    m.setCursorPos(28,6)
  356.    m.write("       ")
  357.    for i = 1,10 do
  358.       m.setCursorPos(28,i+6)
  359.       m.setBackgroundColor(colors.white)
  360.       m.write(" ")
  361.       m.setBackgroundColor(colors.yellow)
  362.       m.write(" ")
  363.       if rodLevel/10 >= i then
  364.          m.setBackgroundColor(colors.red)
  365.       else
  366.          m.setBackgroundColor(colors.yellow)
  367.       end
  368.       m.write("   ")
  369.       m.setBackgroundColor(colors.yellow)
  370.       m.write(" ")
  371.       m.setBackgroundColor(colors.white)
  372.       m.write(" ")
  373.    end
  374.    m.setCursorPos(28,17)
  375.    m.write("       ")
  376.    m.setBackgroundColor(colors.black)
  377. end
  378.  
  379. function turbineInductorDisplay()
  380.    turbineInductor = t.getInductorEngaged()
  381.    m.setCursorPos(30,5)
  382.    if turbineInductor then
  383.       m.write("On")
  384.    else
  385.       m.write("Off")
  386.    end
  387.    m.setBackgroundColor(colors.gray)
  388.    m.setCursorPos(28,6)
  389.    m.write("       ")
  390.    for i = 1,7 do
  391.       m.setCursorPos(28,i+6)
  392.       m.setBackgroundColor(colors.gray)
  393.       m.write(" ")
  394.       m.setBackgroundColor(colors.lightGray)
  395.       m.write(" ")
  396.       if i % 2 == 0 then
  397.          m.setBackgroundColor(colors.gray)
  398.       end
  399.       m.write(" ")
  400.       m.setBackgroundColor(colors.gray)
  401.       m.write(" ")
  402.       if i % 2 ~= 0 then
  403.          m.setBackgroundColor(colors.lightGray)
  404.       end
  405.       m.write(" ")
  406.       m.setBackgroundColor(colors.lightGray)
  407.       m.write(" ")
  408.       m.setBackgroundColor(colors.gray)
  409.       m.write(" ")
  410.    end
  411.    for i = 8,10 do
  412.    m.setCursorPos(28,i+6)
  413.       m.setBackgroundColor(colors.gray)
  414.       m.write(" ")
  415.       m.setBackgroundColor(colors.lightGray)
  416.       m.write(" ")
  417.       if turbineInductor then
  418.          m.setBackgroundColor(colors.red)
  419.       else
  420.          m.setBackgroundColor(colors.blue)
  421.       end
  422.       m.write(" ")
  423.       m.setBackgroundColor(colors.gray)
  424.       m.write(" ")
  425.       if turbineInductor then
  426.          m.setBackgroundColor(colors.red)
  427.       else
  428.          m.setBackgroundColor(colors.blue)
  429.       end
  430.       m.write(" ")
  431.       m.setBackgroundColor(colors.lightGray)
  432.       m.write(" ")
  433.       m.setBackgroundColor(colors.gray)
  434.       m.write(" ")
  435.    end
  436.    m.setCursorPos(28,17)
  437.    m.write("       ")
  438.    m.setBackgroundColor(colors.black)
  439. end
  440. function getClick()
  441.    local event, side, x, y = os.pullEvent("monitor_touch")
  442.    button.checkxy(x,y)
  443. end
  444.  
  445. function findOptFuelRods()
  446.    print("Number of turbines: "..numTurbines)
  447.    m.clear()
  448.    r.setActive(false)
  449.    checkEn()
  450.    displayEn()
  451.    fuelRodLevel()
  452.    while r.getFuelTemperature() > 99 do
  453.       for i= 1,3 do
  454.         checkEn()
  455.         displayEn()
  456.         fuelRodLevel()
  457.         m.setCursorPos(3,6)
  458.         m.write("Finding Optimal Rod Level")
  459.         m.setCursorPos(3,7)
  460.         m.write("Core Temp: "..r.getFuelTemperature())
  461.         m.setCursorPos(3,8)
  462.         m.write("Waiting for 99c")
  463.         sleep(1)
  464.       end
  465.    end
  466.    while r.getHotFluidAmount() > 10000 do
  467.      for i = 1,3 do
  468.         checkEn()
  469.         displayEn()
  470.         fuelRodLevel()
  471.         m.setCursorPos(3,6)
  472.         m.write("Finding Optimal Rod Level, please wait....")
  473.         m.setCursorPos(3,7)
  474.         m.write("Fluid Amount: "..comma_value(r.getHotFluidAmount()).."mb")
  475.         m.setCursorPos(3,8)
  476.         m.write("Waiting for 10,000mb")
  477.         sleep(1)
  478.       end
  479.    end
  480.    r.setAllControlRodLevels(99)
  481.    r.setActive(true)
  482.    
  483.    while r.getFuelTemperature() < 100 do
  484.    for i = 1,5 do
  485.      checkEn()
  486.      displayEn()
  487.      fuelRodLevel()
  488.      m.setCursorPos(3,6)
  489.      m.write("Set all rod levels to 99")
  490.      m.setCursorPos(3,7)
  491.      m.write("Waiting 5 seconds...")
  492.      sleep(1)
  493.    end
  494.    end
  495.    for i = 1,5 do
  496.      checkEn()
  497.      displayEn()
  498.      fuelRodLevel()
  499.      m.setCursorPos(3,6)
  500.      m.write("Set all rod levels to 99")
  501.      m.setCursorPos(3,7)
  502.      m.write("Waiting 5 seconds...")
  503.      sleep(1)
  504.    end
  505.    local tempMB = r.getEnergyProducedLastTick()
  506.    print(tempMB.."MB/t of steam")
  507.    local tempRodLevels = math.floor(2000*numTurbines/tempMB)
  508.    print(2000*numTurbines.."/"..tempMB.." = "..tempRodLevels)
  509.    tempRodLevels = 100-tempRodLevels+5
  510.    if tempRodLevels < 0 then
  511.      print("Suggested Rod Level is "..tempRodLevels.." trying 0.")
  512.      tempRodLevels = 0
  513.    end
  514.    print("Adding 5 to Rod Levels: "..math.floor(tempRodLevels))
  515.    r.setAllControlRodLevels(math.floor(tempRodLevels))
  516.    print("Waiting 10 seconds to confirm...")
  517.    for i = 1,10 do
  518.      checkEn()
  519.      displayEn()
  520.      fuelRodLevel()
  521.      m.setCursorPos(3,6)
  522.      m.write("Estimated Level: "..tempRodLevels)
  523.      m.setCursorPos(3,7)
  524.      m.write("Waiting 10 seconds...")
  525.      sleep(1)
  526.    end
  527.    tempMB = r.getEnergyProducedLastTick()
  528.    while tempMB > 2000*numTurbines do
  529.       tempRodLevels = tempRodLevels+1
  530.       r.setAllControlRodLevels(math.floor(tempRodLevels))
  531.       print("Setting Rod Levels to: "..tempRodLevels)
  532.       for i = 1,5 do
  533.        checkEn()
  534.        displayEn()
  535.        fuelRodLevel()
  536.        m.setCursorPos(3,6)
  537.        m.write("Getting below "..2000*numTurbines.."mb/t")
  538.        m.setCursorPos(3,7)
  539.        m.write("Currently at: "..tempMB)
  540.        sleep(1)
  541.       end
  542.       tempMB = r.getEnergyProducedLastTick()
  543.    end
  544.    while tempMB < 2000*numTurbines do
  545.       if tempRodLevels == 0  then
  546.         print("Reactor at max")
  547.         break
  548.       else
  549.         tempRodLevels = tempRodLevels -1
  550.         r.setAllControlRodLevels(math.floor(tempRodLevels))
  551.         print("Setting Rod Levels to: "..tempRodLevels)
  552.         for i = 1,5 do
  553.          checkEn()
  554.          displayEn()
  555.          fuelRodLevel()
  556.          m.setCursorPos(3,6)
  557.          for i, b in pairs(turbines) do
  558.             b.setActive(true)
  559.          end
  560.          m.write("Getting Above "..2000*numTurbines.."mb/t")
  561.          m.setCursorPos(3,7)
  562.          m.write("Currently at: "..tempMB)
  563.          sleep(1)
  564.         end
  565.       end
  566.       tempMB = r.getEnergyProducedLastTick()
  567.    end
  568.    OptFuelRodLevel = tempRodLevels
  569. end
  570.    
  571.  
  572. function autoReactor()
  573.    if not steamReactor then
  574.       r.setAllControlRodLevels(0)
  575.       if energyStoredPercent < turnOnAt then
  576.        if not reactorOnline then
  577.          online()
  578.        end
  579.       end
  580.       if energyStoredPercent > turnOffAt then
  581.        if reactorOnline then
  582.          offline()
  583.        end
  584.       end
  585.     else
  586.        r.setAllControlRodLevels(OptFuelRodLevel)
  587.        if energyStoredPercent < turnOnAt then
  588.          --online()
  589.              setTurbineOnline()
  590.              coilsOn()
  591.        end
  592.        if energyStoredPercent > turnOffAt then
  593.          --if turbineRotorSpeed > 1800 then
  594.          --   offline()
  595.          --else
  596.             --   online()
  597.          --end
  598.          setTurbineOnline()
  599.          coilsOff()
  600.        end
  601.     if turbineRotorSpeed > targetSpeed then
  602.        offline()
  603.     else
  604.        online()
  605.     end
  606.     end
  607. end
  608.  
  609. function displayScreen()
  610.  --  repeat
  611.       checkEn()
  612.       displayEn()
  613.       if menuType == "Reactor" then
  614.         fuelRodLevel()
  615.         if mode == "Automatic" then
  616.            autoMenu()
  617.            autoReactor()
  618.         else
  619.            manualMenu()
  620.         end
  621.        
  622.       else
  623.         turbineInductorDisplay()
  624.         if mode == "Automatic" then
  625.            turbineAutoMenu()
  626.            autoReactor()
  627.         else
  628.            turbineManualMenu()
  629.         end
  630.        
  631.       end
  632.      
  633.       timerCode = os.startTimer(1)
  634.       local event, side, x, y
  635.       repeat
  636.         event, side, x, y = os.pullEvent()
  637.         --print(event)
  638.         --if event == "timer" then
  639.            --print(timerCode..":"..side)
  640.            --if timerCode ~= side then
  641.               --print("Wrong Code")
  642.             --else
  643.               --print("Right Code")
  644.             --end
  645.         --end
  646.        until event~= "timer" or timerCode == side
  647.        if event == "monitor_touch" then
  648.             --print(x..":"..y)
  649.             button.checkxy(x,y)
  650.         end
  651.  --  until event ~= "timer"
  652. end
  653.  
  654. if steamReactor then
  655.    findOptFuelRods()
  656. end
  657.  
  658. while true do
  659.    displayScreen()
  660. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement