91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
# SPDX-FileCopyrightText: 2017 Scott Shawcroft for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
"""
|
|
`adafruit_hid`
|
|
====================================================
|
|
|
|
This driver simulates USB HID devices.
|
|
|
|
* Author(s): Scott Shawcroft, Dan Halbert
|
|
|
|
Implementation Notes
|
|
--------------------
|
|
**Software and Dependencies:**
|
|
* Adafruit CircuitPython firmware for the supported boards:
|
|
https://github.com/adafruit/circuitpython/releases
|
|
"""
|
|
|
|
# imports
|
|
from __future__ import annotations
|
|
import time
|
|
|
|
try:
|
|
import supervisor
|
|
except ImportError:
|
|
supervisor = None
|
|
|
|
try:
|
|
from typing import Sequence
|
|
except ImportError:
|
|
pass
|
|
|
|
# usb_hid may not exist on some boards that still provide BLE or other HID devices.
|
|
try:
|
|
from usb_hid import Device
|
|
except ImportError:
|
|
Device = None
|
|
|
|
__version__ = "6.1.1"
|
|
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_HID.git"
|
|
|
|
|
|
def find_device(
|
|
devices: Sequence[object],
|
|
*,
|
|
usage_page: int,
|
|
usage: int,
|
|
timeout: int = None,
|
|
) -> object:
|
|
"""Search through the provided sequence of devices to find the one with the matching
|
|
usage_page and usage.
|
|
|
|
:param timeout: Time in seconds to wait for USB to become ready before timing out.
|
|
Defaults to None to wait indefinitely.
|
|
Ignored if device is not a `usb_hid.Device`; it might be BLE, for instance."""
|
|
|
|
if hasattr(devices, "send_report"):
|
|
devices = [devices] # type: ignore
|
|
device = None
|
|
for dev in devices:
|
|
if (
|
|
dev.usage_page == usage_page
|
|
and dev.usage == usage
|
|
and hasattr(dev, "send_report")
|
|
):
|
|
device = dev
|
|
break
|
|
if device is None:
|
|
raise ValueError("Could not find matching HID device.")
|
|
|
|
# Wait for USB to be connected only if this is a usb_hid.Device.
|
|
if Device and isinstance(device, Device):
|
|
if supervisor is None:
|
|
# Blinka doesn't have supervisor (see issue Adafruit_Blinka#711), so wait
|
|
# one second for USB to become ready
|
|
time.sleep(1.0)
|
|
elif timeout is None:
|
|
# default behavior: wait indefinitely for USB to become ready
|
|
while not supervisor.runtime.usb_connected:
|
|
time.sleep(1.0)
|
|
else:
|
|
# wait up to timeout seconds for USB to become ready
|
|
for _ in range(timeout):
|
|
if supervisor.runtime.usb_connected:
|
|
return device
|
|
time.sleep(1.0)
|
|
raise OSError("Failed to initialize HID device. Is USB connected?")
|
|
|
|
return device
|