Skip to content

Commit e9a340f

Browse files
committed
Refactor import microcontroller
1 parent 0693f46 commit e9a340f

4 files changed

Lines changed: 57 additions & 69 deletions

File tree

src/adafruit_blinka/importing.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
* Author(s): Melissa LeBlanc-Williams
1010
"""
1111

12+
1213
try:
1314
from importlib import import_module
1415
except ImportError as e:
@@ -21,6 +22,9 @@ def import_module(module_name: str, package: str = None):
2122
return __import__(module_name, globals(), locals(), package_list)
2223

2324

25+
from adafruit_blinka.agnostic import detector
26+
27+
2428
def get_import_file(json_file_name, script_file_location):
2529
"""Get the full path to the microcontroller imports file."""
2630
try:
@@ -53,3 +57,47 @@ def import_mod(caller_globals, module_name: str, package_name: str = "*"):
5357
else:
5458
module = import_module(module_name, package=package_name)
5559
caller_globals[package_name] = getattr(module, package_name)
60+
61+
62+
def import_microcontroller(
63+
caller_globals,
64+
microcontroller_imports,
65+
module_extension: str = "",
66+
package_name: str = "*",
67+
):
68+
"""Detect and import the microcontroller module and package based on detected hardware"""
69+
if module_extension[0:1] != "." and module_extension != "":
70+
# Make sure the module extension starts with a dot if it's not empty
71+
module_extension = f".{module_extension}"
72+
for chip_key, chip_module in microcontroller_imports.items():
73+
if getattr(detector.chip, chip_key):
74+
if isinstance(chip_module, dict):
75+
# Loop through the children and import the first one that matches
76+
for board_key, board_chip_module in chip_module.items():
77+
if board_key.startswith("any_") and getattr(
78+
detector.board, board_key
79+
):
80+
# import Pin from the microcontroller module
81+
import_mod(
82+
caller_globals,
83+
f"{board_chip_module}{module_extension}",
84+
package_name,
85+
)
86+
return True
87+
if board_key == getattr(detector.board, board_key):
88+
print(f"Detected board: {board_key}")
89+
import_mod(
90+
caller_globals,
91+
f"{board_chip_module}{module_extension}",
92+
package_name,
93+
)
94+
return True
95+
import_mod(
96+
caller_globals,
97+
f"{chip_module['default']}{module_extension}",
98+
package_name,
99+
)
100+
return True
101+
import_mod(caller_globals, f"{chip_module}{module_extension}", package_name)
102+
return True
103+
return False

src/digitalio.py

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,15 @@
1010
* Author(s): cefn, Melissa LeBlanc-Williams
1111
"""
1212
import json
13-
from adafruit_blinka.agnostic import board_id, detector
14-
from adafruit_blinka.importing import import_mod, get_import_file
13+
from adafruit_blinka.agnostic import board_id
14+
from adafruit_blinka.importing import get_import_file, import_microcontroller
1515
from adafruit_blinka import Enum, ContextManaged
1616

1717
Pin = None
1818

19-
2019
with open(get_import_file("microcontroller_imports.json", __file__)) as f:
2120
microcontroller_imports = json.load(f)
22-
23-
for chip_key, chip_module in microcontroller_imports.items():
24-
if getattr(detector.chip, chip_key):
25-
if isinstance(chip_module, dict):
26-
# Loop through the children and import the first one that matches
27-
for board_key, board_chip_module in chip_module.items():
28-
if board_key.startswith("any_") and getattr(
29-
detector.board, board_key
30-
):
31-
# import Pin from the microcontroller module
32-
import_mod(globals(), f"{board_chip_module}.pin", "Pin")
33-
break
34-
if board_key == getattr(detector.board, board_key):
35-
import_mod(globals(), f"{board_chip_module}.pin", "Pin")
36-
break
37-
else:
38-
import_mod(globals(), f"{chip_module['default']}.pin", "Pin")
39-
break
40-
import_mod(globals(), f"{chip_module}.pin", "Pin")
41-
break
21+
import_microcontroller(globals(), microcontroller_imports, "pin", "Pin")
4222

4323

4424
class DriveMode(Enum):

src/microcontroller/__init__.py

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import time
1313

1414
from adafruit_platformdetect.constants import chips as ap_chip
15-
from adafruit_blinka.agnostic import chip_id, detector
16-
from adafruit_blinka.importing import import_mod, get_import_file
15+
from adafruit_blinka.agnostic import chip_id
16+
from adafruit_blinka.importing import get_import_file, import_microcontroller
1717
from microcontroller import pin # pylint: disable=unused-import
1818
from microcontroller.pin import Pin # pylint: disable=unused-import
1919

@@ -28,27 +28,7 @@ def delay_us(delay):
2828

2929
with open(get_import_file("../microcontroller_imports.json", __file__)) as f:
3030
microcontroller_imports = json.load(f)
31-
32-
for chip_key, chip_module in microcontroller_imports.items():
33-
if getattr(detector.chip, chip_key):
34-
if isinstance(chip_module, dict):
35-
# Loop through the children and import the first one that matches
36-
for board_key, board_chip_module in chip_module.items():
37-
if board_key.startswith("any_") and getattr(
38-
detector.board, board_key
39-
):
40-
# import Pin from the microcontroller module
41-
import_mod(globals(), f"{board_chip_module}.pin", "*")
42-
break
43-
if board_key == getattr(detector.board, board_key):
44-
import_mod(globals(), f"{board_chip_module}.pin", "*")
45-
break
46-
else:
47-
import_mod(globals(), f"{chip_module['default']}.pin", "*")
48-
break
49-
import_mod(globals(), f"{chip_module}.pin", "*")
50-
break
51-
else:
31+
if not import_microcontroller(globals(), microcontroller_imports, "", "*"):
5232
if chip_id == ap_chip.GENERIC_X86:
5333
print(
5434
"WARNING: GENERIC_X86 is not fully supported. Some features may not work."

src/microcontroller/pin.py

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,16 @@
55
import sys
66
import json
77
from adafruit_platformdetect.constants import chips as ap_chip
8-
from adafruit_blinka.agnostic import chip_id, detector
9-
from adafruit_blinka.importing import import_mod, get_import_file
8+
from adafruit_blinka.agnostic import chip_id
9+
from adafruit_blinka.importing import get_import_file, import_microcontroller
1010

1111
# We intentionally are patching into this namespace so skip the wildcard check.
1212
# pylint: disable=unused-wildcard-import,wildcard-import,ungrouped-imports
1313

1414

1515
with open(get_import_file("../microcontroller_imports.json", __file__)) as f:
1616
microcontroller_imports = json.load(f)
17-
18-
for chip_key, chip_module in microcontroller_imports.items():
19-
if getattr(detector.chip, chip_key):
20-
if isinstance(chip_module, dict):
21-
# Loop through the children and import the first one that matches
22-
for board_key, board_chip_module in chip_module.items():
23-
if board_key.startswith("any_") and getattr(
24-
detector.board, board_key
25-
):
26-
# import Pin from the microcontroller module
27-
import_mod(globals(), f"{board_chip_module}.pin", "*")
28-
break
29-
if board_key == getattr(detector.board, board_key):
30-
import_mod(globals(), f"{board_chip_module}.pin", "*")
31-
break
32-
else:
33-
import_mod(globals(), f"{chip_module['default']}.pin", "*")
34-
break
35-
import_mod(globals(), f"{chip_module}.pin", "*")
36-
break
37-
else:
17+
if not import_microcontroller(globals(), microcontroller_imports, "pin", "*"):
3818
if "sphinx" in sys.modules:
3919
# pylint: disable=unused-import
4020
from adafruit_blinka.microcontroller.generic_micropython import Pin

0 commit comments

Comments
 (0)