Skip to content
Merged
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed
- Fix crash when running `pybricksdev run ble -` (bug introduced in alpha.49).

## [1.0.0-alpha.52] - 2024-11-29

### Added
Expand Down
160 changes: 85 additions & 75 deletions poetry.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pybricksdev/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

"""Main entry point for running pybricksdev as a module."""

from .cli import main
from pybricksdev.cli import main

if __name__ == "__main__":
main()
2 changes: 1 addition & 1 deletion pybricksdev/_vendored/pynxt/flash.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import math
from importlib.resources import read_binary

from . import resources
from pybricksdev._vendored.pynxt import resources

# Mnemonics for the addresses of the various registers used by the flash
# controller.
Expand Down
2 changes: 1 addition & 1 deletion pybricksdev/_vendored/pynxt/samba.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import struct

from . import lowlevel
from pybricksdev._vendored.pynxt import lowlevel

ATMEL_VENDOR_ID = 0x03EB
SAMBA_PRODUCT_ID = 0x6124
Expand Down
4 changes: 2 additions & 2 deletions pybricksdev/ble/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from bleak.backends.device import BLEDevice
from bleak.backends.scanner import AdvertisementData

from ..tools import chunk
from .pybricks import PYBRICKS_SERVICE_UUID
from pybricksdev.ble.pybricks import PYBRICKS_SERVICE_UUID
from pybricksdev.tools import chunk

logger = logging.getLogger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion pybricksdev/ble/lwp3/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
communications with devices that provide the LEGO Wireless Protocol v3.
"""

from .bytecodes import Capabilities, HubKind, LastNetwork, Status
from pybricksdev.ble.lwp3.bytecodes import Capabilities, HubKind, LastNetwork, Status

# LEGO Wireless Protocol v3 is defined at:
# https://lego.github.io/lego-ble-wireless-protocol-docs/
Expand Down
2 changes: 1 addition & 1 deletion pybricksdev/ble/lwp3/bootloader.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from enum import IntEnum

from .bytecodes import Capabilities, HubKind, Version
from pybricksdev.ble.lwp3.bytecodes import Capabilities, HubKind, Version

# Bootloader characteristic bytecodes

Expand Down
8 changes: 3 additions & 5 deletions pybricksdev/ble/lwp3/bytecodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -574,8 +574,7 @@ class PortID(IntEnum):
All enum members are dynamic. (0 to 49 are external and 50 - 100 are internal)
"""

# not used - Python requires at least one member
_PLACEHOLDER = -1
names = ()

@property
def internal(self) -> bool:
Expand Down Expand Up @@ -914,8 +913,7 @@ class HwNetExtFamily(IntEnum):
a single byte.
"""

# not used - Python requires at least one member
_PLACEHOLDER = -1
names = ()

@property
def family(self) -> HwNetFamily:
Expand Down Expand Up @@ -1008,7 +1006,7 @@ class IODeviceCapabilities(IntFlag):
Sensor capabilities flags. (48-bit)
"""

pass
names = ()


class DataFormat(IntEnum):
Expand Down
4 changes: 2 additions & 2 deletions pybricksdev/ble/lwp3/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@
from enum import IntEnum
from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Type, Union, overload

from ...tools.checksum import xor_bytes
from .bytecodes import (
from pybricksdev.ble.lwp3.bytecodes import (
MAX_NAME_SIZE,
AlertKind,
AlertOperation,
Expand Down Expand Up @@ -52,6 +51,7 @@
Version,
VirtualPortSetupCommand,
)
from pybricksdev.tools.checksum import xor_bytes


class AbstractMessage(abc.ABC):
Expand Down
8 changes: 4 additions & 4 deletions pybricksdev/ble/oad/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
https://software-dl.ti.com/lprf/sdg-latest/html/oad-ble-stack-3.x/oad_profile.html
"""

from ._common import OADReturn, oad_uuid
from .control_point import OADControlPoint
from .image_block import OADImageBlock
from .image_identify import OADImageIdentify
from pybricksdev.ble.oad._common import OADReturn, oad_uuid
from pybricksdev.ble.oad.control_point import OADControlPoint
from pybricksdev.ble.oad.image_block import OADImageBlock
from pybricksdev.ble.oad.image_identify import OADImageIdentify

__all__ = [
"OAD_SERVICE_UUID",
Expand Down
2 changes: 1 addition & 1 deletion pybricksdev/ble/oad/control_point.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from bleak import BleakClient
from bleak.exc import BleakError

from ._common import OADReturn, SoftwareVersion, oad_uuid
from pybricksdev.ble.oad._common import OADReturn, SoftwareVersion, oad_uuid

__all__ = ["OADControlPoint"]

Expand Down
2 changes: 1 addition & 1 deletion pybricksdev/ble/oad/firmware.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import struct
from typing import NamedTuple

from ._common import ImageInfo, SoftwareVersion
from pybricksdev.ble.oad._common import ImageInfo, SoftwareVersion

# More info at:
# https://github.com/TexasInstruments/simplelink-lowpower-f3-sdk/blob/main/tools/common/oad/oad_image_tool.py
Expand Down
2 changes: 1 addition & 1 deletion pybricksdev/ble/oad/image_block.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from bleak import BleakClient

from ._common import oad_uuid
from pybricksdev.ble.oad._common import oad_uuid

__all__ = ["OADImageBlock"]

Expand Down
2 changes: 1 addition & 1 deletion pybricksdev/ble/oad/image_identify.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from bleak import BleakClient
from bleak.exc import BleakError

from ._common import ImageInfo, OADReturn, SoftwareVersion, oad_uuid
from pybricksdev.ble.oad._common import ImageInfo, OADReturn, SoftwareVersion, oad_uuid

__all__ = ["OADImageIdentify"]

Expand Down
28 changes: 14 additions & 14 deletions pybricksdev/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
import argcomplete
from argcomplete.completers import FilesCompleter

from .. import __name__ as MODULE_NAME
from .. import __version__ as MODULE_VERSION
from pybricksdev import __name__ as MODULE_NAME
from pybricksdev import __version__ as MODULE_VERSION

PROG_NAME = (
f"{path.basename(sys.executable)} -m {MODULE_NAME}"
Expand Down Expand Up @@ -112,7 +112,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
parser.tool = self

async def run(self, args: argparse.Namespace):
from ..compile import compile_multi_file, print_mpy
from pybricksdev.compile import compile_multi_file, print_mpy

with _get_script_path(args.file) as script_path:
mpy = await compile_multi_file(script_path, args.abi)
Expand Down Expand Up @@ -171,10 +171,10 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
)

async def run(self, args: argparse.Namespace):
from ..ble import find_device
from ..connections.ev3dev import EV3Connection
from ..connections.lego import REPLHub
from ..connections.pybricks import PybricksHub
from pybricksdev.ble import find_device
from pybricksdev.connections.ev3dev import EV3Connection
from pybricksdev.connections.lego import REPLHub
from pybricksdev.connections.pybricks import PybricksHub

# Pick the right connection
if args.conntype == "ssh":
Expand Down Expand Up @@ -225,7 +225,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
)

def run(self, args: argparse.Namespace):
from .flash import flash_firmware
from pybricksdev.cli.flash import flash_firmware

return flash_firmware(args.firmware, args.name)

Expand All @@ -242,7 +242,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
).completer = FilesCompleter(allowednames=(".bin",))

async def run(self, args: argparse.Namespace):
from ..dfu import backup_dfu
from pybricksdev.dfu import backup_dfu

backup_dfu(args.firmware)

Expand All @@ -262,7 +262,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
).completer = FilesCompleter(allowednames=(".bin",))

async def run(self, args: argparse.Namespace):
from ..dfu import restore_dfu
from pybricksdev.dfu import restore_dfu

restore_dfu(args.firmware)

Expand Down Expand Up @@ -305,7 +305,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
).completer = FilesCompleter(allowednames=(".oda",))

async def run(self, args: argparse.Namespace):
from .oad import flash_oad_image
from pybricksdev.cli.oad import flash_oad_image

await flash_oad_image(args.firmware)

Expand All @@ -319,7 +319,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
parser.tool = self

async def run(self, args: argparse.Namespace):
from .oad import dump_oad_info
from pybricksdev.cli.oad import dump_oad_info

await dump_oad_info()

Expand Down Expand Up @@ -356,7 +356,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
parser.tool = self

def run(self, args: argparse.Namespace):
from .lwp3.repl import repl, setup_repl_logging
from pybricksdev.cli.lwp3.repl import repl, setup_repl_logging

setup_repl_logging()
return repl()
Expand Down Expand Up @@ -392,7 +392,7 @@ def add_parser(self, subparsers: argparse._SubParsersAction):
async def run(self, args: argparse.Namespace):
from importlib.resources import read_text

from .. import resources
from pybricksdev import resources

print(read_text(resources, resources.UDEV_RULES))

Expand Down
41 changes: 22 additions & 19 deletions pybricksdev/cli/flash.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import hashlib
import json
import logging
import os
import struct
import sys
import zipfile
Expand All @@ -19,23 +20,23 @@
from tqdm.auto import tqdm
from tqdm.contrib.logging import logging_redirect_tqdm

from ..ble.lwp3 import (
from pybricksdev.ble.lwp3 import (
LEGO_CID,
LWP3_BOOTLOADER_SERVICE_UUID,
LWP3_HUB_CHARACTERISTIC_UUID,
LWP3_HUB_SERVICE_UUID,
)
from ..ble.lwp3 import AdvertisementData as HubAdvertisementData
from ..ble.lwp3.bootloader import BootloaderAdvertisementData
from ..ble.lwp3.bytecodes import HubKind, HubProperty
from ..ble.lwp3.messages import (
from pybricksdev.ble.lwp3 import AdvertisementData as HubAdvertisementData
from pybricksdev.ble.lwp3.bootloader import BootloaderAdvertisementData
from pybricksdev.ble.lwp3.bytecodes import HubKind, HubProperty
from pybricksdev.ble.lwp3.messages import (
FirmwareUpdateMessage,
HubPropertyRequestUpdate,
HubPropertyUpdate,
parse_message,
)
from ..ble.nus import NUS_RX_UUID, NUS_TX_UUID
from ..ble.pybricks import (
from pybricksdev.ble.nus import NUS_RX_UUID, NUS_TX_UUID
from pybricksdev.ble.pybricks import (
FW_REV_UUID,
PNP_ID_UUID,
PYBRICKS_COMMAND_EVENT_UUID,
Expand All @@ -44,13 +45,13 @@
Command,
unpack_pnp_id,
)
from ..compile import compile_file
from ..connections.lego import REPLHub
from ..dfu import flash_dfu
from ..firmware import create_firmware_blob
from ..flash import BootloaderConnection
from ..tools import chunk
from ..tools.checksum import xor_bytes
from pybricksdev.compile import compile_file
from pybricksdev.connections.lego import REPLHub
from pybricksdev.dfu import flash_dfu
from pybricksdev.firmware import create_firmware_blob
from pybricksdev.flash import BootloaderConnection
from pybricksdev.tools import chunk
from pybricksdev.tools.checksum import xor_bytes

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -117,7 +118,9 @@ async def download_and_run(client: BleakClient, script: str, abi: int) -> None:
# file has to be closed so mpy-cross can open it
temp.file.close()

mpy = await compile_file(temp.name, abi)
mpy = await compile_file(
os.path.dirname(temp.name), os.path.basename(temp.name), abi
)

recv_queue = asyncio.Queue()

Expand Down Expand Up @@ -335,9 +338,9 @@ async def flash_nxt(firmware: bytes) -> None:
firmware:
A firmware blob with the NxOS header appended to the end.
"""
from .._vendored.pynxt.firmware import Firmware
from .._vendored.pynxt.flash import FlashController
from .._vendored.pynxt.samba import SambaBrick, SambaOpenError
from pybricksdev._vendored.pynxt.firmware import Firmware
from pybricksdev._vendored.pynxt.flash import FlashController
from pybricksdev._vendored.pynxt.samba import SambaBrick, SambaOpenError

# parse the header
info = Firmware(firmware)
Expand Down Expand Up @@ -375,7 +378,7 @@ async def flash_ev3(firmware: bytes) -> None:
firmware:
A firmware blob.
"""
from ..connections.ev3 import EV3Bootloader
from pybricksdev.connections.ev3 import EV3Bootloader

# TODO: nice error message and exit(1) if EV3 is not found
with EV3Bootloader() as bootloader:
Expand Down
6 changes: 3 additions & 3 deletions pybricksdev/cli/lwp3/repl.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
from prompt_toolkit.history import FileHistory
from prompt_toolkit.patch_stdout import StdoutProxy, patch_stdout

from ...ble.lwp3 import (
from pybricksdev.ble.lwp3 import (
LEGO_CID,
LWP3_HUB_CHARACTERISTIC_UUID,
LWP3_HUB_SERVICE_UUID,
bytecodes,
messages,
)
from ...ble.lwp3.bytecodes import Capabilities, HubKind, LastNetwork, Status
from ...ble.lwp3.messages import AbstractMessage, parse_message
from pybricksdev.ble.lwp3.bytecodes import Capabilities, HubKind, LastNetwork, Status
from pybricksdev.ble.lwp3.messages import AbstractMessage, parse_message

logger = logging.getLogger(__name__)
history_file = Path(user_cache_dir("pybricksdev"), "lwp3-explorer-history.txt")
Expand Down
13 changes: 9 additions & 4 deletions pybricksdev/cli/oad.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,18 @@
from tqdm.auto import tqdm
from tqdm.contrib.logging import logging_redirect_tqdm

from ..ble.lwp3 import LEGO_CID, LWP3_HUB_SERVICE_UUID, HubKind
from ..ble.oad import OADControlPoint, OADImageBlock, OADImageIdentify, OADReturn
from ..ble.oad.control_point import (
from pybricksdev.ble.lwp3 import LEGO_CID, LWP3_HUB_SERVICE_UUID, HubKind
from pybricksdev.ble.oad import (
OADControlPoint,
OADImageBlock,
OADImageIdentify,
OADReturn,
)
from pybricksdev.ble.oad.control_point import (
OAD_LEGO_MARIO_DEVICE_TYPE,
OAD_LEGO_TECHNIC_MOVE_DEVICE_TYPE,
)
from ..ble.oad.firmware import parse_oad_header
from pybricksdev.ble.oad.firmware import parse_oad_header

__all__ = ["dump_oad_info", "flash_oad_image"]

Expand Down
Loading