client.py 1004 B

123456789101112131415161718192021222324252627282930313233343536
  1. # Copyright 2022 QMK
  2. # SPDX-License-Identifier: GPL-2.0-or-later
  3. import hid
  4. class XAPClient:
  5. """XAP device discovery
  6. """
  7. @staticmethod
  8. def devices(search: str = None) -> list[dict]:
  9. """Find compatible XAP devices
  10. Args:
  11. search: optional search string to filter results by
  12. """
  13. def _is_xap_usage(x):
  14. return x['usage_page'] == 0xFF51 and x['usage'] == 0x0058
  15. def _is_filtered_device(x):
  16. name = '%04x:%04x' % (x['vendor_id'], x['product_id'])
  17. return name.lower().startswith(search.lower())
  18. devices = filter(_is_xap_usage, hid.enumerate())
  19. if search:
  20. devices = filter(_is_filtered_device, devices)
  21. return list(devices)
  22. def connect(self, device: dict):
  23. """Connect to a given XAP device
  24. Args:
  25. device: item from a previous `XAPClient.devices()` call
  26. """
  27. from .device import XAPDevice
  28. return XAPDevice(device)