Skip to content

Commit ac67149

Browse files
dlechnkarstens
andcommitted
pybricksdev.usb: add Pybricks USB device class/subclass/protocol
This adds constants for the Pybricks USB device class, subclass and protocol. These are used to identify hubs running the Pybricks firmware when connected via USB. The `usb` command of the CLI is modified to only accept Pybricks hubs now. If we still want to support running programs on hubs running official LEGO firmware, we can add that back with a different command name. Co-authored-by: Nate Karstens <[email protected]>
1 parent c06d239 commit ac67149

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

pybricksdev/cli/__init__.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@
2020

2121
from .. import __name__ as MODULE_NAME
2222
from .. import __version__ as MODULE_VERSION
23+
from ..usb import (
24+
LEGO_USB_VID,
25+
PYBRICKS_USB_DEVICE_CLASS,
26+
PYBRICKS_USB_DEVICE_PROTOCOL,
27+
PYBRICKS_USB_DEVICE_SUBCLASS,
28+
)
2329

2430
PROG_NAME = (
2531
f"{path.basename(sys.executable)} -m {MODULE_NAME}"
@@ -171,9 +177,10 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
171177
)
172178

173179
async def run(self, args: argparse.Namespace):
180+
from usb.core import find as find_usb
181+
174182
from ..ble import find_device as find_ble
175183
from ..connections.ev3dev import EV3Connection
176-
from ..connections.lego import REPLHub
177184
from ..connections.pybricks import PybricksHub
178185

179186
# Pick the right connection
@@ -192,8 +199,17 @@ async def run(self, args: argparse.Namespace):
192199
device_or_address = await find_ble(args.name)
193200

194201
elif args.conntype == "usb":
195-
hub = REPLHub()
196-
device_or_address = None
202+
hub = PybricksHub()
203+
device_or_address = find_usb(
204+
idVendor=LEGO_USB_VID,
205+
bDeviceClass=PYBRICKS_USB_DEVICE_CLASS,
206+
bDeviceSubClass=PYBRICKS_USB_DEVICE_SUBCLASS,
207+
bDeviceProtocol=PYBRICKS_USB_DEVICE_PROTOCOL,
208+
)
209+
if device_or_address is None:
210+
print("No Pybricks USB device found.", file=sys.stderr)
211+
exit(1)
212+
197213
else:
198214
raise ValueError(f"Unknown connection type: {args.conntype}")
199215

pybricksdev/usb/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,8 @@ class LegoUsbPid(_enum.IntEnum):
2121
SPIKE_ESSENTIAL = 0x000D
2222
ROBOT_INVENTOR = 0x0010
2323
ROBOT_INVENTOR_DFU = 0x0011
24+
25+
26+
PYBRICKS_USB_DEVICE_CLASS = 0xFF
27+
PYBRICKS_USB_DEVICE_SUBCLASS = 0xC5
28+
PYBRICKS_USB_DEVICE_PROTOCOL = 0xF5

0 commit comments

Comments
 (0)