local component = require("component") local serial = require("serialization") local term = require("term") local dnsclient = require("dnsclient") local event = require("event") local graphics = require("graphics") local thread = require("thread") -- local scrn_gpu = component.proxy(component.get("eb366")) -- get gpu that should connect to screen -- local vterm_gpu = component.proxy(component.get("414e")) -- gpu that should be binded to terminal server. -- local scrn_addr = "a5f3cfef-7ca6-4944-91f4-d6c11a812d87" -- local vterm_addr = "8915d086-0b0a-4225-a334-93b56005c2a3" local modem = component.modem --print(dnsclient.declare("control_server")) --should only be ran once per new computer local reactorSrv = dnsclient.resolve("reactor_fission_1") local disk_usage = 0 ------ REACTOR DATA ------- local reactorData = { type = "REACT", status = false, reactor_type = "OTHER", powerData = { tick = 0.0, max = 0.0, curr = 0.0 }, fuelData = { name = "???", time_left = 0.0 }, heatData = { tick = 0.0, max = 0.0, curr = 0.0 } } function handle_modem_msg(_, lcl, from, port, dist, message) data = serial.unserialize(message) if (data.type == "REACT") then --[[{ type = REACT reactor_type = FISSION/FUSION/SALT/OTHER status = bool fuelData = {name=str, time_left=float} powerData = {rft=float, max=float, min=float} heatData = {ht=float, max=float, min=float} }]] reactorData = data end end local function renderScreen() local panel = graphics.createBox(1,1,graphics.w-1,graphics.h / 2 + 2, "Reactor Monitor", 0x0000aa) graphics.createStatusText(panel.w/2-2,panel.y+1,"",reactorData.status) local fuelPanel = graphics.createBox(panel.x+2, panel.y+3, panel.w/2-3, 5, "Fission Fuel", 0xaaaaaa) graphics.createText(fuelPanel.x+1, fuelPanel.y+2, "Fuel Type: ".. reactorData.fuelData.name) graphics.createText(fuelPanel.x+1, fuelPanel.y+3, "Fuel Left: ".. reactorData.fuelData.time_left .. " Ticks") local heatPanel = graphics.createBox(math.ceil(panel.w/2+2), panel.y+3, panel.w/2-3, 5, "Heat Data", 0xaaaaaa) graphics.createText(heatPanel.x+1, heatPanel.y+2, "Heat Tick: ".. reactorData.heatData.tick) graphics.createText(heatPanel.x+1, heatPanel.y+3, "Max Heat : ".. reactorData.heatData.max) graphics.createText(heatPanel.x+1, heatPanel.y+4, "Current : ".. reactorData.heatData.curr) --graphics.createText(fuelPanel.x+1, panel.y+6, "Power Output: ".. reactorData.powerData.tick .. " rf/t") local pct = reactorData.powerData.curr / reactorData.powerData.max local val = reactorData.powerData.tick graphics.createTitledBar(panel.x+2,panel.y+10,graphics.w-4,1, "Power Buffer", 0x669200, pct, val, "RF/t") local diskPanel = graphics.createBox(1,graphics.h / 2 + 5, graphics.w / 2, 5, "Disk Monitor", 0xaaaaaa) graphics.createTitledBar(diskPanel.x+1, diskPanel.y+2, diskPanel.w-1, 1, "Disk Usage", 0x0000aa, disk_usage, math.ceil(disk_usage * 100), "%") end function getRSUsage() while(true) do rs = component.block_refinedstorage_cable.getStorages().total.item disk_usage = rs.usage / rs.capacity os.sleep(1) end end function screenUpdateThread() while(true) do graphics.clearScreen() renderScreen() os.sleep(1) end end local thread_rsUsage = nil local thread_screenUpdate = nil local isRunning = false function start() if not isRunning then -- graphics.setGPU(component.proxy(component.get("eb366"))) -- graphics.bind_to_screen(component.get("97608c")) -- component.proxy(component.get("414e")).bind(component.get("8915d")) graphics.setResolution(80,25) term.write("Starting Control.\n") term.write("Starting Network Drivers...\n") if modem.isOpen(1001) then term.write("WARN: port 1001 was already open.") end modem.open(1001) event.listen("modem_message", handle_modem_msg) thread_rsUsage = thread.create(getRSUsage) thread_screenUpdate = thread.create(screenUpdateThread) end end function stop() graphics.setResolution(graphics.gpu.maxResolution()) modem.close(1001) event.ignore("modem_message", handle_modem_msg) thread_screenUpdate:kill() thread_rsUsage:kill() end