diff --git a/esphome/components/rp2040/generate_boards.py b/esphome/components/rp2040/generate_boards.py index 25bf8a5346..63df8d4252 100644 --- a/esphome/components/rp2040/generate_boards.py +++ b/esphome/components/rp2040/generate_boards.py @@ -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 ", - "", - 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():