This commit is contained in:
J. Nick Koston
2026-03-05 14:03:33 -10:00
parent 424d4193b2
commit e560594202
+24 -35
View File
@@ -8,6 +8,8 @@ from pathlib import Path
import re
import sys
from jinja2 import Environment, FileSystemLoader
# Map arduino-pico pin defines to ESPHome-friendly names
PIN_NAME_MAP = {
"LED": "LED",
@@ -123,49 +125,36 @@ def _get_variant(json_file: Path) -> str | None:
return data.get("build", {}).get("variant")
def format_pins(pins: dict[str, int] | str) -> str:
"""Format a pin dict or alias as Python source."""
_TEMPLATE_DIR = Path(__file__).parent
def _format_pins(pins: dict[str, int] | str) -> str:
"""Jinja2 filter to format a pin dict or alias as Python source."""
if isinstance(pins, str):
return f'"{pins}"'
items = ", ".join(f'"{k}": {v}' for k, v in sorted(pins.items()))
return repr(pins)
items = ", ".join(f"{k!r}: {v}" for k, v in sorted(pins.items()))
return f"{{{items}}}"
_jinja_env = Environment(
loader=FileSystemLoader(_TEMPLATE_DIR), keep_trailing_newline=True
)
_jinja_env.filters["format_pins"] = _format_pins
_jinja_env.filters["repr"] = repr
def generate(arduino_pico_path: Path) -> str:
"""Generate boards.py content."""
board_pins, boards = load_boards(arduino_pico_path)
lines = [
"# Auto-generated by generate_boards.py — do not edit manually",
"# To regenerate: python esphome/components/rp2040/generate_boards.py <arduino-pico-path>",
"",
f"# arduino-pico maps pins >= {CYW43_GPIO_OFFSET} to CYW43 wireless chip GPIOs",
f"CYW43_GPIO_OFFSET = {CYW43_GPIO_OFFSET}",
f"CYW43_MAX_GPIO = {CYW43_GPIO_OFFSET + CYW43_GPIO_COUNT - 1}",
f"DEFAULT_MAX_PIN = {DEFAULT_MAX_PIN}",
"",
"RP2040_BASE_PINS = {}",
"",
"RP2040_BOARD_PINS = {",
]
for name, pins in sorted(board_pins.items()):
lines.append(f" {name!r}: {format_pins(pins)},")
lines.append("}")
lines.append("")
lines.append("BOARDS = {")
for name, info in sorted(boards.items()):
lines.append(f" {name!r}: {{")
for key, value in info.items():
lines.append(f" {key!r}: {value!r},")
lines.append(" },")
lines.append("}")
lines.append("")
return "\n".join(lines)
template = _jinja_env.get_template("boards.jinja2")
return template.render(
cyw43_gpio_offset=CYW43_GPIO_OFFSET,
cyw43_max_gpio=CYW43_GPIO_OFFSET + CYW43_GPIO_COUNT - 1,
default_max_pin=DEFAULT_MAX_PIN,
board_pins=sorted(board_pins.items()),
boards=sorted(boards.items()),
)
def main():