Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- com = require("component")
- forms = require("forms")
- gpu = com.gpu
- screenWidth, screenHeight = gpu.getResolution()
- reactors = {}
- -- check a valid reactor is attached
- if not com.isAvailable("br_reactor") then
- print("A valid reactor is required to run this program")
- os.exit()
- end
- -- initialize display colors
- red = 0xff0000
- orange = 0xff6000
- green = 0x00ff00
- black = 0x000000
- gray = 0x959595
- themeDark = 0x990023
- -- initialize information display variables
- col1 = 3
- col2 = 38
- col3 = 73
- row1 = 5
- row2 = 22
- row3 = 37
- -- initialize display form and labels
- main = forms.addForm()
- main.border = 1
- main.fontColor = themeDark
- titleLabel = main:addLabel(2, 2, "REACTOR ID:")
- titleLabel.W = screenWidth - 2
- titleLabel.H = 1
- -- initialize current displayed reactor variables
- currReactor = 1
- currReactorStored = 0
- currReactorRfTick = 0
- currReactorActive = false
- currReactorWaste = 0
- currReactorFuel = 0
- currReactorMaxFuel = 0
- currReactorWasteTick = 0
- currReactorCase = 0
- currReactorCore = 0
- currReactorReactivity = 0
- currReactorRodLevel = 0
- currReactorIsPassive = true
- -- initializes all display elements
- function InitializeDisplay()
- InitializeRfTickDisplay()
- InitializeStoredRfDisplay()
- InitializeStatusDisplay()
- InitializeFuelDisplay()
- InitializeWasteDisplay()
- InitializeWasteTickDisplay()
- InitializeCaseDisplay()
- InitializeCoreDisplay()
- InitializeReactivityDisplay()
- InitializeFormButtons()
- end
- -- creates the required elements for the rf/t display
- function InitializeRfTickDisplay()
- rfTickLabel = main:addLabel(col1, row1, "RF/t")
- rfTickLabel.W = #rfTickLabel.caption
- rfTickBatteryNub = main:addLabel(col1 + 3, row1 + 2, " ")
- rfTickBatteryNub.W = 3
- rfTickBatteryNub.color = gray
- rfTickBatteryBase = main:addLabel(col1 + 1, row1 + 3, " ")
- rfTickBatteryBase.W = 7
- rfTickBatteryBase.H = 12
- rfTickBatteryBase.color = gray
- rfTickBatteryLevel = main:addLabel(col1 + 2, row1 + 13, " ")
- rfTickBatteryLevel.W = 5
- rfTickBatteryLevel.color = black
- rfTickValue = main:addLabel(col1 + 9, row1 + 14, " ")
- end
- -- creates the required elements for the stored rf display
- function InitializeStoredRfDisplay()
- storedLabel = main:addLabel(col2, row1, "STORED RF")
- storedLabel.W = #storedLabel.caption
- storedBatteryNub = main:addLabel(col2 + 3, row1 + 2, " ")
- storedBatteryNub.W = 3
- storedBatteryNub.color = gray
- storedBatteryBase = main:addLabel(col2 + 1, row1 + 3, " ")
- storedBatteryBase.W = 7
- storedBatteryBase.H = 12
- storedBatteryBase.color = gray
- storedBatteryLevel = main:addLabel(col2 + 2, row1 + 13, " ")
- storedBatteryLevel.W = 5
- storedBatteryValue = main:addLabel(col2 + 9, row1 + 14, " ")
- end
- -- creates the required elements for the reactor status display
- function InitializeStatusDisplay()
- statusLabel = main:addLabel(col3, row1, "STATUS")
- statusLabel.W = #statusLabel.caption
- onButton = main:addButton(col3, row1 + 4, "ON ", EnableReactor)
- onButton.W = 18
- onButton.H = 3
- onButton.color = red
- offButton = main:addButton(col3, row1 + 9, "OFF", DisableReactor)
- offButton.W = 18
- offButton.H = 3
- offButton.color = red
- end
- -- creates the required elements for the fuel display
- function InitializeFuelDisplay()
- fuelLabel = main:addLabel(col1, row2, "FUEL")
- fuelLabel.W = #fuelLabel.caption
- fuelBase = main:addLabel(col1 + 1, row2 + 2, " ")
- fuelBase.W = 7
- fuelBase.H = 12
- fuelBase.color = gray
- fuelLevel = main:addLabel(col1 + 2, row2 + 12, " ")
- fuelLevel.W = 5
- fuelValue = main:addLabel(col1 + 9, row2 + 13, " ")
- end
- -- creates the required elements for the waste display
- function InitializeWasteDisplay()
- wasteLabel = main:addLabel(col2, row2, "WASTE")
- wasteLabel.W = #wasteLabel.caption
- wasteBase = main:addLabel(col2 + 1, row2 + 2, " ")
- wasteBase.W = 7
- wasteBase.H = 12
- wasteBase.color = gray
- wasteLevel = main:addLabel(col2 + 2, row2 + 12, " ")
- wasteLevel.W = 5
- wasteValue = main:addLabel(col2 + 9, row2 + 13, " ")
- end
- -- creates the required elements for the waste tick display
- function InitializeWasteTickDisplay()
- wasteTickLabel = main:addLabel(col3, row2, "WASTE MB/t")
- wasteTickLabel.W = #wasteTickLabel.caption
- wasteTickBase = main:addLabel(col3 + 1, row2 + 5, " ")
- wasteTickBase.W = 12
- wasteTickBase.H = 3
- wasteTickBase.color = gray
- wasteTickLevel = main:addLabel(col3 + 2, row2 + 6, " ")
- wasteTickLevel.H = 1
- wasteTickValue = main:addLabel(col3 + 1, row2 + 4, " ")
- end
- -- creates the required elements for the case display
- function InitializeCaseDisplay()
- caseLabel = main:addLabel(col1, row3, "CASE TEMP")
- caseLabel.W = #caseLabel.caption
- end
- -- creates the required elements for the core display
- function InitializeCoreDisplay()
- coreLabel = main:addLabel(col2, row3, "CORE TEMP")
- coreLabel.W = #coreLabel.caption
- end
- -- creates the required elements for the reactivity display
- function InitializeReactivityDisplay()
- reactivityLabel = main:addLabel(col3, row3, "REACTIVITY")
- reactivityLabel.W = #reactivityLabel.caption
- end
- -- creates form buttons
- function InitializeFormButtons()
- exitButton = main:addButton(screenWidth - 13, screenHeight - 4, "EXIT", ExitProgram)
- exitButton.W = 12
- exitButton.H = 3
- end
- -- gets all available reactors attached
- function GetReactors()
- local i = 1
- for address, type in com.list("br_reactor") do
- reactors[i] = com.proxy(address)
- print("Found reactor " .. i .. " at " .. address)
- i = i + 1
- end
- end
- -- gets all information for the request reactor
- function GetReactorInformation(i)
- currReactorStored = reactors[i].getEnergyStored()
- currReactorRfTick = reactors[i].getEnergyProducedLastTick()
- currReactorActive = reactors[i].getActive()
- currReactorWaste = reactors[i].getWasteAmount()
- currReactorFuel = reactors[i].getFuelAmount()
- currReactorMaxFuel = reactors[i].getFuelAmountMax()
- currReactorWasteTick = reactors[i].getFuelConsumedLastTick()
- currReactorCase = reactors[i].getCasingTemperature()
- currReactorCore = reactors[i].getFuelTemperature()
- currReactorReactivity = reactors[i].getFuelReactivity()
- currReactorRodLEvel = reactors[i].getControlRodLevel(1)
- currReactorIsPassive = not reactors[i].isActivelyCooled()
- end
- function DisableReactor()
- reactors[currReactor].setActive(false)
- currReactorActive = false
- DrawStatus(false)
- end
- function EnableReactor()
- reactors[currReactor].setActive(true)
- currReactorActive = true
- DrawStatus(true)
- end
- function BeginUpdate()
- GetReactorInformation(1)
- DrawDisplay()
- end
- function DrawDisplay()
- DrawStorage(currReactorStored)
- DrawStatus(currReactorActive)
- DrawRfTick(currReactorRfTick)
- DrawFuel(currReactorMaxFuel, currReactorFuel)
- DrawWaste(currReactorMaxFuel, currReactorWaste)
- DrawWasteTick(currReactorWasteTick)
- end
- function DrawRfTick(rfTick)
- local percentageLevel = rfTick / 25000
- local integerLevel = Round(percentageLevel * 10)
- rfTickValue.caption = Round(rfTick) .. " RF/t"
- rfTickBatteryLevel.caption = " "
- rfTickBatteryLevel.W = 5
- gpu.setBackground(black)
- if integerLevel == 0 then
- rfTickBatteryLevel.top = row1 + 13
- rfTickBatteryLevel.H = 1
- gpu.fill(col1 + 2, row1 + 4, 5, 10 - integerLevel, " ")
- elseif integerLevel > 10 then
- rfTickBatteryLevel.top = row1 + 4
- rfTickBatteryLevel.H = 10
- else
- rfTickBatteryLevel.top = row1 + 14 - integerLevel
- rfTickBatteryLevel.H = integerLevel
- gpu.fill(col1 + 2, row1 + 4, 5, 10 - integerLevel, " ")
- end
- if integerLevel == 0 then
- rfTickBatteryLevel.color = black
- elseif integerLevel <= 3 then
- rfTickBatteryLevel.color = red
- elseif integerLevel <= 7 then
- rfTickBatteryLevel.color = orange
- else
- rfTickBatteryLevel.color = green
- end
- rfTickBatteryLevel:redraw()
- rfTickValue:redraw()
- end
- function DrawStorage(storedRf)
- local percentageLevel = storedRf / 10000000
- local integerLevel = Round(percentageLevel * 10)
- storedBatteryValue.caption = Round(storedRf) .. " RF"
- storedBatteryLevel.caption = PadStringLeft(3, tostring(integerLevel * 10), " ") .. "%"
- storedBatteryLevel.W = 5
- gpu.setBackground(black)
- gpu.fill(col2 + 2, row1 + 4, 5, 10 - integerLevel, " ")
- if integerLevel == 0 then
- storedBatteryLevel.top = row1 + 13
- storedBatteryLevel.H = 1
- else
- storedBatteryLevel.top = row1 + 14 - integerLevel
- storedBatteryLevel.H = integerLevel
- end
- if integerLevel == 0 then
- storedBatteryLevel.color = black
- elseif integerLevel <= 3 then
- storedBatteryLevel.color = red
- elseif integerLevel <= 7 then
- storedBatteryLevel.color = orange
- else
- storedBatteryLevel.color = green
- end
- storedBatteryLevel:redraw()
- storedBatteryValue:redraw()
- end
- function DrawStatus(status)
- if status == true then
- onButton.color = green
- offButton.color = red
- else
- onButton.color = red
- offButton.color = green
- end
- onButton:redraw()
- offButton:redraw()
- end
- function DrawFuel(maxFuel, fuel)
- local percentageLevel = fuel / maxFuel
- local integerLevel = Round(percentageLevel * 10)
- fuelValue.caption = fuel .. " mb"
- fuelLevel.caption = PadStringLeft(3, tostring(integerLevel * 10), " ") .. "%"
- fuelLevel.W = 5
- gpu.setBackground(black)
- gpu.fill(col1 + 2, row2 + 3, 5, 10 - integerLevel, " ")
- if integerLevel == 0 then
- fuelLevel.top = row2 + 12
- fuelLevel.H = 1
- else
- fuelLevel.top = row2 + 13 - integerLevel
- fuelLevel.H = integerLevel
- end
- if integerLevel == 0 then
- fuelLevel.color = black
- elseif integerLevel <= 3 then
- fuelLevel.color = red
- elseif integerLevel <= 7 then
- fuelLevel.color = orange
- else
- fuelLevel.color = green
- end
- fuelLevel:redraw()
- fuelValue:redraw()
- end
- function DrawWaste(maxFuel, waste)
- local percentageLevel = waste / maxFuel
- local integerLevel = Round(percentageLevel * 10)
- wasteValue.caption = waste .. " mb"
- wasteLevel.caption = PadStringLeft(3, tostring(integerLevel * 10), " ") .. "%"
- wasteLevel.W = 5
- gpu.setBackground(black)
- gpu.fill(col2 + 2, row2 + 3, 5, 10 - integerLevel, " ")
- if integerLevel == 0 then
- wasteLevel.top = row2 + 12
- wasteLevel.H = 1
- else
- wasteLevel.top = row2 + 13 - integerLevel
- wasteLevel.H = integerLevel
- end
- if integerLevel == 0 then
- wasteLevel.color = black
- elseif integerLevel <= 3 then
- wasteLevel.color = green
- elseif integerLevel <= 7 then
- wasteLevel.color = orange
- else
- wasteLevel.color = red
- end
- wasteLevel:redraw()
- wasteValue:redraw()
- end
- function DrawWasteTick(fuelConsumed)
- local percentageLevel = fuelConsumed / 1
- local integerLevel = Round(percentageLevel * 10)
- wasteTickValue.caption = waste .. " mb/t"
- gpu.setBackground(black)
- gpu.fill(col3 + 2 + integerLevel, row2 + 3, 10 - integerLevel, 1, " ")
- if integerLevel == 0 then
- wasteTickLevel.W = 1
- else
- wasteTickLevel.W = integerLevel
- end
- if integerLevel == 0 then
- wasteTickLevel.color = black
- elseif integerLevel <= 3 then
- wasteTickLevel.color = green
- elseif integerLevel <= 7 then
- wasteTickLevel.color = orange
- else
- wasteTickLevel.color = red
- end
- wasteTickLevel:redraw()
- wasteTickValue:redraw()
- end
- function Round(value)
- return math.floor(value + .5)
- end
- function PadStringLeft(length, value, character)
- return string.rep(character, length - #value) .. value
- end
- function ExitProgram()
- timer:stop()
- gpu.setBackground(black)
- gpu.fill(1, 1, screenWidth, screenHeight, " ")
- forms.stop()
- os.exit()
- end
- InitializeDisplay()
- GetReactors()
- GetReactorInformation(1)
- DrawDisplay()
- timer = main:addTimer(1, BeginUpdate)
- forms.run(main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement