diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 94276a472..43ddf09f0 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,41 +1,41 @@ # Define source files set(SOURCES "audio/audio_codec.cc" - "audio/audio_service.cc" - "audio/codecs/no_audio_codec.cc" - "audio/codecs/box_audio_codec.cc" - "audio/codecs/es8311_audio_codec.cc" - "audio/codecs/es8374_audio_codec.cc" - "audio/codecs/es8388_audio_codec.cc" - "audio/codecs/es8389_audio_codec.cc" - "audio/codecs/dummy_audio_codec.cc" - "audio/processors/audio_debugger.cc" - "led/single_led.cc" - "led/circular_strip.cc" - "led/gpio_led.cc" - "display/display.cc" - "display/lcd_display.cc" - "display/oled_display.cc" - "display/lvgl_display/lvgl_display.cc" - "display/emote_display.cc" - "display/lvgl_display/emoji_collection.cc" - "display/lvgl_display/lvgl_theme.cc" - "display/lvgl_display/lvgl_font.cc" - "display/lvgl_display/lvgl_image.cc" - "display/lvgl_display/gif/lvgl_gif.cc" - "display/lvgl_display/gif/gifdec.c" - "display/lvgl_display/jpg/image_to_jpeg.cpp" - "protocols/protocol.cc" - "protocols/mqtt_protocol.cc" - "protocols/websocket_protocol.cc" - "mcp_server.cc" - "system_info.cc" - "application.cc" - "ota.cc" - "settings.cc" - "device_state_event.cc" - "assets.cc" - "main.cc" - ) + "audio/audio_service.cc" + "audio/codecs/no_audio_codec.cc" + "audio/codecs/box_audio_codec.cc" + "audio/codecs/es8311_audio_codec.cc" + "audio/codecs/es8374_audio_codec.cc" + "audio/codecs/es8388_audio_codec.cc" + "audio/codecs/es8389_audio_codec.cc" + "audio/codecs/dummy_audio_codec.cc" + "audio/processors/audio_debugger.cc" + "led/single_led.cc" + "led/circular_strip.cc" + "led/gpio_led.cc" + "display/display.cc" + "display/lcd_display.cc" + "display/oled_display.cc" + "display/lvgl_display/lvgl_display.cc" + "display/emote_display.cc" + "display/lvgl_display/emoji_collection.cc" + "display/lvgl_display/lvgl_theme.cc" + "display/lvgl_display/lvgl_font.cc" + "display/lvgl_display/lvgl_image.cc" + "display/lvgl_display/gif/lvgl_gif.cc" + "display/lvgl_display/gif/gifdec.c" + "display/lvgl_display/jpg/image_to_jpeg.cpp" + "protocols/protocol.cc" + "protocols/mqtt_protocol.cc" + "protocols/websocket_protocol.cc" + "mcp_server.cc" + "system_info.cc" + "application.cc" + "ota.cc" + "settings.cc" + "device_state_event.cc" + "assets.cc" + "main.cc" +) set(INCLUDE_DIRS "." "display" "display/lvgl_display" "display/lvgl_display/jpg" "audio" "protocols") @@ -47,14 +47,14 @@ list(APPEND INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/boards/common) idf_build_get_property(build_components BUILD_COMPONENTS) # Function to find component dynamically by pattern function(find_component_by_pattern PATTERN COMPONENT_VAR PATH_VAR) - foreach(COMPONENT ${build_components}) - if(COMPONENT MATCHES "${PATTERN}") + foreach (COMPONENT ${build_components}) + if (COMPONENT MATCHES "${PATTERN}") set(${COMPONENT_VAR} ${COMPONENT} PARENT_SCOPE) idf_component_get_property(COMPONENT_PATH ${COMPONENT} COMPONENT_DIR) set(${PATH_VAR} "${COMPONENT_PATH}" PARENT_SCOPE) break() - endif() - endforeach() + endif () + endforeach () endfunction() # Set default BUILTIN_TEXT_FONT and BUILTIN_ICON_FONT @@ -63,560 +63,563 @@ set(BUILTIN_ICON_FONT font_awesome_14_1) # Add board files according to BOARD_TYPE # Set default assets if the board uses partition table V2 -if(CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI) +if (CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI) set(BOARD_TYPE "bread-compact-wifi") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ML307) +elseif (CONFIG_BOARD_TYPE_BREAD_COMPACT_ML307) set(BOARD_TYPE "bread-compact-ml307") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32) +elseif (CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32) set(BOARD_TYPE "bread-compact-esp32") -elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32_LCD) +elseif (CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32_LCD) set(BOARD_TYPE "bread-compact-esp32-lcd") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_DF_K10) +elseif (CONFIG_BOARD_TYPE_DF_K10) set(BOARD_TYPE "df-k10") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_DF_S3_AI_CAM) +elseif (CONFIG_BOARD_TYPE_DF_S3_AI_CAM) set(BOARD_TYPE "df-s3-ai-cam") -elseif(CONFIG_BOARD_TYPE_ESP_BOX_3) +elseif (CONFIG_BOARD_TYPE_ESP_BOX_3) set(BOARD_TYPE "esp-box-3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP_BOX) +elseif (CONFIG_BOARD_TYPE_ESP_BOX) set(BOARD_TYPE "esp-box") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP_BOX_LITE) +elseif (CONFIG_BOARD_TYPE_ESP_BOX_LITE) set(BOARD_TYPE "esp-box-lite") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_KEVIN_BOX_1) +elseif (CONFIG_BOARD_TYPE_KEVIN_BOX_1) set(BOARD_TYPE "kevin-box-1") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_KEVIN_BOX_2) +elseif (CONFIG_BOARD_TYPE_KEVIN_BOX_2) set(BOARD_TYPE "kevin-box-2") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_KEVIN_C3) +elseif (CONFIG_BOARD_TYPE_KEVIN_C3) set(BOARD_TYPE "kevin-c3") -elseif(CONFIG_BOARD_TYPE_KEVIN_SP_V3_DEV) +elseif (CONFIG_BOARD_TYPE_KEVIN_SP_V3_DEV) set(BOARD_TYPE "kevin-sp-v3-dev") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_KEVIN_SP_V4_DEV) +elseif (CONFIG_BOARD_TYPE_KEVIN_SP_V4_DEV) set(BOARD_TYPE "kevin-sp-v4-dev") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_KEVIN_YUYING_313LCD) +elseif (CONFIG_BOARD_TYPE_KEVIN_YUYING_313LCD) set(BOARD_TYPE "kevin-yuying-313lcd") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_LICHUANG_DEV) +elseif (CONFIG_BOARD_TYPE_LICHUANG_DEV) set(BOARD_TYPE "lichuang-dev") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_LICHUANG_C3_DEV) +elseif (CONFIG_BOARD_TYPE_LICHUANG_C3_DEV) set(BOARD_TYPE "lichuang-c3-dev") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_MAGICLICK_2P4) +elseif (CONFIG_BOARD_TYPE_MAGICLICK_2P4) set(BOARD_TYPE "magiclick-2p4") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_MAGICLICK_2P5) +elseif (CONFIG_BOARD_TYPE_MAGICLICK_2P5) set(BOARD_TYPE "magiclick-2p5") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_MAGICLICK_C3) +elseif (CONFIG_BOARD_TYPE_MAGICLICK_C3) set(BOARD_TYPE "magiclick-c3") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_MAGICLICK_C3_V2) +elseif (CONFIG_BOARD_TYPE_MAGICLICK_C3_V2) set(BOARD_TYPE "magiclick-c3-v2") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_M5STACK_CORE_S3) +elseif (CONFIG_BOARD_TYPE_M5STACK_CORE_S3) set(BOARD_TYPE "m5stack-core-s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_M5STACK_CORE_TAB5) +elseif (CONFIG_BOARD_TYPE_M5STACK_CORE_TAB5) set(BOARD_TYPE "m5stack-tab5") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ATOMS3_ECHO_BASE) +elseif (CONFIG_BOARD_TYPE_ATOMS3_ECHO_BASE) set(BOARD_TYPE "atoms3-echo-base") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_ATOMS3R_ECHO_BASE) +elseif (CONFIG_BOARD_TYPE_ATOMS3R_ECHO_BASE) set(BOARD_TYPE "atoms3r-echo-base") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_ATOMS3R_CAM_M12_ECHO_BASE) +elseif (CONFIG_BOARD_TYPE_ATOMS3R_CAM_M12_ECHO_BASE) set(BOARD_TYPE "atoms3r-cam-m12-echo-base") -elseif(CONFIG_BOARD_TYPE_ATOM_ECHOS3R) +elseif (CONFIG_BOARD_TYPE_ATOM_ECHOS3R) set(BOARD_TYPE "atom-echos3r") -elseif(CONFIG_BOARD_TYPE_ATOMMATRIX_ECHO_BASE) +elseif (CONFIG_BOARD_TYPE_ATOMMATRIX_ECHO_BASE) set(BOARD_TYPE "atommatrix-echo-base") -elseif(CONFIG_BOARD_TYPE_XMINI_C3_V3) +elseif (CONFIG_BOARD_TYPE_XMINI_C3_V3) set(BOARD_TYPE "xmini-c3-v3") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_XMINI_C3_4G) +elseif (CONFIG_BOARD_TYPE_XMINI_C3_4G) set(BOARD_TYPE "xmini-c3-4g") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_XMINI_C3) +elseif (CONFIG_BOARD_TYPE_XMINI_C3) set(BOARD_TYPE "xmini-c3") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_ESP32S3_KORVO2_V3) +elseif (CONFIG_BOARD_TYPE_ESP32S3_KORVO2_V3) set(BOARD_TYPE "esp32s3-korvo2-v3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP_SPARKBOT) +elseif (CONFIG_BOARD_TYPE_ESP_SPARKBOT) set(BOARD_TYPE "esp-sparkbot") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP_SPOT_S3) +elseif (CONFIG_BOARD_TYPE_ESP_SPOT_S3) set(BOARD_TYPE "esp-spot-s3") -elseif(CONFIG_BOARD_TYPE_ESP_HI) +elseif (CONFIG_BOARD_TYPE_ESP_HI) set(BOARD_TYPE "esp-hi") # Set ESP_HI emoji directory for DEFAULT_ASSETS_EXTRA_FILES set(DEFAULT_ASSETS_EXTRA_FILES "${CMAKE_BINARY_DIR}/emoji") -elseif(CONFIG_BOARD_TYPE_ECHOEAR) +elseif (CONFIG_BOARD_TYPE_ECHOEAR) set(BOARD_TYPE "echoear") set(BUILTIN_TEXT_FONT font_puhui_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_AUDIO_BOARD) +elseif (CONFIG_BOARD_TYPE_ESP32S3_AUDIO_BOARD) set(BOARD_TYPE "waveshare-s3-audio-board") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_8) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_8) set(BOARD_TYPE "esp32-s3-touch-amoled-1.8") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_2_06) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_2_06) set(BOARD_TYPE "waveshare-s3-touch-amoled-2.06") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_4B) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_4B) set(BOARD_TYPE "waveshare-s3-touch-lcd-4b") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_75) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_75) set(BOARD_TYPE "waveshare-s3-touch-amoled-1.75") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_85C) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_85C) set(BOARD_TYPE "esp32-s3-touch-lcd-1.85c") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_85) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_85) set(BOARD_TYPE "esp32-s3-touch-lcd-1.85") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_46) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_46) set(BOARD_TYPE "esp32-s3-touch-lcd-1.46") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_3_5) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_3_5) set(BOARD_TYPE "esp32-s3-touch-lcd-3.5") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_3_5B) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_3_5B) set(BOARD_TYPE "waveshare-s3-touch-lcd-3.5b") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_3_49) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_3_49) set(BOARD_TYPE "waveshare-s3-touch-lcd-3.49") set(LVGL_TEXT_FONT font_puhui_basic_30_4) set(LVGL_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32C6_LCD_1_69) +elseif (CONFIG_BOARD_TYPE_ESP32C6_LCD_1_69) set(BOARD_TYPE "waveshare-c6-lcd-1.69") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32C6_Touch_AMOLED_1_43) +elseif (CONFIG_BOARD_TYPE_ESP32C6_Touch_AMOLED_1_43) set(BOARD_TYPE "waveshare-c6-touch-amoled-1.43") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32P4_NANO) +elseif (CONFIG_BOARD_TYPE_ESP32P4_NANO) set(BOARD_TYPE "waveshare-p4-nano") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_4B) +elseif (CONFIG_BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_4B) set(BOARD_TYPE "waveshare-p4-wifi6-touch-lcd-4b") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_7B) +elseif (CONFIG_BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_7B) set(BOARD_TYPE "waveshare-p4-wifi6-touch-lcd-7b") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_XC) +elseif (CONFIG_BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_XC) set(BOARD_TYPE "waveshare-p4-wifi6-touch-lcd-xc") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI_LCD) +elseif (CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI_LCD) set(BOARD_TYPE "bread-compact-wifi-lcd") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_TUDOUZI) +elseif (CONFIG_BOARD_TYPE_TUDOUZI) set(BOARD_TYPE "tudouzi") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_LILYGO_T_CIRCLE_S3) +elseif (CONFIG_BOARD_TYPE_LILYGO_T_CIRCLE_S3) set(BOARD_TYPE "lilygo-t-circle-s3") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_0_V1_1) +elseif (CONFIG_BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_0_V1_1) set(BOARD_TYPE "lilygo-t-cameraplus-s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_2) +elseif (CONFIG_BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_2) set(BOARD_TYPE "lilygo-t-cameraplus-s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA) +elseif (CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA) set(BOARD_TYPE "lilygo-t-display-s3-pro-mvsrlora") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_P4) +elseif (CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_P4) set(BOARD_TYPE "lilygo-t-display-p4") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_MOVECALL_MOJI_ESP32S3) +elseif (CONFIG_BOARD_TYPE_MOVECALL_MOJI_ESP32S3) set(BOARD_TYPE "movecall-moji-esp32s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_MOVECALL_CUICAN_ESP32S3) +elseif (CONFIG_BOARD_TYPE_MOVECALL_CUICAN_ESP32S3) set(BOARD_TYPE "movecall-cuican-esp32s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3) +elseif (CONFIG_BOARD_TYPE_ATK_DNESP32S3) set(BOARD_TYPE "atk-dnesp32s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX) +elseif (CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX) set(BOARD_TYPE "atk-dnesp32s3-box") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX0) +elseif (CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX0) set(BOARD_TYPE "atk-dnesp32s3-box0") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX2_WIFI) +elseif (CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX2_WIFI) set(BOARD_TYPE "atk-dnesp32s3-box2-wifi") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX2_4G) +elseif (CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX2_4G) set(BOARD_TYPE "atk-dnesp32s3-box2-4g") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3M_WIFI) +elseif (CONFIG_BOARD_TYPE_ATK_DNESP32S3M_WIFI) set(BOARD_TYPE "atk-dnesp32s3m-wifi") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3M_4G) +elseif (CONFIG_BOARD_TYPE_ATK_DNESP32S3M_4G) set(BOARD_TYPE "atk-dnesp32s3m-4g") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_DU_CHATX) +elseif (CONFIG_BOARD_TYPE_DU_CHATX) set(BOARD_TYPE "du-chatx") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_ESP32S3_Taiji_Pi) +elseif (CONFIG_BOARD_TYPE_ESP32S3_Taiji_Pi) set(BOARD_TYPE "taiji-pi-s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_0_85TFT_WIFI) +elseif (CONFIG_BOARD_TYPE_XINGZHI_Cube_0_85TFT_WIFI) set(BOARD_TYPE "xingzhi-cube-0.85tft-wifi") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_0_85TFT_ML307) +elseif (CONFIG_BOARD_TYPE_XINGZHI_Cube_0_85TFT_ML307) set(BOARD_TYPE "xingzhi-cube-0.85tft-ml307") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_WIFI) +elseif (CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_WIFI) set(BOARD_TYPE "xingzhi-cube-0.96oled-wifi") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_ML307) +elseif (CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_ML307) set(BOARD_TYPE "xingzhi-cube-0.96oled-ml307") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_WIFI) +elseif (CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_WIFI) set(BOARD_TYPE "xingzhi-cube-1.54tft-wifi") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_ML307) +elseif (CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_ML307) set(BOARD_TYPE "xingzhi-cube-1.54tft-ml307") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_SENSECAP_WATCHER) +elseif (CONFIG_BOARD_TYPE_SENSECAP_WATCHER) set(BOARD_TYPE "sensecap-watcher") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_DOIT_S3_AIBOX) +elseif (CONFIG_BOARD_TYPE_DOIT_S3_AIBOX) set(BOARD_TYPE "doit-s3-aibox") -elseif(CONFIG_BOARD_TYPE_MIXGO_NOVA) +elseif (CONFIG_BOARD_TYPE_MIXGO_NOVA) set(BOARD_TYPE "mixgo-nova") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_GENJUTECH_S3_1_54TFT) +elseif (CONFIG_BOARD_TYPE_GENJUTECH_S3_1_54TFT) set(BOARD_TYPE "genjutech-s3-1.54tft") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32_CGC) +elseif (CONFIG_BOARD_TYPE_ESP32_CGC) set(BOARD_TYPE "esp32-cgc") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_ESP32_CGC_144) +elseif (CONFIG_BOARD_TYPE_ESP32_CGC_144) set(BOARD_TYPE "esp32-cgc-144") set(BUILTIN_TEXT_FONT font_puhui_basic_14_1) set(BUILTIN_ICON_FONT font_awesome_14_1) -elseif(CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board) +elseif (CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board) set(BOARD_TYPE "esp-s3-lcd-ev-board") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board_2) +elseif (CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board_2) set(BOARD_TYPE "esp-s3-lcd-ev-board-2") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_WIFI) +elseif (CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_WIFI) set(BOARD_TYPE "zhengchen-1.54tft-wifi") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_MINSI_K08_DUAL) +elseif (CONFIG_BOARD_TYPE_MINSI_K08_DUAL) set(BOARD_TYPE "minsi-k08-dual") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307) +elseif (CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307) set(BOARD_TYPE "zhengchen-1.54tft-ml307") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_ESP32_S3_1_54_MUMA) +elseif (CONFIG_BOARD_TYPE_ESP32_S3_1_54_MUMA) set(BOARD_TYPE "sp-esp32-s3-1.54-muma") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_ESP32_S3_1_28_BOX) +elseif (CONFIG_BOARD_TYPE_ESP32_S3_1_28_BOX) set(BOARD_TYPE "sp-esp32-s3-1.28-box") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_OTTO_ROBOT) +elseif (CONFIG_BOARD_TYPE_OTTO_ROBOT) set(BOARD_TYPE "otto-robot") set(BUILTIN_TEXT_FONT font_puhui_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) -elseif(CONFIG_BOARD_TYPE_ELECTRON_BOT) +elseif (CONFIG_BOARD_TYPE_ELECTRON_BOT) set(BOARD_TYPE "electron-bot") set(BUILTIN_TEXT_FONT font_puhui_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) -elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI_CAM) +elseif (CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI_CAM) set(BOARD_TYPE "bread-compact-wifi-s3cam") set(BUILTIN_TEXT_FONT font_puhui_basic_16_4) set(BUILTIN_ICON_FONT font_awesome_16_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_JIUCHUAN) +elseif (CONFIG_BOARD_TYPE_JIUCHUAN) set(BOARD_TYPE "jiuchuan-s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_LABPLUS_MPYTHON_V3) +elseif (CONFIG_BOARD_TYPE_LABPLUS_MPYTHON_V3) set(BOARD_TYPE "labplus-mpython-v3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_LABPLUS_LEDONG_V2) +elseif (CONFIG_BOARD_TYPE_LABPLUS_LEDONG_V2) set(BOARD_TYPE "labplus-ledong-v2") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_SURFER_C3_1_14TFT) +elseif (CONFIG_BOARD_TYPE_SURFER_C3_1_14TFT) set(BOARD_TYPE "surfer-c3-1.14tft") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_32) -elseif(CONFIG_BOARD_TYPE_YUNLIAO_S3) +elseif (CONFIG_BOARD_TYPE_YUNLIAO_S3) set(BOARD_TYPE "yunliao-s3") set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) set(BUILTIN_ICON_FONT font_awesome_20_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -elseif(CONFIG_BOARD_TYPE_WTP4C5MP07S) +elseif (CONFIG_BOARD_TYPE_WTP4C5MP07S) set(BOARD_TYPE "wireless-tag-wtp4c5mp07s") set(BUILTIN_TEXT_FONT font_puhui_basic_30_4) set(BUILTIN_ICON_FONT font_awesome_30_4) set(DEFAULT_EMOJI_COLLECTION twemoji_64) -endif() +endif () file(GLOB BOARD_SOURCES - ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc - ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc + ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.c ) list(APPEND SOURCES ${BOARD_SOURCES}) # Select audio processor according to Kconfig -if(CONFIG_USE_AUDIO_PROCESSOR) +if (CONFIG_USE_AUDIO_PROCESSOR) list(APPEND SOURCES "audio/processors/afe_audio_processor.cc") -else() +else () list(APPEND SOURCES "audio/processors/no_audio_processor.cc") -endif() -if(CONFIG_IDF_TARGET_ESP32S3 OR CONFIG_IDF_TARGET_ESP32P4) +endif () +if (CONFIG_USE_ESP_BLUFI_WIFI_PROVISIONING) + list(APPEND SOURCES "boards/common/blufi.cpp") +endif () +if (CONFIG_IDF_TARGET_ESP32S3 OR CONFIG_IDF_TARGET_ESP32P4) list(APPEND SOURCES "audio/wake_words/afe_wake_word.cc") list(APPEND SOURCES "audio/wake_words/custom_wake_word.cc") -else() +else () list(APPEND SOURCES "audio/wake_words/esp_wake_word.cc") -endif() +endif () # Select language directory according to Kconfig -if(CONFIG_LANGUAGE_ZH_CN) +if (CONFIG_LANGUAGE_ZH_CN) set(LANG_DIR "zh-CN") -elseif(CONFIG_LANGUAGE_ZH_TW) +elseif (CONFIG_LANGUAGE_ZH_TW) set(LANG_DIR "zh-TW") -elseif(CONFIG_LANGUAGE_EN_US) +elseif (CONFIG_LANGUAGE_EN_US) set(LANG_DIR "en-US") -elseif(CONFIG_LANGUAGE_JA_JP) +elseif (CONFIG_LANGUAGE_JA_JP) set(LANG_DIR "ja-JP") -elseif(CONFIG_LANGUAGE_KO_KR) +elseif (CONFIG_LANGUAGE_KO_KR) set(LANG_DIR "ko-KR") -elseif(CONFIG_LANGUAGE_VI_VN) +elseif (CONFIG_LANGUAGE_VI_VN) set(LANG_DIR "vi-VN") -elseif(CONFIG_LANGUAGE_TH_TH) +elseif (CONFIG_LANGUAGE_TH_TH) set(LANG_DIR "th-TH") -elseif(CONFIG_LANGUAGE_DE_DE) +elseif (CONFIG_LANGUAGE_DE_DE) set(LANG_DIR "de-DE") -elseif(CONFIG_LANGUAGE_FR_FR) +elseif (CONFIG_LANGUAGE_FR_FR) set(LANG_DIR "fr-FR") -elseif(CONFIG_LANGUAGE_ES_ES) +elseif (CONFIG_LANGUAGE_ES_ES) set(LANG_DIR "es-ES") -elseif(CONFIG_LANGUAGE_IT_IT) +elseif (CONFIG_LANGUAGE_IT_IT) set(LANG_DIR "it-IT") -elseif(CONFIG_LANGUAGE_RU_RU) +elseif (CONFIG_LANGUAGE_RU_RU) set(LANG_DIR "ru-RU") -elseif(CONFIG_LANGUAGE_AR_SA) +elseif (CONFIG_LANGUAGE_AR_SA) set(LANG_DIR "ar-SA") -elseif(CONFIG_LANGUAGE_HI_IN) +elseif (CONFIG_LANGUAGE_HI_IN) set(LANG_DIR "hi-IN") -elseif(CONFIG_LANGUAGE_PT_PT) +elseif (CONFIG_LANGUAGE_PT_PT) set(LANG_DIR "pt-PT") -elseif(CONFIG_LANGUAGE_PL_PL) +elseif (CONFIG_LANGUAGE_PL_PL) set(LANG_DIR "pl-PL") -elseif(CONFIG_LANGUAGE_CS_CZ) +elseif (CONFIG_LANGUAGE_CS_CZ) set(LANG_DIR "cs-CZ") -elseif(CONFIG_LANGUAGE_FI_FI) +elseif (CONFIG_LANGUAGE_FI_FI) set(LANG_DIR "fi-FI") -elseif(CONFIG_LANGUAGE_TR_TR) +elseif (CONFIG_LANGUAGE_TR_TR) set(LANG_DIR "tr-TR") -elseif(CONFIG_LANGUAGE_ID_ID) +elseif (CONFIG_LANGUAGE_ID_ID) set(LANG_DIR "id-ID") -elseif(CONFIG_LANGUAGE_UK_UA) +elseif (CONFIG_LANGUAGE_UK_UA) set(LANG_DIR "uk-UA") -elseif(CONFIG_LANGUAGE_RO_RO) +elseif (CONFIG_LANGUAGE_RO_RO) set(LANG_DIR "ro-RO") -elseif(CONFIG_LANGUAGE_BG_BG) +elseif (CONFIG_LANGUAGE_BG_BG) set(LANG_DIR "bg-BG") -elseif(CONFIG_LANGUAGE_CA_ES) +elseif (CONFIG_LANGUAGE_CA_ES) set(LANG_DIR "ca-ES") -elseif(CONFIG_LANGUAGE_DA_DK) +elseif (CONFIG_LANGUAGE_DA_DK) set(LANG_DIR "da-DK") -elseif(CONFIG_LANGUAGE_EL_GR) +elseif (CONFIG_LANGUAGE_EL_GR) set(LANG_DIR "el-GR") -elseif(CONFIG_LANGUAGE_FA_IR) +elseif (CONFIG_LANGUAGE_FA_IR) set(LANG_DIR "fa-IR") -elseif(CONFIG_LANGUAGE_FIL_PH) +elseif (CONFIG_LANGUAGE_FIL_PH) set(LANG_DIR "fil-PH") -elseif(CONFIG_LANGUAGE_HE_IL) +elseif (CONFIG_LANGUAGE_HE_IL) set(LANG_DIR "he-IL") -elseif(CONFIG_LANGUAGE_HR_HR) +elseif (CONFIG_LANGUAGE_HR_HR) set(LANG_DIR "hr-HR") -elseif(CONFIG_LANGUAGE_HU_HU) +elseif (CONFIG_LANGUAGE_HU_HU) set(LANG_DIR "hu-HU") -elseif(CONFIG_LANGUAGE_MS_MY) +elseif (CONFIG_LANGUAGE_MS_MY) set(LANG_DIR "ms-MY") -elseif(CONFIG_LANGUAGE_NB_NO) +elseif (CONFIG_LANGUAGE_NB_NO) set(LANG_DIR "nb-NO") -elseif(CONFIG_LANGUAGE_NL_NL) +elseif (CONFIG_LANGUAGE_NL_NL) set(LANG_DIR "nl-NL") -elseif(CONFIG_LANGUAGE_SK_SK) +elseif (CONFIG_LANGUAGE_SK_SK) set(LANG_DIR "sk-SK") -elseif(CONFIG_LANGUAGE_SL_SI) +elseif (CONFIG_LANGUAGE_SL_SI) set(LANG_DIR "sl-SI") -elseif(CONFIG_LANGUAGE_SV_SE) +elseif (CONFIG_LANGUAGE_SV_SE) set(LANG_DIR "sv-SE") -elseif(CONFIG_LANGUAGE_SR_RS) +elseif (CONFIG_LANGUAGE_SR_RS) set(LANG_DIR "sr-RS") -endif() +endif () # Define generation path set(LANG_JSON "${CMAKE_CURRENT_SOURCE_DIR}/assets/locales/${LANG_DIR}/language.json") @@ -626,170 +629,170 @@ set(LANG_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/assets/lang_config.h") file(GLOB LANG_SOUNDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/locales/${LANG_DIR}/*.ogg) # If not en-US, collect en-US audio files as fallback for missing files -if(NOT LANG_DIR STREQUAL "en-US") +if (NOT LANG_DIR STREQUAL "en-US") file(GLOB EN_US_SOUNDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/locales/en-US/*.ogg) - + # Extract filenames (without path) from current language set(EXISTING_NAMES "") - foreach(SOUND_FILE ${LANG_SOUNDS}) + foreach (SOUND_FILE ${LANG_SOUNDS}) get_filename_component(FILENAME ${SOUND_FILE} NAME) list(APPEND EXISTING_NAMES ${FILENAME}) - endforeach() - + endforeach () + # Only add en-US audio files that are missing in current language - foreach(EN_SOUND ${EN_US_SOUNDS}) + foreach (EN_SOUND ${EN_US_SOUNDS}) get_filename_component(FILENAME ${EN_SOUND} NAME) - if(NOT ${FILENAME} IN_LIST EXISTING_NAMES) + if (NOT ${FILENAME} IN_LIST EXISTING_NAMES) list(APPEND LANG_SOUNDS ${EN_SOUND}) message(STATUS "Using en-US fallback for missing audio: ${FILENAME}") - endif() - endforeach() -endif() + endif () + endforeach () +endif () file(GLOB COMMON_SOUNDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/common/*.ogg) # If target chip is ESP32, exclude specific files to avoid build errors -if(CONFIG_IDF_TARGET_ESP32) +if (CONFIG_IDF_TARGET_ESP32) list(REMOVE_ITEM SOURCES "audio/codecs/box_audio_codec.cc" - "audio/codecs/es8388_audio_codec.cc" - "audio/codecs/es8389_audio_codec.cc" - "led/gpio_led.cc" - "${CMAKE_CURRENT_SOURCE_DIR}/boards/common/esp32_camera.cc" - "display/lvgl_display/jpg/image_to_jpeg.cpp" - ) -endif() + "audio/codecs/es8388_audio_codec.cc" + "audio/codecs/es8389_audio_codec.cc" + "led/gpio_led.cc" + "${CMAKE_CURRENT_SOURCE_DIR}/boards/common/esp32_camera.cc" + "display/lvgl_display/jpg/image_to_jpeg.cpp" + ) +endif () idf_component_register(SRCS ${SOURCES} - EMBED_FILES ${LANG_SOUNDS} ${COMMON_SOUNDS} - INCLUDE_DIRS ${INCLUDE_DIRS} - WHOLE_ARCHIVE - ) + EMBED_FILES ${LANG_SOUNDS} ${COMMON_SOUNDS} + INCLUDE_DIRS ${INCLUDE_DIRS} + WHOLE_ARCHIVE +) # Use target_compile_definitions to define BOARD_TYPE, BOARD_NAME # If BOARD_NAME is empty, use BOARD_TYPE -if(NOT BOARD_NAME) +if (NOT BOARD_NAME) set(BOARD_NAME ${BOARD_TYPE}) -endif() +endif () target_compile_definitions(${COMPONENT_LIB} - PRIVATE BOARD_TYPE=\"${BOARD_TYPE}\" BOARD_NAME=\"${BOARD_NAME}\" - PRIVATE BUILTIN_TEXT_FONT=${BUILTIN_TEXT_FONT} BUILTIN_ICON_FONT=${BUILTIN_ICON_FONT} - ) + PRIVATE BOARD_TYPE=\"${BOARD_TYPE}\" BOARD_NAME=\"${BOARD_NAME}\" + PRIVATE BUILTIN_TEXT_FONT=${BUILTIN_TEXT_FONT} BUILTIN_ICON_FONT=${BUILTIN_ICON_FONT} +) # Add generation rules add_custom_command( - OUTPUT ${LANG_HEADER} - COMMAND python ${PROJECT_DIR}/scripts/gen_lang.py - --language "${LANG_DIR}" - --output "${LANG_HEADER}" - DEPENDS + OUTPUT ${LANG_HEADER} + COMMAND python ${PROJECT_DIR}/scripts/gen_lang.py + --language "${LANG_DIR}" + --output "${LANG_HEADER}" + DEPENDS ${LANG_JSON} ${PROJECT_DIR}/scripts/gen_lang.py - COMMENT "Generating ${LANG_DIR} language config" + COMMENT "Generating ${LANG_DIR} language config" ) # Force build generation dependencies add_custom_target(lang_header ALL - DEPENDS ${LANG_HEADER} + DEPENDS ${LANG_HEADER} ) # Find ESP-SR component dynamically find_component_by_pattern("espressif__esp-sr" ESP_SR_COMPONENT ESP_SR_COMPONENT_PATH) -if(ESP_SR_COMPONENT_PATH) +if (ESP_SR_COMPONENT_PATH) set(ESP_SR_MODEL_PATH "${ESP_SR_COMPONENT_PATH}/model") -endif() +endif () # Find xiaozhi-fonts component dynamically find_component_by_pattern("xiaozhi-fonts" XIAOZHI_FONTS_COMPONENT XIAOZHI_FONTS_COMPONENT_PATH) -if(XIAOZHI_FONTS_COMPONENT_PATH) +if (XIAOZHI_FONTS_COMPONENT_PATH) set(XIAOZHI_FONTS_PATH "${XIAOZHI_FONTS_COMPONENT_PATH}") -endif() - -if(CONFIG_BOARD_TYPE_ESP_HI) -set(URL "https://github.com/espressif2022/image_player/raw/main/test_apps/test_8bit") -set(EMOJI_DIR "${CMAKE_BINARY_DIR}/emoji") -file(MAKE_DIRECTORY ${EMOJI_DIR}) - -# List all files to download -set(FILES_TO_DOWNLOAD "") -list(APPEND FILES_TO_DOWNLOAD "Anger_enter.aaf" "Anger_loop.aaf" "Anger_return.aaf") -list(APPEND FILES_TO_DOWNLOAD "happy_enter.aaf" "happy_loop.aaf" "happ_return.aaf") -list(APPEND FILES_TO_DOWNLOAD "sad_enter.aaf" "sad_loop.aaf" "sad_return.aaf") -list(APPEND FILES_TO_DOWNLOAD "scorn_enter.aaf" "scorn_loop.aaf" "scorn_return.aaf") -list(APPEND FILES_TO_DOWNLOAD "left_enter.aaf" "left_loop.aaf" "left_return.aaf") -list(APPEND FILES_TO_DOWNLOAD "right_enter.aaf" "right_loop.aaf" "right_return.aaf") -list(APPEND FILES_TO_DOWNLOAD "asking.aaf" "blink_once.aaf" "blink_quick.aaf") -list(APPEND FILES_TO_DOWNLOAD "connecting.aaf" "panic_enter.aaf" "panic_loop.aaf") -list(APPEND FILES_TO_DOWNLOAD "panic_return.aaf" "wake.aaf") - -foreach(FILENAME IN LISTS FILES_TO_DOWNLOAD) - set(REMOTE_FILE "${URL}/${FILENAME}") - set(LOCAL_FILE "${EMOJI_DIR}/${FILENAME}") - - # Check if local file exists - if(EXISTS ${LOCAL_FILE}) - message(STATUS "File ${FILENAME} already exists, skipping download") - else() - message(STATUS "Downloading ${FILENAME}") - file(DOWNLOAD ${REMOTE_FILE} ${LOCAL_FILE} - STATUS DOWNLOAD_STATUS) - list(GET DOWNLOAD_STATUS 0 STATUS_CODE) - if(NOT STATUS_CODE EQUAL 0) - message(FATAL_ERROR "Failed to download ${FILENAME} from ${URL}") - endif() - endif() -endforeach() - -endif() +endif () + +if (CONFIG_BOARD_TYPE_ESP_HI) + set(URL "https://github.com/espressif2022/image_player/raw/main/test_apps/test_8bit") + set(EMOJI_DIR "${CMAKE_BINARY_DIR}/emoji") + file(MAKE_DIRECTORY ${EMOJI_DIR}) + + # List all files to download + set(FILES_TO_DOWNLOAD "") + list(APPEND FILES_TO_DOWNLOAD "Anger_enter.aaf" "Anger_loop.aaf" "Anger_return.aaf") + list(APPEND FILES_TO_DOWNLOAD "happy_enter.aaf" "happy_loop.aaf" "happ_return.aaf") + list(APPEND FILES_TO_DOWNLOAD "sad_enter.aaf" "sad_loop.aaf" "sad_return.aaf") + list(APPEND FILES_TO_DOWNLOAD "scorn_enter.aaf" "scorn_loop.aaf" "scorn_return.aaf") + list(APPEND FILES_TO_DOWNLOAD "left_enter.aaf" "left_loop.aaf" "left_return.aaf") + list(APPEND FILES_TO_DOWNLOAD "right_enter.aaf" "right_loop.aaf" "right_return.aaf") + list(APPEND FILES_TO_DOWNLOAD "asking.aaf" "blink_once.aaf" "blink_quick.aaf") + list(APPEND FILES_TO_DOWNLOAD "connecting.aaf" "panic_enter.aaf" "panic_loop.aaf") + list(APPEND FILES_TO_DOWNLOAD "panic_return.aaf" "wake.aaf") + + foreach (FILENAME IN LISTS FILES_TO_DOWNLOAD) + set(REMOTE_FILE "${URL}/${FILENAME}") + set(LOCAL_FILE "${EMOJI_DIR}/${FILENAME}") + + # Check if local file exists + if (EXISTS ${LOCAL_FILE}) + message(STATUS "File ${FILENAME} already exists, skipping download") + else () + message(STATUS "Downloading ${FILENAME}") + file(DOWNLOAD ${REMOTE_FILE} ${LOCAL_FILE} + STATUS DOWNLOAD_STATUS) + list(GET DOWNLOAD_STATUS 0 STATUS_CODE) + if (NOT STATUS_CODE EQUAL 0) + message(FATAL_ERROR "Failed to download ${FILENAME} from ${URL}") + endif () + endif () + endforeach () + +endif () # Function to build default assets based on configuration function(build_default_assets_bin) # Set output path for generated assets.bin set(GENERATED_ASSETS_BIN "${CMAKE_BINARY_DIR}/generated_assets.bin") - + # Prepare arguments for build script set(BUILD_ARGS - "--sdkconfig" "${SDKCONFIG}" - "--output" "${GENERATED_ASSETS_BIN}" + "--sdkconfig" "${SDKCONFIG}" + "--output" "${GENERATED_ASSETS_BIN}" ) - + # Add builtin text font if defined - if(BUILTIN_TEXT_FONT) + if (BUILTIN_TEXT_FONT) list(APPEND BUILD_ARGS "--builtin_text_font" "${BUILTIN_TEXT_FONT}") - endif() - + endif () + # Add default emoji collection if defined - if(DEFAULT_EMOJI_COLLECTION) + if (DEFAULT_EMOJI_COLLECTION) list(APPEND BUILD_ARGS "--emoji_collection" "${DEFAULT_EMOJI_COLLECTION}") - endif() - + endif () + # Add default assets extra files if defined - if(DEFAULT_ASSETS_EXTRA_FILES) + if (DEFAULT_ASSETS_EXTRA_FILES) list(APPEND BUILD_ARGS "--extra_files" "${DEFAULT_ASSETS_EXTRA_FILES}") - endif() - + endif () + list(APPEND BUILD_ARGS "--esp_sr_model_path" "${ESP_SR_MODEL_PATH}") list(APPEND BUILD_ARGS "--xiaozhi_fonts_path" "${XIAOZHI_FONTS_PATH}") - + # Create custom command to build assets add_custom_command( - OUTPUT ${GENERATED_ASSETS_BIN} - COMMAND python ${PROJECT_DIR}/scripts/build_default_assets.py ${BUILD_ARGS} - DEPENDS + OUTPUT ${GENERATED_ASSETS_BIN} + COMMAND python ${PROJECT_DIR}/scripts/build_default_assets.py ${BUILD_ARGS} + DEPENDS ${SDKCONFIG} ${PROJECT_DIR}/scripts/build_default_assets.py - COMMENT "Building default assets.bin based on configuration" - VERBATIM + COMMENT "Building default assets.bin based on configuration" + VERBATIM ) - + # Create target for generated assets add_custom_target(generated_default_assets ALL - DEPENDS ${GENERATED_ASSETS_BIN} + DEPENDS ${GENERATED_ASSETS_BIN} ) - + # Set the generated file path in parent scope set(GENERATED_ASSETS_LOCAL_FILE ${GENERATED_ASSETS_BIN} PARENT_SCOPE) - + message(STATUS "Default assets build configured: ${GENERATED_ASSETS_BIN}") endfunction() @@ -797,55 +800,55 @@ endfunction() # Function to get local assets file path (handles both URL and local file) function(get_assets_local_file assets_source assets_local_file_var) # Check if it's a URL (starts with http:// or https://) - if(assets_source MATCHES "^https?://") + if (assets_source MATCHES "^https?://") # It's a URL, download it get_filename_component(ASSETS_FILENAME "${assets_source}" NAME) set(ASSETS_LOCAL_FILE "${CMAKE_BINARY_DIR}/${ASSETS_FILENAME}") set(ASSETS_TEMP_FILE "${CMAKE_BINARY_DIR}/${ASSETS_FILENAME}.tmp") - + # Check if local file exists - if(EXISTS ${ASSETS_LOCAL_FILE}) + if (EXISTS ${ASSETS_LOCAL_FILE}) message(STATUS "Assets file ${ASSETS_FILENAME} already exists, skipping download") - else() + else () message(STATUS "Downloading ${ASSETS_FILENAME}") - + # Clean up any existing temp file - if(EXISTS ${ASSETS_TEMP_FILE}) + if (EXISTS ${ASSETS_TEMP_FILE}) file(REMOVE ${ASSETS_TEMP_FILE}) - endif() - + endif () + # Download to temporary file first file(DOWNLOAD ${assets_source} ${ASSETS_TEMP_FILE} - STATUS DOWNLOAD_STATUS) + STATUS DOWNLOAD_STATUS) list(GET DOWNLOAD_STATUS 0 STATUS_CODE) - if(NOT STATUS_CODE EQUAL 0) + if (NOT STATUS_CODE EQUAL 0) # Clean up temp file on failure - if(EXISTS ${ASSETS_TEMP_FILE}) + if (EXISTS ${ASSETS_TEMP_FILE}) file(REMOVE ${ASSETS_TEMP_FILE}) - endif() + endif () message(FATAL_ERROR "Failed to download ${ASSETS_FILENAME} from ${assets_source}") - endif() - + endif () + # Move temp file to final location (atomic operation) file(RENAME ${ASSETS_TEMP_FILE} ${ASSETS_LOCAL_FILE}) message(STATUS "Successfully downloaded ${ASSETS_FILENAME}") - endif() - else() + endif () + else () # It's a local file path - if(IS_ABSOLUTE "${assets_source}") + if (IS_ABSOLUTE "${assets_source}") set(ASSETS_LOCAL_FILE "${assets_source}") - else() + else () set(ASSETS_LOCAL_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${assets_source}") - endif() - + endif () + # Check if local file exists - if(NOT EXISTS ${ASSETS_LOCAL_FILE}) + if (NOT EXISTS ${ASSETS_LOCAL_FILE}) message(FATAL_ERROR "Assets file not found: ${ASSETS_LOCAL_FILE}") - endif() - + endif () + message(STATUS "Using assets file: ${ASSETS_LOCAL_FILE}") - endif() - + endif () + set(${assets_local_file_var} ${ASSETS_LOCAL_FILE} PARENT_SCOPE) endfunction() @@ -854,19 +857,19 @@ partition_table_get_partition_info(size "--partition-name assets" "size") partition_table_get_partition_info(offset "--partition-name assets" "offset") if ("${size}" AND "${offset}") # Flash assets based on configuration - if(CONFIG_FLASH_DEFAULT_ASSETS) + if (CONFIG_FLASH_DEFAULT_ASSETS) # Build default assets based on configuration build_default_assets_bin() esptool_py_flash_to_partition(flash "assets" "${GENERATED_ASSETS_LOCAL_FILE}") message(STATUS "Generated default assets flash configured: ${GENERATED_ASSETS_LOCAL_FILE} -> assets partition") - elseif(CONFIG_FLASH_CUSTOM_ASSETS) + elseif (CONFIG_FLASH_CUSTOM_ASSETS) # Flash custom assets get_assets_local_file("${CONFIG_CUSTOM_ASSETS_FILE}" ASSETS_LOCAL_FILE) esptool_py_flash_to_partition(flash "assets" "${ASSETS_LOCAL_FILE}") message(STATUS "Custom assets flash configured: ${ASSETS_LOCAL_FILE} -> assets partition") - elseif(CONFIG_FLASH_NONE_ASSETS) + elseif (CONFIG_FLASH_NONE_ASSETS) message(STATUS "Assets flashing disabled (FLASH_NONE_ASSETS)") - endif() -else() + endif () +else () message(STATUS "Assets partition not found, using v1 partition table") -endif() +endif () diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 78e16d49f..16c53a6f3 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -648,6 +648,28 @@ config USE_AUDIO_DEBUGGER help Enable audio debugger, send audio data through UDP to the host machine +menu "WiFi Configuration Method" + help + WiFi Configuration Method Selection + config USE_HOTSPOT_WIFI_PROVISIONING + bool "Hotspot" + default y + help + Use WiFi Hotspot to transmit WiFi configuration data + config USE_ACOUSTIC_WIFI_PROVISIONING + bool "Acoustic" + help + Use audio signal to transmit WiFi configuration data + + config USE_ESP_BLUFI_WIFI_PROVISIONING + bool "Esp Blufi" + help + Use esp blufi protocol to transmit WiFi configuration data + select CONFIG_BT_ENABLED + select CONFIG_BT_BLE_42_FEATURES_SUPPORTED + select CONFIG_BT_BLE_BLUFI_ENABLE +endmenu + config AUDIO_DEBUG_UDP_SERVER string "Audio Debug UDP Server Address" default "192.168.2.100:8000" @@ -655,12 +677,6 @@ config AUDIO_DEBUG_UDP_SERVER help UDP server address, format: IP:PORT, used to receive audio debugging data -config USE_ACOUSTIC_WIFI_PROVISIONING - bool "Enable Acoustic WiFi Provisioning" - default n - help - Enable acoustic WiFi provisioning, use audio signal to transmit WiFi configuration data - config RECEIVE_CUSTOM_MESSAGE bool "Enable Custom Message Reception" default n @@ -691,11 +707,11 @@ menu "Camera Configuration" depends on !CAMERA_SENSOR_SWAP_PIXEL_BYTE_ORDER help This option treats the camera buffer as a uint16_t[] array and performs byte-swapping (endianness conversion) on each element. - + Should only be modified by development board integration engineers. - + **Incorrect usage may result in incorrect image colors!** - + ATTENTION: If the option CAMERA_SENSOR_SWAP_PIXEL_BYTE_ORDER is available for your sensor, please use that instead. endmenu diff --git a/main/boards/common/blufi.cpp b/main/boards/common/blufi.cpp new file mode 100644 index 000000000..67419bc8b --- /dev/null +++ b/main/boards/common/blufi.cpp @@ -0,0 +1,557 @@ +#include "blufi.h" +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_mac.h" +#include "esp_bt.h" + +// Bluedroid specific +#ifdef CONFIG_BT_BLUEDROID_ENABLED +#include "esp_bt_main.h" +#include "esp_bt_device.h" +#include "esp_gap_ble_api.h" +#endif + +// NimBLE specific +#ifdef CONFIG_BT_NIMBLE_ENABLED +#include "nimble/nimble_port.h" +#include "nimble/nimble_port_freertos.h" +#include "host/ble_hs.h" +#include "services/gap/ble_svc_gap.h" +#include "console/console.h" +extern void esp_blufi_gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg); +extern int esp_blufi_gatt_svr_init(void); +extern void esp_blufi_gatt_svr_deinit(void); +extern void esp_blufi_btc_init(void); +extern void esp_blufi_btc_deinit(void); +#endif + +extern "C" { + // Blufi Advertising & Connection + void esp_blufi_adv_start(void); + void esp_blufi_adv_stop(void); + void esp_blufi_disconnect(void); + + // Internal BTC layer functions needed for error reporting + void btc_blufi_report_error(esp_blufi_error_state_t state); + + // Bluedroid specific GAP event handler +#ifdef CONFIG_BT_BLUEDROID_ENABLED + void esp_blufi_gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param); +#endif + + // NimBLE specific internal functions +#ifdef CONFIG_BT_NIMBLE_ENABLED + void esp_blufi_gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg); + int esp_blufi_gatt_svr_init(void); + void esp_blufi_gatt_svr_deinit(void); + void esp_blufi_btc_init(void); + void esp_blufi_btc_deinit(void); +#endif +} + +// mbedTLS for security +#include "mbedtls/md5.h" +#include "esp_crc.h" +#include "esp_random.h" +#include "ssid_manager.h" + +// Logging Tag +static const char* BLUFI_TAG = "BLUFI_CLASS"; + + +Blufi& Blufi::GetInstance() { + static Blufi instance; + return instance; +} + +Blufi::Blufi() : + m_sec(nullptr), + m_ble_is_connected(false), + m_sta_connected(false), + m_sta_got_ip(false), + m_sta_ssid_len(0), + m_sta_is_connecting(false) +{ + // Initialize member variables + memset(&m_sta_config, 0, sizeof(m_sta_config)); + memset(&m_ap_config, 0, sizeof(m_ap_config)); + memset(m_sta_bssid, 0, sizeof(m_sta_bssid)); + memset(m_sta_ssid, 0, sizeof(m_sta_ssid)); + memset(&m_sta_conn_info, 0, sizeof(m_sta_conn_info)); +} + +Blufi::~Blufi() { + if (m_sec) { + _security_deinit(); + } +} + +esp_err_t Blufi::init() { + esp_err_t ret; + +#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED + ret = _controller_init(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "BLUFI controller init failed: %s", esp_err_to_name(ret)); + return ret; + } +#endif + + ret = _host_and_cb_init(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "BLUFI host and cb init failed: %s", esp_err_to_name(ret)); + return ret; + } + + ESP_LOGI(BLUFI_TAG, "BLUFI VERSION %04x", esp_blufi_get_version()); + return ESP_OK; +} + +esp_err_t Blufi::deinit() { + esp_err_t ret; + ret = _host_deinit(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "Host deinit failed: %s", esp_err_to_name(ret)); + } +#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED + ret = _controller_deinit(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "Controller deinit failed: %s", esp_err_to_name(ret)); + } +#endif + return ret; +} + + +#ifdef CONFIG_BT_BLUEDROID_ENABLED +esp_err_t Blufi::_host_init() { + esp_err_t ret = esp_bluedroid_init(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s init bluedroid failed: %s", __func__, esp_err_to_name(ret)); + return ESP_FAIL; + } + ret = esp_bluedroid_enable(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s enable bluedroid failed: %s", __func__, esp_err_to_name(ret)); + return ESP_FAIL; + } + ESP_LOGI(BLUFI_TAG, "BD ADDR: " ESP_BD_ADDR_STR, ESP_BD_ADDR_HEX(esp_bt_dev_get_address())); + return ESP_OK; +} + +esp_err_t Blufi::_host_deinit() { + esp_err_t ret = esp_blufi_profile_deinit(); + if (ret != ESP_OK) return ret; + + ret = esp_bluedroid_disable(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s disable bluedroid failed: %s", __func__, esp_err_to_name(ret)); + return ESP_FAIL; + } + ret = esp_bluedroid_deinit(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s deinit bluedroid failed: %s", __func__, esp_err_to_name(ret)); + return ESP_FAIL; + } + return ESP_OK; +} + +esp_err_t Blufi::_gap_register_callback() { + esp_err_t rc = esp_ble_gap_register_callback(esp_blufi_gap_event_handler); + if(rc){ + return rc; + } + return esp_blufi_profile_init(); +} + +esp_err_t Blufi::_host_and_cb_init() { + esp_blufi_callbacks_t blufi_callbacks = { + .event_cb = &_event_callback_trampoline, + .negotiate_data_handler = &_negotiate_data_handler_trampoline, + .encrypt_func = &_encrypt_func_trampoline, + .decrypt_func = &_decrypt_func_trampoline, + .checksum_func = &_checksum_func_trampoline, + }; + + esp_err_t ret = _host_init(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s initialise host failed: %s", __func__, esp_err_to_name(ret)); + return ret; + } + ret = esp_blufi_register_callbacks(&blufi_callbacks); + if(ret){ + ESP_LOGE(BLUFI_TAG, "%s blufi register failed, error code = %x", __func__, ret); + return ret; + } + ret = _gap_register_callback(); + if(ret){ + ESP_LOGE(BLUFI_TAG, "%s gap register failed, error code = %x", __func__, ret); + return ret; + } + return ESP_OK; +} +#endif /* CONFIG_BT_BLUEDROID_ENABLED */ + +#ifdef CONFIG_BT_NIMBLE_ENABLED +// Stubs for NimBLE specific store functionality +void ble_store_config_init(); + +void Blufi::_nimble_on_reset(int reason) { + ESP_LOGE(BLUFI_TAG, "NimBLE Resetting state; reason=%d", reason); +} + +void Blufi::_nimble_on_sync() { + // This is called when the host and controller are synced. + // It's a good place to initialize the Blufi profile. + esp_blufi_profile_init(); +} + +void Blufi::_nimble_host_task(void *param) { + ESP_LOGI(BLUFI_TAG, "BLE Host Task Started"); + nimble_port_run(); // This function will return only when nimble_port_stop() is executed + nimble_port_freertos_deinit(); +} + +esp_err_t Blufi::_host_init() { + // esp_nimble_init() is called by controller_init for NimBLE + ble_hs_cfg.reset_cb = _nimble_on_reset; + ble_hs_cfg.sync_cb = _nimble_on_sync; + ble_hs_cfg.gatts_register_cb = esp_blufi_gatt_svr_register_cb; + + // Security Manager settings (can be customized) + ble_hs_cfg.sm_io_cap = 4; // IO capability: No Input, No Output +#ifdef CONFIG_EXAMPLE_BONDING + ble_hs_cfg.sm_bonding = 1; +#endif + + int rc = esp_blufi_gatt_svr_init(); + assert(rc == 0); + + ble_store_config_init(); // Configure the BLE storage + esp_blufi_btc_init(); + + esp_err_t err = esp_nimble_enable(_nimble_host_task); + if (err) { + ESP_LOGE(BLUFI_TAG, "%s failed: %s", __func__, esp_err_to_name(err)); + return ESP_FAIL; + } + return ESP_OK; +} + +esp_err_t Blufi::_host_deinit(void) { + esp_err_t ret = nimble_port_stop(); + if (ret == ESP_OK) { + esp_nimble_deinit(); + } + esp_blufi_gatt_svr_deinit(); + ret = esp_blufi_profile_deinit(); + esp_blufi_btc_deinit(); + return ret; +} + +esp_err_t Blufi::_gap_register_callback(void) { + return ESP_OK; // For NimBLE, GAP callbacks are handled differently +} + +esp_err_t Blufi::_host_and_cb_init() { + esp_blufi_callbacks_t blufi_callbacks = { + .event_cb = &_event_callback_trampoline, + .negotiate_data_handler = &_negotiate_data_handler_trampoline, + .encrypt_func = &_encrypt_func_trampoline, + .decrypt_func = &_decrypt_func_trampoline, + .checksum_func = &_checksum_func_trampoline, + }; + + esp_err_t ret = esp_blufi_register_callbacks(&blufi_callbacks); + if(ret){ + ESP_LOGE(BLUFI_TAG, "%s blufi register failed, error code = %x", __func__, ret); + return ret; + } + + // Host init must be called after registering callbacks for NimBLE + ret = _host_init(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s initialise host failed: %s", __func__, esp_err_to_name(ret)); + return ret; + } + return ESP_OK; +} +#endif /* CONFIG_BT_NIMBLE_ENABLED */ + +#if CONFIG_BT_CONTROLLER_ENABLED || !CONFIG_BT_NIMBLE_ENABLED +esp_err_t Blufi::_controller_init() { + esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT(); + esp_err_t ret = esp_bt_controller_init(&bt_cfg); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s initialize controller failed: %s", __func__, esp_err_to_name(ret)); + return ret; + } + ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s enable controller failed: %s", __func__, esp_err_to_name(ret)); + return ret; + } + +#ifdef CONFIG_BT_NIMBLE_ENABLED + // For NimBLE, host init needs to be done after controller init + ret = esp_nimble_init(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "esp_nimble_init() failed: %s", esp_err_to_name(ret)); + return ret; + } +#endif + return ESP_OK; +} + +esp_err_t Blufi::_controller_deinit() { + esp_err_t ret = esp_bt_controller_disable(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s disable controller failed: %s", __func__, esp_err_to_name(ret)); + } + ret = esp_bt_controller_deinit(); + if (ret) { + ESP_LOGE(BLUFI_TAG, "%s deinit controller failed: %s", __func__, esp_err_to_name(ret)); + } + return ret; +} +#endif // Generic controller init + + +static int myrand(void *rng_state, unsigned char *output, size_t len) { + esp_fill_random(output, len); + return 0; +} + +void Blufi::_security_init() { + m_sec = new BlufiSecurity(); + if (m_sec == nullptr) { + ESP_LOGE(BLUFI_TAG, "Failed to allocate security context"); + return; + } + memset(m_sec, 0, sizeof(BlufiSecurity)); + m_sec->dhm = new mbedtls_dhm_context(); + m_sec->aes = new mbedtls_aes_context(); + + mbedtls_dhm_init(m_sec->dhm); + mbedtls_aes_init(m_sec->aes); + + memset(m_sec->iv, 0x0, sizeof(m_sec->iv)); +} + +void Blufi::_security_deinit() { + if (m_sec == nullptr) return; + + if (m_sec->dh_param) { + free(m_sec->dh_param); + } + mbedtls_dhm_free(m_sec->dhm); + mbedtls_aes_free(m_sec->aes); + delete m_sec->dhm; + delete m_sec->aes; + delete m_sec; + m_sec = nullptr; +} + +void Blufi::_dh_negotiate_data_handler(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free) { + if (m_sec == nullptr) { + ESP_LOGE(BLUFI_TAG, "Security not initialized in DH handler"); + btc_blufi_report_error(ESP_BLUFI_INIT_SECURITY_ERROR); + return; + } + + uint8_t type = data[0]; + switch (type) { + case 0x00: /* DH_PARAM_LEN */ + m_sec->dh_param_len = (data[1] << 8) | data[2]; + if (m_sec->dh_param) { + free(m_sec->dh_param); + m_sec->dh_param = nullptr; + } + m_sec->dh_param = (uint8_t *)malloc(m_sec->dh_param_len); + if (m_sec->dh_param == nullptr) { + ESP_LOGE(BLUFI_TAG, "DH malloc failed"); + btc_blufi_report_error(ESP_BLUFI_DH_MALLOC_ERROR); + } + break; + case 0x01: /* DH_PARAM_DATA */ { + if (m_sec->dh_param == nullptr) { + ESP_LOGE(BLUFI_TAG, "DH param not allocated"); + btc_blufi_report_error(ESP_BLUFI_DH_PARAM_ERROR); + return; + } + uint8_t *param = m_sec->dh_param; + memcpy(m_sec->dh_param, &data[1], m_sec->dh_param_len); + int ret = mbedtls_dhm_read_params(m_sec->dhm, ¶m, ¶m[m_sec->dh_param_len]); + if (ret) { + ESP_LOGE(BLUFI_TAG, "mbedtls_dhm_read_params failed %d", ret); + btc_blufi_report_error(ESP_BLUFI_READ_PARAM_ERROR); + return; + } + + const int dhm_len = mbedtls_dhm_get_len(m_sec->dhm); + ret = mbedtls_dhm_make_public(m_sec->dhm, dhm_len, m_sec->self_public_key, DH_SELF_PUB_KEY_LEN, myrand, NULL); + if (ret) { + ESP_LOGE(BLUFI_TAG, "mbedtls_dhm_make_public failed %d", ret); + btc_blufi_report_error(ESP_BLUFI_MAKE_PUBLIC_ERROR); + return; + } + + ret = mbedtls_dhm_calc_secret(m_sec->dhm, m_sec->share_key, SHARE_KEY_LEN, &m_sec->share_len, myrand, NULL); + if (ret) { + ESP_LOGE(BLUFI_TAG, "mbedtls_dhm_calc_secret failed %d", ret); + btc_blufi_report_error(ESP_BLUFI_ENCRYPT_ERROR); + return; + } + + ret = mbedtls_md5(m_sec->share_key, m_sec->share_len, m_sec->psk); + if (ret) { + ESP_LOGE(BLUFI_TAG, "mbedtls_md5 failed %d", ret); + btc_blufi_report_error(ESP_BLUFI_CALC_MD5_ERROR); + return; + } + + mbedtls_aes_setkey_enc(m_sec->aes, m_sec->psk, PSK_LEN * 8); + + *output_data = &m_sec->self_public_key[0]; + *output_len = dhm_len; + *need_free = false; + + free(m_sec->dh_param); + m_sec->dh_param = NULL; + } + break; + default: + ESP_LOGE(BLUFI_TAG, "DH handler unknown type: %d", type); + } +} + +int Blufi::_aes_encrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len) { + if (!m_sec) return -1; + size_t iv_offset = 0; + uint8_t iv0[16]; + memcpy(iv0, m_sec->iv, 16); + iv0[0] = iv8; + return mbedtls_aes_crypt_cfb128(m_sec->aes, MBEDTLS_AES_ENCRYPT, crypt_len, &iv_offset, iv0, crypt_data, crypt_data); +} + +int Blufi::_aes_decrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len) { + if (!m_sec) return -1; + size_t iv_offset = 0; + uint8_t iv0[16]; + memcpy(iv0, m_sec->iv, 16); + iv0[0] = iv8; + return mbedtls_aes_crypt_cfb128(m_sec->aes, MBEDTLS_AES_DECRYPT, crypt_len, &iv_offset, iv0, crypt_data, crypt_data); +} + +uint16_t Blufi::_crc_checksum(uint8_t iv8, uint8_t *data, int len) { + return esp_crc16_be(0, data, len); +} + + +int Blufi::_get_softap_conn_num() { + wifi_sta_list_t sta_list; + if (esp_wifi_ap_get_sta_list(&sta_list) == ESP_OK) { + return sta_list.num; + } + return 0; +} + +void Blufi::_handle_event(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param) { + switch (event) { + case ESP_BLUFI_EVENT_INIT_FINISH: + ESP_LOGI(BLUFI_TAG, "BLUFI init finish"); + esp_blufi_adv_start(); + break; + case ESP_BLUFI_EVENT_BLE_CONNECT: + ESP_LOGI(BLUFI_TAG, "BLUFI ble connect"); + m_ble_is_connected = true; + esp_blufi_adv_stop(); + _security_init(); + break; + case ESP_BLUFI_EVENT_BLE_DISCONNECT: + ESP_LOGI(BLUFI_TAG, "BLUFI ble disconnect"); + m_ble_is_connected = false; + _security_deinit(); + esp_blufi_adv_start(); + break; + case ESP_BLUFI_EVENT_SET_WIFI_OPMODE: + ESP_LOGI(BLUFI_TAG, "BLUFI Set WIFI opmode %d", param->wifi_mode.op_mode); + ESP_ERROR_CHECK(esp_wifi_set_mode(param->wifi_mode.op_mode)); + break; + case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP: + ESP_LOGI(BLUFI_TAG, "BLUFI request wifi connect to AP"); + // Here, we would connect to Wi-Fi. The original code restarts, which is one strategy. + // Another is to start the connection process directly. + esp_wifi_set_config(WIFI_IF_STA, &m_sta_config); + esp_wifi_connect(); + m_sta_is_connecting = true; + m_sta_conn_info = {}; // Reset connection info + break; + case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP: + ESP_LOGI(BLUFI_TAG, "BLUFI request wifi disconnect from AP"); + esp_wifi_disconnect(); + break; + case ESP_BLUFI_EVENT_GET_WIFI_STATUS: { + wifi_mode_t mode; + esp_wifi_get_mode(&mode); + if (m_sta_connected) { + esp_blufi_extra_info_t info; + memset(&info, 0, sizeof(esp_blufi_extra_info_t)); + memcpy(info.sta_bssid, m_sta_bssid, 6); + info.sta_bssid_set = true; + info.sta_ssid = m_sta_ssid; + info.sta_ssid_len = m_sta_ssid_len; + esp_blufi_send_wifi_conn_report(mode, m_sta_got_ip ? ESP_BLUFI_STA_CONN_SUCCESS : ESP_BLUFI_STA_NO_IP, _get_softap_conn_num(), &info); + } else if (m_sta_is_connecting) { + esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONNECTING, _get_softap_conn_num(), &m_sta_conn_info); + } else { + esp_blufi_send_wifi_conn_report(mode, ESP_BLUFI_STA_CONN_FAIL, _get_softap_conn_num(), &m_sta_conn_info); + } + ESP_LOGI(BLUFI_TAG, "BLUFI get wifi status"); + break; + } + case ESP_BLUFI_EVENT_RECV_STA_BSSID: + memcpy(m_sta_config.sta.bssid, param->sta_bssid.bssid, 6); + m_sta_config.sta.bssid_set = true; + ESP_LOGI(BLUFI_TAG, "Recv STA BSSID"); + break; + case ESP_BLUFI_EVENT_RECV_STA_SSID: + strncpy((char *)m_sta_config.sta.ssid, (char *)param->sta_ssid.ssid, param->sta_ssid.ssid_len); + m_sta_config.sta.ssid[param->sta_ssid.ssid_len] = '\0'; + ESP_LOGI(BLUFI_TAG, "Recv STA SSID: %s", m_sta_config.sta.ssid); + break; + case ESP_BLUFI_EVENT_RECV_STA_PASSWD: + strncpy((char *)m_sta_config.sta.password, (char *)param->sta_passwd.passwd, param->sta_passwd.passwd_len); + m_sta_config.sta.password[param->sta_passwd.passwd_len] = '\0'; + ESP_LOGI(BLUFI_TAG, "Recv STA PASSWORD"); + break; + default: + ESP_LOGW(BLUFI_TAG, "Unhandled event: %d", event); + break; + } +} + + +void Blufi::_event_callback_trampoline(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param) { + GetInstance()._handle_event(event, param); +} + +void Blufi::_negotiate_data_handler_trampoline(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free) { + GetInstance()._dh_negotiate_data_handler(data, len, output_data, output_len, need_free); +} + +int Blufi::_encrypt_func_trampoline(uint8_t iv8, uint8_t *crypt_data, int crypt_len) { + return GetInstance()._aes_encrypt(iv8, crypt_data, crypt_len); +} + +int Blufi::_decrypt_func_trampoline(uint8_t iv8, uint8_t *crypt_data, int crypt_len) { + return GetInstance()._aes_decrypt(iv8, crypt_data, crypt_len); +} + +uint16_t Blufi::_checksum_func_trampoline(uint8_t iv8, uint8_t *data, int len) { + return _crc_checksum(iv8, data, len); +} \ No newline at end of file diff --git a/main/boards/common/blufi.h b/main/boards/common/blufi.h new file mode 100644 index 000000000..6d0d2fd09 --- /dev/null +++ b/main/boards/common/blufi.h @@ -0,0 +1,100 @@ +#pragma once + +#include +#include "mbedtls/dhm.h" +#include "mbedtls/aes.h" +#include "esp_err.h" +#include "esp_blufi_api.h" +#include "esp_wifi_types.h" + + +class Blufi { +public: + /** + * @brief Get the singleton instance of the Blufi class. + */ + static Blufi& GetInstance(); + + /** + * @brief Initializes the Bluetooth controller, host, and Blufi profile. + * This is the main entry point to start the Blufi process. + * @return ESP_OK on success, otherwise an error code. + */ + esp_err_t init(); + + /** + * @brief Deinitializes Blufi and the Bluetooth stack. + * @return ESP_OK on success, otherwise an error code. + */ + esp_err_t deinit(); + + // Delete copy constructor and assignment operator for singleton + Blufi(const Blufi&) = delete; + Blufi& operator=(const Blufi&) = delete; + +private: + Blufi(); + ~Blufi(); + + + // Initialization logic + static esp_err_t _controller_init(); + static esp_err_t _controller_deinit(); + static esp_err_t _host_init(); + static esp_err_t _host_deinit(); + static esp_err_t _gap_register_callback(); + static esp_err_t _host_and_cb_init(); + + void _security_init(); + void _security_deinit(); + void _dh_negotiate_data_handler(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free); + int _aes_encrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len); + int _aes_decrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len); + static uint16_t _crc_checksum(uint8_t iv8, uint8_t *data, int len); + + void _handle_event(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param); + static int _get_softap_conn_num(); + + // These C-style functions are registered with ESP-IDF and call the corresponding instance methods. + + static void _event_callback_trampoline(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param); + static void _negotiate_data_handler_trampoline(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free); + static int _encrypt_func_trampoline(uint8_t iv8, uint8_t *crypt_data, int crypt_len); + static int _decrypt_func_trampoline(uint8_t iv8, uint8_t *crypt_data, int crypt_len); + static uint16_t _checksum_func_trampoline(uint8_t iv8, uint8_t *data, int len); + +#ifdef CONFIG_BT_NIMBLE_ENABLED + static void _nimble_on_reset(int reason); + static void _nimble_on_sync(); + static void _nimble_host_task(void *param); +#endif + + // Security context, formerly blufi_sec struct + struct BlufiSecurity { +#define DH_SELF_PUB_KEY_LEN 128 + uint8_t self_public_key[DH_SELF_PUB_KEY_LEN]; +#define SHARE_KEY_LEN 128 + uint8_t share_key[SHARE_KEY_LEN]; + size_t share_len; +#define PSK_LEN 16 + uint8_t psk[PSK_LEN]; + uint8_t *dh_param; + int dh_param_len; + uint8_t iv[16]; + mbedtls_dhm_context* dhm; + esp_aes_context *aes; + }; + BlufiSecurity *m_sec; + + // State variables + wifi_config_t m_sta_config{}; + wifi_config_t m_ap_config{}; + bool m_ble_is_connected; + bool m_sta_connected; + bool m_sta_got_ip; + uint8_t m_sta_bssid[6]{}; + uint8_t m_sta_ssid[32]{}; + int m_sta_ssid_len; + bool m_sta_is_connecting; + esp_blufi_extra_info_t m_sta_conn_info{}; +}; \ No newline at end of file diff --git a/main/boards/common/wifi_board.cc b/main/boards/common/wifi_board.cc index b9c32cdbd..67e45d768 100644 --- a/main/boards/common/wifi_board.cc +++ b/main/boards/common/wifi_board.cc @@ -16,6 +16,7 @@ #include #include #include "afsk_demod.h" +#include "blufi.h" static const char *TAG = "WifiBoard"; @@ -35,7 +36,7 @@ std::string WifiBoard::GetBoardType() { void WifiBoard::EnterWifiConfigMode() { auto& application = Application::GetInstance(); application.SetDeviceState(kDeviceStateWifiConfiguring); - +#ifdef CONFIG_USE_HOTSPOT_WIFI_PROVISIONING auto& wifi_ap = WifiConfigurationAp::GetInstance(); wifi_ap.SetLanguage(Lang::CODE); wifi_ap.SetSsidPrefix("Xiaozhi"); @@ -50,10 +51,14 @@ void WifiBoard::EnterWifiConfigMode() { hint += Lang::Strings::ACCESS_VIA_BROWSER; hint += wifi_ap.GetWebServerUrl(); hint += "\n\n"; - - // 播报配置 WiFi 的提示 application.Alert(Lang::Strings::WIFI_CONFIG_MODE, hint.c_str(), "gear", Lang::Sounds::OGG_WIFICONFIG); - +#endif + // 播报配置 WiFi 的提示 + #if CONFIG_USE_ESP_BLUFI_WIFI_PROVISIONING + auto &blufi = Blufi::GetInstance(); + // 初始化 esp-blufi协议 + blufi.init(); + #endif #if CONFIG_USE_ACOUSTIC_WIFI_PROVISIONING auto display = Board::GetInstance().GetDisplay(); auto codec = Board::GetInstance().GetAudioCodec(); @@ -64,7 +69,7 @@ void WifiBoard::EnterWifiConfigMode() { ESP_LOGI(TAG, "Start receiving WiFi credentials from audio, input channels: %d", channel); audio_wifi_config::ReceiveWifiCredentialsFromAudio(&application, &wifi_ap, display, channel); #endif - + // Wait forever until reset after configuration while (true) { vTaskDelay(pdMS_TO_TICKS(10000));