list connected SNESes if more than one; allow connecting to specific one

This commit is contained in:
Adam Ziegler 2021-08-28 21:20:45 -05:00 committed by Fabian Dill
parent 9402d82405
commit fd0a87626e
1 changed files with 36 additions and 6 deletions

View File

@ -52,11 +52,26 @@ class LttPCommandProcessor(ClientCommandProcessor):
self.output(f"Setting slow mode to {self.ctx.slow_mode}")
@mark_raw
def _cmd_snes(self, snes_address: str = "") -> bool:
"""Connect to a snes.
Optionally include network address of a snes to connect to, otherwise show available devices"""
def _cmd_snes(self, snes_options: str = "") -> bool:
"""Connect to a snes. Optionally include network address of a snes to connect to, otherwise show available devices; and a SNES device number if more than one SNES is detected"""
snes_address = self.ctx.snes_address
snes_device_number = -1
options = snes_options.split()
num_options = len(options)
if num_options > 0:
snes_address = options[0]
if num_options > 1:
try:
snes_device_number = int(options[1])
except:
pass
self.ctx.snes_reconnect_address = None
asyncio.create_task(snes_connect(self.ctx, snes_address if snes_address else self.ctx.snes_address))
asyncio.create_task(snes_connect(self.ctx, snes_address, snes_device_number))
return True
def _cmd_snes_close(self) -> bool:
@ -504,6 +519,7 @@ async def snes_connect(ctx: Context, address):
snes_logger.error('Already connected to SNI, likely awaiting a device.')
return
device = None
recv_task = None
ctx.snes_state = SNESState.SNES_CONNECTING
socket = await _snes_connect(ctx, address)
@ -512,15 +528,29 @@ async def snes_connect(ctx: Context, address):
try:
devices = await get_snes_devices(ctx)
numDevices = len(devices)
if len(devices) == 1:
if numDevices == 1:
device = devices[0]
elif ctx.snes_reconnect_address:
if ctx.snes_attached_device[1] in devices:
device = ctx.snes_attached_device[1]
else:
device = devices[ctx.snes_attached_device[0]]
else:
elif numDevices > 1:
if deviceIndex == -1:
logger.info("Found " + str(numDevices) + " SNES devices; connect to one with /snes <address> <device number>:")
for idx, availableDevice in enumerate(devices):
logger.info(str(idx + 1) + ": " + availableDevice)
elif (deviceIndex < 0) or (deviceIndex - 1) > numDevices:
logger.warning("SNES device number out of range")
else:
device = devices[deviceIndex - 1]
if device is None:
await snes_disconnect(ctx)
return