local induction_port = peripheral.find("inductionPort")
local monitor = peripheral.find("monitor")
if not induction_port then error("No induction port found!") end
if not monitor then error("No monitor found!") end
monitor.setBackgroundColor(colors.black)
monitor.clear()
local function format_number(num)
num = tonumber(num) or 0
local sign = " "
if num < 0 then sign = "-" num = math.abs(num) end
local suffixes = {"", "k", "M", "G", "T", "P", "E"}
local i = 1
while num >= 1000 and i < #suffixes do
num = num / 1000
i = i + 1
end
return string.format("%s%.2f%s", sign, num, suffixes[i])
end
local function formatTime(seconds)
if not seconds then return "--" end
local days = math.floor(seconds / 86400)
seconds = seconds % 86400
local hours = math.floor(seconds / 3600)
seconds = seconds % 3600
local minutes = math.floor(seconds / 60)
seconds = math.floor(seconds % 60)
local result = ""
if days > 0 then result = result .. days.."d " end
if hours > 0 or days > 0 then result = result .. hours.."h " end
if minutes > 0 or hours > 0 or days > 0 then result = result .. minutes.."m " end
result = result .. seconds.."s"
return result
end
while true do
local fill = induction_port.getEnergyFilledPercentage() or 0
local percent = fill * 100
local energy = induction_port.getEnergy()
local maxEnergy = induction_port.getMaxEnergy()
local lastInput = induction_port.getLastInput()
local lastOutput = induction_port.getLastOutput()
local transferCap = induction_port.getTransferCap()
local netMovement = lastInput - lastOutput -- per tick
local status, eta
if netMovement > 0.001 then
status = "Power"
eta = ((maxEnergy - energy) / netMovement) * 0.05
elseif netMovement < -0.001 then
status = "Drain"
eta = (energy / -netMovement) * 0.05
else
status = "Neutral"
eta = nil
end
monitor.clear()
monitor.setCursorPos(1,1)
monitor.write("*Induction Matrix*")
monitor.setCursorPos(1,2)
monitor.write("------------------")
monitor.setCursorPos(1,3)
monitor.write(string.format("Stored: %s", format_number(energy)))
monitor.setCursorPos(1,4)
monitor.write(string.format("Limit : %s", format_number(maxEnergy)))
monitor.setCursorPos(1,5)
monitor.write(string.format("Charge : %.1f%%", percent))
monitor.setCursorPos(1,7)
monitor.write(string.format("Input : %s", format_number(lastInput)))
monitor.setCursorPos(1,8)
monitor.write(string.format("Output: %s", format_number(lastOutput)))
monitor.setCursorPos(1,9)
monitor.write(string.format("Max IO: %s", format_number(transferCap)))
monitor.setCursorPos(1,11)
monitor.write(string.format("Change:%s", format_number(netMovement)))
monitor.setCursorPos(1,12)
monitor.write(string.format("%s: %s", status, formatTime(eta)))
sleep(0.05)
end