|
|
@ -45,8 +45,9 @@ class Plugins(DaemonThread): |
|
|
|
self.plugins = {} |
|
|
|
self.gui_name = gui_name |
|
|
|
self.descriptions = {} |
|
|
|
self.device_manager = DeviceMgr() |
|
|
|
self.device_manager = DeviceMgr(config) |
|
|
|
self.load_plugins() |
|
|
|
self.add_jobs(self.device_manager.thread_jobs()) |
|
|
|
self.start() |
|
|
|
|
|
|
|
def load_plugins(self): |
|
|
@ -247,7 +248,7 @@ class DeviceUnpairableError(Exception): |
|
|
|
Device = namedtuple("Device", "path interface_number id_ product_key") |
|
|
|
DeviceInfo = namedtuple("DeviceInfo", "device description initialized") |
|
|
|
|
|
|
|
class DeviceMgr(PrintError): |
|
|
|
class DeviceMgr(ThreadJob, PrintError): |
|
|
|
'''Manages hardware clients. A client communicates over a hardware |
|
|
|
channel with the device. |
|
|
|
|
|
|
@ -276,11 +277,9 @@ class DeviceMgr(PrintError): |
|
|
|
the HID IDs. |
|
|
|
|
|
|
|
This plugin is thread-safe. Currently only devices supported by |
|
|
|
hidapi are implemented. |
|
|
|
hidapi are implemented.''' |
|
|
|
|
|
|
|
''' |
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
def __init__(self, config): |
|
|
|
super(DeviceMgr, self).__init__() |
|
|
|
# Keyed by wallet. The value is the device id if the wallet |
|
|
|
# has been paired, and None otherwise. |
|
|
@ -293,6 +292,20 @@ class DeviceMgr(PrintError): |
|
|
|
self.recognised_hardware = set() |
|
|
|
# For synchronization |
|
|
|
self.lock = threading.RLock() |
|
|
|
self.config = config |
|
|
|
|
|
|
|
def thread_jobs(self): |
|
|
|
# Thread job to handle device timeouts |
|
|
|
return [self] |
|
|
|
|
|
|
|
def run(self): |
|
|
|
'''Handle device timeouts. Runs in the context of the Plugins |
|
|
|
thread.''' |
|
|
|
with self.lock: |
|
|
|
clients = list(self.clients.keys()) |
|
|
|
cutoff = time.time() - self.config.get_session_timeout() |
|
|
|
for client in clients: |
|
|
|
client.timeout(cutoff) |
|
|
|
|
|
|
|
def register_devices(self, device_pairs): |
|
|
|
for pair in device_pairs: |
|
|
@ -343,9 +356,6 @@ class DeviceMgr(PrintError): |
|
|
|
self.wallets[wallet] = id_ |
|
|
|
wallet.paired() |
|
|
|
|
|
|
|
def paired_wallets(self): |
|
|
|
return list(self.wallets.keys()) |
|
|
|
|
|
|
|
def client_lookup(self, id_): |
|
|
|
with self.lock: |
|
|
|
for client, (path, client_id) in self.clients.items(): |
|
|
|