mpflash 1.0.1__py3-none-any.whl → 1.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mpflash/add_firmware.py +98 -98
- mpflash/ask_input.py +236 -236
- mpflash/basicgit.py +284 -284
- mpflash/bootloader/__init__.py +2 -2
- mpflash/bootloader/activate.py +60 -60
- mpflash/bootloader/detect.py +82 -82
- mpflash/bootloader/manual.py +101 -101
- mpflash/bootloader/micropython.py +12 -12
- mpflash/bootloader/touch1200.py +36 -36
- mpflash/cli_download.py +129 -129
- mpflash/cli_flash.py +224 -216
- mpflash/cli_group.py +111 -111
- mpflash/cli_list.py +87 -87
- mpflash/cli_main.py +39 -39
- mpflash/common.py +210 -177
- mpflash/config.py +44 -44
- mpflash/connected.py +104 -77
- mpflash/download.py +364 -364
- mpflash/downloaded.py +130 -130
- mpflash/errors.py +9 -9
- mpflash/flash/__init__.py +55 -55
- mpflash/flash/esp.py +59 -59
- mpflash/flash/stm32.py +19 -19
- mpflash/flash/stm32_dfu.py +104 -104
- mpflash/flash/uf2/__init__.py +88 -88
- mpflash/flash/uf2/boardid.py +15 -15
- mpflash/flash/uf2/linux.py +136 -130
- mpflash/flash/uf2/macos.py +42 -42
- mpflash/flash/uf2/uf2disk.py +12 -12
- mpflash/flash/uf2/windows.py +43 -43
- mpflash/flash/worklist.py +170 -170
- mpflash/list.py +106 -106
- mpflash/logger.py +41 -41
- mpflash/mpboard_id/__init__.py +93 -93
- mpflash/mpboard_id/add_boards.py +251 -251
- mpflash/mpboard_id/board.py +37 -37
- mpflash/mpboard_id/board_id.py +86 -86
- mpflash/mpboard_id/store.py +43 -43
- mpflash/mpremoteboard/__init__.py +266 -266
- mpflash/mpremoteboard/mpy_fw_info.py +141 -141
- mpflash/mpremoteboard/runner.py +140 -140
- mpflash/vendor/click_aliases.py +91 -91
- mpflash/vendor/dfu.py +165 -165
- mpflash/vendor/pydfu.py +605 -605
- mpflash/vendor/readme.md +2 -2
- mpflash/versions.py +135 -135
- {mpflash-1.0.1.dist-info → mpflash-1.0.2.dist-info}/LICENSE +20 -20
- {mpflash-1.0.1.dist-info → mpflash-1.0.2.dist-info}/METADATA +1 -1
- mpflash-1.0.2.dist-info/RECORD +53 -0
- mpflash-1.0.1.dist-info/RECORD +0 -53
- {mpflash-1.0.1.dist-info → mpflash-1.0.2.dist-info}/WHEEL +0 -0
- {mpflash-1.0.1.dist-info → mpflash-1.0.2.dist-info}/entry_points.txt +0 -0
mpflash/config.py
CHANGED
@@ -1,44 +1,44 @@
|
|
1
|
-
"""centralized configuration for mpflash"""
|
2
|
-
|
3
|
-
import os
|
4
|
-
from importlib.metadata import version
|
5
|
-
from pathlib import Path
|
6
|
-
from typing import List
|
7
|
-
|
8
|
-
import platformdirs
|
9
|
-
|
10
|
-
from mpflash.logger import log
|
11
|
-
|
12
|
-
|
13
|
-
def get_version():
|
14
|
-
name = __package__ or "mpflash"
|
15
|
-
return version(name)
|
16
|
-
|
17
|
-
|
18
|
-
class MPtoolConfig:
|
19
|
-
"""Centralized configuration for mpflash"""
|
20
|
-
|
21
|
-
quiet: bool = False
|
22
|
-
verbose: bool = False
|
23
|
-
usb: bool = False
|
24
|
-
ignore_ports: List[str] = []
|
25
|
-
firmware_folder: Path = platformdirs.user_downloads_path() / "firmware"
|
26
|
-
# test options specified on the commandline
|
27
|
-
tests: List[str] = []
|
28
|
-
_interactive: bool = True
|
29
|
-
|
30
|
-
@property
|
31
|
-
def interactive(self):
|
32
|
-
# No interactions in CI
|
33
|
-
if os.getenv("GITHUB_ACTIONS") == "true":
|
34
|
-
log.warning("Disabling interactive mode in CI")
|
35
|
-
return False
|
36
|
-
return self._interactive
|
37
|
-
|
38
|
-
@interactive.setter
|
39
|
-
def interactive(self, value: bool):
|
40
|
-
self._interactive = value
|
41
|
-
|
42
|
-
|
43
|
-
config = MPtoolConfig()
|
44
|
-
__version__ = get_version()
|
1
|
+
"""centralized configuration for mpflash"""
|
2
|
+
|
3
|
+
import os
|
4
|
+
from importlib.metadata import version
|
5
|
+
from pathlib import Path
|
6
|
+
from typing import List
|
7
|
+
|
8
|
+
import platformdirs
|
9
|
+
|
10
|
+
from mpflash.logger import log
|
11
|
+
|
12
|
+
|
13
|
+
def get_version():
|
14
|
+
name = __package__ or "mpflash"
|
15
|
+
return version(name)
|
16
|
+
|
17
|
+
|
18
|
+
class MPtoolConfig:
|
19
|
+
"""Centralized configuration for mpflash"""
|
20
|
+
|
21
|
+
quiet: bool = False
|
22
|
+
verbose: bool = False
|
23
|
+
usb: bool = False
|
24
|
+
ignore_ports: List[str] = []
|
25
|
+
firmware_folder: Path = platformdirs.user_downloads_path() / "firmware"
|
26
|
+
# test options specified on the commandline
|
27
|
+
tests: List[str] = []
|
28
|
+
_interactive: bool = True
|
29
|
+
|
30
|
+
@property
|
31
|
+
def interactive(self):
|
32
|
+
# No interactions in CI
|
33
|
+
if os.getenv("GITHUB_ACTIONS") == "true":
|
34
|
+
log.warning("Disabling interactive mode in CI")
|
35
|
+
return False
|
36
|
+
return self._interactive
|
37
|
+
|
38
|
+
@interactive.setter
|
39
|
+
def interactive(self, value: bool):
|
40
|
+
self._interactive = value
|
41
|
+
|
42
|
+
|
43
|
+
config = MPtoolConfig()
|
44
|
+
__version__ = get_version()
|
mpflash/connected.py
CHANGED
@@ -1,77 +1,104 @@
|
|
1
|
-
from typing import List, Tuple
|
2
|
-
|
3
|
-
from rich import print
|
4
|
-
from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn, TimeElapsedColumn
|
5
|
-
from rich.table import Column
|
6
|
-
|
7
|
-
from mpflash.common import filtered_comports
|
8
|
-
from mpflash.mpremoteboard import MPRemoteBoard
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
1
|
+
from typing import List, Tuple
|
2
|
+
|
3
|
+
from rich import print
|
4
|
+
from rich.progress import BarColumn, Progress, SpinnerColumn, TextColumn, TimeElapsedColumn
|
5
|
+
from rich.table import Column
|
6
|
+
|
7
|
+
from mpflash.common import filtered_comports
|
8
|
+
from mpflash.mpremoteboard import MPRemoteBoard
|
9
|
+
|
10
|
+
import os
|
11
|
+
|
12
|
+
if os.name == "linux":
|
13
|
+
from mpflash.common import find_serial_by_path # type: ignore
|
14
|
+
else:
|
15
|
+
|
16
|
+
def find_serial_by_path(path: str) -> str:
|
17
|
+
# log.warning(f"find_serial_by_path not implemented for {os.name}")
|
18
|
+
return path
|
19
|
+
|
20
|
+
|
21
|
+
def connected_ports_boards(
|
22
|
+
*, include: List[str], ignore: List[str], bluetooth: bool = False
|
23
|
+
) -> Tuple[List[str], List[str], List[MPRemoteBoard]]:
|
24
|
+
"""
|
25
|
+
Returns a tuple containing lists of unique ports and boards from the connected MCUs.
|
26
|
+
Boards that are physically connected, but give no tangible response are ignored.
|
27
|
+
|
28
|
+
Returns:
|
29
|
+
A tuple containing three lists:
|
30
|
+
- A list of unique ports where MCUs are connected.
|
31
|
+
- A list of unique board names of the connected MCUs.
|
32
|
+
- A list of MPRemoteBoard instances of the connected MCUs.
|
33
|
+
"""
|
34
|
+
conn_mcus = [
|
35
|
+
b for b in list_mcus(include=include, ignore=ignore, bluetooth=bluetooth) if b.connected
|
36
|
+
]
|
37
|
+
# ignore boards that have the [micropython-stubber] ignore flag set
|
38
|
+
conn_mcus = [
|
39
|
+
item for item in conn_mcus if not (item.toml.get("mpflash", {}).get("ignore", False))
|
40
|
+
]
|
41
|
+
|
42
|
+
ports = list({b.port for b in conn_mcus})
|
43
|
+
boards = list({b.board for b in conn_mcus})
|
44
|
+
return (ports, boards, conn_mcus)
|
45
|
+
|
46
|
+
|
47
|
+
# #########################################################################################################
|
48
|
+
rp_spinner = SpinnerColumn(finished_text="✅")
|
49
|
+
rp_text = TextColumn("{task.description} {task.fields[device]}", table_column=Column())
|
50
|
+
rp_bar = BarColumn(bar_width=None, table_column=Column())
|
51
|
+
|
52
|
+
|
53
|
+
def list_mcus(
|
54
|
+
*, ignore: List[str], include: List[str], bluetooth: bool = False
|
55
|
+
) -> List[MPRemoteBoard]:
|
56
|
+
"""
|
57
|
+
Retrieves information about connected microcontroller boards.
|
58
|
+
|
59
|
+
Returns:
|
60
|
+
List[MPRemoteBoard]: A list of MPRemoteBoard instances with board information.
|
61
|
+
Raises:
|
62
|
+
ConnectionError: If there is an error connecting to a board.
|
63
|
+
"""
|
64
|
+
# conn_mcus = [MPRemoteBoard(sp) for sp in MPRemoteBoard.connected_boards(bluetooth) if sp not in config.ignore_ports]
|
65
|
+
|
66
|
+
comports = filtered_comports(
|
67
|
+
ignore=ignore,
|
68
|
+
include=include,
|
69
|
+
bluetooth=bluetooth,
|
70
|
+
)
|
71
|
+
connected_mcus = [
|
72
|
+
MPRemoteBoard(
|
73
|
+
c.device,
|
74
|
+
location=find_serial_by_path(c.device) or c.location or "?",
|
75
|
+
)
|
76
|
+
for c in comports
|
77
|
+
]
|
78
|
+
|
79
|
+
# a lot of boilerplate to show a progress bar with the comport currently scanned
|
80
|
+
# low update rate to facilitate screen readers/narration
|
81
|
+
with Progress(
|
82
|
+
rp_spinner,
|
83
|
+
rp_text,
|
84
|
+
rp_bar,
|
85
|
+
TimeElapsedColumn(),
|
86
|
+
refresh_per_second=1,
|
87
|
+
) as progress:
|
88
|
+
tsk_scan = progress.add_task("[green]Scanning", visible=False, total=None)
|
89
|
+
progress.tasks[tsk_scan].fields["device"] = "..."
|
90
|
+
progress.tasks[tsk_scan].visible = True
|
91
|
+
progress.start_task(tsk_scan)
|
92
|
+
try:
|
93
|
+
for mcu in connected_mcus:
|
94
|
+
progress.update(tsk_scan, device=mcu.serialport.replace("/dev/tty", "tty"))
|
95
|
+
try:
|
96
|
+
mcu.get_mcu_info()
|
97
|
+
except ConnectionError as e:
|
98
|
+
print(f"Error: {e}")
|
99
|
+
continue
|
100
|
+
finally:
|
101
|
+
# transient
|
102
|
+
progress.stop_task(tsk_scan)
|
103
|
+
progress.tasks[tsk_scan].visible = False
|
104
|
+
return connected_mcus
|