feat: add log buffer, draw on screen manually

This commit is contained in:
2025-05-06 19:56:15 -03:00
parent b0d27aa022
commit 8bab43c149
+68 -42
View File
@@ -47,25 +47,16 @@ local logTypes = {
} }
} }
local log = {} local log = {}
log.buffer = {}
for typeName, format in pairs(logTypes) do for typeName, format in pairs(logTypes) do
log[typeName] = function(fmt, ...) log[typeName] = function(fmt, ...)
local prevColourBg = term.getBackgroundColour() local entry = {
local prevColourFg = term.getTextColour() message = string.format(fmt, ...),
type = typeName
}
term.setBackgroundColour(format["BG"]) table.insert(log.buffer, entry)
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
end end
end end
@@ -104,27 +95,6 @@ function sendToAll(name, msgData)
modem.transmit(0, 0, message) modem.transmit(0, 0, message)
end 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 command handling
]] ]]
@@ -154,10 +124,27 @@ declareCommandHandler("SCAN", handleScan,
["fuel"] = "number" ["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) local function handleMessages(side, channel, replyChannel, message, dist)
if channel ~= HOST_CHANNEL then return end if channel ~= HOST_CHANNEL then return end
@@ -190,20 +177,21 @@ local function handleMessages(side, channel, replyChannel, message, dist)
if not success then if not success then
log.error("error occurred while executing command %s: %s", message.name, err) log.error("error occurred while executing command %s: %s", message.name, err)
end end
log.info("processed command (%s)", message.name)
end end
registerEventListener("modem_message", handleMessages) registerEventListener("modem_message", handleMessages)
--[[ --[[
main main
]] ]]
log.general("tutel host init") -- log.general("tutel host init")
-- transmit scan -- transmit scan
log.info("broadcasting SCAN") -- log.info("broadcasting SCAN")
sendToAll("SCAN", { ["hostChannel"] = HOST_CHANNEL })
--[[ --[[
loop functions screen drawing
]] ]]
function updateScreen() function updateScreen()
local w, h = term.getSize() local w, h = term.getSize()
@@ -223,8 +211,41 @@ function updateScreen()
term.setTextColour(colors.black) term.setTextColour(colors.black)
term.clearLine() term.clearLine()
drawTextCentered("tutel host controller") 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 end
--[[
event polling
]]
function pollEvents() function pollEvents()
local eventData = { os.pullEvent() } local eventData = { os.pullEvent() }
@@ -234,6 +255,11 @@ function pollEvents()
dispatchEvents(eventName, table.unpack(eventData)) dispatchEvents(eventName, table.unpack(eventData))
end end
--[[
main loop
]]
sendToAll("SCAN", { ["hostChannel"] = HOST_CHANNEL })
while true do while true do
pollEvents() pollEvents()
updateScreen()
end end