134 lines
3.4 KiB
Lua
134 lines
3.4 KiB
Lua
-- license:BSD-3-Clause
|
|
-- copyright-holders:Vas Crabb
|
|
|
|
|
|
-- Helpers
|
|
|
|
local function settings_path()
|
|
return manager.machine.options.entries.homepath:value():match('([^;]+)') .. '/offscreenreload'
|
|
end
|
|
|
|
local function settings_filename()
|
|
return emu.romname() .. '.cfg'
|
|
end
|
|
|
|
local function make_helper(setting)
|
|
if (setting.binding == nil) or (setting.axis == nil) or (setting.button == nil) then
|
|
return nil
|
|
elseif (setting.axis.port == nil) or (setting.axis.mask == nil) or (setting.axis.type == nil) then
|
|
return nil
|
|
elseif (setting.button.port == nil) or (setting.button.mask == nil) or (setting.button.type == nil) then
|
|
return nil
|
|
end
|
|
|
|
local ioport = manager.machine.ioport
|
|
local result = {
|
|
binding = manager.machine.input:seq_from_tokens(setting.binding),
|
|
bindingcfg = setting.binding,
|
|
axis = {
|
|
port = setting.axis.port,
|
|
mask = setting.axis.mask,
|
|
type = ioport:token_to_input_type(setting.axis.type) },
|
|
button = {
|
|
port = setting.button.port,
|
|
mask = setting.button.mask,
|
|
type = ioport:token_to_input_type(setting.button.type) } }
|
|
|
|
local axisport = ioport.ports[result.axis.port]
|
|
if axisport then
|
|
local field = axisport:field(result.axis.mask)
|
|
if field and (field.type == result.axis.type) then
|
|
result.axis.field = field
|
|
end
|
|
end
|
|
|
|
local buttonport = ioport.ports[result.button.port]
|
|
if buttonport then
|
|
local field = buttonport:field(result.button.mask)
|
|
if field and (field.type == result.button.type) then
|
|
result.button.field = field
|
|
end
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
local function make_settings(helpers)
|
|
local input = manager.machine.input
|
|
local ioport = manager.machine.ioport
|
|
local result = { }
|
|
for i, helper in ipairs(helpers) do
|
|
local h = {
|
|
binding = helper.bindingcfg,
|
|
axis = {
|
|
port = helper.axis.port,
|
|
mask = helper.axis.mask,
|
|
type = ioport:input_type_to_token(helper.axis.type) },
|
|
button = {
|
|
port = helper.button.port,
|
|
mask = helper.button.mask,
|
|
type = ioport:input_type_to_token(helper.button.type) } }
|
|
table.insert(result, h)
|
|
end
|
|
return result
|
|
end
|
|
|
|
|
|
-- Entry points
|
|
|
|
local lib = { }
|
|
|
|
function lib:load_settings()
|
|
local filename = settings_path() .. '/' .. settings_filename()
|
|
local file = io.open(filename, 'r')
|
|
if not file then
|
|
return { }
|
|
end
|
|
local json = require('json')
|
|
local settings = json.parse(file:read('a'))
|
|
file:close()
|
|
if not settings then
|
|
emu.print_error(string.format('Error loading off-screen reload helpers: error parsing file "%s" as JSON', filename))
|
|
return { }
|
|
end
|
|
|
|
result = { }
|
|
for index, setting in ipairs(settings) do
|
|
local helper = make_helper(setting)
|
|
if helper then
|
|
table.insert(result, helper)
|
|
end
|
|
end
|
|
return result
|
|
end
|
|
|
|
function lib:save_settings(helpers)
|
|
local path = settings_path()
|
|
local stat = lfs.attributes(path)
|
|
if stat and (stat.mode ~= 'directory') then
|
|
emu.print_error(string.format('Error saving off-screen reload helpers: "%s" is not a directory', path))
|
|
return
|
|
end
|
|
local filename = path .. '/' .. settings_filename()
|
|
|
|
if #helpers == 0 then
|
|
os.remove(filename)
|
|
return
|
|
elseif not stat then
|
|
lfs.mkdir(path)
|
|
end
|
|
|
|
local json = require('json')
|
|
local settings = make_settings(helpers)
|
|
local text = json.stringify(settings, { indent = true })
|
|
local file = io.open(filename, 'w')
|
|
if not file then
|
|
emu.print_error(string.format('Error saving off-screen reload helpers: error opening file "%s" for writing', filename))
|
|
return
|
|
end
|
|
file:write(text)
|
|
file:close()
|
|
end
|
|
|
|
return lib
|