diff --git a/lua/CC Tweaked/tutel/tutel-host.lua b/lua/CC Tweaked/tutel/tutel-host.lua index 39543c6..ed2c30f 100644 --- a/lua/CC Tweaked/tutel/tutel-host.lua +++ b/lua/CC Tweaked/tutel/tutel-host.lua @@ -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 \ No newline at end of file + pollEvents() +end