feat: add EAF RTC and badge dual mode
1. 固定 RTC 数字人链路使用 ai_chat_ui_eaf,双模式开启后不再回退 LVGL/GIF 旧 RTC UI。 2. 保留电子吧唧 LVGL/SquareLine UI,只在电子吧唧运行模式启动 LVGL,避免与 EAF 抢同一 LCD flush。 3. 拆分 dzbj_hw_display_init 与 dzbj_display_init,AI/配网只初始化 LCD Touch 硬件,电子吧唧再启动 LVGL UI。 4. 配网模式使用 EAF 最小显示栈显示中文提示,请使用APP 蓝牙配网,不加载数字人资源和动画。 5. 开启 CONFIG_BAJI_BADGE_MODE,形成 RTC 数字人对话与电子吧唧图片显示双模式固件。 6. 电子吧唧图片扫描跳过 Background_360x360.jpg,避免 RTC 数字人背景进入吧唧图片列表。 7. BLE 图传在 BLE 5.0 关闭时跳过 2M PHY API,保持 legacy 1M PHY 兼容配网和图传。 8. sdkconfig.defaults 同步 BLE 内存优化,限制连接数和缓存,保留 GATT 与扫描能力。 9. 移除 ota.cc 编译和 app_update 直接依赖,双模式固件不创建 OTA 检查任务。 10. Ota 接口改为禁用 stub,保留接口兼容但不执行升级和版本检查。 11. Board 上报 JSON 的 OTA label 改为 disabled,避免依赖 OTA 运行分区。 12. partitions.csv 改为 factory 单 app 分区,扩大 app 到 0x900000,并扩大 storage 到 0x6F0000。 13. application 去除 OTA 任务句柄和服务器时间依赖,减少运行时资源占用。 14. system_info 去除 esp_ota_ops 依赖,配合无 OTA 分区配置。 15. 同步最新烧录运行日志,记录本轮双模式与配网测试结果。
This commit is contained in:
parent
24e0d19d29
commit
6b166f4463
1336
05-最新日志.txt
1336
05-最新日志.txt
File diff suppressed because it is too large
Load Diff
@ -16,7 +16,6 @@ set(SOURCES "audio_codecs/audio_codec.cc"
|
|||||||
"iot/thing_manager.cc"
|
"iot/thing_manager.cc"
|
||||||
"system_info.cc"
|
"system_info.cc"
|
||||||
"application.cc"
|
"application.cc"
|
||||||
"ota.cc"
|
|
||||||
"settings.cc"
|
"settings.cc"
|
||||||
"background_task.cc"
|
"background_task.cc"
|
||||||
"bluetooth_provisioning.cc" # 蓝牙配网实现
|
"bluetooth_provisioning.cc" # 蓝牙配网实现
|
||||||
@ -28,10 +27,9 @@ set(SOURCES "audio_codecs/audio_codec.cc"
|
|||||||
"dzbj/pages_pwm.c"
|
"dzbj/pages_pwm.c"
|
||||||
"dzbj/dzbj_init.c" # 含 dzbj_hw_display_init(公共硬件初始化);dzbj_display_init 函数体内部 #ifdef 包裹
|
"dzbj/dzbj_init.c" # 含 dzbj_hw_display_init(公共硬件初始化);dzbj_display_init 函数体内部 #ifdef 包裹
|
||||||
"dzbj/fatfs.c" # DecodeImg 公共(AI 模式 BG GIF PoC 也用);吧唧专用函数 fatfs_init/list 等无副作用
|
"dzbj/fatfs.c" # DecodeImg 公共(AI 模式 BG GIF PoC 也用);吧唧专用函数 fatfs_init/list 等无副作用
|
||||||
# Phase 10: ai_chat_ui 双轨编译
|
# Phase 10: RTC 数字人固定使用 EAF UI
|
||||||
# CONFIG_BAJI_BADGE_MODE=y → ai_chat_ui.c (LVGL 版)
|
# CONFIG_BAJI_BADGE_MODE 仅控制电子吧唧模块是否额外编译
|
||||||
# CONFIG_BAJI_BADGE_MODE=n → ai_chat_ui_eaf.c (esp_emote_gfx 版)
|
"dzbj/ai_chat_ui_eaf.c"
|
||||||
# 这两个在下方 if(CONFIG_BAJI_BADGE_MODE) 块中条件编译
|
|
||||||
"fonts/font_puhui_20_4.c" # 阿里巴巴普惠体 20px 4bpp(GB2312 简体中文)
|
"fonts/font_puhui_20_4.c" # 阿里巴巴普惠体 20px 4bpp(GB2312 简体中文)
|
||||||
# SquareLine Studio UI 公共文件(AI 模式也使用)
|
# SquareLine Studio UI 公共文件(AI 模式也使用)
|
||||||
"ui/ui.c"
|
"ui/ui.c"
|
||||||
@ -56,27 +54,7 @@ set(SOURCES "audio_codecs/audio_codec.cc"
|
|||||||
"ui/images/ui_img_s12_png.c"
|
"ui/images/ui_img_s12_png.c"
|
||||||
"ui/images/ui_img_s13_png.c"
|
"ui/images/ui_img_s13_png.c"
|
||||||
"ui/images/ui_img_s14_png.c"
|
"ui/images/ui_img_s14_png.c"
|
||||||
# emoji 表情图片资源(旧 PNG 静态表情,保留备用)
|
# 旧 LVGL/GIF 表情资源由 ai_chat_ui.c 使用;当前 RTC 固定走 EAF UI,不再编译进固件。
|
||||||
"ui/images/ui_img_neutral_png.c"
|
|
||||||
"ui/images/ui_img_happy_png.c"
|
|
||||||
"ui/images/ui_img_sad_png.c"
|
|
||||||
"ui/images/ui_img_angry_png.c"
|
|
||||||
"ui/images/ui_img_crying_png.c"
|
|
||||||
"ui/images/ui_img_funny_png.c"
|
|
||||||
"ui/images/ui_img_laughing_png.c"
|
|
||||||
# GIF 动画表情资源(压缩优化,200x89)
|
|
||||||
"ui/images/my_emotion/emotion_angry_200_89.c"
|
|
||||||
"ui/images/my_emotion/emotion_blink1_200_89.c"
|
|
||||||
"ui/images/my_emotion/emotion_blink_fast_200_89.c"
|
|
||||||
"ui/images/my_emotion/emotion_blink_slow_200_89.c"
|
|
||||||
"ui/images/my_emotion/emotion_dizzy_200_89.c"
|
|
||||||
"ui/images/my_emotion/emotion_happy_200_89.c"
|
|
||||||
"ui/images/my_emotion/emotion_sad_200_89.c"
|
|
||||||
"ui/images/my_emotion/emotion_sleep_200_89.c"
|
|
||||||
# GIF 动画图标资源(压缩优化,45x45,叠加在表情上)
|
|
||||||
"ui/images/my_icon/icon_emotion_confused_45.c"
|
|
||||||
"ui/images/my_icon/icon_emotion_sleep_45.c"
|
|
||||||
"ui/images/my_icon/icon_emotion_thinking_45.c"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(INCLUDE_DIRS "." "display" "audio_codecs" "protocols" "audio_processing" "audio" "dzbj" "ui")
|
set(INCLUDE_DIRS "." "display" "audio_codecs" "protocols" "audio_processing" "audio" "dzbj" "ui")
|
||||||
@ -210,7 +188,8 @@ file(GLOB BOARD_SOURCES
|
|||||||
list(APPEND SOURCES ${BOARD_SOURCES})
|
list(APPEND SOURCES ${BOARD_SOURCES})
|
||||||
|
|
||||||
# === 电子吧唧专属 srcs(条件编译,CONFIG_BAJI_BADGE_MODE=n 时不参与编译)===
|
# === 电子吧唧专属 srcs(条件编译,CONFIG_BAJI_BADGE_MODE=n 时不参与编译)===
|
||||||
# 源代码文件全部保留在仓库中,仅通过 Kconfig 开关控制是否进入编译队列
|
# 源代码文件全部保留在仓库中,仅通过 Kconfig 开关控制是否进入编译队列。
|
||||||
|
# RTC 数字人始终使用 ai_chat_ui_eaf.c,避免开启双模式后退回 LVGL/GIF 旧链路。
|
||||||
if(CONFIG_BAJI_BADGE_MODE)
|
if(CONFIG_BAJI_BADGE_MODE)
|
||||||
list(APPEND SOURCES
|
list(APPEND SOURCES
|
||||||
# dzbj 吧唧专属模块
|
# dzbj 吧唧专属模块
|
||||||
@ -221,11 +200,6 @@ if(CONFIG_BAJI_BADGE_MODE)
|
|||||||
"dzbj/dzbj_button.c"
|
"dzbj/dzbj_button.c"
|
||||||
"dzbj/dzbj_battery.c"
|
"dzbj/dzbj_battery.c"
|
||||||
"dzbj/ble_transfer.c"
|
"dzbj/ble_transfer.c"
|
||||||
# 吧唧模式 LVGL UI(AI 对话屏幕 + 各种 PoC)
|
|
||||||
"dzbj/ai_chat_ui.c"
|
|
||||||
"dzbj/sprite_demo.c"
|
|
||||||
"dzbj/dual_gif_demo.c"
|
|
||||||
"dzbj/bg_gif_demo.c"
|
|
||||||
# SquareLine Studio 吧唧专属 UI 屏幕(9 个)
|
# SquareLine Studio 吧唧专属 UI 屏幕(9 个)
|
||||||
"ui/screens/ui_ScreenHome.c"
|
"ui/screens/ui_ScreenHome.c"
|
||||||
"ui/screens/ui_ScreenImg.c"
|
"ui/screens/ui_ScreenImg.c"
|
||||||
@ -237,11 +211,6 @@ if(CONFIG_BAJI_BADGE_MODE)
|
|||||||
"ui/screens/ui_ScreenSharing.c"
|
"ui/screens/ui_ScreenSharing.c"
|
||||||
"ui/screens/ui_ScreenReceiving.c"
|
"ui/screens/ui_ScreenReceiving.c"
|
||||||
)
|
)
|
||||||
else()
|
|
||||||
# Phase 10: 数字人模式 EAF UI(替代 LVGL 版 ai_chat_ui.c + bg_gif_demo.c)
|
|
||||||
list(APPEND SOURCES
|
|
||||||
"dzbj/ai_chat_ui_eaf.c"
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CONFIG_CONNECTION_TYPE_MQTT_UDP)
|
if(CONFIG_CONNECTION_TYPE_MQTT_UDP)
|
||||||
@ -293,7 +262,7 @@ idf_component_register(SRCS ${SOURCES}
|
|||||||
INCLUDE_DIRS ${INCLUDE_DIRS}
|
INCLUDE_DIRS ${INCLUDE_DIRS}
|
||||||
# 路径 D'' AEC: esp-sr 提供 esp_aec.h 底层同步 API (aec_create/aec_process/aec_destroy)
|
# 路径 D'' AEC: esp-sr 提供 esp_aec.h 底层同步 API (aec_create/aec_process/aec_destroy)
|
||||||
# 配合软件 loopback ref (DAC PCM copy 到 ring buffer) 实现设备端 AEC
|
# 配合软件 loopback ref (DAC PCM copy 到 ring buffer) 实现设备端 AEC
|
||||||
REQUIRES esp_wifi esp_netif esp_event nvs_flash bt spi_flash app_update efuse volc_engine_rtc_lite common zlib esp_lcd driver esp-sr
|
REQUIRES esp_wifi esp_netif esp_event nvs_flash bt spi_flash esp_app_format efuse volc_engine_rtc_lite common zlib esp_lcd driver esp-sr
|
||||||
WHOLE_ARCHIVE
|
WHOLE_ARCHIVE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -103,7 +103,6 @@ Application::Application() {
|
|||||||
dialog_watchdog_task_handle_ = nullptr; // 初始化对话看门狗任务句柄
|
dialog_watchdog_task_handle_ = nullptr; // 初始化对话看门狗任务句柄
|
||||||
clock_ticks_ = 0; // 初始化时钟计数
|
clock_ticks_ = 0; // 初始化时钟计数
|
||||||
main_loop_task_handle_ = nullptr; // 初始化主循环任务句柄
|
main_loop_task_handle_ = nullptr; // 初始化主循环任务句柄
|
||||||
check_new_version_task_handle_ = nullptr; // 初始化版本检查任务句柄
|
|
||||||
audio_loop_task_handle_ = nullptr; // 初始化音频循环任务句柄
|
audio_loop_task_handle_ = nullptr; // 初始化音频循环任务句柄
|
||||||
|
|
||||||
esp_timer_create_args_t clock_timer_args = {
|
esp_timer_create_args_t clock_timer_args = {
|
||||||
@ -322,106 +321,7 @@ void Application::ApplyAEC(std::vector<int16_t>& mic_inout) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Application::CheckNewVersion() {
|
void Application::CheckNewVersion() {
|
||||||
// ESP_LOGI(TAG, "OTA版本检查已临时禁用");
|
ESP_LOGI(TAG, "OTA disabled in this dual-mode firmware");
|
||||||
// return;
|
|
||||||
auto& board = Board::GetInstance();
|
|
||||||
auto display = board.GetDisplay();
|
|
||||||
// Check if there is a new firmware version available
|
|
||||||
ota_.SetPostData(board.GetJson());// 发送当前设备的JSON数据到OTA服务器,用于检查是否有新的固件版本 包办板载信息 BOARD_TYPE
|
|
||||||
|
|
||||||
const int MAX_RETRY = 10;
|
|
||||||
int retry_count = 0;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
if (!ota_.CheckVersion()) {
|
|
||||||
retry_count++;
|
|
||||||
if (retry_count >= MAX_RETRY) {
|
|
||||||
ESP_LOGE(TAG, "Too many retries, exit version check");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ESP_LOGW(TAG, "Check new version failed, retry in %d seconds (%d/%d)", 60, retry_count, MAX_RETRY);
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(60000));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
retry_count = 0;
|
|
||||||
|
|
||||||
if (ota_.HasNewVersion()) {
|
|
||||||
Alert(Lang::Strings::OTA_UPGRADE, Lang::Strings::UPGRADING, "happy", Lang::Sounds::P3_UPGRADE);
|
|
||||||
// Wait for the chat state to be idle
|
|
||||||
do {
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(3000));
|
|
||||||
} while (GetDeviceState() != kDeviceStateIdle);
|
|
||||||
|
|
||||||
// Use main task to do the upgrade, not cancelable
|
|
||||||
Schedule([this, display]() {
|
|
||||||
SetDeviceState(kDeviceStateUpgrading);
|
|
||||||
|
|
||||||
display->SetIcon(FONT_AWESOME_DOWNLOAD);
|
|
||||||
std::string message = std::string(Lang::Strings::NEW_VERSION) + ota_.GetFirmwareVersion();
|
|
||||||
display->SetChatMessage("system", message.c_str());
|
|
||||||
|
|
||||||
auto& board = Board::GetInstance();
|
|
||||||
board.SetPowerSaveMode(false);// 关闭低功耗模式
|
|
||||||
#if CONFIG_USE_WAKE_WORD_DETECT || CONFIG_USE_CUSTOM_WAKE_WORD
|
|
||||||
wake_word_detect_.Stop();
|
|
||||||
#endif
|
|
||||||
// 预先关闭音频输出,避免升级过程有音频操作
|
|
||||||
auto codec = board.GetAudioCodec();
|
|
||||||
codec->EnableInput(false);
|
|
||||||
codec->EnableOutput(false);
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
audio_decode_queue_.clear();
|
|
||||||
}
|
|
||||||
background_task_->WaitForCompletion();
|
|
||||||
delete background_task_;
|
|
||||||
background_task_ = nullptr;
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
|
||||||
|
|
||||||
ota_.StartUpgrade([display](int progress, size_t speed) {
|
|
||||||
char buffer[64];
|
|
||||||
snprintf(buffer, sizeof(buffer), "%d%% %zuKB/s", progress, speed / 1024);
|
|
||||||
display->SetChatMessage("system", buffer);
|
|
||||||
});
|
|
||||||
|
|
||||||
// If upgrade success, the device will reboot and never reach here
|
|
||||||
display->SetStatus(Lang::Strings::UPGRADE_FAILED);
|
|
||||||
ESP_LOGI(TAG, "Firmware upgrade failed...");
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(3000));
|
|
||||||
Reboot();
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// No new version, mark the current version as valid
|
|
||||||
ota_.MarkCurrentVersionValid();
|
|
||||||
std::string message = std::string(Lang::Strings::VERSION) + ota_.GetCurrentVersion();
|
|
||||||
display->ShowNotification(message.c_str());
|
|
||||||
|
|
||||||
// 检查是否有设备激活码
|
|
||||||
// if (ota_.HasActivationCode()) {
|
|
||||||
// // Activation code is valid
|
|
||||||
// SetDeviceState(kDeviceStateActivating);//设置设备状态为激活中
|
|
||||||
// // ShowActivationCode();//显示设备激活码
|
|
||||||
|
|
||||||
// // Check again in 60 seconds or until the device is idle
|
|
||||||
// for (int i = 0; i < 60; ++i) {
|
|
||||||
// if (device_state_ == kDeviceStateIdle) {
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// vTaskDelay(pdMS_TO_TICKS(1000));
|
|
||||||
// }
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
SetDeviceState(kDeviceStateIdle);
|
|
||||||
display->SetChatMessage("system", "");
|
|
||||||
ResetDecoder();
|
|
||||||
PlaySound(Lang::Sounds::P3_SUCCESS);
|
|
||||||
// Exit the loop if upgrade or idle
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 取消设备激活码播报,当前设备绑定使用Wi-Fi的Mac地址进行绑定
|
// 取消设备激活码播报,当前设备绑定使用Wi-Fi的Mac地址进行绑定
|
||||||
@ -1945,20 +1845,7 @@ void Application::Start() {
|
|||||||
});
|
});
|
||||||
protocol_->Start();
|
protocol_->Start();
|
||||||
|
|
||||||
// Check for new firmware version or get the MQTT broker address
|
// 当前双模式固件不启用 OTA,避免创建检查任务并占用运行时资源。
|
||||||
ota_.SetCheckVersionUrl(CONFIG_OTA_VERSION_URL);
|
|
||||||
ota_.SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str());
|
|
||||||
ota_.SetHeader("Client-Id", board.GetUuid());
|
|
||||||
ota_.SetHeader("Accept-Language", Lang::CODE);
|
|
||||||
auto app_desc = esp_app_get_description();
|
|
||||||
ota_.SetHeader("User-Agent", std::string(BOARD_NAME "/") + app_desc->version);
|
|
||||||
|
|
||||||
// 禁用自动OTA - 注释掉下面的任务创建OTA自动升级
|
|
||||||
xTaskCreate([](void* arg) {
|
|
||||||
Application* app = (Application*)arg;
|
|
||||||
app->CheckNewVersion();
|
|
||||||
vTaskDelete(NULL);
|
|
||||||
}, "check_new_version", 4096 * 2, this, 2, nullptr);
|
|
||||||
|
|
||||||
|
|
||||||
#if CONFIG_USE_AUDIO_PROCESSOR
|
#if CONFIG_USE_AUDIO_PROCESSOR
|
||||||
@ -2227,18 +2114,6 @@ void Application::OnClockTimer() {
|
|||||||
//ESP_LOGI(TAG, "此设备角色为: %s",CONFIG_DEVICE_ROLE);
|
//ESP_LOGI(TAG, "此设备角色为: %s",CONFIG_DEVICE_ROLE);
|
||||||
// ESP_LOGI(TAG, "此设备角色为: KAKA 1028 升级成功!");
|
// ESP_LOGI(TAG, "此设备角色为: KAKA 1028 升级成功!");
|
||||||
|
|
||||||
// 如果我们已经同步了服务器时间,如果设备处于空闲状态,请将状态设置为时钟“HH:MM”
|
|
||||||
if (ota_.HasServerTime()) {
|
|
||||||
if (device_state_ == kDeviceStateIdle) {
|
|
||||||
Schedule([this]() {
|
|
||||||
// Set status to clock "HH:MM"
|
|
||||||
time_t now = time(NULL);// 获取当前时间
|
|
||||||
char time_str[64];// 时间字符串缓冲区
|
|
||||||
strftime(time_str, sizeof(time_str), "%H:%M ", localtime(&now));// 格式化时间字符串
|
|
||||||
Board::GetInstance().GetDisplay()->SetStatus(time_str);// 设置显示状态
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4891,4 +4766,3 @@ void Application::WakeFromHibernate() {
|
|||||||
|
|
||||||
ESP_LOGI(TAG, "✓ 唤醒完成,已触发 RTC 重连");
|
ESP_LOGI(TAG, "✓ 唤醒完成,已触发 RTC 重连");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "websocket_protocol.h"
|
#include "websocket_protocol.h"
|
||||||
#include "ota.h"
|
|
||||||
#include "background_task.h"
|
#include "background_task.h"
|
||||||
#include "audio/simple_pipeline.h"
|
#include "audio/simple_pipeline.h"
|
||||||
// #include "ble_service.h" // BLE JSON Service 暂不使用
|
// #include "ble_service.h" // BLE JSON Service 暂不使用
|
||||||
@ -134,7 +133,6 @@ private:
|
|||||||
#if CONFIG_USE_AUDIO_PROCESSOR
|
#if CONFIG_USE_AUDIO_PROCESSOR
|
||||||
AudioProcessor audio_processor_;
|
AudioProcessor audio_processor_;
|
||||||
#endif
|
#endif
|
||||||
Ota ota_;
|
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
std::list<std::function<void()>> main_tasks_;
|
std::list<std::function<void()>> main_tasks_;
|
||||||
std::unique_ptr<Protocol> protocol_;
|
std::unique_ptr<Protocol> protocol_;
|
||||||
@ -186,7 +184,6 @@ private:
|
|||||||
TaskHandle_t dialog_watchdog_task_handle_; // 对话看门狗任务句柄
|
TaskHandle_t dialog_watchdog_task_handle_; // 对话看门狗任务句柄
|
||||||
int clock_ticks_;
|
int clock_ticks_;
|
||||||
TaskHandle_t main_loop_task_handle_;
|
TaskHandle_t main_loop_task_handle_;
|
||||||
TaskHandle_t check_new_version_task_handle_;
|
|
||||||
|
|
||||||
// Audio encode / decode
|
// Audio encode / decode
|
||||||
TaskHandle_t audio_loop_task_handle_;
|
TaskHandle_t audio_loop_task_handle_;
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include "assets/lang_config.h"
|
#include "assets/lang_config.h"
|
||||||
|
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
#include <esp_ota_ops.h>
|
#include <esp_app_desc.h>
|
||||||
#include <esp_chip_info.h>
|
#include <esp_chip_info.h>
|
||||||
#include <esp_random.h>
|
#include <esp_random.h>
|
||||||
|
|
||||||
@ -151,8 +151,7 @@ std::string Board::GetJson() {
|
|||||||
json += "],";
|
json += "],";
|
||||||
|
|
||||||
json += "\"ota\":{";
|
json += "\"ota\":{";
|
||||||
auto ota_partition = esp_ota_get_running_partition();
|
json += "\"label\":\"disabled\"";
|
||||||
json += "\"label\":\"" + std::string(ota_partition->label) + "\"";
|
|
||||||
json += "},";
|
json += "},";
|
||||||
|
|
||||||
json += "\"board\":" + GetBoardJson();
|
json += "\"board\":" + GetBoardJson();
|
||||||
|
|||||||
@ -59,7 +59,6 @@ extern "C" void init_spiffs_image_list(void);
|
|||||||
// AI 对话屏幕初始化(纯 C,避免 lv_font_t 冲突)
|
// AI 对话屏幕初始化(纯 C,避免 lv_font_t 冲突)
|
||||||
extern "C" void ai_chat_screen_init(void);
|
extern "C" void ai_chat_screen_init(void);
|
||||||
extern "C" void ai_chat_resume_animation(void);
|
extern "C" void ai_chat_resume_animation(void);
|
||||||
// 配网模式专用最小化初始化 (只显示文字, 不加载 EAF 资源 / 不创建 anim)
|
|
||||||
extern "C" void ai_chat_screen_init_provisioning(const char* hint_text);
|
extern "C" void ai_chat_screen_init_provisioning(const char* hint_text);
|
||||||
|
|
||||||
// 背光初始化(pages_pwm.h 包含 LVGL 头文件,不能直接 include)
|
// 背光初始化(pages_pwm.h 包含 LVGL 头文件,不能直接 include)
|
||||||
@ -253,24 +252,17 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
// ===== AI 对话模式 =====
|
// ===== AI 对话模式 =====
|
||||||
// 仅硬件+LVGL 初始化(不加载 SquareLine UI)
|
// 仅初始化 LCD/Touch 硬件。LVGL 只属于电子吧唧模式,AI/配网路径由 EAF 或纯提示接管。
|
||||||
dzbj_hw_display_init(codec_i2c_bus_);
|
dzbj_hw_display_init(codec_i2c_bus_);
|
||||||
// 配网模式跳过 EAF 数字人初始化, 节省 ~30 KB DRAM + 4.32 MB PSRAM,
|
|
||||||
// 让 BLE Bluedroid stack 有足够 DRAM 完成 advertising data malloc.
|
|
||||||
// 配网期间用户操作只需要听音效 + 看简单提示, 不需要数字人界面.
|
|
||||||
if (WifiBoard::NeedsProvisioning()) {
|
if (WifiBoard::NeedsProvisioning()) {
|
||||||
// 配网模式: EAF 最小化初始化 (仅显示文字, 不加载 8 张 EAF 资源 + 不创建 anim)
|
// 配网模式只启用 EAF 最小显示栈:renderer + label,不加载数字人资源和动画。
|
||||||
// 省 4.32 MB PSRAM (EAF 资源) + 数字人 anim 的 DRAM 占用
|
ESP_LOGI(TAG, "🔵 配网模式: 使用 EAF 最小显示栈显示中文提示");
|
||||||
// 保留 ~30 KB DRAM 给 gfx flush buffer (启动时预分配, 不抢 BLE 初始化)
|
ai_chat_screen_init_provisioning("请使用APP\n蓝牙配网");
|
||||||
// 显示"请使用APP\n蓝牙配网~"提示
|
|
||||||
// 跟 adaptation_dzbjImg_shar (用 LVGL 显示 GIF + 配网) 同思路, 用 EAF 替代 LVGL
|
|
||||||
ESP_LOGI(TAG, "🔵 配网模式: EAF 最小化初始化, 显示配网提示文字");
|
|
||||||
ai_chat_screen_init_provisioning("请使用APP\n蓝牙配网~");
|
|
||||||
} else {
|
} else {
|
||||||
// 加载 AI 对话专用屏幕
|
// 加载 AI 对话专用屏幕
|
||||||
ai_chat_screen_init();
|
ai_chat_screen_init();
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(100)); // 等待首帧渲染
|
||||||
}
|
}
|
||||||
vTaskDelay(pdMS_TO_TICKS(100)); // 等待首帧渲染
|
|
||||||
pwm_init(); // 点亮背光
|
pwm_init(); // 点亮背光
|
||||||
ESP_LOGI(TAG, "🤖 AI对话模式启动");
|
ESP_LOGI(TAG, "🤖 AI对话模式启动");
|
||||||
|
|
||||||
|
|||||||
@ -454,12 +454,16 @@ static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_
|
|||||||
ESP_LOGI(CONN_TAG, "Connected, conn_id %u, remote "ESP_BD_ADDR_STR"",
|
ESP_LOGI(CONN_TAG, "Connected, conn_id %u, remote "ESP_BD_ADDR_STR"",
|
||||||
param->connect.conn_id, ESP_BD_ADDR_HEX(param->connect.remote_bda));
|
param->connect.conn_id, ESP_BD_ADDR_HEX(param->connect.remote_bda));
|
||||||
esp_ble_gap_update_conn_params(&conn_params);
|
esp_ble_gap_update_conn_params(&conn_params);
|
||||||
// 请求 2M PHY 提升传输速度(对端不支持时自动回退 1M,不影响兼容性)
|
// BLE 5.0 开启时请求 2M PHY;RTC 双模式默认关闭 BLE 5.0,走 legacy 1M 保配网稳定。
|
||||||
|
#if CONFIG_BT_BLE_50_FEATURES_SUPPORTED
|
||||||
esp_ble_gap_set_preferred_phy(param->connect.remote_bda,
|
esp_ble_gap_set_preferred_phy(param->connect.remote_bda,
|
||||||
ESP_BLE_GAP_NO_PREFER_TRANSMIT_PHY | ESP_BLE_GAP_NO_PREFER_RECEIVE_PHY,
|
ESP_BLE_GAP_NO_PREFER_TRANSMIT_PHY | ESP_BLE_GAP_NO_PREFER_RECEIVE_PHY,
|
||||||
ESP_BLE_GAP_PHY_2M_PREF_MASK,
|
ESP_BLE_GAP_PHY_2M_PREF_MASK,
|
||||||
ESP_BLE_GAP_PHY_2M_PREF_MASK,
|
ESP_BLE_GAP_PHY_2M_PREF_MASK,
|
||||||
ESP_BLE_GAP_PHY_OPTIONS_NO_PREF);
|
ESP_BLE_GAP_PHY_OPTIONS_NO_PREF);
|
||||||
|
#else
|
||||||
|
ESP_LOGI(CONN_TAG, "BLE 5.0 disabled, keep legacy 1M PHY for compatibility");
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ESP_GATTS_DISCONNECT_EVT:
|
case ESP_GATTS_DISCONNECT_EVT:
|
||||||
|
|||||||
@ -12,10 +12,9 @@
|
|||||||
|
|
||||||
#define TAG "DZBJ"
|
#define TAG "DZBJ"
|
||||||
|
|
||||||
// 仅硬件+LVGL 初始化(不加载 SquareLine UI,不点亮背光)
|
// 仅 LCD/Touch 硬件初始化,不启动 LVGL。
|
||||||
//
|
// 双模式固件中 CONFIG_BAJI_BADGE_MODE 只是"支持电子吧唧"的编译开关,
|
||||||
// Phase 10: 数字人 EAF 模式(CONFIG_BAJI_BADGE_MODE=n)下跳过 LVGL 初始化
|
// 不能用它判断当前运行模式;AI/EAF/配网路径必须避免初始化 LVGL。
|
||||||
// 让 esp_emote_gfx 接管 panel_handle,避免双框架冲突
|
|
||||||
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
|
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
|
||||||
ESP_LOGI(TAG, "开始初始化显示硬件...");
|
ESP_LOGI(TAG, "开始初始化显示硬件...");
|
||||||
|
|
||||||
@ -34,15 +33,7 @@ void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
|
|||||||
ESP_LOGI(TAG, "屏幕触摸已禁用 (DZBJ_ENABLE_TOUCH=0)");
|
ESP_LOGI(TAG, "屏幕触摸已禁用 (DZBJ_ENABLE_TOUCH=0)");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_BAJI_BADGE_MODE
|
ESP_LOGI(TAG, "硬件初始化完成,跳过 LVGL,等待上层显示管线接管");
|
||||||
// 4. LVGL 初始化(仅吧唧模式)
|
|
||||||
lvgl_lcd_init();
|
|
||||||
ESP_LOGI(TAG, "LVGL 初始化完成");
|
|
||||||
#else
|
|
||||||
// Phase 10: 数字人 EAF 模式下不初始化 LVGL
|
|
||||||
// esp_emote_gfx 会在 ai_chat_screen_init 中接管 panel_handle
|
|
||||||
ESP_LOGI(TAG, "数字人 EAF 模式: 跳过 LVGL 初始化,等待 esp_emote_gfx 接管");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_BAJI_BADGE_MODE
|
#ifdef CONFIG_BAJI_BADGE_MODE
|
||||||
@ -50,6 +41,10 @@ void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
|
|||||||
void dzbj_display_init(i2c_master_bus_handle_t i2c_bus) {
|
void dzbj_display_init(i2c_master_bus_handle_t i2c_bus) {
|
||||||
dzbj_hw_display_init(i2c_bus);
|
dzbj_hw_display_init(i2c_bus);
|
||||||
|
|
||||||
|
// 电子吧唧模式才启动 LVGL + SquareLine UI。
|
||||||
|
lvgl_lcd_init();
|
||||||
|
ESP_LOGI(TAG, "LVGL 初始化完成");
|
||||||
|
|
||||||
// SquareLine UI 初始化
|
// SquareLine UI 初始化
|
||||||
ui_init();
|
ui_init();
|
||||||
ESP_LOGI(TAG, "UI 初始化完成");
|
ESP_LOGI(TAG, "UI 初始化完成");
|
||||||
|
|||||||
@ -14,8 +14,8 @@ extern "C" {
|
|||||||
void dzbj_display_init(i2c_master_bus_handle_t i2c_bus);
|
void dzbj_display_init(i2c_master_bus_handle_t i2c_bus);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 仅硬件+LVGL 初始化(不加载 SquareLine UI,不点亮背光)—— 公共
|
// 仅 LCD/Touch 硬件初始化,不启动 LVGL。
|
||||||
// 用于 AI 模式:调用方自行加载 AI 专用屏幕后再点亮背光
|
// 用于 AI/EAF 和配网模式:避免 LVGL 与 EAF 双显示栈抢内部 SRAM。
|
||||||
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus);
|
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@ -327,6 +327,9 @@ void img_loop_task(void *pvParameters) {
|
|||||||
while((entry = readdir(dir)) != NULL && file_count < 10) {
|
while((entry = readdir(dir)) != NULL && file_count < 10) {
|
||||||
// 检查是否是图片文件(.jpg, .jpeg, .png等)
|
// 检查是否是图片文件(.jpg, .jpeg, .png等)
|
||||||
const char *name = entry->d_name;
|
const char *name = entry->d_name;
|
||||||
|
if(strcmp(name, "Background_360x360.jpg") == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
int len = strlen(name);
|
int len = strlen(name);
|
||||||
if(len > 4) {
|
if(len > 4) {
|
||||||
const char *ext = name + len - 4;
|
const char *ext = name + len - 4;
|
||||||
@ -417,6 +420,9 @@ void init_spiffs_image_list(void) {
|
|||||||
while((entry = readdir(dir)) != NULL && spiffs_image_count < MAX_IMAGE_FILES) {
|
while((entry = readdir(dir)) != NULL && spiffs_image_count < MAX_IMAGE_FILES) {
|
||||||
// 检查是否是图片文件(.jpg, .jpeg, .png等)
|
// 检查是否是图片文件(.jpg, .jpeg, .png等)
|
||||||
const char *name = entry->d_name;
|
const char *name = entry->d_name;
|
||||||
|
if(strcmp(name, "Background_360x360.jpg") == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
int len = strlen(name);
|
int len = strlen(name);
|
||||||
if(len > 4 && len < MAX_FILENAME_LEN) {
|
if(len > 4 && len < MAX_FILENAME_LEN) {
|
||||||
const char *ext = name + len - 4;
|
const char *ext = name + len - 4;
|
||||||
|
|||||||
30
main/ota.h
30
main/ota.h
@ -4,22 +4,23 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
class Ota {
|
class Ota {
|
||||||
public:
|
public:
|
||||||
Ota();
|
Ota() = default;
|
||||||
~Ota();
|
~Ota() = default;
|
||||||
|
|
||||||
void SetCheckVersionUrl(std::string check_version_url);
|
void SetCheckVersionUrl(std::string check_version_url) { check_version_url_ = std::move(check_version_url); }
|
||||||
void SetHeader(const std::string& key, const std::string& value);
|
void SetHeader(const std::string& key, const std::string& value) { headers_[key] = value; }
|
||||||
void SetPostData(const std::string& post_data);
|
void SetPostData(const std::string& post_data) { post_data_ = post_data; }
|
||||||
bool CheckVersion();
|
bool CheckVersion() { return false; }
|
||||||
bool HasNewVersion() { return has_new_version_; }
|
bool HasNewVersion() { return false; }
|
||||||
bool HasMqttConfig() { return has_mqtt_config_; }
|
bool HasMqttConfig() { return false; }
|
||||||
bool HasActivationCode() { return has_activation_code_; }
|
bool HasActivationCode() { return false; }
|
||||||
bool HasServerTime() { return has_server_time_; }
|
bool HasServerTime() { return false; }
|
||||||
void StartUpgrade(std::function<void(int progress, size_t speed)> callback);
|
void StartUpgrade(std::function<void(int progress, size_t speed)> callback) {}
|
||||||
void MarkCurrentVersionValid();
|
void MarkCurrentVersionValid() {}
|
||||||
|
|
||||||
const std::string& GetFirmwareVersion() const { return firmware_version_; }
|
const std::string& GetFirmwareVersion() const { return firmware_version_; }
|
||||||
const std::string& GetCurrentVersion() const { return current_version_; }
|
const std::string& GetCurrentVersion() const { return current_version_; }
|
||||||
@ -39,11 +40,6 @@ private:
|
|||||||
std::string firmware_url_;
|
std::string firmware_url_;
|
||||||
std::string post_data_;
|
std::string post_data_;
|
||||||
std::map<std::string, std::string> headers_;
|
std::map<std::string, std::string> headers_;
|
||||||
|
|
||||||
void Upgrade(const std::string& firmware_url);
|
|
||||||
std::function<void(int progress, size_t speed)> upgrade_callback_;
|
|
||||||
std::vector<int> ParseVersion(const std::string& version);
|
|
||||||
bool IsNewVersionAvailable(const std::string& currentVersion, const std::string& newVersion);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _OTA_H
|
#endif // _OTA_H
|
||||||
|
|||||||
@ -7,7 +7,6 @@
|
|||||||
#include <esp_system.h>
|
#include <esp_system.h>
|
||||||
#include <esp_partition.h>
|
#include <esp_partition.h>
|
||||||
#include <esp_app_desc.h>
|
#include <esp_app_desc.h>
|
||||||
#include <esp_ota_ops.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define TAG "SystemInfo"
|
#define TAG "SystemInfo"
|
||||||
@ -133,4 +132,3 @@ exit: //Common return path
|
|||||||
free(end_array);
|
free(end_array);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,6 @@
|
|||||||
# ESP-IDF Partition Table
|
# ESP-IDF Partition Table
|
||||||
# Name, Type, SubType, Offset, Size, Flags
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
nvs, data, nvs, 0x9000, 0x4000,
|
nvs, data, nvs, 0x9000, 0x4000,
|
||||||
otadata, data, ota, 0xd000, 0x2000,
|
|
||||||
phy_init, data, phy, 0xf000, 0x1000,
|
phy_init, data, phy, 0xf000, 0x1000,
|
||||||
ota_0, app, ota_0, 0x10000, 0x580000,
|
factory, app, factory, 0x10000, 0x900000,
|
||||||
ota_1, app, ota_1, 0x590000, 0x580000,
|
storage, data, spiffs, 0x910000, 0x6F0000,
|
||||||
storage, data, spiffs, 0xB10000, 0x4F0000,
|
|
||||||
|
|||||||
|
22
sdkconfig
22
sdkconfig
@ -587,7 +587,7 @@ CONFIG_CONNECTION_TYPE_VOLC_RTC=y
|
|||||||
#
|
#
|
||||||
# Baji RTC Toy Configuration
|
# Baji RTC Toy Configuration
|
||||||
#
|
#
|
||||||
# CONFIG_BAJI_BADGE_MODE is not set
|
CONFIG_BAJI_BADGE_MODE=y
|
||||||
# end of Baji RTC Toy Configuration
|
# end of Baji RTC Toy Configuration
|
||||||
|
|
||||||
CONFIG_WEBSOCKET_URL="wss://xiaozhi-dev-api.goods.fun/xiaozhi/v1"
|
CONFIG_WEBSOCKET_URL="wss://xiaozhi-dev-api.goods.fun/xiaozhi/v1"
|
||||||
@ -1029,18 +1029,18 @@ CONFIG_BT_LOG_BLUFI_TRACE_LEVEL_WARNING=y
|
|||||||
CONFIG_BT_LOG_BLUFI_TRACE_LEVEL=2
|
CONFIG_BT_LOG_BLUFI_TRACE_LEVEL=2
|
||||||
# end of BT DEBUG LOG LEVEL
|
# end of BT DEBUG LOG LEVEL
|
||||||
|
|
||||||
CONFIG_BT_ACL_CONNECTIONS=4
|
CONFIG_BT_ACL_CONNECTIONS=1
|
||||||
CONFIG_BT_MULTI_CONNECTION_ENBALE=y
|
# CONFIG_BT_MULTI_CONNECTION_ENBALE is not set
|
||||||
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
|
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
|
||||||
# CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY is not set
|
# CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY is not set
|
||||||
CONFIG_BT_SMP_ENABLE=y
|
CONFIG_BT_SMP_ENABLE=y
|
||||||
CONFIG_BT_SMP_MAX_BONDS=15
|
CONFIG_BT_SMP_MAX_BONDS=2
|
||||||
# CONFIG_BT_BLE_ACT_SCAN_REP_ADV_SCAN is not set
|
# CONFIG_BT_BLE_ACT_SCAN_REP_ADV_SCAN is not set
|
||||||
CONFIG_BT_MAX_DEVICE_NAME_LEN=32
|
CONFIG_BT_MAX_DEVICE_NAME_LEN=32
|
||||||
CONFIG_BT_BLE_RPA_TIMEOUT=900
|
CONFIG_BT_BLE_RPA_TIMEOUT=900
|
||||||
# CONFIG_BT_BLE_50_FEATURES_SUPPORTED is not set
|
# CONFIG_BT_BLE_50_FEATURES_SUPPORTED is not set
|
||||||
CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y
|
CONFIG_BT_BLE_42_FEATURES_SUPPORTED=y
|
||||||
CONFIG_BT_BLE_42_DTM_TEST_EN=y
|
# CONFIG_BT_BLE_42_DTM_TEST_EN is not set
|
||||||
CONFIG_BT_BLE_42_ADV_EN=y
|
CONFIG_BT_BLE_42_ADV_EN=y
|
||||||
CONFIG_BT_BLE_42_SCAN_EN=y
|
CONFIG_BT_BLE_42_SCAN_EN=y
|
||||||
CONFIG_BT_BLE_VENDOR_HCI_EN=y
|
CONFIG_BT_BLE_VENDOR_HCI_EN=y
|
||||||
@ -1052,8 +1052,8 @@ CONFIG_BT_BLE_VENDOR_HCI_EN=y
|
|||||||
# Controller Options
|
# Controller Options
|
||||||
#
|
#
|
||||||
CONFIG_BT_CTRL_MODE_EFF=1
|
CONFIG_BT_CTRL_MODE_EFF=1
|
||||||
CONFIG_BT_CTRL_BLE_MAX_ACT=6
|
CONFIG_BT_CTRL_BLE_MAX_ACT=2
|
||||||
CONFIG_BT_CTRL_BLE_MAX_ACT_EFF=6
|
CONFIG_BT_CTRL_BLE_MAX_ACT_EFF=2
|
||||||
CONFIG_BT_CTRL_BLE_STATIC_ACL_TX_BUF_NB=0
|
CONFIG_BT_CTRL_BLE_STATIC_ACL_TX_BUF_NB=0
|
||||||
CONFIG_BT_CTRL_PINNED_TO_CORE_0=y
|
CONFIG_BT_CTRL_PINNED_TO_CORE_0=y
|
||||||
# CONFIG_BT_CTRL_PINNED_TO_CORE_1 is not set
|
# CONFIG_BT_CTRL_PINNED_TO_CORE_1 is not set
|
||||||
@ -1061,7 +1061,7 @@ CONFIG_BT_CTRL_PINNED_TO_CORE=0
|
|||||||
CONFIG_BT_CTRL_HCI_MODE_VHCI=y
|
CONFIG_BT_CTRL_HCI_MODE_VHCI=y
|
||||||
# CONFIG_BT_CTRL_HCI_MODE_UART_H4 is not set
|
# CONFIG_BT_CTRL_HCI_MODE_UART_H4 is not set
|
||||||
CONFIG_BT_CTRL_HCI_TL=1
|
CONFIG_BT_CTRL_HCI_TL=1
|
||||||
CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=30
|
CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=10
|
||||||
CONFIG_BT_BLE_CCA_MODE_NONE=y
|
CONFIG_BT_BLE_CCA_MODE_NONE=y
|
||||||
# CONFIG_BT_BLE_CCA_MODE_HW is not set
|
# CONFIG_BT_BLE_CCA_MODE_HW is not set
|
||||||
# CONFIG_BT_BLE_CCA_MODE_SW is not set
|
# CONFIG_BT_BLE_CCA_MODE_SW is not set
|
||||||
@ -1103,7 +1103,7 @@ CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DEVICE=y
|
|||||||
# CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DATA is not set
|
# CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DATA is not set
|
||||||
# CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DATA_DEVICE is not set
|
# CONFIG_BT_CTRL_SCAN_DUPL_TYPE_DATA_DEVICE is not set
|
||||||
CONFIG_BT_CTRL_SCAN_DUPL_TYPE=0
|
CONFIG_BT_CTRL_SCAN_DUPL_TYPE=0
|
||||||
CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE=100
|
CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE=10
|
||||||
CONFIG_BT_CTRL_DUPL_SCAN_CACHE_REFRESH_PERIOD=0
|
CONFIG_BT_CTRL_DUPL_SCAN_CACHE_REFRESH_PERIOD=0
|
||||||
# CONFIG_BT_CTRL_BLE_MESH_SCAN_DUPL_EN is not set
|
# CONFIG_BT_CTRL_BLE_MESH_SCAN_DUPL_EN is not set
|
||||||
# CONFIG_BT_CTRL_COEX_PHY_CODED_TX_RX_TLIM_EN is not set
|
# CONFIG_BT_CTRL_COEX_PHY_CODED_TX_RX_TLIM_EN is not set
|
||||||
@ -1134,7 +1134,7 @@ CONFIG_BT_CTRL_LE_PING_EN=y
|
|||||||
# end of BLE disconnects when Instant Passed (0x28) occurs
|
# end of BLE disconnects when Instant Passed (0x28) occurs
|
||||||
|
|
||||||
# CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY is not set
|
# CONFIG_BT_CTRL_RUN_IN_FLASH_ONLY is not set
|
||||||
CONFIG_BT_CTRL_DTM_ENABLE=y
|
# CONFIG_BT_CTRL_DTM_ENABLE is not set
|
||||||
CONFIG_BT_CTRL_BLE_MASTER=y
|
CONFIG_BT_CTRL_BLE_MASTER=y
|
||||||
# CONFIG_BT_CTRL_BLE_TEST is not set
|
# CONFIG_BT_CTRL_BLE_TEST is not set
|
||||||
CONFIG_BT_CTRL_BLE_SCAN=y
|
CONFIG_BT_CTRL_BLE_SCAN=y
|
||||||
@ -1661,7 +1661,7 @@ CONFIG_SPIRAM_USE_MALLOC=y
|
|||||||
# CONFIG_SPIRAM_MEMTEST is not set
|
# CONFIG_SPIRAM_MEMTEST is not set
|
||||||
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
|
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
|
||||||
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
|
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
|
||||||
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
|
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
|
||||||
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
|
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
|
||||||
CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y
|
CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y
|
||||||
# end of SPI RAM config
|
# end of SPI RAM config
|
||||||
|
|||||||
@ -163,6 +163,16 @@ CONFIG_BT_STACK_NO_LOG=n
|
|||||||
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
|
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
|
||||||
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=n
|
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=n
|
||||||
CONFIG_BT_RESERVE_DRAM=0x10000
|
CONFIG_BT_RESERVE_DRAM=0x10000
|
||||||
|
CONFIG_BT_ACL_CONNECTIONS=1
|
||||||
|
CONFIG_BT_MULTI_CONNECTION_ENBALE=n
|
||||||
|
CONFIG_BT_SMP_MAX_BONDS=2
|
||||||
|
CONFIG_BT_CTRL_BLE_MAX_ACT=2
|
||||||
|
CONFIG_BT_BLE_42_DTM_TEST_EN=n
|
||||||
|
CONFIG_BT_CTRL_DTM_ENABLE=n
|
||||||
|
CONFIG_BT_BLE_42_SCAN_EN=y
|
||||||
|
CONFIG_BT_CTRL_BLE_SCAN=y
|
||||||
|
CONFIG_BT_CTRL_ADV_DUP_FILT_MAX=10
|
||||||
|
CONFIG_BT_CTRL_SCAN_DUPL_CACHE_SIZE=10
|
||||||
|
|
||||||
# BluFi 未被代码使用(两种模式均用自定义 GATT Server),关闭以减少无关兼容风险
|
# BluFi 未被代码使用(两种模式均用自定义 GATT Server),关闭以减少无关兼容风险
|
||||||
CONFIG_BT_BLUFI_ENABLED=n
|
CONFIG_BT_BLUFI_ENABLED=n
|
||||||
@ -182,4 +192,4 @@ CONFIG_LWIP_MAX_SOCKETS=20
|
|||||||
# === Baji RTC Toy 模式开关 ===
|
# === Baji RTC Toy 模式开关 ===
|
||||||
# 数字人 RTC 单一形态固件:CONFIG_BAJI_BADGE_MODE=n
|
# 数字人 RTC 单一形态固件:CONFIG_BAJI_BADGE_MODE=n
|
||||||
# 双模式(AI + 电子吧唧)固件:CONFIG_BAJI_BADGE_MODE=y
|
# 双模式(AI + 电子吧唧)固件:CONFIG_BAJI_BADGE_MODE=y
|
||||||
CONFIG_BAJI_BADGE_MODE=n
|
CONFIG_BAJI_BADGE_MODE=y
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user