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. 同步最新烧录运行日志,记录本轮双模式与配网测试结果。
163 lines
5.2 KiB
C++
163 lines
5.2 KiB
C++
#include "board.h"
|
|
#include "system_info.h"
|
|
#include "settings.h"
|
|
#include "display/display.h"
|
|
#include "assets/lang_config.h"
|
|
|
|
#include <esp_log.h>
|
|
#include <esp_app_desc.h>
|
|
#include <esp_chip_info.h>
|
|
#include <esp_random.h>
|
|
|
|
#define TAG "Board"
|
|
|
|
Board::Board() {
|
|
Settings settings("board", true);
|
|
uuid_ = settings.GetString("uuid");
|
|
if (uuid_.empty()) {
|
|
uuid_ = GenerateUuid();
|
|
settings.SetString("uuid", uuid_);
|
|
}
|
|
// 只有当BOARD_NAME不包含"moji"时才打印日志
|
|
std::string board_name = BOARD_NAME;
|
|
if (board_name.find("moji") == std::string::npos) {
|
|
ESP_LOGI(TAG, "UUID=%s SKU=%s", uuid_.c_str(), BOARD_NAME);
|
|
}
|
|
}
|
|
|
|
std::string Board::GenerateUuid() {
|
|
// UUID v4 需要 16 字节的随机数据
|
|
uint8_t uuid[16];
|
|
|
|
// 使用 ESP32 的硬件随机数生成器
|
|
esp_fill_random(uuid, sizeof(uuid));
|
|
|
|
// 设置版本 (版本 4) 和变体位
|
|
uuid[6] = (uuid[6] & 0x0F) | 0x40; // 版本 4
|
|
uuid[8] = (uuid[8] & 0x3F) | 0x80; // 变体 1
|
|
|
|
// 将字节转换为标准的 UUID 字符串格式
|
|
char uuid_str[37];
|
|
snprintf(uuid_str, sizeof(uuid_str),
|
|
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
|
uuid[0], uuid[1], uuid[2], uuid[3],
|
|
uuid[4], uuid[5], uuid[6], uuid[7],
|
|
uuid[8], uuid[9], uuid[10], uuid[11],
|
|
uuid[12], uuid[13], uuid[14], uuid[15]);
|
|
|
|
return std::string(uuid_str);
|
|
}
|
|
|
|
bool Board::GetBatteryLevel(int &level, bool& charging, bool& discharging) {
|
|
return false;
|
|
}
|
|
|
|
Display* Board::GetDisplay() {
|
|
static Display display;
|
|
return &display;
|
|
}
|
|
|
|
Led* Board::GetLed() {
|
|
static NoLed led;
|
|
return &led;
|
|
}
|
|
|
|
std::string Board::GetJson() {
|
|
/*
|
|
{
|
|
"version": 2,
|
|
"flash_size": 4194304,
|
|
"psram_size": 0,
|
|
"minimum_free_heap_size": 123456,
|
|
"mac_address": "00:00:00:00:00:00",
|
|
"uuid": "00000000-0000-0000-0000-000000000000",
|
|
"chip_model_name": "esp32s3",
|
|
"chip_info": {
|
|
"model": 1,
|
|
"cores": 2,
|
|
"revision": 0,
|
|
"features": 0
|
|
},
|
|
"application": {
|
|
"name": "my-app",
|
|
"version": "1.0.0",
|
|
"compile_time": "2021-01-01T00:00:00Z"
|
|
"idf_version": "4.2-dev"
|
|
"elf_sha256": ""
|
|
},
|
|
"partition_table": [
|
|
"app": {
|
|
"label": "app",
|
|
"type": 1,
|
|
"subtype": 2,
|
|
"address": 0x10000,
|
|
"size": 0x100000
|
|
}
|
|
],
|
|
"ota": {
|
|
"label": "ota_0"
|
|
},
|
|
"board": {
|
|
...
|
|
}
|
|
}
|
|
*/
|
|
std::string json = "{";
|
|
json += "\"version\":2,";
|
|
json += "\"language\":\"" + std::string(Lang::CODE) + "\",";
|
|
json += "\"flash_size\":" + std::to_string(SystemInfo::GetFlashSize()) + ",";
|
|
json += "\"minimum_free_heap_size\":" + std::to_string(SystemInfo::GetMinimumFreeHeapSize()) + ",";
|
|
json += "\"mac_address\":\"" + SystemInfo::GetMacAddress() + "\",";
|
|
json += "\"uuid\":\"" + uuid_ + "\",";
|
|
json += "\"chip_model_name\":\"" + SystemInfo::GetChipModelName() + "\",";
|
|
json += "\"chip_info\":{";
|
|
|
|
esp_chip_info_t chip_info;
|
|
esp_chip_info(&chip_info);
|
|
json += "\"model\":" + std::to_string(chip_info.model) + ",";
|
|
json += "\"cores\":" + std::to_string(chip_info.cores) + ",";
|
|
json += "\"revision\":" + std::to_string(chip_info.revision) + ",";
|
|
json += "\"features\":" + std::to_string(chip_info.features);
|
|
json += "},";
|
|
|
|
json += "\"application\":{";
|
|
auto app_desc = esp_app_get_description();
|
|
json += "\"name\":\"" + std::string(app_desc->project_name) + "\",";
|
|
json += "\"version\":\"" + std::string(app_desc->version) + "\",";
|
|
json += "\"compile_time\":\"" + std::string(app_desc->date) + "T" + std::string(app_desc->time) + "Z\",";
|
|
json += "\"idf_version\":\"" + std::string(app_desc->idf_ver) + "\",";
|
|
|
|
char sha256_str[65];
|
|
for (int i = 0; i < 32; i++) {
|
|
snprintf(sha256_str + i * 2, sizeof(sha256_str) - i * 2, "%02x", app_desc->app_elf_sha256[i]);
|
|
}
|
|
json += "\"elf_sha256\":\"" + std::string(sha256_str) + "\"";
|
|
json += "},";
|
|
|
|
json += "\"partition_table\": [";
|
|
esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL);
|
|
while (it) {
|
|
const esp_partition_t *partition = esp_partition_get(it);
|
|
json += "{";
|
|
json += "\"label\":\"" + std::string(partition->label) + "\",";
|
|
json += "\"type\":" + std::to_string(partition->type) + ",";
|
|
json += "\"subtype\":" + std::to_string(partition->subtype) + ",";
|
|
json += "\"address\":" + std::to_string(partition->address) + ",";
|
|
json += "\"size\":" + std::to_string(partition->size);
|
|
json += "},";
|
|
it = esp_partition_next(it);
|
|
}
|
|
json.pop_back(); // Remove the last comma
|
|
json += "],";
|
|
|
|
json += "\"ota\":{";
|
|
json += "\"label\":\"disabled\"";
|
|
json += "},";
|
|
|
|
json += "\"board\":" + GetBoardJson();
|
|
|
|
// Close the JSON object
|
|
json += "}";
|
|
return json;
|
|
}
|