From e22242c4e7de4aeaeaed12204b910e51da654ed5 Mon Sep 17 00:00:00 2001 From: neru Date: Thu, 8 May 2025 20:31:42 -0300 Subject: [PATCH] chore: misc changes and refactor --- lua/CC Tweaked/tutel/tutel-client.lua | 57 ++++++++++++++++++++------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/lua/CC Tweaked/tutel/tutel-client.lua b/lua/CC Tweaked/tutel/tutel-client.lua index 94dba4f..56fb200 100644 --- a/lua/CC Tweaked/tutel/tutel-client.lua +++ b/lua/CC Tweaked/tutel/tutel-client.lua @@ -103,7 +103,7 @@ function handleScan(keys) log.info("received scan, host channel assigned to %d, replying...", keys.hostChannel) local x, y, z = gps.locate() - + sendToHost("SCAN", { ["positionX"] = x, ["positionY"] = y, @@ -162,27 +162,38 @@ end declareCommandHandler("ABORT", handleAbort) --[[ - main + event handling ]] -function pollAndProcessMessages() - local eventType, side, channel, replyChannel, message, dist = os.pullEvent("modem_message") +local eventListeners = {} +local function registerEventListener(name, listener) + if not eventListeners[name] then eventListeners[name] = {} end + table.insert(eventListeners[name], listener) +end - -- ignore messages not from host, HOST_CHANNEL and REPLY_CHANNEL will get assigned after receiving SCAN on channel 0 +local function dispatchEvents(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 TURTLE_CHANNEL and channel ~= TURTLE_CHANNEL then return end - -- message validation + -- msg 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 + -- cmd validation if not message.name then - log.warning("received nameless message") + log.warning("received nameless command?") return end if not commands[message.name] then - log.error("unhandled message (%s)", message.name) + log.error("unhandled command (%s)", message.name) return end @@ -194,14 +205,32 @@ function pollAndProcessMessages() end end - cmd.handler(message.data) + -- cmd execution + local success, err = pcall(cmd.handler, message.data, message.id) + if not success then + log.error("error occurred while executing command %s: %s", message.name, err) + return + end - -- message handling log.info("processed command (%s)", message.name) end +registerEventListener("modem_message", handleMessages) -log.general("tutel client init") +--[[ + event polling +]] +function pollEvents() + local eventData = { os.pullEvent() } -while true do - pollAndProcessMessages() + local eventName = eventData[1] + table.remove(eventData, 1) + + dispatchEvents(eventName, table.unpack(eventData)) end + +--[[ + main loop +]] +while true do + pollEvents() +end \ No newline at end of file