Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ui.lua (run on your UI-side computer)
- -- ========================================================
- -- Peripheral wrapping
- -- ========================================================
- rednet.open("left")
- local monitor = assert(peripheral.wrap("back"), "Monitor not found")
- -- ========================================================
- -- Formatting
- -- ========================================================
- local function formatK(val)
- if not val then return "-" end
- if val >= 1000 then
- return string.format("%dk", math.floor(val/1000))
- else
- return tostring(val)
- end
- end
- local function formatTimeTicks(ticks)
- if not ticks or ticks == "-" or ticks == math.huge then return "-" end
- local seconds = math.floor(ticks/20 + 0.5)
- local h = math.floor(seconds/3600)
- local m = math.floor((seconds % 3600)/60)
- local s = seconds % 60
- return string.format("%02d:%02d:%02d", h, m, s)
- end
- -- ========================================================
- -- Monitor UI (main, with percentage thresholds)
- -- ========================================================
- local function monitorUI(data)
- monitor.setBackgroundColor(colors.black)
- monitor.clear()
- monitor.setTextScale(1)
- local w, _ = monitor.getSize()
- -- top line: accumulator % on left, ON/OFF on right
- monitor.setCursorPos(1, 1)
- monitor.setTextColor(colors.white)
- monitor.write(string.format("Accumulator: %.1f%%", data.accPct))
- monitor.setCursorPos(w - 2, 1)
- monitor.setTextColor(data.generatorOn and colors.lime or colors.red)
- monitor.write(data.generatorOn and "ON" or "OFF")
- -- rate & ETA
- monitor.setCursorPos(1, 3)
- monitor.setTextColor(colors.white)
- monitor.write("Rate: " .. tostring(math.floor(data.avgFEperTick + 0.5)) .. " FE/t")
- monitor.setCursorPos(1, 4)
- monitor.write(data.etaLabel .. " " .. formatTimeTicks(data.etaTicks))
- -- thresholds as percentages
- local minPct = data.minEnergy / data.totalCapacity * 100
- local maxPct = data.maxEnergy / data.totalCapacity * 100
- monitor.setCursorPos(1, 6)
- monitor.setTextColor(colors.lightGray)
- monitor.write(string.format(
- "Thresholds: Min: %.1f%% Max: %.1f%%",
- minPct, maxPct
- ))
- -- battery banks
- local y = 8
- monitor.setTextColor(colors.lightGray)
- monitor.setCursorPos(1, y)
- monitor.write(string.format("Bank 0: %s/%s", formatK(data.accEnergy), formatK(data.accCapacity)))
- monitor.setCursorPos(1, y + 1)
- monitor.write(string.format("Bank 1: %s/%s", formatK(data.acc0Energy), formatK(data.acc0Capacity)))
- monitor.setCursorPos(1, y + 2)
- monitor.write(string.format("Bank 2: %s/%s", formatK(data.acc1Energy), formatK(data.acc1Capacity)))
- monitor.setCursorPos(1, y + 3)
- monitor.write(string.format("Bank 3: %s/%s", formatK(data.capBankEnergy), formatK(data.capBankCap)))
- end
- -- ========================================================
- -- Receive & render loop
- -- ========================================================
- while true do
- local _, data = rednet.receive("generator_status")
- monitorUI(data)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement