From 42846032d06c216158ac276fd6015ef04824f156 Mon Sep 17 00:00:00 2001 From: Tomasz Duda Date: Mon, 6 May 2024 18:55:36 +0200 Subject: [PATCH] move install of smp to post build step --- esphome/components/nrf52/__init__.py | 25 ----------- esphome/components/zephyr/__init__.py | 44 ++++++++++++++++++- esphome/components/zephyr/const.py | 4 ++ .../components/zephyr/post_build.py.script | 10 +++++ .../pre_build.py.script} | 0 esphome/writer.py | 4 +- esphome/zephyr_tools.py | 6 ++- requirements.txt | 5 --- 8 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 esphome/components/zephyr/post_build.py.script rename esphome/components/{nrf52/build_zephyr.py.script => zephyr/pre_build.py.script} (100%) diff --git a/esphome/components/nrf52/__init__.py b/esphome/components/nrf52/__init__.py index 9d75e780b3..0069624995 100644 --- a/esphome/components/nrf52/__init__.py +++ b/esphome/components/nrf52/__init__.py @@ -1,4 +1,3 @@ -import os import esphome.codegen as cg import esphome.config_validation as cv from esphome.const import ( @@ -13,12 +12,8 @@ from esphome.const import ( CONF_PLATFORM_VERSION, ) from esphome.core import CORE, coroutine_with_priority -from esphome.helpers import ( - copy_file_if_changed, -) from esphome.components.zephyr import ( - zephyr_copy_files, zephyr_set_core_data, zephyr_to_code, ) @@ -153,27 +148,7 @@ async def to_code(config): cg.add_platformio_option("board_upload.require_upload_port", "true") cg.add_platformio_option("board_upload.wait_for_upload_port", "true") # - cg.add_platformio_option( - "extra_scripts", [f"pre:build_{CORE.data[KEY_CORE][KEY_TARGET_FRAMEWORK]}.py"] - ) if CORE.using_zephyr: zephyr_to_code(conf) else: raise NotImplementedError - - -# Called by writer.py -def copy_files(): - if CORE.using_zephyr: - zephyr_copy_files() - - dir = os.path.dirname(__file__) - build_zephyr_file = os.path.join( - dir, f"build_{CORE.data[KEY_CORE][KEY_TARGET_FRAMEWORK]}.py.script" - ) - copy_file_if_changed( - build_zephyr_file, - CORE.relative_build_path( - f"build_{CORE.data[KEY_CORE][KEY_TARGET_FRAMEWORK]}.py" - ), - ) diff --git a/esphome/components/zephyr/__init__.py b/esphome/components/zephyr/__init__.py index 0c9ea55ca4..5909c1512d 100644 --- a/esphome/components/zephyr/__init__.py +++ b/esphome/components/zephyr/__init__.py @@ -1,12 +1,15 @@ +import os from typing import Union import esphome.codegen as cg from esphome.core import CORE from esphome.helpers import ( write_file_if_changed, + copy_file_if_changed, ) from esphome.const import ( CONF_VARIANT, CONF_BOARD, + KEY_NAME, ) from .const import ( ZEPHYR_VARIANT_GENERIC, @@ -16,6 +19,8 @@ from .const import ( KEY_OVERLAY, zephyr_ns, BOOTLOADER_MCUBOOT, + KEY_EXTRA_BUILD_FILES, + KEY_PATH, ) @@ -31,6 +36,7 @@ def zephyr_set_core_data(config): CORE.data[KEY_ZEPHYR][KEY_PRJ_CONF] = {} CORE.data[KEY_ZEPHYR][KEY_OVERLAY] = "" CORE.data[KEY_ZEPHYR][KEY_BOOTLOADER] = config[KEY_BOOTLOADER] + CORE.data[KEY_ZEPHYR][KEY_EXTRA_BUILD_FILES] = {} return config @@ -58,6 +64,24 @@ def zephyr_add_overlay(content): CORE.data[KEY_ZEPHYR][KEY_OVERLAY] += content +def add_extra_build_file(filename: str, path: str) -> bool: + """Add an extra build file to the project.""" + if filename not in CORE.data[KEY_ZEPHYR][KEY_EXTRA_BUILD_FILES]: + CORE.data[KEY_ZEPHYR][KEY_EXTRA_BUILD_FILES][filename] = { + KEY_NAME: filename, + KEY_PATH: path, + } + return True + return False + + +def add_extra_script(stage: str, filename: str, path: str): + """Add an extra script to the project.""" + key = f"{stage}:{filename}" + if add_extra_build_file(filename, path): + cg.add_platformio_option("extra_scripts", [key]) + + def zephyr_to_code(conf): cg.add(zephyr_ns.setup_preferences()) cg.add_build_flag("-DUSE_ZEPHYR") @@ -110,6 +134,17 @@ def zephyr_to_code(conf): zephyr_add_prj_conf("USB_CDC_ACM_LOG_LEVEL_WRN", True) + add_extra_script( + "pre", + "pre_build.py", + os.path.join(os.path.dirname(__file__), "pre_build.py.script"), + ) + add_extra_script( + "post", + "post_build.py", + os.path.join(os.path.dirname(__file__), "post_build.py.script"), + ) + def _format_prj_conf_val(value: PrjConfValueType) -> str: if isinstance(value, bool): @@ -121,7 +156,8 @@ def _format_prj_conf_val(value: PrjConfValueType) -> str: raise ValueError -def zephyr_copy_files(): +# Called by writer.py +def copy_files(): want_opts = CORE.data[KEY_ZEPHYR][KEY_PRJ_CONF] contents = ( "\n".join( @@ -156,3 +192,9 @@ def zephyr_copy_files(): CORE.relative_build_path(f"boards/{CORE.data[KEY_ZEPHYR][KEY_BOARD]}.json"), fake_board_manifest, ) + + for _, file in CORE.data[KEY_ZEPHYR][KEY_EXTRA_BUILD_FILES].items(): + copy_file_if_changed( + file[KEY_PATH], + CORE.relative_build_path(file[KEY_NAME]), + ) diff --git a/esphome/components/zephyr/const.py b/esphome/components/zephyr/const.py index de5f641108..b268a18b29 100644 --- a/esphome/components/zephyr/const.py +++ b/esphome/components/zephyr/const.py @@ -2,10 +2,14 @@ import esphome.codegen as cg ZEPHYR_VARIANT_GENERIC = "generic" ZEPHYR_VARIANT_NRF_SDK = "nrf-sdk" + KEY_ZEPHYR = "zephyr" KEY_PRJ_CONF = "prj_conf" KEY_OVERLAY = "overlay" KEY_BOOTLOADER = "bootloader" +KEY_EXTRA_BUILD_FILES = "extra_build_files" +KEY_PATH = "path" + BOOTLOADER_MCUBOOT = "mcuboot" zephyr_ns = cg.esphome_ns.namespace("zephyr") diff --git a/esphome/components/zephyr/post_build.py.script b/esphome/components/zephyr/post_build.py.script new file mode 100644 index 0000000000..6de6c2f98e --- /dev/null +++ b/esphome/components/zephyr/post_build.py.script @@ -0,0 +1,10 @@ +Import("env") + +import sys + +try: + import smp + import smpclient +except ImportError: + if sys.version_info >= (3, 10): + env.Execute("$PYTHONEXE -m pip install smp==1.0.0 git+https://github.com/tomaszduda23/smpclient/@d25c8035ae2858fd41a106058297b619d58fbcb5") diff --git a/esphome/components/nrf52/build_zephyr.py.script b/esphome/components/zephyr/pre_build.py.script similarity index 100% rename from esphome/components/nrf52/build_zephyr.py.script rename to esphome/components/zephyr/pre_build.py.script diff --git a/esphome/writer.py b/esphome/writer.py index 10e3c0ea0b..d5915cf812 100644 --- a/esphome/writer.py +++ b/esphome/writer.py @@ -310,8 +310,8 @@ def copy_src_tree(): CORE.relative_src_path("esphome.h"), ESPHOME_H_FORMAT.format(include_s + '\n#include "pio_includes.h"'), ) - elif CORE.is_nrf52: - from esphome.components.nrf52 import copy_files + elif CORE.using_zephyr: + from esphome.components.zephyr import copy_files copy_files() diff --git a/esphome/zephyr_tools.py b/esphome/zephyr_tools.py index 2775e519a3..d5ecdf40fb 100644 --- a/esphome/zephyr_tools.py +++ b/esphome/zephyr_tools.py @@ -8,7 +8,7 @@ from bleak import BleakScanner, BleakClient from bleak.exc import BleakDeviceNotFoundError, BleakDBusError from esphome.espota2 import ProgressBar -if sys.version_info >= (3, 10): +try: from smpclient.transport.ble import SMPBLETransport from smpclient.transport.serial import SMPSerialTransport from smpclient import SMPClient @@ -17,6 +17,8 @@ if sys.version_info >= (3, 10): from smpclient.requests.os_management import ResetWrite from smpclient.generics import error, success from smp.exceptions import SMPBadStartDelimiter +except ModuleNotFoundError: + pass SMP_SERVICE_UUID = "8D53DC1D-1DB7-4CD3-868B-8A527460AA84" @@ -89,7 +91,7 @@ def get_image_tlv_sha256(file): async def smpmgr_upload(config, host, firmware): if sys.version_info < (3, 10): - _LOGGER.error("smpmgr requires at least python 3.10") + _LOGGER.error("BLE OTA requires at least python 3.10") return 1 image_tlv_sha256 = get_image_tlv_sha256(firmware) if image_tlv_sha256 is None: diff --git a/requirements.txt b/requirements.txt index b4a403450a..f90dfa1291 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,11 +29,6 @@ pyparsing >= 3.0 argcomplete>=2.0.0 # for mcumgr -smp==1.0.0 -smpclient @ git+https://github.com/tomaszduda23/smpclient/@d25c8035ae2858fd41a106058297b619d58fbcb5 bleak==0.21.1 -pydantic==2.7.0 cbor2==5.6.1 -crcmod==1.7 -# pretty print by logging? rich==13.7.0