add some code

This commit is contained in:
2025-09-05 13:25:11 +08:00
parent 9ff0a99e7a
commit 3cf1229a85
8911 changed files with 2535396 additions and 0 deletions

View File

@@ -0,0 +1,225 @@
# spiffs_create_partition_assets
#
# Create a spiffs image of the specified directory on the host during build and optionally
# have the created image flashed using `idf.py flash`
function(spiffs_create_partition_assets partition base_dir)
# Define option flags (BOOL)
set(options FLASH_IN_PROJECT
FLASH_APPEND_APP
MMAP_SUPPORT_SJPG
MMAP_SUPPORT_SPNG
MMAP_SUPPORT_QOI
MMAP_SUPPORT_SQOI
MMAP_SUPPORT_RAW
MMAP_RAW_DITHER
MMAP_RAW_BGR_MODE)
# Define one-value arguments (STRING and INT)
set(one_value_args MMAP_FILE_SUPPORT_FORMAT
MMAP_SPLIT_HEIGHT
MMAP_RAW_FILE_FORMAT
MMAP_RAW_COLOR_FORMAT
IMPORT_INC_PATH)
# Define multi-value arguments
set(multi DEPENDS)
# Parse the arguments passed to the function
cmake_parse_arguments(arg
"${options}"
"${one_value_args}"
"${multi}"
"${ARGN}")
if(NOT DEFINED arg_MMAP_FILE_SUPPORT_FORMAT OR arg_MMAP_FILE_SUPPORT_FORMAT STREQUAL "")
message(FATAL_ERROR "MMAP_FILE_SUPPORT_FORMAT is empty. Please input the file suffixes you want (e.g .png, .jpg).")
endif()
if(arg_MMAP_SUPPORT_QOI AND (arg_MMAP_SUPPORT_SJPG OR arg_MMAP_SUPPORT_SPNG))
message(FATAL_ERROR "MMAP_SUPPORT_QOI depends on !MMAP_SUPPORT_SJPG && !MMAP_SUPPORT_SPNG.")
endif()
if(arg_MMAP_SUPPORT_SQOI AND NOT arg_MMAP_SUPPORT_QOI)
message(FATAL_ERROR "MMAP_SUPPORT_SQOI depends on MMAP_SUPPORT_QOI.")
endif()
if( (arg_MMAP_SUPPORT_SJPG OR arg_MMAP_SUPPORT_SPNG OR arg_MMAP_SUPPORT_SQOI) AND
(NOT DEFINED arg_MMAP_SPLIT_HEIGHT OR arg_MMAP_SPLIT_HEIGHT LESS 1) )
message(FATAL_ERROR "MMAP_SPLIT_HEIGHT must be defined and its value >= 1 when MMAP_SUPPORT_SJPG, MMAP_SUPPORT_SPNG, or MMAP_SUPPORT_SQOI is enabled.")
endif()
if(DEFINED arg_MMAP_SPLIT_HEIGHT)
if(NOT (arg_MMAP_SUPPORT_SJPG OR arg_MMAP_SUPPORT_SPNG OR arg_MMAP_SUPPORT_SQOI))
message(FATAL_ERROR "MMAP_SPLIT_HEIGHT depends on MMAP_SUPPORT_SJPG || MMAP_SUPPORT_SPNG || MMAP_SUPPORT_SQOI.")
endif()
endif()
if(arg_MMAP_SUPPORT_RAW AND (arg_MMAP_SUPPORT_SJPG OR arg_MMAP_SUPPORT_SPNG OR arg_MMAP_SUPPORT_QOI OR arg_MMAP_SUPPORT_SQOI))
message(FATAL_ERROR "MMAP_SUPPORT_RAW and MMAP_SUPPORT_SJPG/MMAP_SUPPORT_SPNG/MMAP_SUPPORT_QOI/MMAP_SUPPORT_SQOI cannot be enabled at the same time.")
endif()
# Try to install Pillow using pip
idf_build_get_property(python PYTHON)
execute_process(
COMMAND ${python} -c "import PIL"
RESULT_VARIABLE PIL_FOUND
OUTPUT_QUIET
ERROR_QUIET
)
if(NOT PIL_FOUND EQUAL 0)
message(STATUS "Pillow not found. Attempting to install it using pip...")
execute_process(
COMMAND ${python} -m pip install -U Pillow
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE error
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
if(result)
message(FATAL_ERROR "Failed to install Pillow using pip. Please install it manually.\nError: ${error}")
else()
message(STATUS "Pillow successfully installed.")
endif()
endif()
# Try to install qoi-conv using pip
execute_process(
COMMAND ${python} -c "import importlib; importlib.import_module('qoi-conv')"
RESULT_VARIABLE PIL_FOUND
OUTPUT_QUIET
ERROR_QUIET
)
if(NOT PIL_FOUND EQUAL 0)
message(STATUS "qoi-conv not found. Attempting to install it using pip...")
execute_process(
COMMAND ${python} -m pip install -U qoi-conv
RESULT_VARIABLE result
OUTPUT_VARIABLE output
ERROR_VARIABLE error
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
if(result)
message(FATAL_ERROR "Failed to install qoi-conv using pip. Please install it manually.\nError: ${error}")
else()
message(STATUS "qoi-conv successfully installed.")
endif()
endif()
get_filename_component(base_dir_full_path ${base_dir} ABSOLUTE)
get_filename_component(base_dir_name "${base_dir_full_path}" NAME)
partition_table_get_partition_info(size "--partition-name ${partition}" "size")
partition_table_get_partition_info(offset "--partition-name ${partition}" "offset")
if("${size}" AND "${offset}")
set(TARGET_COMPONENT "")
set(TARGET_COMPONENT_PATH "")
idf_build_get_property(build_components BUILD_COMPONENTS)
foreach(COMPONENT ${build_components})
if(COMPONENT MATCHES "esp_mmap_assets" OR COMPONENT MATCHES "espressif__esp_mmap_assets")
set(TARGET_COMPONENT ${COMPONENT})
break()
endif()
endforeach()
if(TARGET_COMPONENT STREQUAL "")
message(FATAL_ERROR "Component 'esp_mmap_assets' not found.")
else()
idf_component_get_property(TARGET_COMPONENT_PATH ${TARGET_COMPONENT} COMPONENT_DIR)
endif()
set(image_file ${CMAKE_BINARY_DIR}/mmap_build/${base_dir_name}/${partition}.bin)
set(MVMODEL_EXE ${TARGET_COMPONENT_PATH}/spiffs_assets_gen.py)
if(arg_MMAP_SUPPORT_RAW)
foreach(COMPONENT ${build_components})
if(COMPONENT MATCHES "^lvgl$" OR COMPONENT MATCHES "^lvgl__lvgl$")
set(lvgl_name ${COMPONENT})
if(COMPONENT STREQUAL "lvgl")
set(lvgl_ver $ENV{LVGL_VERSION})
else()
idf_component_get_property(lvgl_ver ${lvgl_name} COMPONENT_VERSION)
endif()
break()
endif()
endforeach()
if("${lvgl_ver}" STREQUAL "")
message("Could not determine LVGL version, assuming v8.x")
set(lvgl_ver "8.0.0")
endif()
message(STATUS "LVGL version: ${lvgl_ver}")
endif()
if(NOT arg_MMAP_SPLIT_HEIGHT)
set(arg_MMAP_SPLIT_HEIGHT 0) # Default value
endif()
# Handle IMPORT_INC_PATH parameter
if(DEFINED arg_IMPORT_INC_PATH)
set(import_include_path ${arg_IMPORT_INC_PATH})
else()
set(import_include_path ${CMAKE_CURRENT_LIST_DIR})
endif()
string(TOLOWER "${arg_MMAP_SUPPORT_SJPG}" support_sjpg)
string(TOLOWER "${arg_MMAP_SUPPORT_SPNG}" support_spng)
string(TOLOWER "${arg_MMAP_SUPPORT_QOI}" support_qoi)
string(TOLOWER "${arg_MMAP_SUPPORT_SQOI}" support_sqoi)
string(TOLOWER "${arg_MMAP_SUPPORT_RAW}" support_raw)
string(TOLOWER "${arg_MMAP_RAW_DITHER}" support_raw_dither)
string(TOLOWER "${arg_MMAP_RAW_BGR_MODE}" support_raw_bgr)
set(app_bin_path "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin")
set(CONFIG_FILE_PATH "${CMAKE_BINARY_DIR}/mmap_build/${base_dir_name}.json")
configure_file(
"${TARGET_COMPONENT_PATH}/config_template.json.in"
"${CONFIG_FILE_PATH}"
@ONLY
)
add_custom_target(assets_${partition}_bin ALL
COMMENT "Move and Pack assets..."
COMMAND python ${MVMODEL_EXE} --config "${CONFIG_FILE_PATH}"
DEPENDS ${arg_DEPENDS}
VERBATIM)
if(arg_FLASH_APPEND_APP)
add_custom_target(assets_${partition}_merge_bin ALL
COMMENT "Merge Bin..."
COMMAND python ${TARGET_COMPONENT_PATH}/spiffs_assets_gen.py --config "${CONFIG_FILE_PATH}" --merge
COMMAND ${CMAKE_COMMAND} -E rm "${build_dir}/.bin_timestamp" # Remove the timestamp file to force re-run
DEPENDS assets_${partition}_bin app
VERBATIM)
endif()
if(arg_FLASH_IN_PROJECT)
set(assets_target "assets_${partition}_bin")
if(arg_FLASH_APPEND_APP)
set(assets_target "assets_${partition}_merge_bin")
add_dependencies(app-flash ${assets_target})
else()
esptool_py_flash_to_partition(flash "${partition}" "${image_file}")
endif()
add_dependencies(flash ${assets_target})
endif()
else()
set(message "Failed to create assets bin for partition '${partition}'. "
"Check project configuration if using the correct partition table file.")
fail_at_build_time(assets_${partition}_bin "${message}")
endif()
endfunction()