feat: add even handling

This commit is contained in:
2025-05-06 18:57:43 -03:00
parent 412f7cbedd
commit ae31cd04b5
+64 -36
View File
@@ -104,6 +104,27 @@ 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
eventListeners[name]:insert(listener)
end
local function dispatchEvents(event, ...)
log.info("dispatching event: %s", event)
local eventTbl = eventListeners[event]
if not eventTbl then return end
for i = 0, #eventTbl, 1 do
eventTbl[i](...)
end
end
--[[
command handling
]]
@@ -133,44 +154,46 @@ declareCommandHandler("SCAN", handleScan,
["fuel"] = "number"
})
--[[
main
]]
function pollAndProcessMessages()
local eventType, side, channel, replyChannel, message, dist = os.pullEvent("modem_message")
-- to-do: check if reply channel is valid turtle channel
--[[
modem message handler
]]
local function handleMessages(side, channel, replyChannel, message, dist)
if channel ~= HOST_CHANNEL then return end
-- message validation
if type(message) ~= "table" then return end
if not message.header or message.header ~= MSG_HEADER then return end
if not message.data then message.data = {} end
-- command validation
if not message.name then
log.warning("received nameless message")
return
end
if not commands[message.name] then
log.error("unhandled message (%s)", message.name)
return
end
local cmd = commands[message.name]
for i, v in pairs(cmd.keys) do
if type(message.data[i]) ~= v and v ~= "optional" then
log.error("command %s requires key %s of type %s (was %s)", message.name, i, v, type(message[i]))
return
end
end
cmd.handler(message.data, message.id)
-- message handling
log.info("received command (%s)", message.name)
end
--[[
main
]]
-- function pollAndProcessMessages()
-- -- command validation
-- if not message.name then
-- log.warning("received nameless message")
-- return
-- end
-- if not commands[message.name] then
-- log.error("unhandled message (%s)", message.name)
-- return
-- end
-- local cmd = commands[message.name]
-- for i, v in pairs(cmd.keys) do
-- if type(message.data[i]) ~= v and v ~= "optional" then
-- log.error("command %s requires key %s of type %s (was %s)", message.name, i, v, type(message[i]))
-- return
-- end
-- end
-- cmd.handler(message.data, message.id)
-- -- message handling
-- log.info("received command (%s)", message.name)
-- end
log.general("tutel host init")
@@ -178,10 +201,6 @@ log.general("tutel host init")
sendToAll("SCAN", { ["hostChannel"] = HOST_CHANNEL })
log.info("broadcasted scan message")
-- while true do
-- pollAndProcessEvents()
-- end
function updateScreen()
local w, h = term.getSize()
@@ -202,6 +221,15 @@ function updateScreen()
drawTextCentered("tutel host controller")
end
function pollEvents()
local eventData = { os.pullEvent() }
local eventName = eventData[1]
eventData:remove(1)
dispatchEvents(eventName, eventData:unpack())
end
while true do
updateScreen()
end
pollEvents()
end