Add the signals to expose the device over Tuhi's DBus interface

bus_own_name is asynchronous, so we first need to send a signal back and then
we can start connecting to the devices. Otherwise we'll have to implement a
queue which would be a lot harder than just waiting.
This commit is contained in:
Peter Hutterer 2018-01-12 20:18:26 +10:00
parent 8e907ba81a
commit 4aca12b6e7
2 changed files with 36 additions and 12 deletions

14
tuhi.py
View File

@ -26,21 +26,31 @@ WACOM_COMPANY_ID = 0x4755
class Tuhi(GObject.Object): class Tuhi(GObject.Object):
__gsignals__ = {
"device-added":
(GObject.SIGNAL_RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)),
}
def __init__(self): def __init__(self):
self.server = TuhiDBusServer() GObject.Object.__init__(self)
self.server = TuhiDBusServer(self)
self.server.connect('bus-name-owned', self._on_bus_name_owned)
self.bluez = BlueZDeviceManager() self.bluez = BlueZDeviceManager()
self.bluez.connect('device-added', self._on_device_added) self.bluez.connect('device-added', self._on_device_added)
self.bluez.connect_to_bluez()
self.drawings = [] self.drawings = []
def _on_bus_name_owned(self, dbus_server):
self.bluez.connect_to_bluez()
def _on_device_added(self, manager, device): def _on_device_added(self, manager, device):
if device.vendor_id != WACOM_COMPANY_ID: if device.vendor_id != WACOM_COMPANY_ID:
return return
device.connect('connected', self._on_device_connected) device.connect('connected', self._on_device_connected)
device.connect_device() device.connect_device()
self.emit('device-added', device)
def _on_device_connected(self, device): def _on_device_connected(self, device):
logger.debug('{}: connected'.format(device.address)) logger.debug('{}: connected'.format(device.address))

View File

@ -80,17 +80,20 @@ class TuhiDrawing(object):
return json.dumps(json_data) return json.dumps(json_data)
class TuhiDBusDevice(object): class TuhiDBusDevice(GObject.Object):
""" """
Class representing a DBus object for a Tuhi device. This class only Class representing a DBus object for a Tuhi device. This class only
handles the DBus bits, communication with the device is done elsewhere. handles the DBus bits, communication with the device is done elsewhere.
""" """
def __init__(self, btaddr, connection): def __init__(self, device, connection):
self.name = 'UNKNOWN' GObject.Object.__init__(self)
self.btaddr = btaddr
self.name = device.name
self.btaddr = device.address
self.width, self.height = 0, 0 self.width, self.height = 0, 0
self.drawings = [] self.drawings = []
self.objpath = "{}/{}".format(BASE_PATH, btaddr) objpath = device.address.replace(':', '_')
self.objpath = "{}/{}".format(BASE_PATH, objpath)
self._register_object(connection) self._register_object(connection)
@ -144,17 +147,25 @@ class TuhiDBusDevice(object):
return self.drawings[index].json() return self.drawings[index].json()
class TuhiDBusServer(object): class TuhiDBusServer(GObject.Object):
""" """
Class for the DBus server. Class for the DBus server.
""" """
def __init__(self): __gsignals__ = {
"bus-name-owned":
(GObject.SIGNAL_RUN_FIRST, None, ()),
}
def __init__(self, tuhi):
GObject.Object.__init__(self)
self._devices = []
self._dbus = Gio.bus_own_name(Gio.BusType.SESSION, self._dbus = Gio.bus_own_name(Gio.BusType.SESSION,
BUS_NAME, BUS_NAME,
Gio.BusNameOwnerFlags.NONE, Gio.BusNameOwnerFlags.NONE,
self._bus_aquired, self._bus_aquired,
self._bus_name_aquired, self._bus_name_aquired,
self._bus_name_lost) self._bus_name_lost)
tuhi.connect('device-added', self._on_device_added)
def _bus_aquired(self, connection, name): def _bus_aquired(self, connection, name):
introspection = Gio.DBusNodeInfo.new_for_xml(INTROSPECTION_XML) introspection = Gio.DBusNodeInfo.new_for_xml(INTROSPECTION_XML)
@ -165,9 +176,8 @@ class TuhiDBusServer(object):
self._method_cb, self._method_cb,
self._property_read_cb, self._property_read_cb,
self._property_write_cb) self._property_write_cb)
self._connection = connection
# FIXME this shold be using the btaddr self.emit('bus-name-owned')
self._devices = [TuhiDBusDevice(0, connection)]
def _bus_name_aquired(self, connection, name): def _bus_name_aquired(self, connection, name):
pass pass
@ -193,6 +203,10 @@ class TuhiDBusServer(object):
def cleanup(self): def cleanup(self):
Gio.bus_unown_name(self._dbus) Gio.bus_unown_name(self._dbus)
def _on_device_added(self, tuhi, device):
dev = TuhiDBusDevice(device, self._connection)
self._devices.append(dev)
def main(args): def main(args):
t = TuhiDBusServer() t = TuhiDBusServer()