SHARE
TWEET

Draconic Reactor Control

a guest Apr 19th, 2019 121 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- modifiable variables
  2. local reactorSide = "back"
  3. local fluxgateSide = "right"
  4.  
  5. local targetStrength = 50
  6. local maxTemperature = 8000
  7. local safeTemperature = 3000
  8. local lowestFieldPercent = 15
  9.  
  10. local activateOnCharged = 1
  11.  
  12. -- please leave things untouched from here on
  13. os.loadAPI("lib/f")
  14.  
  15. local version = "0.25"
  16. -- toggleable via the monitor, use our algorithm to achieve our target field strength or let the user tweak it
  17. local autoInputGate = 1
  18. local curInputGate = 222000
  19.  
  20. -- monitor
  21. local mon, monitor, monX, monY
  22.  
  23. -- peripherals
  24. local reactor
  25. local fluxgate
  26. local inputfluxgate
  27.  
  28. -- reactor information
  29. local ri
  30.  
  31. -- last performed action
  32. local action = "None since reboot"
  33. local emergencyCharge = false
  34. local emergencyTemp = false
  35.  
  36. monitor = f.periphSearch("monitor")
  37. inputfluxgate = f.periphSearch("flux_gate")
  38. fluxgate = peripheral.wrap(fluxgateSide)
  39. reactor = peripheral.wrap(reactorSide)
  40.  
  41. if monitor == null then
  42.     error("No valid monitor was found")
  43. end
  44.  
  45. if fluxgate == null then
  46.     error("No valid fluxgate was found")
  47. end
  48.  
  49. if reactor == null then
  50.     error("No valid reactor was found")
  51. end
  52.  
  53. if inputfluxgate == null then
  54.     error("No valid flux gate was found")
  55. end
  56.  
  57. monX, monY = monitor.getSize()
  58. mon = {}
  59. mon.monitor,mon.X, mon.Y = monitor, monX, monY
  60.  
  61. --write settings to config file
  62. function save_config()
  63.   sw = fs.open("config.txt", "w")  
  64.   sw.writeLine(version)
  65.   sw.writeLine(autoInputGate)
  66.   sw.writeLine(curInputGate)
  67.   sw.close()
  68. end
  69.  
  70. --read settings from file
  71. function load_config()
  72.   sr = fs.open("config.txt", "r")
  73.   version = sr.readLine()
  74.   autoInputGate = tonumber(sr.readLine())
  75.   curInputGate = tonumber(sr.readLine())
  76.   sr.close()
  77. end
  78.  
  79.  
  80. -- 1st time? save our settings, if not, load our settings
  81. if fs.exists("config.txt") == false then
  82.   save_config()
  83. else
  84.   load_config()
  85. end
  86.  
  87. function buttons()
  88.  
  89.   while true do
  90.     -- button handler
  91.     event, side, xPos, yPos = os.pullEvent("monitor_touch")
  92.  
  93.     -- reactor control
  94.     if yPos >= 1 and yPos <= 3 then
  95.       if ri.status == "charging" then
  96.         reactor.stopReactor()
  97.       elseif ri.status == "offline" then
  98.         reactor.chargeReactor()
  99.       elseif ri.status == "online" then
  100.         reactor.stopReactor()
  101.       end
  102.     end
  103.    
  104.     -- output gate controls
  105.     -- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
  106.     -- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
  107.     if yPos == 7 then
  108.       local cFlow = fluxgate.getSignalLowFlow()
  109.       if xPos >= 2 and xPos <= 4 then
  110.         cFlow = cFlow-1000
  111.       elseif xPos >= 6 and xPos <= 9 then
  112.         cFlow = cFlow-10000
  113.       elseif xPos >= 10 and xPos <= 12 then
  114.         cFlow = cFlow-100000
  115.       elseif xPos >= 17 and xPos <= 19 then
  116.         cFlow = cFlow+100000
  117.       elseif xPos >= 21 and xPos <= 23 then
  118.         cFlow = cFlow+10000
  119.       elseif xPos >= 25 and xPos <= 27 then
  120.         cFlow = cFlow+1000
  121.       end
  122.       fluxgate.setSignalLowFlow(cFlow)
  123.     end
  124.  
  125.     -- input gate controls
  126.     -- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
  127.     -- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
  128.     if yPos == 10 and autoInputGate == 0 and xPos ~= 14 and xPos ~= 15 then
  129.       if xPos >= 2 and xPos <= 4 then
  130.         curInputGate = curInputGate-1000
  131.       elseif xPos >= 6 and xPos <= 9 then
  132.         curInputGate = curInputGate-10000
  133.       elseif xPos >= 10 and xPos <= 12 then
  134.         curInputGate = curInputGate-100000
  135.       elseif xPos >= 17 and xPos <= 19 then
  136.         curInputGate = curInputGate+100000
  137.       elseif xPos >= 21 and xPos <= 23 then
  138.         curInputGate = curInputGate+10000
  139.       elseif xPos >= 25 and xPos <= 27 then
  140.         curInputGate = curInputGate+1000
  141.       end
  142.       inputfluxgate.setSignalLowFlow(curInputGate)
  143.       save_config()
  144.     end
  145.  
  146.     -- input gate toggle
  147.     if yPos == 10 and ( xPos == 14 or xPos == 15) then
  148.       if autoInputGate == 1 then
  149.         autoInputGate = 0
  150.       else
  151.         autoInputGate = 1
  152.       end
  153.       save_config()
  154.     end
  155.  
  156.   end
  157. end
  158.  
  159. function drawButtons(y)
  160.  
  161.   -- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
  162.   -- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
  163.  
  164.   f.draw_text(mon, 2, y, " < ", colors.white, colors.lightBlue)
  165.   f.draw_text(mon, 6, y, " <<", colors.white, colors.lightBlue)
  166.   f.draw_text(mon, 10, y, "<<<", colors.white, colors.lightBlue)
  167.  
  168.   f.draw_text(mon, 17, y, ">>>", colors.white, colors.purple)
  169.   f.draw_text(mon, 21, y, ">> ", colors.white, colors.purple)
  170.   f.draw_text(mon, 25, y, " > ", colors.white, colors.purple)
  171. end
  172.  
  173.  
  174.  
  175. function update()
  176.   while true do
  177.  
  178.     f.clear(mon)
  179.  
  180.     ri = reactor.getReactorInfo()
  181.  
  182.     -- print out all the infos from .getReactorInfo() to term
  183.  
  184.     if ri == nil then
  185.       error("reactor has an invalid setup")
  186.     end
  187.  
  188.     for k, v in pairs (ri) do
  189.       print(k.. ": ".. v)
  190.     end
  191.     print("Output Gate: ", fluxgate.getSignalLowFlow())
  192.     print("Input Gate: ", inputfluxgate.getSignalLowFlow())
  193.  
  194.     -- monitor output
  195.  
  196.     local statusColor
  197.     statusColor = colors.red
  198.  
  199.     if ri.status == "online" or ri.status == "charged" then
  200.       statusColor = colors.green
  201.     elseif ri.status == "offline" then
  202.       statusColor = colors.gray
  203.     elseif ri.status == "charging" then
  204.       statusColor = colors.orange
  205.     end
  206.  
  207.     f.draw_text_lr(mon, 2, 2, 1, "Reactor Status", string.upper(ri.status), colors.white, statusColor, colors.black)
  208.  
  209.     f.draw_text_lr(mon, 2, 4, 1, "Generation", f.format_int(ri.generationRate) .. " rf/t", colors.white, colors.lime, colors.black)
  210.  
  211.     f.draw_text_lr(mon, 2, 6, 1, "Output Gate", f.format_int(fluxgate.getSignalLowFlow()) .. " rf/t", colors.white, colors.blue, colors.black)
  212.  
  213.     -- buttons
  214.     drawButtons(7)
  215.  
  216.     f.draw_text_lr(mon, 2, 9, 1, "Input Gate", f.format_int(inputfluxgate.getSignalLowFlow()) .. " rf/t", colors.white, colors.blue, colors.black)
  217.  
  218.     if autoInputGate == 1 then
  219.       f.draw_text(mon, 14, 10, "AU", colors.white, colors.gray)
  220.     else
  221.       f.draw_text(mon, 14, 10, "MA", colors.white, colors.green)
  222.       drawButtons(10)
  223.     end
  224.    
  225.     f.draw_text(mon, 0, 12, "                                                      ", colors.white, colors.yellow)
  226.    
  227.     local satPercent
  228.     satPercent = math.ceil(ri.energySaturation / ri.maxEnergySaturation * 10000)*.01
  229.     f.draw_text_lr(mon, 2, 14, 1, "Energy Saturation", satPercent .. "%", colors.white, colors.white, colors.black)
  230.     f.progress_bar(mon, 2, 15, mon.X-2, satPercent, 100, colors.blue, colors.gray)
  231.  
  232.     local tempPercent, tempColor
  233.     tempPercent = math.ceil(ri.temperature / 8000 * 10000)*.01
  234.  
  235.     temperatureColor = colors.red
  236.     if ri.temperature <= 5000 then tempColor = colors.green end
  237.     if ri.temperature >= 5000 and ri.temperature <= 6500 then tempColor = colors.orange end
  238.  
  239.     f.draw_text_lr(mon, 2, 17, 1, "Temperature ", ri.temperature .. "°C", colors.white, tempColor, colors.black)
  240.     f.progress_bar(mon, 2, 18, mon.X-2, tempPercent, 100, tempColor, colors.gray)
  241.  
  242.     local fieldPercent, fieldColor
  243.     fieldPercent = math.ceil(ri.fieldStrength / ri.maxFieldStrength * 10000)*.01
  244.  
  245.     fieldColor = colors.red
  246.     if fieldPercent >= 50 then fieldColor = colors.green end
  247.     if fieldPercent < 50 and fieldPercent > 30 then fieldColor = colors.orange end
  248.  
  249.     if autoInputGate == 1 then
  250.       f.draw_text_lr(mon, 2, 20, 1, "Field Strength T:" .. targetStrength, fieldPercent .. "%", colors.white, fieldColor, colors.black)
  251.     else
  252.       f.draw_text_lr(mon, 2, 20, 1, "Field Strength", fieldPercent .. "%", colors.white, fieldColor, colors.black)
  253.     end
  254.     f.progress_bar(mon, 2, 21, mon.X-2, fieldPercent, 100, fieldColor, colors.gray)
  255.  
  256.     local fuelPercent, fuelColor
  257.  
  258.     fuelPercent = 100 - math.ceil(ri.fuelConversion / ri.maxFuelConversion * 10000)*.01
  259.  
  260.     fuelColor = colors.red
  261.  
  262.     if fuelPercent >= 70 then fuelColor = colors.green end
  263.     if fuelPercent < 70 and fuelPercent > 30 then fuelColor = colors.orange end
  264.  
  265.     f.draw_text_lr(mon, 2, 23, 1, "Fuel ", fuelPercent .. "%", colors.white, fuelColor, colors.black)
  266.     f.progress_bar(mon, 2, 24, mon.X-2, fuelPercent, 100, fuelColor, colors.gray)
  267.  
  268.     f.draw_text_lr(mon, 2, 26, 1, "Action ", action, colors.gray, colors.gray, colors.black)
  269.  
  270.     -- actual reactor interaction
  271.     --
  272.     if emergencyCharge == true then
  273.       reactor.chargeReactor()
  274.     end
  275.    
  276.     -- are we charging? open the floodgates
  277.     if ri.status == "charging" then
  278.       inputfluxgate.setSignalLowFlow(900000)
  279.       emergencyCharge = false
  280.     end
  281.  
  282.     -- are we stopping from a shutdown and our temp is better? activate
  283.     if emergencyTemp == true and ri.status == "stopping" and ri.temperature < safeTemperature then
  284.       reactor.activateReactor()
  285.       emergencyTemp = false
  286.     end
  287.  
  288.     -- are we charged? lets activate
  289.     if ri.status == "charged" and activateOnCharged == 1 then
  290.       reactor.activateReactor()
  291.     end
  292.  
  293.     -- are we on? regulate the input fludgate to our target field strength
  294.     -- or set it to our saved setting since we are on manual
  295.     if ri.status == "online" then
  296.       if autoInputGate == 1 then
  297.         fluxval = ri.fieldDrainRate / (1 - (targetStrength/100) )
  298.         print("Target Gate: ".. fluxval)
  299.         inputfluxgate.setSignalLowFlow(fluxval)
  300.       else
  301.         inputfluxgate.setSignalLowFlow(curInputGate)
  302.       end
  303.     end
  304.  
  305.     -- safeguards
  306.     --
  307.    
  308.     -- out of fuel, kill it
  309.     if fuelPercent <= 10 then
  310.       reactor.stopReactor()
  311.       action = "Fuel below 10%, refuel"
  312.     end
  313.  
  314.     -- field strength is too dangerous, kill and it try and charge it before it blows
  315.     if fieldPercent <= lowestFieldPercent and ri.status == "online" then
  316.       action = "Field Str < " ..lowestFieldPercent.."%"
  317.       reactor.stopReactor()
  318.       reactor.chargeReactor()
  319.       emergencyCharge = true
  320.     end
  321.  
  322.     -- temperature too high, kill it and activate it when its cool
  323.     if ri.temperature > maxTemperature then
  324.       reactor.stopReactor()
  325.       action = "Temp > " .. maxTemperature
  326.       emergencyTemp = true
  327.     end
  328.  
  329.     sleep(0.1)
  330.   end
  331. end
  332.  
  333. parallel.waitForAny(buttons, update)
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top