Source code for scargo.target_helpers.esp32_helper

import os
import re
import shutil
import subprocess
import sys
from pathlib import Path
from typing import Optional

from scargo.config import Config, Esp32Config
from scargo.logger import get_logger

logger = get_logger()
OUT_FS_DIR = Path("build", "fs")


[docs]def create_esp32_config(chip: Optional[str]) -> Optional[Esp32Config]: if chip is None: return None return Esp32Config(chip=chip)
[docs]def gen_fs_esp32(config: Config) -> None: command = [] partition_list = config.get_esp32_config().partitions fs_size = 0 for i in partition_list: split_list = i.split(",") if "spiffs" in split_list[0]: fs_size = int(re.sub(",", "", split_list[4]), 16) try: project_path = config.project_root fs_in_dir = project_path / "main/fs" fs_out_dir = project_path / OUT_FS_DIR fs_out_bin = project_path / "build/spiffs.bin" fs_in_dir.mkdir(parents=True, exist_ok=True) fs_out_dir.mkdir(parents=True, exist_ok=True) shutil.copytree(fs_in_dir, fs_out_dir, dirs_exist_ok=True) idf_path = os.environ.get("IDF_PATH") command = [ f"{idf_path}/components/spiffs/spiffsgen.py", str(fs_size), str(fs_out_dir), str(fs_out_bin), ] subprocess.run(command, cwd=project_path, check=True) logger.info("Generated %s of size:%s", fs_out_bin, fs_size) except subprocess.CalledProcessError: logger.error("%s fail", command) sys.exit(1)
[docs]def gen_single_binary_esp32(build_profile: str, config: Config) -> None: partition_list = config.get_esp32_config().partitions chip = config.get_esp32_config().chip build_dir = config.project_root / "build" / build_profile flasher_args_path = build_dir / "flash_args" if not flasher_args_path.is_file(): logger.warning("%s does not exists", flasher_args_path) logger.info("Did you run scargo build --profile %s", build_profile) sys.exit(1) line_list = flasher_args_path.read_text().split() spiffs_addr = None for i in partition_list: if "spiffs" in i: split_list = i.split(",") spiffs_addr = split_list[3].strip() break flash_size = "4MB" for index, arg in enumerate(line_list): if "flash_size" in arg: flash_size = line_list[index + 1] if arg.endswith(".bin"): line_list[index] = str(build_dir / arg) command = [ "esptool.py", "--chip", chip, "merge_bin", "-o", "build/flash_image.bin", "--fill-flash-size", f"{flash_size}", ] command.extend(line_list) if spiffs_addr: command.extend([spiffs_addr, "build/spiffs.bin"]) try: logger.info("Running: %s", " ".join(command)) subprocess.run(command, cwd=config.project_root, check=True) except subprocess.CalledProcessError: logger.error("Generation of single binary failed") sys.exit(1)