CCCPaste

induction_matrix

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