feat: add even handling
This commit is contained in:
@@ -104,6 +104,27 @@ 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
|
||||||
|
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
|
command handling
|
||||||
]]
|
]]
|
||||||
@@ -133,44 +154,46 @@ declareCommandHandler("SCAN", handleScan,
|
|||||||
["fuel"] = "number"
|
["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
|
if channel ~= HOST_CHANNEL then return end
|
||||||
|
|
||||||
-- message validation
|
|
||||||
if type(message) ~= "table" then return end
|
if type(message) ~= "table" then return end
|
||||||
if not message.header or message.header ~= MSG_HEADER then return end
|
if not message.header or message.header ~= MSG_HEADER then return end
|
||||||
if not message.data then message.data = {} 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
|
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")
|
log.general("tutel host init")
|
||||||
|
|
||||||
@@ -178,10 +201,6 @@ log.general("tutel host init")
|
|||||||
sendToAll("SCAN", { ["hostChannel"] = HOST_CHANNEL })
|
sendToAll("SCAN", { ["hostChannel"] = HOST_CHANNEL })
|
||||||
log.info("broadcasted scan message")
|
log.info("broadcasted scan message")
|
||||||
|
|
||||||
-- while true do
|
|
||||||
-- pollAndProcessEvents()
|
|
||||||
-- end
|
|
||||||
|
|
||||||
function updateScreen()
|
function updateScreen()
|
||||||
local w, h = term.getSize()
|
local w, h = term.getSize()
|
||||||
|
|
||||||
@@ -202,6 +221,15 @@ function updateScreen()
|
|||||||
drawTextCentered("tutel host controller")
|
drawTextCentered("tutel host controller")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function pollEvents()
|
||||||
|
local eventData = { os.pullEvent() }
|
||||||
|
|
||||||
|
local eventName = eventData[1]
|
||||||
|
eventData:remove(1)
|
||||||
|
|
||||||
|
dispatchEvents(eventName, eventData:unpack())
|
||||||
|
end
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
updateScreen()
|
pollEvents()
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user