From cf68ebc9ce289d1a155704c81a79f8451459b8f8 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 15 Jan 2018 14:25:16 +1000 Subject: [PATCH] tuhi: create a TuhiDevice as glue object between front and backends --- tuhi.py | 81 ++++++++++++++++++++++++++++------------------ tuhi/dbusserver.py | 6 ++-- 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/tuhi.py b/tuhi.py index a9eaacd..669a3a3 100755 --- a/tuhi.py +++ b/tuhi.py @@ -25,54 +25,71 @@ logger = logging.getLogger('tuhi') WACOM_COMPANY_ID = 0x4755 +class TuhiDevice(GObject.Object): + """ + Glue object to combine the backend bluez DBus object (that talks to the + real device) with the frontend DBusServer object that exports the device + over Tuhi's DBus interface + """ + __gsignals__ = { + "drawings-updated": + (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)), + } + + def __init__(self, bluez_device, tuhi_dbus_device): + GObject.Object.__init__(self) + self._tuhi_dbus_device = tuhi_dbus_device + self._wacom_device = WacomDevice(bluez_device) + self._wacom_device.connect('drawing', self._on_drawing_received) + self.drawings = [] + + bluez_device.connect('connected', self._on_bluez_device_connected) + bluez_device.connect('disconnected', self._on_bluez_device_disconnected) + bluez_device.connect_device() + + def _on_bluez_device_connected(self, bluez_device): + logger.debug('{}: connected'.format(bluez_device.address)) + self._wacom_device.start() + + def _on_bluez_device_disconnected(self, bluez_device): + # FIXME: immediately try to reconnect, at least until the DBusServer + # is hooked up correctly + logger.debug('{}: disconnected'.format(bluez_device.address)) + bluez_device.connect_device() + + def _on_drawing_received(self, device, drawing): + logger.debug('Drawing received') + self.drawings.append(drawing) + self.emit('drawings-updated', self.drawings) + + class Tuhi(GObject.Object): __gsignals__ = { "device-added": (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)), + "device-connected": + (GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)), } def __init__(self): GObject.Object.__init__(self) - self.server = TuhiDBusServer(self) - self.server.connect('bus-name-acquired', self._on_bus_name_acquired) + self.server = TuhiDBusServer() + self.server.connect('bus-name-acquired', self._on_tuhi_bus_name_acquired) self.bluez = BlueZDeviceManager() - - self.bluez.connect('device-added', self._on_device_added) + self.bluez.connect('device-added', self._on_bluez_device_added) self.devices = {} - self.drawings = [] - def _on_bus_name_acquired(self, dbus_server): + def _on_tuhi_bus_name_acquired(self, dbus_server): self.bluez.connect_to_bluez() - def _on_device_added(self, manager, device): - if device.vendor_id != WACOM_COMPANY_ID: + def _on_bluez_device_added(self, manager, bluez_device): + if bluez_device.vendor_id != WACOM_COMPANY_ID: return - d = WacomDevice(device) - d.connect('drawing', self._on_drawing_received) - self.devices[device.address] = d - - device.connect('connected', self._on_device_connected) - device.connect('disconnected', self._on_device_disconnected) - device.connect_device() - self.emit('device-added', device) - - def _on_device_connected(self, device): - logger.debug('{}: connected'.format(device.address)) - - d = self.devices[device.address] - d.start() - - def _on_device_disconnected(self, device): - # FIXME: immediately try to reconnect, at least until the DBusServer - # is hooked up correctly - logger.debug('{}: disconnected'.format(device.address)) - device.connect_device() - - def _on_drawing_received(self, device, drawing): - logger.debug('Drawing received') - self.drawings.append(drawing) + tuhi_dbus_device = self.server.create_device(bluez_device) + d = TuhiDevice(bluez_device, tuhi_dbus_device) + self.devices[bluez_device.address] = d def main(args): diff --git a/tuhi/dbusserver.py b/tuhi/dbusserver.py index 9dcb7b8..44c481f 100755 --- a/tuhi/dbusserver.py +++ b/tuhi/dbusserver.py @@ -160,7 +160,7 @@ class TuhiDBusServer(GObject.Object): (GObject.SIGNAL_RUN_FIRST, None, ()), } - def __init__(self, tuhi): + def __init__(self): GObject.Object.__init__(self) self._devices = [] self._dbus = Gio.bus_own_name(Gio.BusType.SESSION, @@ -169,7 +169,6 @@ class TuhiDBusServer(GObject.Object): self._bus_aquired, self._bus_name_aquired, self._bus_name_lost) - tuhi.connect('device-added', self._on_device_added) def _bus_aquired(self, connection, name): introspection = Gio.DBusNodeInfo.new_for_xml(INTROSPECTION_XML) @@ -207,6 +206,7 @@ class TuhiDBusServer(GObject.Object): def cleanup(self): Gio.bus_unown_name(self._dbus) - def _on_device_added(self, tuhi, device): + def create_device(self, device): dev = TuhiDBusDevice(device, self._connection) self._devices.append(dev) + return dev