--[[ Button API: JKjUZpfN Bar API: HXXY5T0Q ]]-- os.loadAPI("button") os.loadAPI("bar") local monWidth, monheight --Color shortforms local lblue = colors.lightBlue local cyan = colors.cyan local lime = colors.lime local yellow = colors.yellow local orange = colors.orange local red = colors.red local white = colors.white local black = colors.black local gray = colors.gray local bgColor = black local textColor = white --Default settings local reactorState = "off" local fuelRodState = 0 local currentPage = 1 local fuel local burnRate local waste local capacity local temp local reactivity local steamLevel local steamOut local coolantLevel local status local controlRodLevel local serverChannel args = {...} function detect() for per, side in pairs(rs.getSides()) do if peripheral.isPresent(side) then if peripheral.getType(side) == "monitor" then mon = peripheral.wrap(side) elseif peripheral.getType(side) == "modem" then modem = side end end end return mon, modem end --[Misc functions]------------------------------- function round(num, places) local multi = 10 ^ (places or 0) return math.floor(num * multi + 0.5) / multi end function toPercent(val, maxval) return (val / maxval) * 100 end function readSettingsFile() end function writeSettingsFile() end function updateInfo() mon.clear() local sender, message, dist = rednet.receive("FSRC-S>C") serverChannel = sender local data = textutils.unserialize(message) reactorState = data._reactorState fuel = data._fuel burnRate = data._burnRate waste = data._waste capacity = data._capacity temp = data._temp reactivity = data._reactivity steamLevel = data._steamLevel coolantLevel = data._coolantLevel steamOut = data._steamOut controlRodLevel = data._controlRodLevel fuelMsg = tostring(fuel) .. " mB (" .. round(toPercent(fuel, capacity), 1) .. "%)" wasteMsg = tostring(waste) .. " mB (" .. round(toPercent(waste, capacity), 1) .. "%)" end function sendData(command) rednet.send(serverChannel, command, "FSRC-C>S") end --[End]------------------------------------------ --[Non-API graphical functions]------------------ function initDisplay(_textColor, _bgColor) mon.setTextScale(1) bgColor = _bgColor textColor = _textColor mon.setTextColor(textColor) mon.setBackgroundColor(bgColor) end function header() label("Reactor Status:", 1, 1, white) drawActiveState(reactorState) hLine(2) end function hLine(row) for i = 1, monWidth do mon.setCursorPos(i, row) mon.write("-") end end function label(text, x, y, color) mon.setCursorPos(x, y) mon.setTextColor(color) mon.write(text) mon.setTextColor(textColor) end --[End]------------------------------------------ function pageOneButtons() button.new("NEXT >", changePage, false, monWidth - 9, monWidth - 1, monHeight, monHeight) button.new("Power", toggleReactor, false, 2, 8, monHeight, monHeight) end function pageTwoButtons() button.new("< BACK", changePage, false, 2, 9, monHeight, monHeight) --All rods button.new("-", raiseRods, false, monWidth - 12, monWidth - 10, 3, 3) button.new("+", lowerRods, false, monWidth - 3, monWidth - 1, 3, 3) end --[Button functions]----------------------------- function toggleReactor() button.flash("Power") if reactorState == "off" then reactorState = "on" sendData("turnon") else reactorState = "off" sendData("shutdown") end end function raiseRods() if fuelRodState > 0 then fuelRodState = fuelRodState - 10 else fuelRodState = 0 end end function lowerRods() if fuelRodState < 100 then fuelRodState = fuelRodState + 10 else fuelRodState = 100 end end --[End]------------------------------------------ function getClick() event, side, x, y = os.pullEvent() if event == "monitor_touch" then button.getButtonClickEvent(x, y) end end function drawActiveState(state) if state == "on" then mon.setCursorPos(monWidth - 1, 1) mon.setTextColor(lime) mon.write("ON") elseif state == "off" then mon.setCursorPos(monWidth - 2, 1) mon.setTextColor(red) mon.write("OFF") elseif state == "auto" then mon.setCursorPos(monWidth - 3, 1) mon.setTextColor(orange) mon.write("AUTO") end mon.setTextColor(textColor) end function page1() button.update() header() label("Fuel : ", 1, 3, lblue) mon.write(fuelMsg) label("Waste : ", 1, 4, lblue) mon.write(wasteMsg) --Fuel bar is always at 100% because waste bar will be --printed on top to notify user of fuel/waste ratio bar.singleColor(100, monWidth / 2 - 10, 5, yellow) bar.singleColor(round(toPercent(waste, capacity), 0), monWidth / 2 - 10, 5, cyan) hLine(6) label(round(temp, 0) .. " C", 1, 7, red) label(":", 9, 7, lblue) label(round(burnRate, 2).. " mB/t", 11, 7, white) label("Steam : ", 1, 8, lblue) mon.write(steamLevel .. " mB") label("Coolant : ", 1, 9, lblue) mon.write(coolantLevel .. " mB") label("Output : ", 1, 10, lblue) mon.write(steamOut .. " mB/t") hLine(monHeight - 1) end function page2() button.update() header() label("Control Rods :", 1, 3, lblue) label(fuelRodState .. "%", (monWidth - 6) - string.len(fuelRodState) / 2, 3, white) end function changePage() mon.clear() if currentPage == 1 then currentPage = 2 button.clear() pageTwoButtons() elseif currentPage == 2 then currentPage = 1 button.clear() pageOneButtons() end end mon, modem = detect() initDisplay(white, black) monWidth, monHeight = mon.getSize() rednet.open(modem) button.setBGColor(colors.black) pageOneButtons() while true do updateInfo() if currentPage == 1 then page1() elseif currentPage == 2 then page2() end getClick() end