From 8bab43c14928385a9fe4206f5c7f26ba9d681b14 Mon Sep 17 00:00:00 2001 From: neru Date: Tue, 6 May 2025 19:56:15 -0300 Subject: [PATCH] feat: add log buffer, draw on screen manually --- lua/CC Tweaked/tutel/tutel-host.lua | 110 +++++++++++++++++----------- 1 file changed, 68 insertions(+), 42 deletions(-) diff --git a/lua/CC Tweaked/tutel/tutel-host.lua b/lua/CC Tweaked/tutel/tutel-host.lua index a74a668..09bb4b1 100644 --- a/lua/CC Tweaked/tutel/tutel-host.lua +++ b/lua/CC Tweaked/tutel/tutel-host.lua @@ -47,25 +47,16 @@ local logTypes = { } } local log = {} +log.buffer = {} for typeName, format in pairs(logTypes) do log[typeName] = function(fmt, ...) - local prevColourBg = term.getBackgroundColour() - local prevColourFg = term.getTextColour() + local entry = { + message = string.format(fmt, ...), + type = typeName + } - term.setBackgroundColour(format["BG"]) - term.setTextColour(format["FG"]) - io.write(("[%s @ line %d]"):format(typeName, debug.getinfo(2, "l").currentline)) - - if format["AffectContent"] then - io.write(" ", string.format(fmt, ...), "\n") - term.setBackgroundColour(prevColourBg) - term.setTextColour(prevColourFg) - else - term.setBackgroundColour(prevColourBg) - term.setTextColour(prevColourFg) - io.write(" ", string.format(fmt, ...), "\n") - end + table.insert(log.buffer, entry) end end @@ -104,27 +95,6 @@ function sendToAll(name, msgData) modem.transmit(0, 0, message) end ---[[ - event handling -]] -local eventListeners = {} -local function registerEventListener(name, listener) - if not eventListeners[name] then eventListeners[name] = {} end - table.insert(eventListeners[name], listener) -end - -local function dispatchEvents(event, ...) - log.info("dispatching event: %s", event) - - local eventTbl = eventListeners[event] - - if not eventTbl then return end - - for i = 1, #eventTbl, 1 do - eventTbl[i](...) - end -end - --[[ command handling ]] @@ -154,10 +124,27 @@ declareCommandHandler("SCAN", handleScan, ["fuel"] = "number" }) - --[[ - modem message handler + event handling ]] +local eventListeners = {} +local function registerEventListener(name, listener) + if not eventListeners[name] then eventListeners[name] = {} end + table.insert(eventListeners[name], listener) +end + +local function dispatchEvents(event, ...) + log.info("dispatching event: %s", event) + + local eventTbl = eventListeners[event] + + if not eventTbl then return end + + for i = 1, #eventTbl, 1 do + eventTbl[i](...) + end +end + local function handleMessages(side, channel, replyChannel, message, dist) if channel ~= HOST_CHANNEL then return end @@ -190,20 +177,21 @@ local function handleMessages(side, channel, replyChannel, message, dist) if not success then log.error("error occurred while executing command %s: %s", message.name, err) end + + log.info("processed command (%s)", message.name) end registerEventListener("modem_message", handleMessages) --[[ main ]] -log.general("tutel host init") +-- log.general("tutel host init") -- transmit scan -log.info("broadcasting SCAN") -sendToAll("SCAN", { ["hostChannel"] = HOST_CHANNEL }) +-- log.info("broadcasting SCAN") --[[ - loop functions + screen drawing ]] function updateScreen() local w, h = term.getSize() @@ -223,8 +211,41 @@ function updateScreen() term.setTextColour(colors.black) term.clearLine() drawTextCentered("tutel host controller") + + local function drawLogs(startY, endY) + for i = #log.buffer, 1, -1 do + if i > endY then break end + + local entry = log.buffer[i] + local format = logFormats[entry.type] + + term.setCursorPos(startY + i) + + local prevColourBg = term.getBackgroundColour() + local prevColourFg = term.getTextColour() + + term.setBackgroundColour(format["BG"]) + term.setTextColour(format["FG"]) + term.write(("[%s]"):format(entry.type)) + + if format["AffectContent"] then + term.write((" %s\n"):format(entry.message)) + term.setBackgroundColour(prevColourBg) + term.setTextColour(prevColourFg) + else + term.setBackgroundColour(prevColourBg) + term.setTextColour(prevColourFg) + term.write((" %s\n"):format(entry.message)) + end + end + end + + drawLogs(2, w - 1) end +--[[ + event polling +]] function pollEvents() local eventData = { os.pullEvent() } @@ -234,6 +255,11 @@ function pollEvents() dispatchEvents(eventName, table.unpack(eventData)) end +--[[ + main loop +]] +sendToAll("SCAN", { ["hostChannel"] = HOST_CHANNEL }) while true do pollEvents() + updateScreen() end