Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions dbus_service/dbus-service
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ class Device(dbus.service.Object):
logging.debug('In Resume')
tls.reset()
try:
init.open_common()
init.reopen()
except:
init.open_common()
init.reopen()

@dbus.service.method(dbus_interface=INTERFACE_NAME, in_signature="s", out_signature="as")
def ListEnrolledFingers(self, user):
Expand Down
5 changes: 5 additions & 0 deletions validitysensor/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,8 @@ def open():
def open_devpath(busnum: int, address: int):
usb.open_devpath(busnum, address)
open_common()


def reopen():
usb.reopen()
open_common()
54 changes: 54 additions & 0 deletions validitysensor/usb.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,26 @@ def __init__(self):
self.trace_enabled = False
self.dev: typing.Optional[ucore.Device] = None
self.cancel = False
self.identity = None
self.reopen_strict = False

@staticmethod
def device_identity(dev: ucore.Device):
try:
bus = dev.bus
except Exception:
bus = None

try:
ports = tuple(dev.port_numbers or ())
except Exception:
ports = ()

return dev.idVendor, dev.idProduct, bus, ports

def open(self, vendor=None, product=None):
self.reopen_strict = False

if vendor is not None and product is not None:
dev = ucore.find(idVendor=vendor, idProduct=product)
else:
Expand All @@ -50,18 +68,54 @@ def match(d):
self.open_dev(dev)

def open_devpath(self, busnum: int, address: int):
self.reopen_strict = True

def match(d):
return d.bus == busnum and d.address == address

dev = ucore.find(custom_match=match)

self.open_dev(dev)

def reopen(self):
if self.identity is None:
if self.reopen_strict:
raise Exception('Cannot safely reopen explicitly selected device without USB identity')
self.open()
return

vendor, product, bus, ports = self.identity

if bus is not None and ports:
def match(d):
if d.idVendor != vendor or d.idProduct != product:
return False
if d.bus != bus:
return False
try:
return tuple(d.port_numbers or ()) == ports
except Exception:
return False

dev = ucore.find(custom_match=match)

if dev is None:
raise Exception('Previously opened fingerprint device not found at the same USB topology')

self.open_dev(dev)
return

if self.reopen_strict:
raise Exception('Cannot safely reopen explicitly selected device without USB topology')

self.open(vendor, product)

def open_dev(self, dev: ucore.Device):
if dev is None:
raise Exception('No matching devices found')

self.dev = dev
self.identity = self.device_identity(dev)
self.dev.default_timeout = 15000
dev.set_configuration()

Expand Down