From 44281091123cc6786c23df0c13184807736a8e05 Mon Sep 17 00:00:00 2001 From: loop Date: Tue, 21 Apr 2026 15:02:40 +0800 Subject: [PATCH] feat(basic_demo): sync builtin lua scripts from components --- application/basic_demo/.gitignore | 1 + application/basic_demo/CMakeLists.txt | 5 + .../scripts/builtin/audio_play_test_wav.lua | 31 --- .../scripts/builtin/button_play_test_wav.lua | 90 ------ .../fatfs_image/scripts/builtin/hello.lua | 1 - application/basic_demo/fatfs_image/test.wav | Bin 102340 -> 0 bytes .../lua_scripts/advance_audio_fft.lua} | 0 .../lua_scripts/advance_camera_preview.lua} | 0 .../lua_scripts/advance_clock_dial_demo.lua} | 0 .../lua_scripts/advance_flappybird.lua} | 0 .../lua_scripts/advance_lcd_touch_paint.lua} | 0 .../basic_demo/tools/cmake/skills_sync.cmake | 258 ++++++++++++++---- .../tools/sync_component_lua_scripts.py | 172 ++++++++++++ .../cap_boards/CMakeLists.txt | 1 + .../lua_scripts/basic_audio_record_play.lua | 0 .../lua_scripts/basic_button.lua | 0 .../lua_scripts/basic_camera_capture.lua | 0 .../lua_scripts/basic_display_demo.lua | 0 .../lua_scripts/basic_router_llm_analyze.lua | 43 +++ .../lua_scripts/basic_router_send_file.lua | 72 +++++ .../lua_scripts/basic_router_send_message.lua | 43 +++ .../lua_scripts/basic_lcd_touch_demo.lua | 0 .../lua_scripts/basic_led_strip.lua | 0 .../lua_scripts/basic_mcpwm_servo.lua | 0 .../lua_scripts/basic_system_info.lua | 0 25 files changed, 537 insertions(+), 180 deletions(-) delete mode 100644 application/basic_demo/fatfs_image/scripts/builtin/audio_play_test_wav.lua delete mode 100644 application/basic_demo/fatfs_image/scripts/builtin/button_play_test_wav.lua delete mode 100644 application/basic_demo/fatfs_image/scripts/builtin/hello.lua delete mode 100644 application/basic_demo/fatfs_image/test.wav rename application/basic_demo/{fatfs_image/scripts/builtin/audio_fft_2.lua => main/lua_scripts/advance_audio_fft.lua} (100%) rename application/basic_demo/{fatfs_image/scripts/builtin/camera_preview_demo.lua => main/lua_scripts/advance_camera_preview.lua} (100%) rename application/basic_demo/{fatfs_image/scripts/builtin/clock_dial_demo.lua => main/lua_scripts/advance_clock_dial_demo.lua} (100%) rename application/basic_demo/{fatfs_image/scripts/builtin/flappybird.lua => main/lua_scripts/advance_flappybird.lua} (100%) rename application/basic_demo/{fatfs_image/scripts/builtin/lcd_touch_paint.lua => main/lua_scripts/advance_lcd_touch_paint.lua} (100%) create mode 100755 application/basic_demo/tools/sync_component_lua_scripts.py rename application/basic_demo/fatfs_image/scripts/builtin/audio_demo.lua => components/lua_modules/lua_module_audio/lua_scripts/basic_audio_record_play.lua (100%) rename application/basic_demo/fatfs_image/scripts/builtin/button_demo.lua => components/lua_modules/lua_module_button/lua_scripts/basic_button.lua (100%) rename application/basic_demo/fatfs_image/scripts/builtin/camera_capture_demo.lua => components/lua_modules/lua_module_camera/lua_scripts/basic_camera_capture.lua (100%) rename application/basic_demo/fatfs_image/scripts/builtin/display_demo.lua => components/lua_modules/lua_module_display/lua_scripts/basic_display_demo.lua (100%) create mode 100644 components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_llm_analyze.lua create mode 100644 components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_file.lua create mode 100644 components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_message.lua rename application/basic_demo/fatfs_image/scripts/builtin/lcd_touch_demo.lua => components/lua_modules/lua_module_lcd_touch/lua_scripts/basic_lcd_touch_demo.lua (100%) rename application/basic_demo/fatfs_image/scripts/builtin/led_strip_demo.lua => components/lua_modules/lua_module_led_strip/lua_scripts/basic_led_strip.lua (100%) rename application/basic_demo/fatfs_image/scripts/builtin/mcpwm_servo.lua => components/lua_modules/lua_module_mcpwm/lua_scripts/basic_mcpwm_servo.lua (100%) rename application/basic_demo/fatfs_image/scripts/builtin/system_demo.lua => components/lua_modules/lua_module_system/lua_scripts/basic_system_info.lua (100%) diff --git a/application/basic_demo/.gitignore b/application/basic_demo/.gitignore index 7401846..77a4b4e 100644 --- a/application/basic_demo/.gitignore +++ b/application/basic_demo/.gitignore @@ -1 +1,2 @@ fatfs_image/skills +fatfs_image/scripts/builtin diff --git a/application/basic_demo/CMakeLists.txt b/application/basic_demo/CMakeLists.txt index cb88c04..a8f5541 100644 --- a/application/basic_demo/CMakeLists.txt +++ b/application/basic_demo/CMakeLists.txt @@ -15,3 +15,8 @@ basic_demo_enable_component_skills_sync( DEMO_SKILLS_DIR "${CMAKE_SOURCE_DIR}/fatfs_image/skills" MANIFEST_PATH "${CMAKE_BINARY_DIR}/component_skills_manifest.json" ) +basic_demo_enable_component_builtin_lua_sync( + TARGET fatfs_storage_bin + OUTPUT_DIR "${CMAKE_SOURCE_DIR}/fatfs_image/scripts/builtin" + MANIFEST_PATH "${CMAKE_BINARY_DIR}/component_builtin_lua_manifest.json" +) diff --git a/application/basic_demo/fatfs_image/scripts/builtin/audio_play_test_wav.lua b/application/basic_demo/fatfs_image/scripts/builtin/audio_play_test_wav.lua deleted file mode 100644 index 271b315..0000000 --- a/application/basic_demo/fatfs_image/scripts/builtin/audio_play_test_wav.lua +++ /dev/null @@ -1,31 +0,0 @@ -local audio = require("audio") -local bm = require("board_manager") -local storage = require("storage") - -local TEST_WAV_PATH = storage.join_path(storage.get_root_dir(), "test.wav") - -local output_codec, output_rate, output_channels, output_bits = - bm.get_audio_codec_output_params("audio_dac") -if not output_codec then - print("[audio_play_test_wav] ERROR: get_audio_codec_output_params(audio_dac) failed: " .. tostring(output_rate)) - return -end - -local output, out_err = audio.new_output(output_codec, output_rate, output_channels, output_bits) -if not output then - print("[audio_play_test_wav] ERROR: new_output failed: " .. tostring(out_err)) - return -end - -local ok, err = xpcall(function() - print(string.format("[audio_play_test_wav] output=%dHz/%dch/%dbit", - output_rate, output_channels, output_bits)) - print("[audio_play_test_wav] playing " .. TEST_WAV_PATH .. " ...") - audio.play_wav(output, TEST_WAV_PATH) -end, debug.traceback) - -pcall(audio.close, output) -if not ok then - error(err) -end -print("[audio_play_test_wav] done") diff --git a/application/basic_demo/fatfs_image/scripts/builtin/button_play_test_wav.lua b/application/basic_demo/fatfs_image/scripts/builtin/button_play_test_wav.lua deleted file mode 100644 index d2f1a43..0000000 --- a/application/basic_demo/fatfs_image/scripts/builtin/button_play_test_wav.lua +++ /dev/null @@ -1,90 +0,0 @@ --- Button single_click plays test.wav. Requires board_manager for audio_dac codec params only. --- Optional args: pin, duration_ms, poll_ms, test_wav (filename under FATFS root, default test.wav). --- Pattern: xpcall(run) + cleanup() closes button + audio; integer args via args table. -local audio = require("audio") -local bm = require("board_manager") -local btn = require("button") -local delay = require("delay") -local storage = require("storage") - -local a = type(args) == "table" and args or {} -local function int_arg(k, default) - local v = a[k] - if type(v) == "number" then - return math.floor(v) - end - return default -end - -local BUTTON_GPIO_NUM = int_arg("pin", 28) -local RUN_TIME_MS = int_arg("duration_ms", 60000) -local POLL_INTERVAL_MS = int_arg("poll_ms", 10) -local wav_name = (type(a.test_wav) == "string" and a.test_wav ~= "") and a.test_wav or "test.wav" -local TEST_WAV_PATH = storage.join_path(storage.get_root_dir(), wav_name) - -local output -local handle -local is_playing = false - -local function cleanup() - if handle then - pcall(btn.off, handle) - pcall(btn.close, handle) - handle = nil - end - if output then - pcall(audio.close, output) - output = nil - end -end - -local function run() - local output_codec, output_rate, output_channels, output_bits = - bm.get_audio_codec_output_params("audio_dac") - if not output_codec then - error("[button_play_test_wav] get_audio_codec_output_params(audio_dac) failed: " .. tostring(output_rate)) - end - - local out_h, out_err = audio.new_output(output_codec, output_rate, output_channels, output_bits) - if not out_h then - error("[button_play_test_wav] new_output failed: " .. tostring(out_err)) - end - output = out_h - - local btn_h, herr = btn.new(BUTTON_GPIO_NUM, 0) - if not btn_h then - error("[button_play_test_wav] button.new failed: " .. tostring(herr)) - end - handle = btn_h - - btn.on(handle, "single_click", function() - if is_playing then - print("[button_play_test_wav] playback already in progress") - return - end - - is_playing = true - print("[button_play_test_wav] playing " .. TEST_WAV_PATH .. " ...") - audio.play_wav(output, TEST_WAV_PATH) - print("[button_play_test_wav] playback done") - is_playing = false - end) - - print(string.format("[button_play_test_wav] button gpio=%d output=%dHz/%dch/%dbit wav=%s", - BUTTON_GPIO_NUM, output_rate, output_channels, output_bits, wav_name)) - print("[button_play_test_wav] press the button once to play") - print("[button_play_test_wav] running for " .. tostring(RUN_TIME_MS) .. " ms") - - for _ = 1, math.max(1, math.floor(RUN_TIME_MS / POLL_INTERVAL_MS)) do - btn.dispatch() - delay.delay_ms(POLL_INTERVAL_MS) - end -end - -local ok, err = xpcall(run, debug.traceback) -cleanup() -if not ok then - error(err) -end - -print("[button_play_test_wav] done") diff --git a/application/basic_demo/fatfs_image/scripts/builtin/hello.lua b/application/basic_demo/fatfs_image/scripts/builtin/hello.lua deleted file mode 100644 index 1c98aa9..0000000 --- a/application/basic_demo/fatfs_image/scripts/builtin/hello.lua +++ /dev/null @@ -1 +0,0 @@ -print("hello lua!") diff --git a/application/basic_demo/fatfs_image/test.wav b/application/basic_demo/fatfs_image/test.wav deleted file mode 100644 index 8148f8bf610ebe798c47769b33999e435369605a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102340 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 A^8f$< diff --git a/application/basic_demo/fatfs_image/scripts/builtin/audio_fft_2.lua b/application/basic_demo/main/lua_scripts/advance_audio_fft.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/audio_fft_2.lua rename to application/basic_demo/main/lua_scripts/advance_audio_fft.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/camera_preview_demo.lua b/application/basic_demo/main/lua_scripts/advance_camera_preview.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/camera_preview_demo.lua rename to application/basic_demo/main/lua_scripts/advance_camera_preview.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/clock_dial_demo.lua b/application/basic_demo/main/lua_scripts/advance_clock_dial_demo.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/clock_dial_demo.lua rename to application/basic_demo/main/lua_scripts/advance_clock_dial_demo.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/flappybird.lua b/application/basic_demo/main/lua_scripts/advance_flappybird.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/flappybird.lua rename to application/basic_demo/main/lua_scripts/advance_flappybird.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/lcd_touch_paint.lua b/application/basic_demo/main/lua_scripts/advance_lcd_touch_paint.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/lcd_touch_paint.lua rename to application/basic_demo/main/lua_scripts/advance_lcd_touch_paint.lua diff --git a/application/basic_demo/tools/cmake/skills_sync.cmake b/application/basic_demo/tools/cmake/skills_sync.cmake index a7fdbda..d951a7a 100644 --- a/application/basic_demo/tools/cmake/skills_sync.cmake +++ b/application/basic_demo/tools/cmake/skills_sync.cmake @@ -1,11 +1,14 @@ -function(basic_demo_collect_skill_components out_var) +function(basic_demo_collect_project_component_dirs out_var) + set(options INCLUDE_MAIN_DIR) + cmake_parse_arguments(arg "${options}" "" "" ${ARGN}) + idf_build_get_property(build_components BUILD_COMPONENTS) get_filename_component(project_root_dir "${CMAKE_SOURCE_DIR}" REALPATH) get_filename_component(shared_components_root "${CMAKE_SOURCE_DIR}/../../components" REALPATH) get_filename_component(managed_components_root "${CMAKE_SOURCE_DIR}/managed_components" REALPATH) - set(component_args) + set(component_specs) foreach(component_name IN LISTS build_components) idf_component_get_property(component_dir "${component_name}" COMPONENT_DIR) if(NOT component_dir) @@ -20,6 +23,85 @@ function(basic_demo_collect_skill_components out_var) if(component_dir MATCHES "^${project_root_dir}(/|$)" OR component_dir MATCHES "^${shared_components_root}(/|$)") + if(arg_INCLUDE_MAIN_DIR AND component_name STREQUAL "main") + continue() + endif() + list(APPEND component_specs "${component_name}=${component_dir}") + endif() + endforeach() + + if(arg_INCLUDE_MAIN_DIR) + get_filename_component(main_dir "${CMAKE_SOURCE_DIR}/main" REALPATH) + list(APPEND component_specs "__main__=${main_dir}") + endif() + + set(${out_var} "${component_specs}" PARENT_SCOPE) +endfunction() + +function(basic_demo_collect_component_resource_files out_var resource_subdir) + set(options INCLUDE_MAIN_DIR) + set(multi_value_args GLOB_PATTERNS) + cmake_parse_arguments(arg "${options}" "" "${multi_value_args}" ${ARGN}) + + if(NOT arg_GLOB_PATTERNS) + message(FATAL_ERROR "basic_demo_collect_component_resource_files requires GLOB_PATTERNS") + endif() + + basic_demo_collect_project_component_dirs(component_specs ${ARGN}) + + set(resource_files) + foreach(component_spec IN LISTS component_specs) + string(FIND "${component_spec}" "=" separator_index) + if(separator_index EQUAL -1) + message(FATAL_ERROR "Invalid component spec '${component_spec}'") + endif() + + math(EXPR path_index "${separator_index} + 1") + string(SUBSTRING "${component_spec}" ${path_index} -1 component_dir) + set(resource_dir "${component_dir}/${resource_subdir}") + + if(NOT EXISTS "${resource_dir}") + continue() + endif() + + foreach(glob_pattern IN LISTS arg_GLOB_PATTERNS) + file( + GLOB component_resource_files + CONFIGURE_DEPENDS + LIST_DIRECTORIES false + "${resource_dir}/${glob_pattern}" + ) + list(APPEND resource_files ${component_resource_files}) + endforeach() + endforeach() + + list(REMOVE_DUPLICATES resource_files) + set(${out_var} "${resource_files}" PARENT_SCOPE) +endfunction() + +function(basic_demo_append_component_args out_var) + set(options INCLUDE_MAIN_DIR) + set(one_value_args MAIN_DIR_ARG) + cmake_parse_arguments(arg "${options}" "${one_value_args}" "" ${ARGN}) + + basic_demo_collect_project_component_dirs(component_specs ${ARGN}) + + set(component_args) + foreach(component_spec IN LISTS component_specs) + string(FIND "${component_spec}" "=" separator_index) + if(separator_index EQUAL -1) + message(FATAL_ERROR "Invalid component spec '${component_spec}'") + endif() + + string(SUBSTRING "${component_spec}" 0 ${separator_index} component_name) + math(EXPR path_index "${separator_index} + 1") + string(SUBSTRING "${component_spec}" ${path_index} -1 component_dir) + + if(component_name STREQUAL "__main__") + if(arg_MAIN_DIR_ARG) + list(APPEND component_args "${arg_MAIN_DIR_ARG}" "${component_dir}") + endif() + else() list(APPEND component_args --component "${component_name}=${component_dir}") endif() endforeach() @@ -27,43 +109,89 @@ function(basic_demo_collect_skill_components out_var) set(${out_var} "${component_args}" PARENT_SCOPE) endfunction() -function(basic_demo_collect_skill_files out_var) - idf_build_get_property(build_components BUILD_COMPONENTS) +function(basic_demo_get_resource_generator_targets out_var resource_kind) + set(property_names "BASIC_DEMO_RESOURCE_GENERATOR_TARGETS_${resource_kind}") + if(resource_kind STREQUAL "skills") + list(APPEND property_names "BASIC_DEMO_SKILL_GENERATOR_TARGETS") + endif() - get_filename_component(project_root_dir "${CMAKE_SOURCE_DIR}" REALPATH) - get_filename_component(shared_components_root "${CMAKE_SOURCE_DIR}/../../components" REALPATH) - get_filename_component(managed_components_root "${CMAKE_SOURCE_DIR}/managed_components" REALPATH) - - set(skill_files) - foreach(component_name IN LISTS build_components) - idf_component_get_property(component_dir "${component_name}" COMPONENT_DIR) - if(NOT component_dir) - continue() + set(generator_targets) + foreach(property_name IN LISTS property_names) + get_property(property_set GLOBAL PROPERTY "${property_name}" SET) + if(property_set) + get_property(property_targets GLOBAL PROPERTY "${property_name}") + if(property_targets) + list(APPEND generator_targets ${property_targets}) + endif() endif() - - get_filename_component(component_dir "${component_dir}" REALPATH) - - if(component_dir MATCHES "^${managed_components_root}(/|$)") - continue() - endif() - - if(NOT (component_dir MATCHES "^${project_root_dir}(/|$)" OR - component_dir MATCHES "^${shared_components_root}(/|$)")) - continue() - endif() - - if(NOT EXISTS "${component_dir}/skills") - continue() - endif() - - file(GLOB component_skill_files CONFIGURE_DEPENDS LIST_DIRECTORIES false "${component_dir}/skills/*") - list(APPEND skill_files ${component_skill_files}) endforeach() - list(REMOVE_DUPLICATES skill_files) - set(${out_var} "${skill_files}" PARENT_SCOPE) + list(REMOVE_DUPLICATES generator_targets) + set(${out_var} "${generator_targets}" PARENT_SCOPE) endfunction() +function(basic_demo_enable_component_resource_sync) + set(options INCLUDE_MAIN_DIR) + set(one_value_args + TARGET + RESOURCE_KIND + RESOURCE_SUBDIR + OUTPUT_DIR + OUTPUT_ARG_NAME + MANIFEST_PATH + PYTHON_SCRIPT + STAMP_PATH + MAIN_DIR_ARG + COMMENT + ) + set(multi_value_args GLOB_PATTERNS SCRIPT_ARGS) + cmake_parse_arguments(arg "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) + + foreach(required_arg TARGET RESOURCE_KIND RESOURCE_SUBDIR OUTPUT_DIR OUTPUT_ARG_NAME MANIFEST_PATH PYTHON_SCRIPT STAMP_PATH COMMENT) + if(NOT arg_${required_arg}) + message(FATAL_ERROR "basic_demo_enable_component_resource_sync requires ${required_arg}") + endif() + endforeach() + + if(NOT arg_GLOB_PATTERNS) + message(FATAL_ERROR "basic_demo_enable_component_resource_sync requires GLOB_PATTERNS") + endif() + + idf_build_get_property(python PYTHON) + basic_demo_collect_component_resource_files( + resource_dependency_files + "${arg_RESOURCE_SUBDIR}" + ${ARGN} + ) + basic_demo_append_component_args(component_args ${ARGN}) + + add_custom_command( + OUTPUT "${arg_STAMP_PATH}" + COMMAND ${python} + "${arg_PYTHON_SCRIPT}" + --manifest-path "${arg_MANIFEST_PATH}" + "${arg_OUTPUT_ARG_NAME}" "${arg_OUTPUT_DIR}" + ${arg_SCRIPT_ARGS} + ${component_args} + COMMAND ${CMAKE_COMMAND} -E touch "${arg_STAMP_PATH}" + DEPENDS + "${arg_PYTHON_SCRIPT}" + ${resource_dependency_files} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMENT "${arg_COMMENT}" + VERBATIM + ) + + set(sync_target "basic_demo_sync_${arg_RESOURCE_KIND}") + add_custom_target(${sync_target} ALL DEPENDS "${arg_STAMP_PATH}") + + basic_demo_get_resource_generator_targets(generator_targets "${arg_RESOURCE_KIND}") + if(generator_targets) + add_dependencies(${sync_target} ${generator_targets}) + endif() + + add_dependencies(${arg_TARGET} ${sync_target}) +endfunction() function(basic_demo_enable_component_skills_sync) set(options) @@ -80,39 +208,53 @@ function(basic_demo_enable_component_skills_sync) message(FATAL_ERROR "basic_demo_enable_component_skills_sync requires MANIFEST_PATH") endif() - idf_build_get_property(python PYTHON) - basic_demo_collect_skill_components(skill_component_args) - basic_demo_collect_skill_files(skill_dependency_files) - set(skill_sync_extra_args) - set(skill_sync_stamp "${CMAKE_BINARY_DIR}/component_skills_sync.stamp") - + set(skill_sync_extra_args --demo-skills-dir "${arg_DEMO_SKILLS_DIR}") if(CONFIG_BASIC_DEMO_MEMORY_MODE_LIGHTWEIGHT) list(APPEND skill_sync_extra_args --exclude-skill-id memory_ops) endif() - add_custom_command( - OUTPUT "${skill_sync_stamp}" - COMMAND ${python} - "${CMAKE_SOURCE_DIR}/tools/sync_component_skills.py" - --demo-skills-dir "${arg_DEMO_SKILLS_DIR}" - --manifest-path "${arg_MANIFEST_PATH}" - ${skill_sync_extra_args} - ${skill_component_args} - COMMAND ${CMAKE_COMMAND} -E touch "${skill_sync_stamp}" - DEPENDS - "${CMAKE_SOURCE_DIR}/tools/sync_component_skills.py" - ${skill_dependency_files} - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + basic_demo_enable_component_resource_sync( + TARGET "${arg_TARGET}" + RESOURCE_KIND skills + RESOURCE_SUBDIR skills + OUTPUT_DIR "${arg_DEMO_SKILLS_DIR}" + OUTPUT_ARG_NAME --demo-skills-dir + MANIFEST_PATH "${arg_MANIFEST_PATH}" + PYTHON_SCRIPT "${CMAKE_SOURCE_DIR}/tools/sync_component_skills.py" + STAMP_PATH "${CMAKE_BINARY_DIR}/component_skills_sync.stamp" COMMENT "Sync component skills into fatfs_image/skills" - VERBATIM + GLOB_PATTERNS "*" + SCRIPT_ARGS ${skill_sync_extra_args} ) +endfunction() - add_custom_target(basic_demo_sync_skills ALL DEPENDS "${skill_sync_stamp}") +function(basic_demo_enable_component_builtin_lua_sync) + set(options) + set(one_value_args TARGET OUTPUT_DIR MANIFEST_PATH) + cmake_parse_arguments(arg "${options}" "${one_value_args}" "" ${ARGN}) - get_property(skill_generator_targets GLOBAL PROPERTY BASIC_DEMO_SKILL_GENERATOR_TARGETS) - if(skill_generator_targets) - add_dependencies(basic_demo_sync_skills ${skill_generator_targets}) + if(NOT arg_TARGET) + message(FATAL_ERROR "basic_demo_enable_component_builtin_lua_sync requires TARGET") + endif() + if(NOT arg_OUTPUT_DIR) + message(FATAL_ERROR "basic_demo_enable_component_builtin_lua_sync requires OUTPUT_DIR") + endif() + if(NOT arg_MANIFEST_PATH) + message(FATAL_ERROR "basic_demo_enable_component_builtin_lua_sync requires MANIFEST_PATH") endif() - add_dependencies(${arg_TARGET} basic_demo_sync_skills) + basic_demo_enable_component_resource_sync( + TARGET "${arg_TARGET}" + RESOURCE_KIND builtin_lua + RESOURCE_SUBDIR lua_scripts + OUTPUT_DIR "${arg_OUTPUT_DIR}" + OUTPUT_ARG_NAME --output-dir + MANIFEST_PATH "${arg_MANIFEST_PATH}" + PYTHON_SCRIPT "${CMAKE_SOURCE_DIR}/tools/sync_component_lua_scripts.py" + STAMP_PATH "${CMAKE_BINARY_DIR}/component_builtin_lua_sync.stamp" + MAIN_DIR_ARG --main-dir + INCLUDE_MAIN_DIR + COMMENT "Sync component builtin Lua scripts into fatfs_image/scripts/builtin" + GLOB_PATTERNS "*.lua" + ) endfunction() diff --git a/application/basic_demo/tools/sync_component_lua_scripts.py b/application/basic_demo/tools/sync_component_lua_scripts.py new file mode 100755 index 0000000..ee70ce8 --- /dev/null +++ b/application/basic_demo/tools/sync_component_lua_scripts.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +# +# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import annotations + +import argparse +import json +import shutil +import sys +from pathlib import Path + + +class LuaScriptSyncError(RuntimeError): + pass + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description='Sync component Lua scripts into the basic_demo FATFS image.' + ) + parser.add_argument('--output-dir', required=True) + parser.add_argument('--manifest-path', required=True) + parser.add_argument( + '--component', + action='append', + default=[], + help='Component mapping in the form =.', + ) + parser.add_argument( + '--main-dir', + help='Optional basic_demo main directory whose lua_scripts should be treated as builtin scripts.', + ) + return parser.parse_args() + + +def fail(message: str) -> None: + raise LuaScriptSyncError(message) + + +def load_json_file(path: Path) -> object: + try: + return json.loads(path.read_text(encoding='utf-8')) + except FileNotFoundError: + fail(f'Missing JSON file: {path}') + except json.JSONDecodeError as exc: + fail(f'Invalid JSON in {path}: {exc}') + + +def load_manifest(path: Path) -> dict: + if not path.exists(): + return {'synced_files': [], 'sources': {}} + + data = load_json_file(path) + if not isinstance(data, dict): + fail(f'Manifest must be a JSON object: {path}') + + synced_files = data.get('synced_files', []) + sources = data.get('sources', {}) + if not isinstance(synced_files, list): + fail(f"Manifest field 'synced_files' must be a JSON array: {path}") + if not isinstance(sources, dict): + fail(f"Manifest field 'sources' must be a JSON object: {path}") + + return { + 'synced_files': [str(item) for item in synced_files], + 'sources': {str(key): str(value) for key, value in sources.items()}, + } + + +def parse_component_specs(raw_specs: list[str]) -> list[tuple[str, Path]]: + components: list[tuple[str, Path]] = [] + + for spec in raw_specs: + if '=' not in spec: + fail(f"Invalid component mapping '{spec}', expected =.") + name, raw_dir = spec.split('=', 1) + if not name or not raw_dir: + fail(f"Invalid component mapping '{spec}', expected =.") + components.append((name, Path(raw_dir).resolve())) + + components.sort(key=lambda item: item[0]) + return components + + +def collect_builtin_lua_scripts( + components: list[tuple[str, Path]], + main_dir: Path | None, +) -> tuple[dict[str, Path], dict[str, str]]: + copy_map: dict[str, Path] = {} + source_map: dict[str, str] = {} + + source_specs = list(components) + if main_dir is not None: + source_specs.append(('main', main_dir.resolve())) + + for source_name, source_root in source_specs: + scripts_dir = source_root / 'lua_scripts' + if not scripts_dir.is_dir(): + continue + + for script_path in sorted(scripts_dir.glob('*.lua')): + if not script_path.is_file(): + continue + + script_name = script_path.name + previous_source = source_map.get(script_name) + if previous_source: + fail( + f"Duplicate builtin Lua script '{script_name}' between {previous_source} " + f"and {source_name} ({script_path})" + ) + + resolved_path = script_path.resolve() + copy_map[script_name] = resolved_path + source_map[script_name] = f'{source_name} ({resolved_path})' + + return copy_map, source_map + + +def sync_builtin_lua_scripts( + output_dir: Path, + manifest_path: Path, + manifest: dict, + copy_map: dict[str, Path], + source_map: dict[str, str], +) -> None: + output_dir.mkdir(parents=True, exist_ok=True) + + for old_file in manifest.get('synced_files', []): + if old_file not in copy_map: + stale_path = output_dir / old_file + if stale_path.exists(): + stale_path.unlink() + + for filename, source_path in copy_map.items(): + target_path = output_dir / filename + shutil.copy2(source_path, target_path) + + manifest_data = { + 'synced_files': sorted(copy_map.keys()), + 'sources': {filename: source_map[filename] for filename in sorted(source_map)}, + } + manifest_path.write_text( + json.dumps(manifest_data, ensure_ascii=False, indent=2) + '\n', + encoding='utf-8', + ) + + +def main() -> int: + args = parse_args() + + output_dir = Path(args.output_dir).resolve() + manifest_path = Path(args.manifest_path).resolve() + manifest_path.parent.mkdir(parents=True, exist_ok=True) + manifest = load_manifest(manifest_path) + + components = parse_component_specs(args.component) + main_dir = Path(args.main_dir).resolve() if args.main_dir else None + copy_map, source_map = collect_builtin_lua_scripts(components, main_dir) + sync_builtin_lua_scripts(output_dir, manifest_path, manifest, copy_map, source_map) + return 0 + + +if __name__ == '__main__': + try: + sys.exit(main()) + except LuaScriptSyncError as exc: + print(f'sync_component_lua_scripts.py: error: {exc}', file=sys.stderr) + sys.exit(1) diff --git a/components/claw_capabilities/cap_boards/CMakeLists.txt b/components/claw_capabilities/cap_boards/CMakeLists.txt index 1372c55..61a7630 100644 --- a/components/claw_capabilities/cap_boards/CMakeLists.txt +++ b/components/claw_capabilities/cap_boards/CMakeLists.txt @@ -26,3 +26,4 @@ add_custom_command( add_custom_target(cap_boards_generate_skill DEPENDS "${CAP_BOARDS_OUTPUT_MD}") add_dependencies(${COMPONENT_LIB} cap_boards_generate_skill) set_property(GLOBAL APPEND PROPERTY BASIC_DEMO_SKILL_GENERATOR_TARGETS cap_boards_generate_skill) +set_property(GLOBAL APPEND PROPERTY BASIC_DEMO_RESOURCE_GENERATOR_TARGETS_skills cap_boards_generate_skill) diff --git a/application/basic_demo/fatfs_image/scripts/builtin/audio_demo.lua b/components/lua_modules/lua_module_audio/lua_scripts/basic_audio_record_play.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/audio_demo.lua rename to components/lua_modules/lua_module_audio/lua_scripts/basic_audio_record_play.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/button_demo.lua b/components/lua_modules/lua_module_button/lua_scripts/basic_button.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/button_demo.lua rename to components/lua_modules/lua_module_button/lua_scripts/basic_button.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/camera_capture_demo.lua b/components/lua_modules/lua_module_camera/lua_scripts/basic_camera_capture.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/camera_capture_demo.lua rename to components/lua_modules/lua_module_camera/lua_scripts/basic_camera_capture.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/display_demo.lua b/components/lua_modules/lua_module_display/lua_scripts/basic_display_demo.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/display_demo.lua rename to components/lua_modules/lua_module_display/lua_scripts/basic_display_demo.lua diff --git a/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_llm_analyze.lua b/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_llm_analyze.lua new file mode 100644 index 0000000..39667c2 --- /dev/null +++ b/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_llm_analyze.lua @@ -0,0 +1,43 @@ +local event_publisher = require("event_publisher") + +local a = type(args) == "table" and args or {} + +local channel = a.channel +local chat_id = a.chat_id +local analyze_text = a.analyze_text or a.text or "Please analyze this text with llm: " + +local function require_string(name, value) + if type(value) ~= "string" or value == "" then + error("missing args." .. name) + end +end + +require_string("channel", channel) +require_string("chat_id", chat_id) + +print(string.format( + "[event_router_demo] publish trigger event_key=%s channel=%s chat_id=%s", + "lua_llm_analyze", + channel, + chat_id +)) + +event_publisher.publish({ + source_cap = "lua_script", + event_type = "trigger", + source_channel = channel, + target_channel = channel, + chat_id = chat_id, + content_type = "trigger", + message_id = "lua_llm_analyze", + correlation_id = "lua_llm_analyze", + text = analyze_text, + session_policy = "trigger", + payload = { + channel = channel, + chat_id = chat_id, + text = analyze_text, + }, +}) + +print("[event_router_demo] llm analyze trigger published") diff --git a/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_file.lua b/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_file.lua new file mode 100644 index 0000000..c69f5ec --- /dev/null +++ b/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_file.lua @@ -0,0 +1,72 @@ +local event_publisher = require("event_publisher") +local storage = require("storage") + +local a = type(args) == "table" and args or {} + +local channel = a.channel +local chat_id = a.chat_id +local file_caption = a.file_caption or a.caption or "lua trigger demo file" +local root_dir = storage.get_root_dir() +local demo_dir = storage.join_path(root_dir, "demo") +local demo_file_path = a.file_path or storage.join_path(demo_dir, "lua_event_router_demo.txt") + +local function require_string(name, value) + if type(value) ~= "string" or value == "" then + error("missing args." .. name) + end +end + +local function file_event_key_for_channel(name) + if name == "qq" then + return "lua_qq_send_file" + end + if name == "telegram" then + return "lua_tg_send_file" + end + if name == "feishu" then + return "lua_feishu_send_file" + end + error("file send only supports qq / telegram / feishu, got channel=" .. tostring(name)) +end + +require_string("channel", channel) +require_string("chat_id", chat_id) + +storage.mkdir(demo_dir) +storage.write_file(demo_file_path, table.concat({ + "lua event router demo", + "channel=" .. channel, + "chat_id=" .. chat_id, + "caption=" .. file_caption, +}, "\n") .. "\n") + +local event_key = file_event_key_for_channel(channel) + +print(string.format( + "[event_router_demo] publish trigger event_key=%s channel=%s chat_id=%s path=%s", + event_key, + channel, + chat_id, + demo_file_path +)) + +event_publisher.publish({ + source_cap = "lua_script", + event_type = "trigger", + source_channel = channel, + target_channel = channel, + chat_id = chat_id, + content_type = "trigger", + message_id = event_key, + correlation_id = event_key, + text = file_caption, + session_policy = "trigger", + payload = { + channel = channel, + chat_id = chat_id, + path = demo_file_path, + caption = file_caption, + }, +}) + +print("[event_router_demo] send file trigger published path=" .. demo_file_path) diff --git a/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_message.lua b/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_message.lua new file mode 100644 index 0000000..ac710fc --- /dev/null +++ b/components/lua_modules/lua_module_event_publisher/lua_scripts/basic_router_send_message.lua @@ -0,0 +1,43 @@ +local event_publisher = require("event_publisher") + +local a = type(args) == "table" and args or {} + +local channel = a.channel +local chat_id = a.chat_id +local message_text = a.message_text or a.text or "hello from lua event_router" + +local function require_string(name, value) + if type(value) ~= "string" or value == "" then + error("missing args." .. name) + end +end + +require_string("channel", channel) +require_string("chat_id", chat_id) + +print(string.format( + "[event_router_demo] publish trigger event_key=%s channel=%s chat_id=%s", + "lua_im_send_message", + channel, + chat_id +)) + +event_publisher.publish({ + source_cap = "lua_script", + event_type = "trigger", + source_channel = channel, + target_channel = channel, + chat_id = chat_id, + content_type = "trigger", + message_id = "lua_im_send_message", + correlation_id = "lua_im_send_message", + text = message_text, + session_policy = "trigger", + payload = { + channel = channel, + chat_id = chat_id, + text = message_text, + }, +}) + +print("[event_router_demo] send message trigger published") diff --git a/application/basic_demo/fatfs_image/scripts/builtin/lcd_touch_demo.lua b/components/lua_modules/lua_module_lcd_touch/lua_scripts/basic_lcd_touch_demo.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/lcd_touch_demo.lua rename to components/lua_modules/lua_module_lcd_touch/lua_scripts/basic_lcd_touch_demo.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/led_strip_demo.lua b/components/lua_modules/lua_module_led_strip/lua_scripts/basic_led_strip.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/led_strip_demo.lua rename to components/lua_modules/lua_module_led_strip/lua_scripts/basic_led_strip.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/mcpwm_servo.lua b/components/lua_modules/lua_module_mcpwm/lua_scripts/basic_mcpwm_servo.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/mcpwm_servo.lua rename to components/lua_modules/lua_module_mcpwm/lua_scripts/basic_mcpwm_servo.lua diff --git a/application/basic_demo/fatfs_image/scripts/builtin/system_demo.lua b/components/lua_modules/lua_module_system/lua_scripts/basic_system_info.lua similarity index 100% rename from application/basic_demo/fatfs_image/scripts/builtin/system_demo.lua rename to components/lua_modules/lua_module_system/lua_scripts/basic_system_info.lua