kete: add live debugging mode
Just start/stop live mode, the debug happens in the tuhi process. That's enough until we figure out the DBus API if we need one
This commit is contained in:
parent
1a6d0205df
commit
3eca8da251
101
tools/kete.py
101
tools/kete.py
|
@ -184,6 +184,7 @@ class TuhiKeteDevice(_DBusObject):
|
||||||
objpath)
|
objpath)
|
||||||
self.manager = manager
|
self.manager = manager
|
||||||
self.is_registering = False
|
self.is_registering = False
|
||||||
|
self.live = False
|
||||||
self._bluez_device = BlueZDevice(self.property('BlueZDevice'))
|
self._bluez_device = BlueZDevice(self.property('BlueZDevice'))
|
||||||
self._bluez_device.connect('notify::connected', self._on_connected)
|
self._bluez_device.connect('notify::connected', self._on_connected)
|
||||||
|
|
||||||
|
@ -244,6 +245,14 @@ class TuhiKeteDevice(_DBusObject):
|
||||||
Gio.dbus_error_get_remote_error(e) != 'org.freedesktop.DBus.Error.ServiceUnknown'):
|
Gio.dbus_error_get_remote_error(e) != 'org.freedesktop.DBus.Error.ServiceUnknown'):
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
def start_live(self, fd):
|
||||||
|
self.proxy.StartLive('(h)', fd)
|
||||||
|
self.live = True
|
||||||
|
|
||||||
|
def stop_live(self):
|
||||||
|
self.proxy.StopLive()
|
||||||
|
self.live = False
|
||||||
|
|
||||||
def json(self, index):
|
def json(self, index):
|
||||||
return self.proxy.GetJSONData('(u)', index)
|
return self.proxy.GetJSONData('(u)', index)
|
||||||
|
|
||||||
|
@ -577,6 +586,38 @@ class Fetcher(Worker):
|
||||||
svg.save()
|
svg.save()
|
||||||
|
|
||||||
|
|
||||||
|
class LiveChanger(Worker):
|
||||||
|
def __init__(self, manager, args):
|
||||||
|
super(LiveChanger, self).__init__(manager)
|
||||||
|
|
||||||
|
self.device = None
|
||||||
|
for d in manager.devices:
|
||||||
|
if d.address == args.address:
|
||||||
|
self.device = d
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
logger.error(f'{args.address}: device not found')
|
||||||
|
# FIXME: this should be an exception
|
||||||
|
return
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
if self.device is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
logger.debug(f'{self.device}: starting live mode')
|
||||||
|
self.device.start_live(0)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
logger.debug(f'{self.device}: stopping live mode')
|
||||||
|
try:
|
||||||
|
self.device.stop_live()
|
||||||
|
except GLib.Error as e:
|
||||||
|
if (e.domain != 'g-dbus-error-quark' or
|
||||||
|
e.code != Gio.IOErrorEnum.EXISTS or
|
||||||
|
Gio.dbus_error_get_remote_error(e) != 'org.freedesktop.DBus.Error.ServiceUnknown'):
|
||||||
|
raise e
|
||||||
|
|
||||||
|
|
||||||
class TuhiKeteShellLogHandler(logging.StreamHandler):
|
class TuhiKeteShellLogHandler(logging.StreamHandler):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(TuhiKeteShellLogHandler, self).__init__(sys.stdout)
|
super(TuhiKeteShellLogHandler, self).__init__(sys.stdout)
|
||||||
|
@ -1055,6 +1096,66 @@ class TuhiKeteShell(cmd.Cmd):
|
||||||
t = time.strftime('%Y-%m-%d at %H:%M', t)
|
t = time.strftime('%Y-%m-%d at %H:%M', t)
|
||||||
print(f'\t\t* {d}: drawn on the {t}')
|
print(f'\t\t* {d}: drawn on the {t}')
|
||||||
|
|
||||||
|
def complete_enable_live(self, text, line, begidx, endidx):
|
||||||
|
# mark the end of the line so we can match on the number of fields
|
||||||
|
if line.endswith(' '):
|
||||||
|
line += 'm'
|
||||||
|
fields = line.split()
|
||||||
|
|
||||||
|
completion = []
|
||||||
|
if len(fields) == 2:
|
||||||
|
for device in self._manager.devices:
|
||||||
|
if device.address.startswith(text.upper()):
|
||||||
|
completion.append(device.address)
|
||||||
|
elif len(fields) == 3:
|
||||||
|
for v in ('on', 'off'):
|
||||||
|
if v.startswith(text.lower()):
|
||||||
|
completion.append(v)
|
||||||
|
return completion
|
||||||
|
|
||||||
|
def do_enable_live(self, args):
|
||||||
|
desc = '''Enable or disable live mode on a particular device'''
|
||||||
|
parser = argparse.ArgumentParser(prog='enable_live',
|
||||||
|
description=desc,
|
||||||
|
add_help=False)
|
||||||
|
parser.add_argument('-h', action='help', help=argparse.SUPPRESS)
|
||||||
|
parser.add_argument('address', metavar='12:34:56:AB:CD:EF',
|
||||||
|
type=TuhiKeteDevice.is_device_address,
|
||||||
|
default=None, nargs='?',
|
||||||
|
help='the address of the device to listen to')
|
||||||
|
parser.add_argument('mode', choices=['on', 'off'], nargs='?',
|
||||||
|
const='on', default='on')
|
||||||
|
|
||||||
|
try:
|
||||||
|
parsed_args = parser.parse_args(args.split())
|
||||||
|
except SystemExit:
|
||||||
|
return
|
||||||
|
|
||||||
|
address = parsed_args.address
|
||||||
|
mode = parsed_args.mode
|
||||||
|
|
||||||
|
for d in self._manager.devices:
|
||||||
|
if d.address == address:
|
||||||
|
if mode == 'on' and d.live:
|
||||||
|
print(f'Live mode already enabled on {address}')
|
||||||
|
return
|
||||||
|
elif mode == 'off' and not d.live:
|
||||||
|
print(f'Live mode not started on {address}')
|
||||||
|
return
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print(f'Device {address} not found')
|
||||||
|
return
|
||||||
|
|
||||||
|
if mode == 'off':
|
||||||
|
for worker in [w for w in self._workers if isinstance(w, LiveChanger)]:
|
||||||
|
if worker.device.address == address:
|
||||||
|
self.terminate_worker(worker)
|
||||||
|
break
|
||||||
|
return
|
||||||
|
|
||||||
|
self.start_worker(LiveChanger, parsed_args)
|
||||||
|
|
||||||
|
|
||||||
def parse(args):
|
def parse(args):
|
||||||
desc = 'Interactive commandline client to the Tuhi DBus daemon'
|
desc = 'Interactive commandline client to the Tuhi DBus daemon'
|
||||||
|
|
Loading…
Reference in New Issue