Advertisement
zamoth

Untitled

Jul 4th, 2025 (edited)
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.03 KB | None | 0 0
  1. -- ui.lua  (run on your UI-side computer)
  2.  
  3. -- ========================================================
  4. -- Peripheral wrapping
  5. -- ========================================================
  6. rednet.open("left")  
  7. local monitor = assert(peripheral.wrap("back"), "Monitor not found")
  8.  
  9. -- ========================================================
  10. -- Formatting
  11. -- ========================================================
  12. local function formatK(val)
  13.   if not val then return "-" end
  14.   if val >= 1000 then
  15.     return string.format("%dk", math.floor(val/1000))
  16.   else
  17.     return tostring(val)
  18.   end
  19. end
  20.  
  21. local function formatTimeTicks(ticks)
  22.   if not ticks or ticks == "-" or ticks == math.huge then return "-" end
  23.   local seconds = math.floor(ticks/20 + 0.5)
  24.   local h = math.floor(seconds/3600)
  25.   local m = math.floor((seconds % 3600)/60)
  26.   local s = seconds % 60
  27.   return string.format("%02d:%02d:%02d", h, m, s)
  28. end
  29.  
  30. -- ========================================================
  31. -- Monitor UI (main, with percentage thresholds)
  32. -- ========================================================
  33. local function monitorUI(data)
  34.   monitor.setBackgroundColor(colors.black)
  35.   monitor.clear()
  36.   monitor.setTextScale(1)
  37.  
  38.   local w, _ = monitor.getSize()
  39.  
  40.   -- top line: accumulator % on left, ON/OFF on right
  41.   monitor.setCursorPos(1, 1)
  42.   monitor.setTextColor(colors.white)
  43.   monitor.write(string.format("Accumulator: %.1f%%", data.accPct))
  44.   monitor.setCursorPos(w - 2, 1)
  45.   monitor.setTextColor(data.generatorOn and colors.lime or colors.red)
  46.   monitor.write(data.generatorOn and "ON" or "OFF")
  47.  
  48.   -- rate & ETA
  49.   monitor.setCursorPos(1, 3)
  50.   monitor.setTextColor(colors.white)
  51.   monitor.write("Rate: " .. tostring(math.floor(data.avgFEperTick + 0.5)) .. " FE/t")
  52.   monitor.setCursorPos(1, 4)
  53.   monitor.write(data.etaLabel .. " " .. formatTimeTicks(data.etaTicks))
  54.  
  55.   -- thresholds as percentages
  56.   local minPct = data.minEnergy / data.totalCapacity * 100
  57.   local maxPct = data.maxEnergy / data.totalCapacity * 100
  58.   monitor.setCursorPos(1, 6)
  59.   monitor.setTextColor(colors.lightGray)
  60.   monitor.write(string.format(
  61.     "Thresholds: Min: %.1f%%   Max: %.1f%%",
  62.     minPct, maxPct
  63.   ))
  64.  
  65.   -- battery banks
  66.   local y = 8
  67.   monitor.setTextColor(colors.lightGray)
  68.   monitor.setCursorPos(1, y)
  69.   monitor.write(string.format("Bank 0: %s/%s", formatK(data.accEnergy),  formatK(data.accCapacity)))
  70.   monitor.setCursorPos(1, y + 1)
  71.   monitor.write(string.format("Bank 1: %s/%s", formatK(data.acc0Energy), formatK(data.acc0Capacity)))
  72.   monitor.setCursorPos(1, y + 2)
  73.   monitor.write(string.format("Bank 2: %s/%s", formatK(data.acc1Energy), formatK(data.acc1Capacity)))
  74.   monitor.setCursorPos(1, y + 3)
  75.   monitor.write(string.format("Bank 3: %s/%s", formatK(data.capBankEnergy), formatK(data.capBankCap)))
  76. end
  77.  
  78. -- ========================================================
  79. -- Receive & render loop
  80. -- ========================================================
  81. while true do
  82.   local _, data = rednet.receive("generator_status")
  83.   monitorUI(data)
  84. end
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement