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"
|
||||
"system_info.cc"
|
||||
"application.cc"
|
||||
"ota.cc"
|
||||
"settings.cc"
|
||||
"background_task.cc"
|
||||
"bluetooth_provisioning.cc" # 蓝牙配网实现
|
||||
@ -28,10 +27,9 @@ set(SOURCES "audio_codecs/audio_codec.cc"
|
||||
"dzbj/pages_pwm.c"
|
||||
"dzbj/dzbj_init.c" # 含 dzbj_hw_display_init(公共硬件初始化);dzbj_display_init 函数体内部 #ifdef 包裹
|
||||
"dzbj/fatfs.c" # DecodeImg 公共(AI 模式 BG GIF PoC 也用);吧唧专用函数 fatfs_init/list 等无副作用
|
||||
# Phase 10: ai_chat_ui 双轨编译
|
||||
# CONFIG_BAJI_BADGE_MODE=y → ai_chat_ui.c (LVGL 版)
|
||||
# CONFIG_BAJI_BADGE_MODE=n → ai_chat_ui_eaf.c (esp_emote_gfx 版)
|
||||
# 这两个在下方 if(CONFIG_BAJI_BADGE_MODE) 块中条件编译
|
||||
# Phase 10: RTC 数字人固定使用 EAF UI
|
||||
# CONFIG_BAJI_BADGE_MODE 仅控制电子吧唧模块是否额外编译
|
||||
"dzbj/ai_chat_ui_eaf.c"
|
||||
"fonts/font_puhui_20_4.c" # 阿里巴巴普惠体 20px 4bpp(GB2312 简体中文)
|
||||
# SquareLine Studio UI 公共文件(AI 模式也使用)
|
||||
"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_s13_png.c"
|
||||
"ui/images/ui_img_s14_png.c"
|
||||
# emoji 表情图片资源(旧 PNG 静态表情,保留备用)
|
||||
"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"
|
||||
# 旧 LVGL/GIF 表情资源由 ai_chat_ui.c 使用;当前 RTC 固定走 EAF 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})
|
||||
|
||||
# === 电子吧唧专属 srcs(条件编译,CONFIG_BAJI_BADGE_MODE=n 时不参与编译)===
|
||||
# 源代码文件全部保留在仓库中,仅通过 Kconfig 开关控制是否进入编译队列
|
||||
# 源代码文件全部保留在仓库中,仅通过 Kconfig 开关控制是否进入编译队列。
|
||||
# RTC 数字人始终使用 ai_chat_ui_eaf.c,避免开启双模式后退回 LVGL/GIF 旧链路。
|
||||
if(CONFIG_BAJI_BADGE_MODE)
|
||||
list(APPEND SOURCES
|
||||
# dzbj 吧唧专属模块
|
||||
@ -221,11 +200,6 @@ if(CONFIG_BAJI_BADGE_MODE)
|
||||
"dzbj/dzbj_button.c"
|
||||
"dzbj/dzbj_battery.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 个)
|
||||
"ui/screens/ui_ScreenHome.c"
|
||||
"ui/screens/ui_ScreenImg.c"
|
||||
@ -237,11 +211,6 @@ if(CONFIG_BAJI_BADGE_MODE)
|
||||
"ui/screens/ui_ScreenSharing.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()
|
||||
|
||||
if(CONFIG_CONNECTION_TYPE_MQTT_UDP)
|
||||
@ -293,7 +262,7 @@ idf_component_register(SRCS ${SOURCES}
|
||||
INCLUDE_DIRS ${INCLUDE_DIRS}
|
||||
# 路径 D'' AEC: esp-sr 提供 esp_aec.h 底层同步 API (aec_create/aec_process/aec_destroy)
|
||||
# 配合软件 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
|
||||
)
|
||||
|
||||
|
||||
@ -103,7 +103,6 @@ Application::Application() {
|
||||
dialog_watchdog_task_handle_ = nullptr; // 初始化对话看门狗任务句柄
|
||||
clock_ticks_ = 0; // 初始化时钟计数
|
||||
main_loop_task_handle_ = nullptr; // 初始化主循环任务句柄
|
||||
check_new_version_task_handle_ = nullptr; // 初始化版本检查任务句柄
|
||||
audio_loop_task_handle_ = nullptr; // 初始化音频循环任务句柄
|
||||
|
||||
esp_timer_create_args_t clock_timer_args = {
|
||||
@ -322,106 +321,7 @@ void Application::ApplyAEC(std::vector<int16_t>& mic_inout) {
|
||||
}
|
||||
|
||||
void Application::CheckNewVersion() {
|
||||
// ESP_LOGI(TAG, "OTA版本检查已临时禁用");
|
||||
// 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;
|
||||
}
|
||||
ESP_LOGI(TAG, "OTA disabled in this dual-mode firmware");
|
||||
}
|
||||
|
||||
// 取消设备激活码播报,当前设备绑定使用Wi-Fi的Mac地址进行绑定
|
||||
@ -1945,20 +1845,7 @@ void Application::Start() {
|
||||
});
|
||||
protocol_->Start();
|
||||
|
||||
// Check for new firmware version or get the MQTT broker address
|
||||
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);
|
||||
// 当前双模式固件不启用 OTA,避免创建检查任务并占用运行时资源。
|
||||
|
||||
|
||||
#if CONFIG_USE_AUDIO_PROCESSOR
|
||||
@ -2227,18 +2114,6 @@ void Application::OnClockTimer() {
|
||||
//ESP_LOGI(TAG, "此设备角色为: %s",CONFIG_DEVICE_ROLE);
|
||||
// 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 重连");
|
||||
}
|
||||
|
||||
|
||||
@ -17,7 +17,6 @@
|
||||
|
||||
#include "protocol.h"
|
||||
#include "websocket_protocol.h"
|
||||
#include "ota.h"
|
||||
#include "background_task.h"
|
||||
#include "audio/simple_pipeline.h"
|
||||
// #include "ble_service.h" // BLE JSON Service 暂不使用
|
||||
@ -134,7 +133,6 @@ private:
|
||||
#if CONFIG_USE_AUDIO_PROCESSOR
|
||||
AudioProcessor audio_processor_;
|
||||
#endif
|
||||
Ota ota_;
|
||||
std::mutex mutex_;
|
||||
std::list<std::function<void()>> main_tasks_;
|
||||
std::unique_ptr<Protocol> protocol_;
|
||||
@ -186,7 +184,6 @@ private:
|
||||
TaskHandle_t dialog_watchdog_task_handle_; // 对话看门狗任务句柄
|
||||
int clock_ticks_;
|
||||
TaskHandle_t main_loop_task_handle_;
|
||||
TaskHandle_t check_new_version_task_handle_;
|
||||
|
||||
// Audio encode / decode
|
||||
TaskHandle_t audio_loop_task_handle_;
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
#include "assets/lang_config.h"
|
||||
|
||||
#include <esp_log.h>
|
||||
#include <esp_ota_ops.h>
|
||||
#include <esp_app_desc.h>
|
||||
#include <esp_chip_info.h>
|
||||
#include <esp_random.h>
|
||||
|
||||
@ -151,8 +151,7 @@ std::string Board::GetJson() {
|
||||
json += "],";
|
||||
|
||||
json += "\"ota\":{";
|
||||
auto ota_partition = esp_ota_get_running_partition();
|
||||
json += "\"label\":\"" + std::string(ota_partition->label) + "\"";
|
||||
json += "\"label\":\"disabled\"";
|
||||
json += "},";
|
||||
|
||||
json += "\"board\":" + GetBoardJson();
|
||||
@ -160,4 +159,4 @@ std::string Board::GetJson() {
|
||||
// Close the JSON object
|
||||
json += "}";
|
||||
return json;
|
||||
}
|
||||
}
|
||||
|
||||
@ -59,7 +59,6 @@ extern "C" void init_spiffs_image_list(void);
|
||||
// AI 对话屏幕初始化(纯 C,避免 lv_font_t 冲突)
|
||||
extern "C" void ai_chat_screen_init(void);
|
||||
extern "C" void ai_chat_resume_animation(void);
|
||||
// 配网模式专用最小化初始化 (只显示文字, 不加载 EAF 资源 / 不创建 anim)
|
||||
extern "C" void ai_chat_screen_init_provisioning(const char* hint_text);
|
||||
|
||||
// 背光初始化(pages_pwm.h 包含 LVGL 头文件,不能直接 include)
|
||||
@ -253,24 +252,17 @@ public:
|
||||
#endif
|
||||
{
|
||||
// ===== AI 对话模式 =====
|
||||
// 仅硬件+LVGL 初始化(不加载 SquareLine UI)
|
||||
// 仅初始化 LCD/Touch 硬件。LVGL 只属于电子吧唧模式,AI/配网路径由 EAF 或纯提示接管。
|
||||
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()) {
|
||||
// 配网模式: EAF 最小化初始化 (仅显示文字, 不加载 8 张 EAF 资源 + 不创建 anim)
|
||||
// 省 4.32 MB PSRAM (EAF 资源) + 数字人 anim 的 DRAM 占用
|
||||
// 保留 ~30 KB DRAM 给 gfx flush buffer (启动时预分配, 不抢 BLE 初始化)
|
||||
// 显示"请使用APP\n蓝牙配网~"提示
|
||||
// 跟 adaptation_dzbjImg_shar (用 LVGL 显示 GIF + 配网) 同思路, 用 EAF 替代 LVGL
|
||||
ESP_LOGI(TAG, "🔵 配网模式: EAF 最小化初始化, 显示配网提示文字");
|
||||
ai_chat_screen_init_provisioning("请使用APP\n蓝牙配网~");
|
||||
// 配网模式只启用 EAF 最小显示栈:renderer + label,不加载数字人资源和动画。
|
||||
ESP_LOGI(TAG, "🔵 配网模式: 使用 EAF 最小显示栈显示中文提示");
|
||||
ai_chat_screen_init_provisioning("请使用APP\n蓝牙配网");
|
||||
} else {
|
||||
// 加载 AI 对话专用屏幕
|
||||
ai_chat_screen_init();
|
||||
vTaskDelay(pdMS_TO_TICKS(100)); // 等待首帧渲染
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(100)); // 等待首帧渲染
|
||||
pwm_init(); // 点亮背光
|
||||
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"",
|
||||
param->connect.conn_id, ESP_BD_ADDR_HEX(param->connect.remote_bda));
|
||||
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_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_OPTIONS_NO_PREF);
|
||||
#else
|
||||
ESP_LOGI(CONN_TAG, "BLE 5.0 disabled, keep legacy 1M PHY for compatibility");
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case ESP_GATTS_DISCONNECT_EVT:
|
||||
|
||||
@ -12,10 +12,9 @@
|
||||
|
||||
#define TAG "DZBJ"
|
||||
|
||||
// 仅硬件+LVGL 初始化(不加载 SquareLine UI,不点亮背光)
|
||||
//
|
||||
// Phase 10: 数字人 EAF 模式(CONFIG_BAJI_BADGE_MODE=n)下跳过 LVGL 初始化
|
||||
// 让 esp_emote_gfx 接管 panel_handle,避免双框架冲突
|
||||
// 仅 LCD/Touch 硬件初始化,不启动 LVGL。
|
||||
// 双模式固件中 CONFIG_BAJI_BADGE_MODE 只是"支持电子吧唧"的编译开关,
|
||||
// 不能用它判断当前运行模式;AI/EAF/配网路径必须避免初始化 LVGL。
|
||||
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus) {
|
||||
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)");
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BAJI_BADGE_MODE
|
||||
// 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
|
||||
ESP_LOGI(TAG, "硬件初始化完成,跳过 LVGL,等待上层显示管线接管");
|
||||
}
|
||||
|
||||
#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) {
|
||||
dzbj_hw_display_init(i2c_bus);
|
||||
|
||||
// 电子吧唧模式才启动 LVGL + SquareLine UI。
|
||||
lvgl_lcd_init();
|
||||
ESP_LOGI(TAG, "LVGL 初始化完成");
|
||||
|
||||
// SquareLine UI 初始化
|
||||
ui_init();
|
||||
ESP_LOGI(TAG, "UI 初始化完成");
|
||||
|
||||
@ -14,8 +14,8 @@ extern "C" {
|
||||
void dzbj_display_init(i2c_master_bus_handle_t i2c_bus);
|
||||
#endif
|
||||
|
||||
// 仅硬件+LVGL 初始化(不加载 SquareLine UI,不点亮背光)—— 公共
|
||||
// 用于 AI 模式:调用方自行加载 AI 专用屏幕后再点亮背光
|
||||
// 仅 LCD/Touch 硬件初始化,不启动 LVGL。
|
||||
// 用于 AI/EAF 和配网模式:避免 LVGL 与 EAF 双显示栈抢内部 SRAM。
|
||||
void dzbj_hw_display_init(i2c_master_bus_handle_t i2c_bus);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@ -327,6 +327,9 @@ void img_loop_task(void *pvParameters) {
|
||||
while((entry = readdir(dir)) != NULL && file_count < 10) {
|
||||
// 检查是否是图片文件(.jpg, .jpeg, .png等)
|
||||
const char *name = entry->d_name;
|
||||
if(strcmp(name, "Background_360x360.jpg") == 0) {
|
||||
continue;
|
||||
}
|
||||
int len = strlen(name);
|
||||
if(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) {
|
||||
// 检查是否是图片文件(.jpg, .jpeg, .png等)
|
||||
const char *name = entry->d_name;
|
||||
if(strcmp(name, "Background_360x360.jpg") == 0) {
|
||||
continue;
|
||||
}
|
||||
int len = strlen(name);
|
||||
if(len > 4 && len < MAX_FILENAME_LEN) {
|
||||
const char *ext = name + len - 4;
|
||||
|
||||
30
main/ota.h
30
main/ota.h
@ -4,22 +4,23 @@
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <utility>
|
||||
|
||||
class Ota {
|
||||
public:
|
||||
Ota();
|
||||
~Ota();
|
||||
Ota() = default;
|
||||
~Ota() = default;
|
||||
|
||||
void SetCheckVersionUrl(std::string check_version_url);
|
||||
void SetHeader(const std::string& key, const std::string& value);
|
||||
void SetPostData(const std::string& post_data);
|
||||
bool CheckVersion();
|
||||
bool HasNewVersion() { return has_new_version_; }
|
||||
bool HasMqttConfig() { return has_mqtt_config_; }
|
||||
bool HasActivationCode() { return has_activation_code_; }
|
||||
bool HasServerTime() { return has_server_time_; }
|
||||
void StartUpgrade(std::function<void(int progress, size_t speed)> callback);
|
||||
void MarkCurrentVersionValid();
|
||||
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) { headers_[key] = value; }
|
||||
void SetPostData(const std::string& post_data) { post_data_ = post_data; }
|
||||
bool CheckVersion() { return false; }
|
||||
bool HasNewVersion() { return false; }
|
||||
bool HasMqttConfig() { return false; }
|
||||
bool HasActivationCode() { return false; }
|
||||
bool HasServerTime() { return false; }
|
||||
void StartUpgrade(std::function<void(int progress, size_t speed)> callback) {}
|
||||
void MarkCurrentVersionValid() {}
|
||||
|
||||
const std::string& GetFirmwareVersion() const { return firmware_version_; }
|
||||
const std::string& GetCurrentVersion() const { return current_version_; }
|
||||
@ -39,11 +40,6 @@ private:
|
||||
std::string firmware_url_;
|
||||
std::string post_data_;
|
||||
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
|
||||
|
||||
@ -7,7 +7,6 @@
|
||||
#include <esp_system.h>
|
||||
#include <esp_partition.h>
|
||||
#include <esp_app_desc.h>
|
||||
#include <esp_ota_ops.h>
|
||||
|
||||
|
||||
#define TAG "SystemInfo"
|
||||
@ -133,4 +132,3 @@ exit: //Common return path
|
||||
free(end_array);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@ -1,8 +1,6 @@
|
||||
# ESP-IDF Partition Table
|
||||
# Name, Type, SubType, Offset, Size, Flags
|
||||
nvs, data, nvs, 0x9000, 0x4000,
|
||||
otadata, data, ota, 0xd000, 0x2000,
|
||||
phy_init, data, phy, 0xf000, 0x1000,
|
||||
ota_0, app, ota_0, 0x10000, 0x580000,
|
||||
ota_1, app, ota_1, 0x590000, 0x580000,
|
||||
storage, data, spiffs, 0xB10000, 0x4F0000,
|
||||
factory, app, factory, 0x10000, 0x900000,
|
||||
storage, data, spiffs, 0x910000, 0x6F0000,
|
||||
|
||||
|
22
sdkconfig
22
sdkconfig
@ -587,7 +587,7 @@ CONFIG_CONNECTION_TYPE_VOLC_RTC=y
|
||||
#
|
||||
# Baji RTC Toy Configuration
|
||||
#
|
||||
# CONFIG_BAJI_BADGE_MODE is not set
|
||||
CONFIG_BAJI_BADGE_MODE=y
|
||||
# end of Baji RTC Toy Configuration
|
||||
|
||||
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
|
||||
# end of BT DEBUG LOG LEVEL
|
||||
|
||||
CONFIG_BT_ACL_CONNECTIONS=4
|
||||
CONFIG_BT_MULTI_CONNECTION_ENBALE=y
|
||||
CONFIG_BT_ACL_CONNECTIONS=1
|
||||
# CONFIG_BT_MULTI_CONNECTION_ENBALE is not set
|
||||
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
|
||||
# CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY is not set
|
||||
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_MAX_DEVICE_NAME_LEN=32
|
||||
CONFIG_BT_BLE_RPA_TIMEOUT=900
|
||||
# CONFIG_BT_BLE_50_FEATURES_SUPPORTED is not set
|
||||
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_SCAN_EN=y
|
||||
CONFIG_BT_BLE_VENDOR_HCI_EN=y
|
||||
@ -1052,8 +1052,8 @@ CONFIG_BT_BLE_VENDOR_HCI_EN=y
|
||||
# Controller Options
|
||||
#
|
||||
CONFIG_BT_CTRL_MODE_EFF=1
|
||||
CONFIG_BT_CTRL_BLE_MAX_ACT=6
|
||||
CONFIG_BT_CTRL_BLE_MAX_ACT_EFF=6
|
||||
CONFIG_BT_CTRL_BLE_MAX_ACT=2
|
||||
CONFIG_BT_CTRL_BLE_MAX_ACT_EFF=2
|
||||
CONFIG_BT_CTRL_BLE_STATIC_ACL_TX_BUF_NB=0
|
||||
CONFIG_BT_CTRL_PINNED_TO_CORE_0=y
|
||||
# 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_UART_H4 is not set
|
||||
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_HW 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_DEVICE is not set
|
||||
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_BLE_MESH_SCAN_DUPL_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
|
||||
|
||||
# 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_TEST is not set
|
||||
CONFIG_BT_CTRL_BLE_SCAN=y
|
||||
@ -1661,7 +1661,7 @@ CONFIG_SPIRAM_USE_MALLOC=y
|
||||
# CONFIG_SPIRAM_MEMTEST is not set
|
||||
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
|
||||
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_NOINIT_SEG_EXTERNAL_MEMORY=y
|
||||
# end of SPI RAM config
|
||||
|
||||
@ -163,6 +163,16 @@ CONFIG_BT_STACK_NO_LOG=n
|
||||
CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y
|
||||
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=n
|
||||
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),关闭以减少无关兼容风险
|
||||
CONFIG_BT_BLUFI_ENABLED=n
|
||||
@ -182,4 +192,4 @@ CONFIG_LWIP_MAX_SOCKETS=20
|
||||
# === Baji RTC Toy 模式开关 ===
|
||||
# 数字人 RTC 单一形态固件:CONFIG_BAJI_BADGE_MODE=n
|
||||
# 双模式(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