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 = {}
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