Advertisement
Guest User

reactor_control.lua

a guest
Dec 24th, 2015
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.57 KB | None | 0 0
  1. local component = require("component")
  2. local term = require("term")
  3. local computer = require("computer")
  4. local running = true
  5. local text = require("text")
  6. local unicode = require("unicode")
  7. local gpu = component.gpu
  8.  
  9.  
  10. term.clear()
  11.  
  12. term.setCursor(1,1)
  13. print("Nysile Verazi Reactor Control Module")
  14. if not component.isAvailable("br_reactor") then
  15.   serror("Unable to find reactor! Quitting out!")
  16. end
  17. print("Please select a reactor to control")
  18. local c = 1
  19. local addrtable={}
  20. for addr in component.list("br_reactor") do
  21.   print(c .. ": " .. addr)
  22.   addrtable[c] = addr
  23.   c = c + 1
  24.  
  25. end
  26. local result = term.read()
  27. if (result == "\n") then
  28.   print("No selection")
  29.   os.exit()
  30. end
  31. --os.exit()
  32. --print("Result:"..string.sub(result,1,-2)..":done")
  33. c = string.sub(result,1,-2)
  34. local seladdr = addrtable[tonumber(c)]
  35. print(c)
  36. print(addrtable[c])
  37. print("Address: " .. seladdr .. " selected")
  38. term.clear()
  39. term.setCursor(1,1)
  40. print("Nysile Verazi Reactor Control Module")
  41.  
  42. term.setCursor(1,10)
  43. local reactors = {}
  44. for addr in component.list("br_reactor") do
  45.   table.insert(reactors, component.proxy(addr))
  46.     if component.proxy(addr).isActivelyCooled() then
  47.       if component.isAvailable("br_turbine") then
  48. --        print(string.format("Active Cooled: %s",addr))
  49.       else
  50. --        print(string.format("Active Cooled reactor, NO TURBINE: %s",addr))
  51.       end
  52.     else
  53. --      print(string.format("Inactive Cooled: %s",addr))
  54.     end
  55. --  print(string.format("Added reactor %s",addr))
  56. end
  57.  
  58.  
  59. function makebox(x,y,w,h)
  60.   gpu.setForeground(0xFFFFFF)
  61.   gpu.set(x,y,unicode.char(9556))
  62.   gpu.set(x+w,y,unicode.char(9559))
  63.   gpu.set(x,y+h,unicode.char(9562))
  64.   gpu.set(x+w,y+h,unicode.char(9565))
  65.   for i=x+1,x+w-1 do
  66.     gpu.set(i,y,unicode.char(9552))
  67.     gpu.set(i,y+h,unicode.char(9552))
  68.   end
  69.   for i=y+1,y+h-1 do
  70.     gpu.set(x,i,unicode.char(9553))
  71.     gpu.set(x+w,i,unicode.char(9553))
  72.   end
  73. end
  74.  
  75.  
  76. function progressBar(x,y,w,h,value,label,color_on,color_off,color_on_fg,color_off_fg)
  77.  label = text.padRight(label or "",w)
  78.  local fg = gpu.getForeground()
  79.  local bg = gpu.getBackground()
  80.  if not color_on then
  81.    color_on = fg
  82.  end
  83.  if not color_off then
  84.    color_off = bg
  85.  end
  86.  if not color_on_fg then
  87.    color_on_fg = color_off
  88.  end
  89.  if not color_off_fg then
  90.    color_off_fg = color_on
  91.  end
  92.  local v,r = math.modf(w * value)
  93.  if v < 0 then
  94.    v = 0
  95.  elseif v > w then
  96.    v = w
  97.  end
  98.  gpu.setForeground(color_on_fg)
  99.  gpu.setBackground(color_on)
  100.  gpu.set(x,y+h/2,label:sub(1,v))
  101.  if label:sub(v+1,v+1) == " " then
  102.    gpu.setForeground(color_on)
  103.    gpu.setBackground(color_off)
  104.    gpu.set(x+v,y+h/2,unicode.char(0x258f-math.floor(r*8)))
  105.    v=v+1
  106.  end
  107.  gpu.setForeground(color_off_fg)
  108.  gpu.setBackground(color_off)
  109.  gpu.set(x+v,y+h/2,label:sub(v+1))
  110.  gpu.setForeground(fg)
  111.  gpu.setBackground(bg)
  112. end
  113.  
  114. function makegraph(x,y,w,h,toptext,bottomtext,value)
  115.   makebox(x,y,w,h)
  116.   --gpu.set((x+1) + (w/2) - (string.len(toptext)/2),y+1,toptext)
  117.   gpu.set((x+1)+(w/2)-(string.len(toptext)/2),y,toptext)
  118.   for i=1,h-1 do
  119.     progressBar(x+1,y+i,w-1,1,value,"",0x00FF00,0xFF0000,0x000000,0x000000)
  120.   end
  121.   gpu.set((x+1)+(w/2) - (string.len(bottomtext)/2),y+h,bottomtext)
  122. end
  123.  
  124.  
  125. --makebox(49,16,27,2)
  126. --progressBar(50,17,25,1,0.35,"Energy",0x00FF00,0xFF0000,0x000000,0x000000)
  127. --makebox(49,16,27,2)
  128. --makebox(1,15,20,10)
  129. --[[term.setCursor(44,15)
  130. --print("A:15")
  131. --term.setCursor(44,16)
  132. --print("B:16")
  133. --term.setCursor(44,17)
  134. --print("C:17")
  135. --term.setCursor(44,18)
  136. --print("D:18")]]--
  137.  
  138.  
  139. function passiveloop()
  140.   local maxenergy = {}
  141.   local maxeff = {}
  142.   local maxrod = {}
  143.   local currentrod = {}
  144.   local cyclecount = {}
  145.   local maxeffrod = {}
  146.   local energychange = {}
  147.  
  148.   for _,reactor in pairs(reactors) do
  149.     maxenergy[reactor.address] = 0
  150.     maxeff[reactor.address] = 0
  151.     currentrod[reactor.address] = 0
  152.     cyclecount[reactor.address] = 0
  153.     maxeffrod[reactor.address] = 0
  154.     energychange[reactor.address] = 0
  155.     reactor.setAllControlRodLevels(0)
  156.   end
  157.   --Re-enable this later
  158.   --gpu.setResolution(80,25)
  159.   --makebox(1,1,80,25)
  160.   while running do
  161.     local count = 0
  162.     for _,reactor in pairs(reactors) do
  163.  
  164.       local change = energychange[reactor.address] - reactor.getEnergyStored()
  165.       energychange[reactor.address] = reactor.getEnergyStored()
  166.       if (change < 0) then
  167.         currentrod[reactor.address] = currentrod[reactor.address] + 1
  168.         if (currentrod[reactor.address] > 100) then
  169.           currentrod[reactor.address] = 100
  170.         end
  171.       else
  172.         currentrod[reactor.address] = currentrod[reactor.address] - 1
  173.         if (currentrod[reactor.address] < 0) then
  174.           currentrod[reactor.address] = 0
  175.         end
  176.       end
  177.  
  178.  
  179.     reactor.setAllControlRodLevels(100 * (reactor.getEnergyStored() / 10000000))
  180.     currentrod[reactor.address] = 100 * (reactor.getEnergyStored() / 10000000)
  181.   --currentrod[reactor.address])
  182.  
  183.     if ((reactor.getEnergyStored() / 10000000) < 0.5) then
  184.   --    reactor.setAllControlRodLevels
  185.     end
  186.  
  187.       cyclecount[reactor.address] = cyclecount[reactor.address] + 1
  188.  
  189.       if (reactor.getEnergyProducedLastTick() > maxenergy[reactor.address]) then
  190.         maxenergy[reactor.address] = reactor.getEnergyProducedLastTick()
  191.       end
  192.  
  193.       local eff = reactor.getEnergyProducedLastTick() / reactor.getFuelConsumedLastTick()
  194.       if (eff > maxeff[reactor.address]) then
  195.         if (eff < math.huge) then
  196.           maxeff[reactor.address] = eff;
  197.           maxeffrod[reactor.address] = currentrod[reactor.address]      
  198.         end
  199.       end
  200.  
  201. --    makebox(1,1+(count*5),27,2)
  202. --    progressBar(2,2+(count*5),25,1,reactor.getEnergyProducedLastTick() / maxenergy[reactor.address],"Reactor",0x00FF00,0xFF0000,0x000000,0x000000)
  203.  
  204. --    makebox(30,1+(count*5),27,2)
  205. --    progressBar(31,2+(count*5),25,1,(reactor.getEnergyProducedLastTick() / reactor.getFuelConsumedLastTick()) / maxeff[reactor.address],tostring(maxeff[reactor.address]),0x00FF00,0xFF0000,0x000000,0x000000)
  206. --    makebox(1,4+(count*5),27,5)
  207. --    gpu.set(3,5+(count*5),"Reactor Control Rods")
  208. --    progressBar(2,6+(count*5),25,1,currentrod[reactor.address] / 100,"",0x00FF00,0xFF0000,0x000000,0x000000)
  209. --    progressBar(2,7+(count*5),25,1,currentrod[reactor.address] / 100,"",0x00FF00,0xFF0000,0x000000,0x000000)
  210. --    gpu.set(10,8+(count*5),tostring(currentrod[reactor.address]))    
  211.       if (reactor.address == addr) then
  212.         makegraph(1,2+(count*5),60,7,"Reactor Control Rods",tostring(currentrod[reactor.address]),currentrod[reactor.address]/100)
  213.         makegraph(1,10+(count*5),60,7,"Fuel Level",tostring(reactor.getFuelAmount() / reactor.getFuelAmountMax()),reactor.getFuelAmount() / reactor.getFuelAmountMax())
  214.         --makegraph(1,12+(count*5),60,6,"Energy Level",tostring(reactor.getEnergyStored()),(reactor.getEnergyStored() / 10000000))
  215.         makegraph(1,18+(count*5),60,7,"Energy Produced",tostring(reactor.getEnergyProducedLastTick()),reactor.getEnergyProducedLastTick() / maxenergy[reactor.address])
  216.       end
  217.       count = count+1
  218.     end
  219.     os.sleep(0.7)
  220.   end
  221. end
  222.  
  223. function activeloop(selected_address)
  224.   local tank_controller = nil
  225.   for name in pairs(component) do
  226.     if (name == "tank_controller") then
  227. --      print ("Found tank controlller")
  228.       tank_controller = component.tank_controller
  229.       break
  230.     end
  231.   end
  232.   if (tank_controller == nil) then
  233.     print("Unable to find tank_controller. You cannot control an active reactor without a steam storage tank!")
  234.     os.exit()    
  235.   end
  236.  
  237.   local turbine = nil
  238.   for name in pairs(component) do
  239.     if (name == "br_turbine") then
  240. --      print("Found Turbine")
  241.       turbine = component.br_turbine
  242.     end
  243.   end
  244.   if (turbine == nil) then
  245.     print("Unable to find br_turbine. You cannot control an active reactor without a turbine")
  246.     os.exit()
  247.   end
  248.  
  249.   local maxoutput = 1
  250.  
  251. --  print("Fluid in tank:" .. tank_controller.getFluidInTank(1)[1].amount)
  252. --  print("Fluid Capacity:" .. tank_controller.getFluidInTank(1)[1].capacity)
  253.  
  254.   while true do
  255.     local fill = tank_controller.getFluidInTank(1)[1].amount / tank_controller.getFluidInTank(1)[1].capacity
  256.     reactors[1].setAllControlRodLevels(fill * 100)
  257.     makegraph(1,2,60,5,"Steam Level",tostring(fill),fill)
  258.     makegraph(1,9,60,5,"Turbine Energy Storage",tostring(turbine.getEnergyStored()),turbine.getEnergyStored() / 1000000)
  259.     if (turbine.getEnergyProducedLastTick() > maxoutput) then
  260.       maxoutput = turbine.getEnergyProducedLastTick()
  261.     end
  262.     makegraph(1,17,60,5,"Turbine Production",tostring(turbine.getEnergyProducedLastTick()),turbine.getEnergyProducedLastTick() / maxoutput)
  263.     makegraph(65,2,15,3,"RPM",tostring(math.floor(turbine.getRotorSpeed())),turbine.getRotorSpeed() / 2000)
  264.     os.sleep(0.7)
  265.   end
  266. end
  267.  
  268. gpu.setResolution(80,25)
  269. activeloop(seladdr)
  270. --passiveloop(seladdr)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement