micropython-stubber 1.20.4__py3-none-any.whl → 1.20.6__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.
- {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/LICENSE +30 -30
- {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/METADATA +4 -4
- micropython_stubber-1.20.6.dist-info/RECORD +159 -0
- mpflash/README.md +184 -184
- mpflash/libusb_flash.ipynb +203 -203
- mpflash/mpflash/add_firmware.py +98 -98
- mpflash/mpflash/ask_input.py +236 -226
- mpflash/mpflash/bootloader/__init__.py +37 -0
- mpflash/mpflash/bootloader/manual.py +102 -0
- mpflash/mpflash/bootloader/micropython.py +10 -0
- mpflash/mpflash/bootloader/touch1200.py +45 -0
- mpflash/mpflash/cli_download.py +129 -128
- mpflash/mpflash/cli_flash.py +219 -212
- mpflash/mpflash/cli_group.py +98 -92
- mpflash/mpflash/cli_list.py +81 -77
- mpflash/mpflash/cli_main.py +41 -38
- mpflash/mpflash/common.py +164 -151
- mpflash/mpflash/config.py +47 -31
- mpflash/mpflash/connected.py +74 -74
- mpflash/mpflash/download.py +360 -361
- mpflash/mpflash/downloaded.py +129 -129
- mpflash/mpflash/errors.py +9 -5
- mpflash/mpflash/flash.py +52 -69
- mpflash/mpflash/flash_esp.py +59 -59
- mpflash/mpflash/flash_stm32.py +24 -24
- mpflash/mpflash/flash_stm32_cube.py +111 -111
- mpflash/mpflash/flash_stm32_dfu.py +101 -101
- mpflash/mpflash/flash_uf2.py +67 -67
- mpflash/mpflash/flash_uf2_boardid.py +15 -15
- mpflash/mpflash/flash_uf2_linux.py +123 -123
- mpflash/mpflash/flash_uf2_macos.py +34 -37
- mpflash/mpflash/flash_uf2_windows.py +34 -34
- mpflash/mpflash/list.py +89 -89
- mpflash/mpflash/logger.py +41 -41
- mpflash/mpflash/mpboard_id/__init__.py +93 -93
- mpflash/mpflash/mpboard_id/add_boards.py +255 -255
- mpflash/mpflash/mpboard_id/board.py +37 -37
- mpflash/mpflash/mpboard_id/board_id.py +86 -86
- mpflash/mpflash/mpboard_id/store.py +43 -43
- mpflash/mpflash/mpremoteboard/__init__.py +221 -221
- mpflash/mpflash/mpremoteboard/mpy_fw_info.py +141 -141
- mpflash/mpflash/mpremoteboard/runner.py +140 -140
- mpflash/mpflash/uf2disk.py +12 -12
- mpflash/mpflash/vendor/basicgit.py +288 -288
- mpflash/mpflash/vendor/click_aliases.py +91 -0
- mpflash/mpflash/vendor/dfu.py +165 -165
- mpflash/mpflash/vendor/pydfu.py +605 -605
- mpflash/mpflash/vendor/readme.md +2 -2
- mpflash/mpflash/vendor/versions.py +119 -117
- mpflash/mpflash/worklist.py +170 -170
- mpflash/poetry.lock +1588 -1623
- mpflash/pyproject.toml +60 -60
- mpflash/stm32_udev_rules.md +62 -62
- stubber/__init__.py +3 -3
- stubber/basicgit.py +294 -288
- stubber/board/board_info.csv +193 -193
- stubber/board/boot.py +34 -34
- stubber/board/createstubs.py +986 -987
- stubber/board/createstubs_db.py +825 -826
- stubber/board/createstubs_db_min.py +331 -331
- stubber/board/createstubs_db_mpy.mpy +0 -0
- stubber/board/createstubs_lvgl.py +741 -741
- stubber/board/createstubs_lvgl_min.py +741 -741
- stubber/board/createstubs_mem.py +766 -767
- stubber/board/createstubs_mem_min.py +306 -306
- stubber/board/createstubs_mem_mpy.mpy +0 -0
- stubber/board/createstubs_min.py +294 -294
- stubber/board/createstubs_mpy.mpy +0 -0
- stubber/board/fw_info.py +141 -141
- stubber/board/info.py +183 -183
- stubber/board/main.py +19 -19
- stubber/board/modulelist.txt +247 -247
- stubber/board/pyrightconfig.json +34 -34
- stubber/bulk/mcu_stubber.py +454 -455
- stubber/codemod/_partials/__init__.py +48 -50
- stubber/codemod/_partials/db_main.py +147 -147
- stubber/codemod/_partials/lvgl_main.py +77 -77
- stubber/codemod/_partials/modules_reader.py +80 -80
- stubber/codemod/add_comment.py +53 -53
- stubber/codemod/add_method.py +65 -65
- stubber/codemod/board.py +317 -317
- stubber/codemod/enrich.py +145 -145
- stubber/codemod/merge_docstub.py +284 -284
- stubber/codemod/modify_list.py +54 -54
- stubber/codemod/utils.py +57 -57
- stubber/commands/build_cmd.py +94 -94
- stubber/commands/cli.py +51 -51
- stubber/commands/clone_cmd.py +66 -66
- stubber/commands/config_cmd.py +29 -29
- stubber/commands/enrich_folder_cmd.py +70 -70
- stubber/commands/get_core_cmd.py +69 -69
- stubber/commands/get_docstubs_cmd.py +87 -87
- stubber/commands/get_frozen_cmd.py +112 -112
- stubber/commands/get_mcu_cmd.py +56 -56
- stubber/commands/merge_cmd.py +66 -66
- stubber/commands/publish_cmd.py +119 -119
- stubber/commands/stub_cmd.py +30 -30
- stubber/commands/switch_cmd.py +54 -54
- stubber/commands/variants_cmd.py +48 -48
- stubber/cst_transformer.py +178 -178
- stubber/data/board_info.csv +193 -193
- stubber/data/board_info.json +1729 -1729
- stubber/data/micropython_tags.csv +15 -15
- stubber/data/requirements-core-micropython.txt +38 -38
- stubber/data/requirements-core-pycopy.txt +39 -39
- stubber/downloader.py +36 -36
- stubber/freeze/common.py +68 -68
- stubber/freeze/freeze_folder.py +69 -69
- stubber/freeze/freeze_manifest_2.py +113 -113
- stubber/freeze/get_frozen.py +127 -127
- stubber/get_cpython.py +101 -101
- stubber/get_lobo.py +59 -59
- stubber/minify.py +418 -418
- stubber/publish/bump.py +86 -86
- stubber/publish/candidates.py +262 -283
- stubber/publish/database.py +18 -18
- stubber/publish/defaults.py +45 -45
- stubber/publish/enums.py +24 -30
- stubber/publish/helpers.py +29 -29
- stubber/publish/merge_docstubs.py +130 -130
- stubber/publish/missing_class_methods.py +49 -49
- stubber/publish/package.py +146 -177
- stubber/publish/pathnames.py +51 -51
- stubber/publish/publish.py +120 -121
- stubber/publish/pypi.py +38 -38
- stubber/publish/stubpackage.py +1029 -1029
- stubber/rst/__init__.py +9 -9
- stubber/rst/classsort.py +77 -77
- stubber/rst/lookup.py +530 -530
- stubber/rst/output_dict.py +401 -401
- stubber/rst/reader.py +822 -823
- stubber/rst/report_return.py +69 -69
- stubber/rst/rst_utils.py +540 -540
- stubber/stubber.py +38 -38
- stubber/stubs_from_docs.py +90 -90
- stubber/tools/manifestfile.py +610 -610
- stubber/tools/readme.md +5 -5
- stubber/update_fallback.py +117 -117
- stubber/update_module_list.py +123 -125
- stubber/utils/__init__.py +5 -5
- stubber/utils/config.py +127 -127
- stubber/utils/makeversionhdr.py +54 -54
- stubber/utils/manifest.py +92 -92
- stubber/utils/post.py +79 -79
- stubber/utils/repos.py +157 -154
- stubber/utils/stubmaker.py +139 -139
- stubber/utils/typed_config_toml.py +77 -77
- stubber/utils/versions.py +128 -120
- stubber/variants.py +106 -106
- micropython_stubber-1.20.4.dist-info/RECORD +0 -154
- {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/WHEEL +0 -0
- {micropython_stubber-1.20.4.dist-info → micropython_stubber-1.20.6.dist-info}/entry_points.txt +0 -0
mpflash/mpflash/cli_list.py
CHANGED
@@ -1,77 +1,81 @@
|
|
1
|
-
import json
|
2
|
-
from typing import List
|
3
|
-
|
4
|
-
import rich_click as click
|
5
|
-
from rich import print
|
6
|
-
|
7
|
-
from .cli_group import cli
|
8
|
-
from .
|
9
|
-
from .
|
10
|
-
from .
|
11
|
-
|
12
|
-
|
13
|
-
@cli.command(
|
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
|
+
import json
|
2
|
+
from typing import List
|
3
|
+
|
4
|
+
import rich_click as click
|
5
|
+
from rich import print
|
6
|
+
|
7
|
+
from .cli_group import cli
|
8
|
+
from .connected import list_mcus
|
9
|
+
from .list import show_mcus
|
10
|
+
from .logger import make_quiet
|
11
|
+
|
12
|
+
|
13
|
+
@cli.command(
|
14
|
+
"list",
|
15
|
+
help="List the connected MCU boards. alias: devs",
|
16
|
+
aliases=["devs"],
|
17
|
+
)
|
18
|
+
@click.option(
|
19
|
+
"--json",
|
20
|
+
"-j",
|
21
|
+
"as_json",
|
22
|
+
is_flag=True,
|
23
|
+
default=False,
|
24
|
+
show_default=True,
|
25
|
+
help="""Output in json format""",
|
26
|
+
)
|
27
|
+
@click.option(
|
28
|
+
"--serial",
|
29
|
+
"--serial-port",
|
30
|
+
"-s",
|
31
|
+
"serial",
|
32
|
+
default=["*"],
|
33
|
+
multiple=True,
|
34
|
+
show_default=True,
|
35
|
+
help="Which serial port(s) to list. ",
|
36
|
+
metavar="SERIALPORT",
|
37
|
+
)
|
38
|
+
@click.option(
|
39
|
+
"--ignore",
|
40
|
+
"-i",
|
41
|
+
is_eager=True,
|
42
|
+
help="Serial port(s) to ignore. Defaults to MPFLASH_IGNORE.",
|
43
|
+
multiple=True,
|
44
|
+
default=[],
|
45
|
+
envvar="MPFLASH_IGNORE",
|
46
|
+
show_default=True,
|
47
|
+
metavar="SERIALPORT",
|
48
|
+
)
|
49
|
+
@click.option(
|
50
|
+
"--bluetooth/--no-bluetooth",
|
51
|
+
"-b/-nb",
|
52
|
+
is_flag=True,
|
53
|
+
default=False,
|
54
|
+
show_default=True,
|
55
|
+
help="""Include bluetooth ports in the list""",
|
56
|
+
)
|
57
|
+
@click.option(
|
58
|
+
"--progress/--no-progress",
|
59
|
+
# "-p/-np", -p is already used for --port
|
60
|
+
"progress",
|
61
|
+
is_flag=True,
|
62
|
+
default=True,
|
63
|
+
show_default=True,
|
64
|
+
help="""Show progress""",
|
65
|
+
)
|
66
|
+
def cli_list_mcus(serial: List[str], ignore: List[str], bluetooth: bool, as_json: bool, progress: bool = True) -> int:
|
67
|
+
"""List the connected MCU boards, and output in a nice table or json."""
|
68
|
+
serial = list(serial)
|
69
|
+
ignore = list(ignore)
|
70
|
+
if as_json:
|
71
|
+
# avoid noise in json output
|
72
|
+
make_quiet()
|
73
|
+
# TODO? Ask user to select a serialport if [?] is given ?
|
74
|
+
|
75
|
+
conn_mcus = list_mcus(ignore=ignore, include=serial, bluetooth=bluetooth)
|
76
|
+
if as_json:
|
77
|
+
print(json.dumps([mcu.__dict__ for mcu in conn_mcus], indent=4))
|
78
|
+
progress = False
|
79
|
+
if progress:
|
80
|
+
show_mcus(conn_mcus, refresh=False)
|
81
|
+
return 0 if conn_mcus else 1
|
mpflash/mpflash/cli_main.py
CHANGED
@@ -1,38 +1,41 @@
|
|
1
|
-
"""mpflash is a CLI to download and flash MicroPython firmware to various boards."""
|
2
|
-
|
3
|
-
# import rich_click as click
|
4
|
-
|
5
|
-
import os
|
6
|
-
|
7
|
-
import click
|
8
|
-
from loguru import logger as log
|
9
|
-
|
10
|
-
from .cli_download import cli_download
|
11
|
-
from .cli_flash import cli_flash_board
|
12
|
-
from .cli_group import cli
|
13
|
-
from .cli_list import cli_list_mcus
|
14
|
-
|
15
|
-
|
16
|
-
def mpflash():
|
17
|
-
cli.add_command(cli_list_mcus)
|
18
|
-
cli.add_command(cli_download)
|
19
|
-
cli.add_command(cli_flash_board)
|
20
|
-
|
21
|
-
# cli(auto_envvar_prefix="MPFLASH")
|
22
|
-
if False and os.environ.get("COMPUTERNAME")
|
23
|
-
# intentional less error suppression on dev machine
|
24
|
-
result = cli(standalone_mode=False)
|
25
|
-
else:
|
26
|
-
try:
|
27
|
-
result = cli(standalone_mode=
|
28
|
-
exit(result)
|
29
|
-
except AttributeError as e:
|
30
|
-
log.error(f"Error: {e}")
|
31
|
-
exit(-1)
|
32
|
-
except click.exceptions.ClickException as e:
|
33
|
-
log.error(f"Error: {e}")
|
34
|
-
exit(-2)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
1
|
+
"""mpflash is a CLI to download and flash MicroPython firmware to various boards."""
|
2
|
+
|
3
|
+
# import rich_click as click
|
4
|
+
|
5
|
+
import os
|
6
|
+
|
7
|
+
import click
|
8
|
+
from loguru import logger as log
|
9
|
+
|
10
|
+
from .cli_download import cli_download
|
11
|
+
from .cli_flash import cli_flash_board
|
12
|
+
from .cli_group import cli
|
13
|
+
from .cli_list import cli_list_mcus
|
14
|
+
|
15
|
+
|
16
|
+
def mpflash():
|
17
|
+
cli.add_command(cli_list_mcus)
|
18
|
+
cli.add_command(cli_download)
|
19
|
+
cli.add_command(cli_flash_board)
|
20
|
+
|
21
|
+
# cli(auto_envvar_prefix="MPFLASH")
|
22
|
+
if False and os.environ.get("COMPUTERNAME").startswith("JOSVERL"):
|
23
|
+
# intentional less error suppression on dev machine
|
24
|
+
result = cli(standalone_mode=False)
|
25
|
+
else:
|
26
|
+
try:
|
27
|
+
result = cli(standalone_mode=True)
|
28
|
+
exit(result)
|
29
|
+
except AttributeError as e:
|
30
|
+
log.error(f"Error: {e}")
|
31
|
+
exit(-1)
|
32
|
+
except click.exceptions.ClickException as e:
|
33
|
+
log.error(f"Error: {e}")
|
34
|
+
exit(-2)
|
35
|
+
except click.exceptions.Abort as e:
|
36
|
+
# Aborted - Ctrl-C
|
37
|
+
exit(-3)
|
38
|
+
|
39
|
+
|
40
|
+
if __name__ == "__main__":
|
41
|
+
mpflash()
|
mpflash/mpflash/common.py
CHANGED
@@ -1,151 +1,164 @@
|
|
1
|
-
import fnmatch
|
2
|
-
import os
|
3
|
-
import sys
|
4
|
-
from dataclasses import dataclass, field
|
5
|
-
from
|
6
|
-
from
|
7
|
-
|
8
|
-
|
9
|
-
from
|
10
|
-
from serial.tools
|
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
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
class
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
if
|
143
|
-
|
144
|
-
log.trace(f"
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
1
|
+
import fnmatch
|
2
|
+
import os
|
3
|
+
import sys
|
4
|
+
from dataclasses import dataclass, field
|
5
|
+
from enum import Enum
|
6
|
+
from pathlib import Path
|
7
|
+
from typing import List, Optional, Union
|
8
|
+
|
9
|
+
from github import Auth, Github
|
10
|
+
from serial.tools import list_ports
|
11
|
+
from serial.tools.list_ports_common import ListPortInfo
|
12
|
+
|
13
|
+
from .logger import log
|
14
|
+
|
15
|
+
# from mpflash.mpremoteboard import MPRemoteBoard
|
16
|
+
|
17
|
+
PORT_FWTYPES = {
|
18
|
+
"stm32": [".dfu"], # need .dfu for pydfu.py - .hex for cube cli/GUI
|
19
|
+
"esp32": [".bin"],
|
20
|
+
"esp8266": [".bin"],
|
21
|
+
"rp2": [".uf2"],
|
22
|
+
"samd": [".uf2"],
|
23
|
+
# below this not yet implemented / tested
|
24
|
+
"mimxrt": [".hex"],
|
25
|
+
"nrf": [".uf2"],
|
26
|
+
"renesas-ra": [".hex"],
|
27
|
+
}
|
28
|
+
|
29
|
+
# Token with no permissions to avoid throttling
|
30
|
+
# https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28#getting-a-higher-rate-limit
|
31
|
+
PAT_NO_ACCESS = (
|
32
|
+
"github_pat" + "_11AAHPVFQ0qAkDnSUaMKSp" + "_ZkDl5NRRwBsUN6EYg9ahp1Dvj4FDDONnXVgimxC2EtpY7Q7BUKBoQ0Jq72X"
|
33
|
+
)
|
34
|
+
PAT = os.environ.get("GITHUB_TOKEN") or PAT_NO_ACCESS
|
35
|
+
GH_CLIENT = Github(auth=Auth.Token(PAT))
|
36
|
+
|
37
|
+
|
38
|
+
@dataclass
|
39
|
+
class FWInfo:
|
40
|
+
"""
|
41
|
+
Downloaded Firmware information
|
42
|
+
is somewhat related to the BOARD class in the mpboard_id module
|
43
|
+
"""
|
44
|
+
|
45
|
+
port: str # MicroPython port
|
46
|
+
board: str # MicroPython board
|
47
|
+
filename: str = field(default="") # relative filename of the firmware image
|
48
|
+
firmware: str = field(default="") # url or path to original firmware image
|
49
|
+
variant: str = field(default="") # MicroPython variant
|
50
|
+
preview: bool = field(default=False) # True if the firmware is a preview version
|
51
|
+
version: str = field(default="") # MicroPython version (NO v prefix)
|
52
|
+
url: str = field(default="") # url to the firmware image download folder
|
53
|
+
build: str = field(default="0") # The build = number of commits since the last release
|
54
|
+
ext: str = field(default="") # the file extension of the firmware
|
55
|
+
family: str = field(default="micropython") # The family of the firmware
|
56
|
+
custom: bool = field(default=False) # True if the firmware is a custom build
|
57
|
+
description: str = field(default="") # Description used by this firmware (custom only)
|
58
|
+
|
59
|
+
def to_dict(self) -> dict:
|
60
|
+
"""Convert the object to a dictionary"""
|
61
|
+
return self.__dict__
|
62
|
+
|
63
|
+
@classmethod
|
64
|
+
def from_dict(cls, data: dict) -> "FWInfo":
|
65
|
+
"""Create a FWInfo object from a dictionary"""
|
66
|
+
# add missing keys
|
67
|
+
if "ext" not in data:
|
68
|
+
data["ext"] = Path(data["firmware"]).suffix
|
69
|
+
if "family" not in data:
|
70
|
+
data["family"] = "micropython"
|
71
|
+
return cls(**data)
|
72
|
+
|
73
|
+
|
74
|
+
@dataclass
|
75
|
+
class Params:
|
76
|
+
"""Common parameters for downloading and flashing firmware"""
|
77
|
+
|
78
|
+
ports: List[str] = field(default_factory=list)
|
79
|
+
boards: List[str] = field(default_factory=list)
|
80
|
+
versions: List[str] = field(default_factory=list)
|
81
|
+
fw_folder: Path = Path()
|
82
|
+
serial: List[str] = field(default_factory=list)
|
83
|
+
ignore: List[str] = field(default_factory=list)
|
84
|
+
|
85
|
+
|
86
|
+
@dataclass
|
87
|
+
class DownloadParams(Params):
|
88
|
+
"""Parameters for downloading firmware"""
|
89
|
+
|
90
|
+
clean: bool = False
|
91
|
+
force: bool = False
|
92
|
+
|
93
|
+
|
94
|
+
class BootloaderMethod(Enum):
|
95
|
+
MANUAL = "manual"
|
96
|
+
MPY = "mpy"
|
97
|
+
TOUCH_1200 = "touch1200"
|
98
|
+
NONE = "none"
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
@dataclass
|
103
|
+
class FlashParams(Params):
|
104
|
+
"""Parameters for flashing a board"""
|
105
|
+
|
106
|
+
erase: bool = True
|
107
|
+
bootloader: BootloaderMethod = BootloaderMethod.NONE
|
108
|
+
cpu: str = ""
|
109
|
+
|
110
|
+
def __post_init__(self):
|
111
|
+
if isinstance(self.bootloader, str):
|
112
|
+
self.bootloader = BootloaderMethod(self.bootloader)
|
113
|
+
|
114
|
+
|
115
|
+
ParamType = Union[DownloadParams, FlashParams]
|
116
|
+
|
117
|
+
|
118
|
+
def filtered_comports(
|
119
|
+
ignore: Optional[List[str]] = None,
|
120
|
+
include: Optional[List[str]] = None,
|
121
|
+
bluetooth: bool = False,
|
122
|
+
) -> List[ListPortInfo]: # sourcery skip: assign-if-exp
|
123
|
+
"""
|
124
|
+
Get a list of filtered comports.
|
125
|
+
"""
|
126
|
+
if not ignore:
|
127
|
+
ignore = []
|
128
|
+
elif not isinstance(ignore, list): # type: ignore
|
129
|
+
ignore = list(ignore)
|
130
|
+
if not include:
|
131
|
+
include = ["*"]
|
132
|
+
elif not isinstance(include, list): # type: ignore
|
133
|
+
include = list(include)
|
134
|
+
|
135
|
+
# remove ports that are to be ignored
|
136
|
+
log.trace(f"{include=}, {ignore=}, {bluetooth=}")
|
137
|
+
comports = [p for p in list_ports.comports() if not any(fnmatch.fnmatch(p.device, i) for i in ignore)]
|
138
|
+
log.trace(f"comports: {[p.device for p in comports]}")
|
139
|
+
# remove bluetooth ports
|
140
|
+
|
141
|
+
if include != ["*"]:
|
142
|
+
# if there are explicit ports to include, add them to the list
|
143
|
+
explicit = [p for p in list_ports.comports() if any(fnmatch.fnmatch(p.device, i) for i in include)]
|
144
|
+
log.trace(f"explicit: {[p.device for p in explicit]}")
|
145
|
+
if ignore == []:
|
146
|
+
# if nothing to ignore, just use the explicit list as a sinple sane default
|
147
|
+
comports = explicit
|
148
|
+
else:
|
149
|
+
# if there are ports to ignore, add the explicit list to the filtered list
|
150
|
+
comports = list(set(explicit) | set(comports))
|
151
|
+
if not bluetooth:
|
152
|
+
# filter out bluetooth ports
|
153
|
+
comports = [p for p in comports if "bluetooth" not in p.description.lower()]
|
154
|
+
comports = [p for p in comports if "BTHENUM" not in p.hwid]
|
155
|
+
if sys.platform == "darwin":
|
156
|
+
comports = [p for p in comports if ".Bluetooth" not in p.device]
|
157
|
+
log.trace(f"no Bluetooth: {[p.device for p in comports]}")
|
158
|
+
log.debug(f"filtered_comports: {[p.device for p in comports]}")
|
159
|
+
# sort
|
160
|
+
if sys.platform == "win32":
|
161
|
+
# Windows sort of comports by number - but fallback to device name
|
162
|
+
return sorted(comports, key=lambda x: int(x.device.split()[0][3:]) if x.device.split()[0][3:].isdigit() else x)
|
163
|
+
# sort by device name
|
164
|
+
return sorted(comports, key=lambda x: x.device)
|
mpflash/mpflash/config.py
CHANGED
@@ -1,31 +1,47 @@
|
|
1
|
-
"""centralized configuration for mpflash"""
|
2
|
-
|
3
|
-
|
4
|
-
from
|
5
|
-
|
6
|
-
|
7
|
-
import
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
1
|
+
"""centralized configuration for mpflash"""
|
2
|
+
|
3
|
+
import os
|
4
|
+
from pathlib import Path
|
5
|
+
from typing import List
|
6
|
+
|
7
|
+
import pkg_resources
|
8
|
+
import platformdirs
|
9
|
+
|
10
|
+
from mpflash.logger import log
|
11
|
+
|
12
|
+
|
13
|
+
def get_version():
|
14
|
+
name = __package__ or "mpflash"
|
15
|
+
try:
|
16
|
+
return pkg_resources.get_distribution(name).version
|
17
|
+
except pkg_resources.DistributionNotFound:
|
18
|
+
return "Package not found"
|
19
|
+
|
20
|
+
|
21
|
+
class MPtoolConfig:
|
22
|
+
"""Centralized configuration for mpflash"""
|
23
|
+
|
24
|
+
quiet: bool = False
|
25
|
+
verbose: bool = False
|
26
|
+
ignore_ports: List[str] = []
|
27
|
+
firmware_folder: Path = platformdirs.user_downloads_path() / "firmware"
|
28
|
+
# test options specified on the commandline
|
29
|
+
tests: List[str] = []
|
30
|
+
_interactive: bool = True
|
31
|
+
|
32
|
+
@property
|
33
|
+
def interactive(self):
|
34
|
+
# No interactions in CI
|
35
|
+
if os.getenv('GITHUB_ACTIONS') == 'true':
|
36
|
+
log.warning("Disabling interactive mode in CI")
|
37
|
+
return False
|
38
|
+
return self._interactive
|
39
|
+
|
40
|
+
@interactive.setter
|
41
|
+
def interactive(self, value:bool):
|
42
|
+
self._interactive = value
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
config = MPtoolConfig()
|
47
|
+
__version__ = get_version()
|