Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BizHawkClient: Use callbacks in connector script instead of else/ifs #2784

Merged
merged 1 commit into from
Feb 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 83 additions & 22 deletions data/lua/connector_bizhawk_generic.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
Loading