From 3eca8da2514d1750115e4dcdea3ef5a2c1dd3cb9 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Tue, 13 Feb 2018 20:01:56 +0100 Subject: [PATCH] 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 --- tools/kete.py | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/tools/kete.py b/tools/kete.py index a769b4b..2ba0011 100755 --- a/tools/kete.py +++ b/tools/kete.py @@ -184,6 +184,7 @@ class TuhiKeteDevice(_DBusObject): objpath) self.manager = manager self.is_registering = False + self.live = False self._bluez_device = BlueZDevice(self.property('BlueZDevice')) 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'): 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): return self.proxy.GetJSONData('(u)', index) @@ -577,6 +586,38 @@ class Fetcher(Worker): 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): def __init__(self): super(TuhiKeteShellLogHandler, self).__init__(sys.stdout) @@ -1055,6 +1096,66 @@ class TuhiKeteShell(cmd.Cmd): t = time.strftime('%Y-%m-%d at %H:%M', 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): desc = 'Interactive commandline client to the Tuhi DBus daemon'