feat: add log buffer, draw on screen manually
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user