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