From a18229ff8ab049b7a0649adb6a827b2b231501cd Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Fri, 16 Feb 2024 00:59:57 -0700 Subject: [PATCH] BizHawkClient: Use callbacks in connector script instead of else/ifs (#2784) --- data/lua/connector_bizhawk_generic.lua | 105 +++++++++++++++++++------ 1 file changed, 83 insertions(+), 22 deletions(-) diff --git a/data/lua/connector_bizhawk_generic.lua b/data/lua/connector_bizhawk_generic.lua index 47af6e003d8e..00021b241f9a 100644 --- a/data/lua/connector_bizhawk_generic.lua +++ b/data/lua/connector_bizhawk_generic.lua @@ -22,6 +22,10 @@ SOFTWARE. local SCRIPT_VERSION = 1 +-- Set to log incoming requests +-- Will cause lag due to large console output +local DEBUG = false + --[[ This script expects to receive JSON and will send JSON back. A message should be a list of 1 or more requests which will be executed in order. Each request @@ -271,10 +275,6 @@ local base64 = require("base64") local socket = require("socket") local json = require("json") --- Set to log incoming requests --- Will cause lag due to large console output -local DEBUG = false - local SOCKET_PORT_FIRST = 43055 local SOCKET_PORT_RANGE_SIZE = 5 local SOCKET_PORT_LAST = SOCKET_PORT_FIRST + SOCKET_PORT_RANGE_SIZE @@ -330,18 +330,28 @@ function unlock () client_socket:settimeout(0) end -function process_request (req) - local res = {} +request_handlers = { + ["PING"] = function (req) + local res = {} - if req["type"] == "PING" then res["type"] = "PONG" - elseif req["type"] == "SYSTEM" then + return res + end, + + ["SYSTEM"] = function (req) + local res = {} + res["type"] = "SYSTEM_RESPONSE" res["value"] = emu.getsystemid() - elseif req["type"] == "PREFERRED_CORES" then + return res + end, + + ["PREFERRED_CORES"] = function (req) + local res = {} local preferred_cores = client.getconfig().PreferredCores + res["type"] = "PREFERRED_CORES_RESPONSE" res["value"] = {} res["value"]["NES"] = preferred_cores.NES @@ -354,14 +364,21 @@ function process_request (req) res["value"]["PCECD"] = preferred_cores.PCECD res["value"]["SGX"] = preferred_cores.SGX - elseif req["type"] == "HASH" then + return res + end, + + ["HASH"] = function (req) + local res = {} + res["type"] = "HASH_RESPONSE" res["value"] = rom_hash - elseif req["type"] == "GUARD" then - res["type"] = "GUARD_RESPONSE" - local expected_data = base64.decode(req["expected_data"]) + return res + end, + ["GUARD"] = function (req) + local res = {} + local expected_data = base64.decode(req["expected_data"]) local actual_data = memory.read_bytes_as_array(req["address"], #expected_data, req["domain"]) local data_is_validated = true @@ -372,39 +389,83 @@ function process_request (req) end end + res["type"] = "GUARD_RESPONSE" res["value"] = data_is_validated res["address"] = req["address"] - elseif req["type"] == "LOCK" then + return res + end, + + ["LOCK"] = function (req) + local res = {} + res["type"] = "LOCKED" lock() - elseif req["type"] == "UNLOCK" then + return res + end, + + ["UNLOCK"] = function (req) + local res = {} + res["type"] = "UNLOCKED" unlock() - elseif req["type"] == "READ" then + return res + end, + + ["READ"] = function (req) + local res = {} + res["type"] = "READ_RESPONSE" res["value"] = base64.encode(memory.read_bytes_as_array(req["address"], req["size"], req["domain"])) - elseif req["type"] == "WRITE" then + return res + end, + + ["WRITE"] = function (req) + local res = {} + res["type"] = "WRITE_RESPONSE" memory.write_bytes_as_array(req["address"], base64.decode(req["value"]), req["domain"]) - elseif req["type"] == "DISPLAY_MESSAGE" then + return res + end, + + ["DISPLAY_MESSAGE"] = function (req) + local res = {} + res["type"] = "DISPLAY_MESSAGE_RESPONSE" message_queue:push(req["message"]) - elseif req["type"] == "SET_MESSAGE_INTERVAL" then + return res + end, + + ["SET_MESSAGE_INTERVAL"] = function (req) + local res = {} + res["type"] = "SET_MESSAGE_INTERVAL_RESPONSE" message_interval = req["value"] - else + return res + end, + + ["default"] = function (req) + local res = {} + res["type"] = "ERROR" res["err"] = "Unknown command: "..req["type"] - end - return res + return res + end, +} + +function process_request (req) + if request_handlers[req["type"]] then + return request_handlers[req["type"]](req) + else + return request_handlers["default"](req) + end end -- Receive data from AP client and send message back