Advertisement
bcook254

BigReactors2

Jan 17th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. com = require("component")
  2. forms = require("forms")
  3. gpu = com.gpu
  4.  
  5. screenWidth, screenHeight = gpu.getResolution()
  6.  
  7. reactors = {}
  8.  
  9.  -- check a valid reactor is attached
  10. if not com.isAvailable("br_reactor") then
  11.   print("A valid reactor is required to run this program")
  12.   os.exit()
  13. end
  14.  
  15. -- initialize display colors
  16. red = 0xff0000
  17. orange = 0xff6000
  18. green = 0x00ff00
  19. black = 0x000000
  20. gray = 0x959595
  21. themeDark = 0x990023
  22.  
  23. -- initialize information display variables
  24. col1 = 3
  25. col2 = 38
  26. col3 = 73
  27.  
  28. row1 = 5
  29. row2 = 22
  30. row3 = 37
  31.  
  32. -- initialize display form and labels
  33. main = forms.addForm()
  34.  
  35. main.border = 1
  36. main.fontColor = themeDark
  37.  
  38. titleLabel = main:addLabel(2, 2, "REACTOR ID:")
  39. titleLabel.W = screenWidth - 2
  40. titleLabel.H = 1
  41.  
  42. -- initialize current displayed reactor variables
  43. currReactor = 1
  44. currReactorStored = 0
  45. currReactorRfTick = 0
  46. currReactorActive = false
  47. currReactorWaste = 0
  48. currReactorFuel = 0
  49. currReactorMaxFuel = 0
  50. currReactorWasteTick = 0
  51. currReactorCase = 0
  52. currReactorCore = 0
  53. currReactorReactivity = 0
  54. currReactorRodLevel = 0
  55. currReactorIsPassive = true
  56.  
  57. -- initializes all display elements
  58. function InitializeDisplay()
  59.   InitializeRfTickDisplay()
  60.   InitializeStoredRfDisplay()
  61.   InitializeStatusDisplay()
  62.   InitializeFuelDisplay()
  63.   InitializeWasteDisplay()
  64.   InitializeWasteTickDisplay()
  65.   InitializeCaseDisplay()
  66.   InitializeCoreDisplay()
  67.   InitializeReactivityDisplay()
  68.   InitializeFormButtons()
  69. end
  70.  
  71. -- creates the required elements for the rf/t display
  72. function InitializeRfTickDisplay()
  73.   rfTickLabel = main:addLabel(col1, row1, "RF/t")
  74.   rfTickLabel.W = #rfTickLabel.caption
  75.  
  76.   rfTickBatteryNub = main:addLabel(col1 + 3, row1 + 2, " ")
  77.   rfTickBatteryNub.W = 3
  78.   rfTickBatteryNub.color = gray
  79.  
  80.   rfTickBatteryBase = main:addLabel(col1 + 1, row1 + 3, " ")
  81.   rfTickBatteryBase.W = 7
  82.   rfTickBatteryBase.H = 12
  83.   rfTickBatteryBase.color = gray
  84.  
  85.   rfTickBatteryLevel = main:addLabel(col1 + 2, row1 + 13, " ")
  86.   rfTickBatteryLevel.W = 5
  87.   rfTickBatteryLevel.color = black
  88.  
  89.   rfTickValue = main:addLabel(col1 + 9, row1 + 14, " ")
  90. end
  91.  
  92. -- creates the required elements for the stored rf display
  93. function InitializeStoredRfDisplay()
  94.   storedLabel = main:addLabel(col2, row1, "STORED RF")
  95.   storedLabel.W = #storedLabel.caption
  96.  
  97.   storedBatteryNub = main:addLabel(col2 + 3, row1 + 2, " ")
  98.   storedBatteryNub.W = 3
  99.   storedBatteryNub.color = gray
  100.  
  101.   storedBatteryBase = main:addLabel(col2 + 1, row1 + 3, " ")
  102.   storedBatteryBase.W = 7
  103.   storedBatteryBase.H = 12
  104.   storedBatteryBase.color = gray
  105.  
  106.   storedBatteryLevel = main:addLabel(col2 + 2, row1 + 13, " ")
  107.   storedBatteryLevel.W = 5
  108.  
  109.   storedBatteryValue = main:addLabel(col2 + 9, row1 + 14, " ")
  110. end
  111.  
  112. -- creates the required elements for the reactor status display
  113. function InitializeStatusDisplay()
  114.   statusLabel = main:addLabel(col3, row1, "STATUS")
  115.   statusLabel.W = #statusLabel.caption
  116.  
  117.   onButton = main:addButton(col3, row1 + 4, "ON ", EnableReactor)
  118.   onButton.W = 18
  119.   onButton.H = 3
  120.   onButton.color = red
  121.  
  122.   offButton = main:addButton(col3, row1 + 9, "OFF", DisableReactor)
  123.   offButton.W = 18
  124.   offButton.H = 3
  125.   offButton.color = red
  126. end
  127.  
  128. -- creates the required elements for the fuel display
  129. function InitializeFuelDisplay()
  130.   fuelLabel = main:addLabel(col1, row2, "FUEL")
  131.   fuelLabel.W = #fuelLabel.caption
  132.  
  133.   fuelBase = main:addLabel(col1 + 1, row2 + 2, " ")
  134.   fuelBase.W = 7
  135.   fuelBase.H = 12
  136.   fuelBase.color = gray
  137.  
  138.   fuelLevel = main:addLabel(col1 + 2, row2 + 12, " ")
  139.   fuelLevel.W = 5
  140.  
  141.   fuelValue = main:addLabel(col1 + 9, row2 + 13, " ")
  142. end
  143.  
  144. -- creates the required elements for the waste display
  145. function InitializeWasteDisplay()
  146.   wasteLabel = main:addLabel(col2, row2, "WASTE")
  147.   wasteLabel.W = #wasteLabel.caption
  148.  
  149.   wasteBase = main:addLabel(col2 + 1, row2 + 2, " ")
  150.   wasteBase.W = 7
  151.   wasteBase.H = 12
  152.   wasteBase.color = gray
  153.  
  154.   wasteLevel = main:addLabel(col2 + 2, row2 + 12, " ")
  155.   wasteLevel.W = 5
  156.  
  157.   wasteValue = main:addLabel(col2 + 9, row2 + 13, " ")
  158. end
  159.  
  160. -- creates the required elements for the waste tick display
  161. function InitializeWasteTickDisplay()
  162.   wasteTickLabel = main:addLabel(col3, row2, "WASTE MB/t")
  163.   wasteTickLabel.W = #wasteTickLabel.caption
  164.  
  165.   wasteTickBase = main:addLabel(col3 + 1, row2 + 5, " ")
  166.   wasteTickBase.W = 12
  167.   wasteTickBase.H = 3
  168.   wasteTickBase.color = gray
  169.  
  170.   wasteTickLevel = main:addLabel(col3 + 2, row2 + 6, " ")
  171.   wasteTickLevel.H = 1
  172.  
  173.   wasteTickValue = main:addLabel(col3 + 1, row2 + 4, " ")
  174. end
  175.  
  176. -- creates the required elements for the case display
  177. function InitializeCaseDisplay()
  178.   caseLabel = main:addLabel(col1, row3, "CASE TEMP")
  179.   caseLabel.W = #caseLabel.caption
  180. end
  181.  
  182. -- creates the required elements for the core display
  183. function InitializeCoreDisplay()
  184.   coreLabel = main:addLabel(col2, row3, "CORE TEMP")
  185.   coreLabel.W = #coreLabel.caption
  186. end
  187.  
  188. -- creates the required elements for the reactivity display
  189. function InitializeReactivityDisplay()
  190.   reactivityLabel = main:addLabel(col3, row3, "REACTIVITY")
  191.   reactivityLabel.W = #reactivityLabel.caption
  192. end
  193.  
  194. -- creates form buttons
  195. function InitializeFormButtons()
  196.   exitButton = main:addButton(screenWidth - 13, screenHeight - 4, "EXIT", ExitProgram)
  197.   exitButton.W = 12
  198.   exitButton.H = 3
  199. end
  200.  
  201. -- gets all available reactors attached
  202. function GetReactors()
  203.   local i = 1
  204.   for address, type in com.list("br_reactor") do
  205.     reactors[i] = com.proxy(address)
  206.     print("Found reactor " .. i .. " at " .. address)
  207.     i = i + 1
  208.   end
  209. end
  210.  
  211. -- gets all information for the request reactor
  212. function GetReactorInformation(i)
  213.   currReactorStored = reactors[i].getEnergyStored()
  214.   currReactorRfTick = reactors[i].getEnergyProducedLastTick()
  215.   currReactorActive = reactors[i].getActive()
  216.   currReactorWaste = reactors[i].getWasteAmount()
  217.   currReactorFuel = reactors[i].getFuelAmount()
  218.   currReactorMaxFuel = reactors[i].getFuelAmountMax()
  219.   currReactorWasteTick = reactors[i].getFuelConsumedLastTick()
  220.   currReactorCase = reactors[i].getCasingTemperature()
  221.   currReactorCore = reactors[i].getFuelTemperature()
  222.   currReactorReactivity = reactors[i].getFuelReactivity()
  223.   currReactorRodLEvel = reactors[i].getControlRodLevel(1)
  224.   currReactorIsPassive = not reactors[i].isActivelyCooled()
  225. end
  226.  
  227. function DisableReactor()
  228.   reactors[currReactor].setActive(false)
  229.   currReactorActive = false
  230.   DrawStatus(false)
  231. end
  232.  
  233. function EnableReactor()
  234.   reactors[currReactor].setActive(true)
  235.   currReactorActive = true
  236.   DrawStatus(true)
  237. end
  238.  
  239. function BeginUpdate()
  240.   GetReactorInformation(1)
  241.   DrawDisplay()
  242. end
  243.  
  244. function DrawDisplay()
  245.   DrawStorage(currReactorStored)
  246.   DrawStatus(currReactorActive)
  247.   DrawRfTick(currReactorRfTick)
  248.   DrawFuel(currReactorMaxFuel, currReactorFuel)
  249.   DrawWaste(currReactorMaxFuel, currReactorWaste)
  250.   DrawWasteTick(currReactorWasteTick)
  251. end
  252.  
  253. function DrawRfTick(rfTick)
  254.   local percentageLevel = rfTick / 25000
  255.   local integerLevel = Round(percentageLevel * 10)
  256.  
  257.   rfTickValue.caption = Round(rfTick) .. " RF/t"
  258.  
  259.   rfTickBatteryLevel.caption = " "
  260.   rfTickBatteryLevel.W = 5
  261.  
  262.   gpu.setBackground(black)
  263.  
  264.   if integerLevel == 0 then
  265.     rfTickBatteryLevel.top = row1 + 13
  266.     rfTickBatteryLevel.H = 1
  267.     gpu.fill(col1 + 2, row1 + 4, 5, 10 - integerLevel, " ")
  268.   elseif integerLevel > 10 then
  269.     rfTickBatteryLevel.top = row1 + 4
  270.     rfTickBatteryLevel.H = 10
  271.   else
  272.     rfTickBatteryLevel.top = row1 + 14 - integerLevel
  273.     rfTickBatteryLevel.H = integerLevel
  274.     gpu.fill(col1 + 2, row1 + 4, 5, 10 - integerLevel, " ")
  275.   end
  276.  
  277.   if integerLevel == 0 then
  278.     rfTickBatteryLevel.color = black
  279.   elseif integerLevel <= 3 then
  280.     rfTickBatteryLevel.color = red
  281.   elseif integerLevel <= 7 then
  282.     rfTickBatteryLevel.color = orange
  283.   else
  284.     rfTickBatteryLevel.color = green
  285.   end
  286.  
  287.   rfTickBatteryLevel:redraw()
  288.   rfTickValue:redraw()
  289. end
  290.  
  291. function DrawStorage(storedRf)
  292.   local percentageLevel = storedRf / 10000000
  293.   local integerLevel = Round(percentageLevel * 10)
  294.  
  295.   storedBatteryValue.caption = Round(storedRf) .. " RF"
  296.  
  297.   storedBatteryLevel.caption = PadStringLeft(3, tostring(integerLevel * 10), " ") .. "%"
  298.   storedBatteryLevel.W = 5
  299.  
  300.   gpu.setBackground(black)
  301.   gpu.fill(col2 + 2, row1 + 4, 5, 10 - integerLevel, " ")
  302.  
  303.   if integerLevel == 0 then
  304.     storedBatteryLevel.top = row1 + 13
  305.     storedBatteryLevel.H = 1
  306.   else
  307.     storedBatteryLevel.top = row1 + 14 - integerLevel
  308.     storedBatteryLevel.H = integerLevel
  309.   end
  310.  
  311.   if integerLevel == 0 then
  312.     storedBatteryLevel.color = black
  313.   elseif integerLevel <= 3 then
  314.     storedBatteryLevel.color = red
  315.   elseif integerLevel <= 7 then
  316.     storedBatteryLevel.color = orange
  317.   else
  318.     storedBatteryLevel.color = green
  319.   end
  320.  
  321.   storedBatteryLevel:redraw()
  322.   storedBatteryValue:redraw()
  323. end
  324.  
  325. function DrawStatus(status)
  326.   if status == true then
  327.     onButton.color = green
  328.     offButton.color = red
  329.   else
  330.     onButton.color = red
  331.     offButton.color = green
  332.   end
  333.  
  334.   onButton:redraw()
  335.   offButton:redraw()
  336. end
  337.  
  338. function DrawFuel(maxFuel, fuel)
  339.   local percentageLevel = fuel / maxFuel
  340.   local integerLevel = Round(percentageLevel * 10)
  341.  
  342.   fuelValue.caption = fuel .. " mb"
  343.  
  344.   fuelLevel.caption = PadStringLeft(3, tostring(integerLevel * 10), " ") .. "%"
  345.   fuelLevel.W = 5
  346.  
  347.   gpu.setBackground(black)
  348.   gpu.fill(col1 + 2, row2 + 3, 5, 10 - integerLevel, " ")
  349.  
  350.   if integerLevel == 0 then
  351.     fuelLevel.top = row2 + 12
  352.     fuelLevel.H = 1
  353.   else
  354.     fuelLevel.top = row2 + 13 - integerLevel
  355.     fuelLevel.H = integerLevel
  356.   end
  357.  
  358.   if integerLevel == 0 then
  359.     fuelLevel.color = black
  360.   elseif integerLevel <= 3 then
  361.     fuelLevel.color = red
  362.   elseif integerLevel <= 7 then
  363.     fuelLevel.color = orange
  364.   else
  365.     fuelLevel.color = green
  366.   end
  367.  
  368.   fuelLevel:redraw()
  369.   fuelValue:redraw()
  370. end
  371.  
  372. function DrawWaste(maxFuel, waste)
  373.   local percentageLevel = waste / maxFuel
  374.   local integerLevel = Round(percentageLevel * 10)
  375.  
  376.   wasteValue.caption = waste .. " mb"
  377.  
  378.   wasteLevel.caption = PadStringLeft(3, tostring(integerLevel * 10), " ") .. "%"
  379.   wasteLevel.W = 5
  380.  
  381.   gpu.setBackground(black)
  382.   gpu.fill(col2 + 2, row2 + 3, 5, 10 - integerLevel, " ")
  383.  
  384.   if integerLevel == 0 then
  385.     wasteLevel.top = row2 + 12
  386.     wasteLevel.H = 1
  387.   else
  388.     wasteLevel.top = row2 + 13 - integerLevel
  389.     wasteLevel.H = integerLevel
  390.   end
  391.  
  392.   if integerLevel == 0 then
  393.     wasteLevel.color = black
  394.   elseif integerLevel <= 3 then
  395.     wasteLevel.color = green
  396.   elseif integerLevel <= 7 then
  397.     wasteLevel.color = orange
  398.   else
  399.     wasteLevel.color = red
  400.   end
  401.  
  402.   wasteLevel:redraw()
  403.   wasteValue:redraw()
  404. end
  405.  
  406. function DrawWasteTick(fuelConsumed)
  407.   local percentageLevel = fuelConsumed / 1
  408.   local integerLevel = Round(percentageLevel * 10)
  409.  
  410.   wasteTickValue.caption = waste .. " mb/t"
  411.  
  412.   gpu.setBackground(black)
  413.   gpu.fill(col3 + 2 + integerLevel, row2 + 3, 10 - integerLevel, 1, " ")
  414.  
  415.   if integerLevel == 0 then
  416.     wasteTickLevel.W = 1
  417.   else
  418.     wasteTickLevel.W = integerLevel
  419.   end
  420.  
  421.   if integerLevel == 0 then
  422.     wasteTickLevel.color = black
  423.   elseif integerLevel <= 3 then
  424.     wasteTickLevel.color = green
  425.   elseif integerLevel <= 7 then
  426.     wasteTickLevel.color = orange
  427.   else
  428.     wasteTickLevel.color = red
  429.   end
  430.  
  431.   wasteTickLevel:redraw()
  432.   wasteTickValue:redraw()
  433. end
  434.  
  435. function Round(value)
  436.   return math.floor(value + .5)
  437. end
  438.  
  439. function PadStringLeft(length, value, character)
  440.   return string.rep(character, length - #value) .. value
  441. end
  442.  
  443. function ExitProgram()
  444.   timer:stop()
  445.   gpu.setBackground(black)
  446.   gpu.fill(1, 1, screenWidth, screenHeight, " ")
  447.   forms.stop()
  448.   os.exit()
  449. end
  450.  
  451. InitializeDisplay()
  452. GetReactors()
  453. GetReactorInformation(1)
  454. DrawDisplay()
  455.  
  456. timer = main:addTimer(1, BeginUpdate)
  457. forms.run(main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement