- 启动自检日志:远程日志启动后记录 endpoint、目录、待上传文件数、队列配置、coredump 状态。

- 上传状态统计:记录成功/失败次数、最后 HTTP 状态、最后错误码、最后上传时间、最后成功时间。
  - 独立日志 Flash 分区:新增 logfs LittleFS 分区 512KB,日志不再占用音频资源分区;远程日志文件上限为 24 * 16KB =
    384KB。

  - 本地诊断 factory CLI:
      - log status
      - log flush
      - log clear

  - Coredump 支持:启用 flash coredump,新增 64KB coredump 分区;当前会上报 coredump 存在状态、地址、大小、panic
    reason 和设备状态快照。

  - 上传附带设备状态快照:reset reason、固件版本、project name、heap、任务数、多模态连接/活动状态、coredump 状态。
This commit is contained in:
CSBOOK\44744
2026-06-27 22:55:43 +08:00
parent 87ba891a8d
commit e15f9e9f23
10 changed files with 492 additions and 5 deletions
@@ -33,6 +33,8 @@
#define VOICE_PROMPT_DEFAULT_BASE_PATH "/littlefs/audio_prompts"
#define VOICE_PROMPT_LITTLEFS_BASE_PATH "/littlefs"
#define VOICE_PROMPT_LITTLEFS_PARTITION "gifpack"
#define PLATFORM_LOGFS_BASE_PATH "/logfs"
#define PLATFORM_LOGFS_PARTITION "logfs"
#define VOICE_PROMPT_FRAME_HEADER_BYTES 4U
#define VOICE_PROMPT_MAX_OPUS_PACKET_BYTES 2048U
#define VOICE_PROMPT_OPUS_FRAME_MS 60U
@@ -43,6 +45,8 @@ static const char *VOICE_TAG = "voice_prompt";
static bool s_power_hold_configured;
static bool s_voice_prompt_littlefs_mount_attempted;
static esp_err_t s_voice_prompt_littlefs_mount_result = ESP_ERR_INVALID_STATE;
static bool s_logfs_mount_attempted;
static esp_err_t s_logfs_mount_result = ESP_ERR_INVALID_STATE;
static uint64_t power_manager_gpio_bit_mask(int gpio_num)
{
@@ -154,6 +158,49 @@ esp_err_t platform_mount_littlefs(void)
return err;
}
esp_err_t platform_mount_logfs(void)
{
if (s_logfs_mount_attempted) {
return s_logfs_mount_result;
}
esp_vfs_littlefs_conf_t conf = {
.base_path = PLATFORM_LOGFS_BASE_PATH,
.partition_label = PLATFORM_LOGFS_PARTITION,
.partition = NULL,
.format_if_mount_failed = true,
.dont_mount = false,
};
esp_err_t err = esp_vfs_littlefs_register(&conf);
if (err == ESP_ERR_INVALID_STATE &&
esp_littlefs_mounted(PLATFORM_LOGFS_PARTITION)) {
err = ESP_OK;
}
if (err == ESP_OK) {
size_t total_bytes = 0;
size_t used_bytes = 0;
esp_err_t info_err = esp_littlefs_info(PLATFORM_LOGFS_PARTITION,
&total_bytes,
&used_bytes);
if (info_err == ESP_OK) {
ESP_LOGI(VOICE_TAG,
"LogFS mounted at %s, used=%u total=%u",
PLATFORM_LOGFS_BASE_PATH,
(unsigned)used_bytes,
(unsigned)total_bytes);
}
} else {
ESP_LOGW(VOICE_TAG,
"Mount LogFS failed: %s",
esp_err_to_name(err));
}
s_logfs_mount_attempted = true;
s_logfs_mount_result = err;
return err;
}
esp_err_t voice_prompt_play_file(const char *path)
{
if (path == NULL || path[0] == '\0') {