fix: prefer wired modems in findModem() to prevent wireless/wired mismatch
WebBridge.findModem() iterated _G.device with pairs() which has non-deterministic order. On computers with both wired and wireless modems, it could return the wireless modem while the manager uses a wired modem - messages never cross the wired/wireless boundary. Now uses two-pass iteration: first looks for wired modems, then falls back to any modem. Peripheral scan fallback also prefers wired. Backward-compatible: boolean arg (preferWireless) still works.
This commit is contained in:
@@ -170,29 +170,57 @@ end
|
|||||||
|
|
||||||
--- Find a modem peripheral.
|
--- Find a modem peripheral.
|
||||||
-- Prefers the Opus device registry, falls back to peripheral scan.
|
-- Prefers the Opus device registry, falls back to peripheral scan.
|
||||||
-- @param preferWireless boolean|nil If true, prefer wireless modem
|
-- By default prefers wired modems (for reliable LAN communication).
|
||||||
|
-- @param opts table|boolean|nil Options table { preferWireless = bool },
|
||||||
|
-- or legacy boolean (true = prefer wireless)
|
||||||
-- @return table|nil Modem peripheral handle
|
-- @return table|nil Modem peripheral handle
|
||||||
-- @return string|nil Peripheral name/side
|
-- @return string|nil Peripheral name/side
|
||||||
function WebBridge.findModem(preferWireless)
|
function WebBridge.findModem(opts)
|
||||||
|
-- Legacy support: boolean arg means preferWireless
|
||||||
|
if type(opts) == 'boolean' then
|
||||||
|
opts = { preferWireless = opts }
|
||||||
|
end
|
||||||
|
opts = opts or {}
|
||||||
|
|
||||||
-- Try Opus device registry first
|
-- Try Opus device registry first
|
||||||
if _G.device then
|
if _G.device then
|
||||||
if preferWireless and _G.device.wireless_modem then
|
if opts.preferWireless and _G.device.wireless_modem then
|
||||||
return _G.device.wireless_modem, 'wireless_modem'
|
return _G.device.wireless_modem, 'wireless_modem'
|
||||||
end
|
end
|
||||||
-- Find any modem in device registry
|
|
||||||
|
-- Two-pass: prefer wired modems first, then any modem
|
||||||
|
-- (pairs() order is non-deterministic; without two passes,
|
||||||
|
-- a wireless modem might be returned even when wired is available)
|
||||||
|
local fallback, fallbackName
|
||||||
for name, dev in pairs(_G.device) do
|
for name, dev in pairs(_G.device) do
|
||||||
if dev.type == 'modem' or dev.type == 'wireless_modem' or dev.type == 'wired_modem' then
|
if dev.type == 'wired_modem' then
|
||||||
return dev, name
|
return dev, name
|
||||||
|
elseif dev.type == 'modem' or dev.type == 'wireless_modem' then
|
||||||
|
if not fallback then
|
||||||
|
fallback, fallbackName = dev, name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if fallback then
|
||||||
|
return fallback, fallbackName
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Fallback: scan peripherals
|
-- Fallback: scan peripherals (prefer wired)
|
||||||
|
local wirelessDev, wirelessName
|
||||||
for _, name in ipairs(peripheral.getNames()) do
|
for _, name in ipairs(peripheral.getNames()) do
|
||||||
if peripheral.getType(name) == 'modem' then
|
if peripheral.getType(name) == 'modem' then
|
||||||
return peripheral.wrap(name), name
|
local dev = peripheral.wrap(name)
|
||||||
|
if dev.isWireless and not dev.isWireless() then
|
||||||
|
return dev, name -- wired modem found
|
||||||
|
elseif not wirelessDev then
|
||||||
|
wirelessDev, wirelessName = dev, name
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if wirelessDev then
|
||||||
|
return wirelessDev, wirelessName
|
||||||
|
end
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user