refactor(logging): remove remote logging subsystem

This commit is contained in:
chenjintao
2026-10-08 16:08:41 +08:00
parent 5d849033c3
commit 3160a33f50
22 changed files with 12 additions and 2546 deletions
+2 -41
View File
@@ -37,7 +37,6 @@ flowchart LR
Events["System event dispatch"]
MultimodalPolicy["Multimodal session policy"]
Fortune["Daily fortune policy"]
RemoteLog["Remote log service"]
FactoryCli["Factory CLI diagnostics"]
end
@@ -53,7 +52,7 @@ flowchart LR
LCD["ST7789 direct LCD backend"]
Audio["ES8311 audio pipeline"]
Network["Wi-Fi, BLE provisioning, HTTP, WebSocket"]
Storage["NVS, LittleFS, LogFS"]
Storage["NVS, LittleFS"]
GPIO["GPIO, stepper, console UART"]
end
@@ -62,11 +61,9 @@ flowchart LR
Wire --> Workers
Connectivity --> RuntimeAdapters
Workers --> Events
Workers --> RemoteLog
MultimodalPolicy --> RuntimeAdapters
Fortune --> FortuneDomain
Events --> ExpressionMap
FactoryCli --> RemoteLog
RuntimeAdapters --> LCD
RuntimeAdapters --> Audio
RuntimeAdapters --> Network
@@ -123,7 +120,7 @@ sequenceDiagram
Domain->>Platform: Wi-Fi and provisioning primitives
App->>CP: control_plane_start_runtime_workers()
CP->>CP: start model, websocket wait, LCD, Wi-Fi state, events, keys, remote log, fortune
CP->>CP: start model, websocket wait, LCD, Wi-Fi state, events, keys, fortune
```
## Runtime Worker Topology
@@ -139,7 +136,6 @@ flowchart TB
Start --> WifiTask["cp_wifi_state"]
Start --> EventTask["cp_system_event"]
Start --> KeyTask["cp_key_input"]
Start --> RemoteLogTask["cp_remote_log"]
Start --> FortuneTask["cp_fortune\nif FORTUNE_ENABLE"]
KeyTask --> EventTask
@@ -148,7 +144,6 @@ flowchart TB
Multimodal --> ModelTask
Multimodal --> Audio["audio capture/playback"]
WifiTask --> LcdTask
RemoteLogTask --> LogServer["remote log server"]
FortuneTask --> FortuneApi["daily fortune API"]
```
@@ -259,33 +254,6 @@ sequenceDiagram
end
```
## Remote Logging Flow
```mermaid
flowchart TD
EspLog["ESP_LOGx / printf log"]
Hook["esp_log_set_vprintf hook"]
Filter["filter by CONFIG_TQ_REMOTE_LOG_MIN_LEVEL"]
RamQueue["RAM queue\nCONFIG_TQ_REMOTE_LOG_QUEUE_LEN"]
FlushTimer["periodic flush\nCONFIG_TQ_REMOTE_LOG_FLUSH_INTERVAL_MS"]
LogFS["/logfs/remote_logs\nLittleFS persistent queue"]
StaReady{"STA connected\nand realtime path idle?"}
Upload["HTTP POST JSON batch\nCONFIG_TQ_REMOTE_LOG_ENDPOINT"]
Server["remote_log_receiver.py\n/opt/logTools/logs"]
Backoff["exponential retry backoff"]
DropOld["trim old files\nCONFIG_TQ_REMOTE_LOG_MAX_FILES"]
CoreDump["detect flash coredump\nupload metadata report"]
EspLog --> Hook --> Filter --> RamQueue
RamQueue --> FlushTimer --> LogFS --> DropOld
LogFS --> StaReady
CoreDump --> StaReady
StaReady -- yes --> Upload --> Server
StaReady -- no --> Backoff --> StaReady
Upload -- fail --> Backoff
Upload -- success --> Delete["delete uploaded local file"]
```
## Daily Fortune Flow
```mermaid
@@ -314,15 +282,8 @@ flowchart LR
UART["UART0 serial input"]
CLI["factory CLI parser"]
Identity["identity / auth commands"]
LogStatus["log status"]
LogFlush["log flush"]
LogClear["log clear"]
RemoteLog["control_plane_remote_log_*"]
UARTOut["UART0 JSON/OK/ERROR output"]
UART --> CLI
CLI --> Identity --> UARTOut
CLI --> LogStatus --> RemoteLog --> UARTOut
CLI --> LogFlush --> RemoteLog --> UARTOut
CLI --> LogClear --> RemoteLog --> UARTOut
```
@@ -1,5 +1,7 @@
# Flash 与内存容量分析、风险及后续开发建议
> 历史容量快照:文中远程日志与 `logfs` 已从当前固件移除,分区地址和容量应以现行 `16m.csv` 与最新构建产物为准。
本文记录当前固件的 Flash 分区使用情况、静态 RAM 使用情况、运行时内存风险、可优化内容和后续开发约束,用于功能评审、资源接入、OTA 设计和长期容量管理。
LittleFS 资源从源码到设备的详细流程见:
@@ -1,5 +1,7 @@
# OTA 后首次语音启动与后台上传隔离修复说明
> 历史实现记录:文中远程日志及 LogFS 上传路径已从当前固件移除,相关描述不代表现行行为。
## 1. 提交信息
```text
@@ -414,4 +416,3 @@ Listening 到达时间
4. 模拟服务端 task 启动超过 10 秒,确认出现 `Local wake timed-out task cleanup`,下一次唤醒创建新 task。
5. 在 ASR 结束到 TTS 开始期间观察远程日志,确认没有启动后台 HTTPS 上传。
6. 开机 60 秒后保持语音空闲,确认历史日志和 coredump 能继续上传,而不是永久被阻塞。
@@ -14,7 +14,7 @@
- Wi-Fi 连接、重连和配置热点;
- 设备身份、JWT 和会话令牌;
- 用户出生资料、每日运势和财富方向;
- NVS、LittleFS、远程日志和工厂 CLI。
- NVS、LittleFS 和工厂 CLI。
## 2. 分层架构
@@ -269,7 +269,6 @@ flowchart TB
LCD["cp_lcd_render<br/>LCD 启动"]
Events["cp_system_event<br/>事件分发"]
Keys["cp_key_input<br/>GPIO 与消抖"]
Logs["remote log worker"]
Fortune["cp_fortune<br/>每日运势"]
Monitor["cp_task_monitor<br/>可选诊断"]
@@ -278,7 +277,6 @@ flowchart TB
Start --> LCD
Start --> Events
Start --> Keys
Start --> Logs
Start --> Fortune
Start --> Monitor
```
@@ -705,4 +703,3 @@ control_plane_stop_runtime_workers()
- `components/platform/src/multimodal/transport_ws/transport_ws_runtime_impl.c`
- `components/platform/src/lcd_direct.c`
- `components/platform/src/platform_stepper_driver.c`
@@ -107,7 +107,7 @@ When enabled, the first multimodal HTTPS connection failure requests controlled
When disabled, HTTPS and WebSocket retry behavior remains active, but the firmware does not intentionally disconnect a Wi-Fi connection that is still reported as associated.
Runtime impact when enabled: all device network traffic is interrupted during reassociation, including WebSocket, HTTPS, remote logging, LAN HTTP, and mDNS traffic. It is enabled by default because field testing demonstrated a stale STA data path that repeated transport-level reconnects could not recover. Disable it only when deliberate reassociation is unacceptable for a deployment.
Runtime impact when enabled: all device network traffic is interrupted during reassociation, including WebSocket, HTTPS, LAN HTTP, and mDNS traffic. It is enabled by default because field testing demonstrated a stale STA data path that repeated transport-level reconnects could not recover. Disable it only when deliberate reassociation is unacceptable for a deployment.
The HTTPS preflight performs one application-level DNS lookup. lwIP already
retransmits DNS queries internally, and the captured failure took about 14
+3 -55
View File
@@ -9,7 +9,7 @@
| `988dc92` | 增加 LCD 背光 PWM 亮度控制 |
| `6a11aca` | 增加轻待机状态协调器和活动事件接入 |
| `baad9dc` | 增加背光、扬声器功放和电机的待机策略 |
| `e773ebc` | 增加 Wi-Fi、远程日志、电池检测和内存监控的待机策略 |
| `e773ebc` | 增加 Wi-Fi、电池检测和内存监控的待机策略(远程日志部分现已移除) |
| `cb203a7` | 进入轻待机前播放提示音,并等待真实播放完成 |
`bba99a0 fix(control-plane): trigger PTT on short press` 是独立的按键行为修复,不属于低功耗改动,因此不在本文范围内。
@@ -35,7 +35,6 @@
- 扬声器功放在无音频播放时仍可能保持供电。
- 步进电机完成动作后可能继续保持线圈电流。
- Wi-Fi 始终使用活跃策略。
- 远程日志持续尝试 HTTP 上传。
- 电池检测和内存监控仍按活跃周期运行。
- 缺少统一的待机状态、空闲计时、唤醒入口和失败回滚机制。
- 如果进入待机时立即关闭功放,待机提示音将无法完整播放。
@@ -79,8 +78,6 @@ CONFIG_TQ_LIGHT_STANDBY_PROMPT_FILE="standby_5min.opus"
CONFIG_TQ_LIGHT_STANDBY_DISABLE_SPEAKER_OUTPUT=y
CONFIG_TQ_LIGHT_STANDBY_RELEASE_MOTOR_HOLD=y
CONFIG_TQ_LIGHT_STANDBY_WIFI_POWER_SAVE=y
CONFIG_TQ_LIGHT_STANDBY_PAUSE_REMOTE_LOG_UPLOAD=y
CONFIG_TQ_LIGHT_STANDBY_REMOTE_LOG_POLL_MS=5000
CONFIG_TQ_LIGHT_STANDBY_BATTERY_INTERVAL_SEC=300
CONFIG_TQ_LIGHT_STANDBY_MEMORY_SAMPLE_INTERVAL_MS=10000
CONFIG_TQ_LIGHT_STANDBY_MEMORY_REPORT_INTERVAL_MS=300000
@@ -372,51 +369,6 @@ esp_err_t platform_wifi_portal_set_light_standby(bool standby)
- 可能增加网络首包延迟,实际幅度受 AP 的 DTIM、信号质量和网络负载影响。
- 不等同于关闭 Wi-Fi,网络任务和 WebSocket 仍会消耗资源。
### 5.6 远程日志
#### 问题原因
待机期间继续发起 HTTP 上传会周期性唤醒网络和 CPU。完全停止日志采集又会丢失现场诊断信息。
#### 解决方式
待机期间继续接收日志并落盘,但暂停 coredump 和日志文件的 HTTP 上传;轮询间隔放宽至 5 秒。唤醒后恢复上传。
#### 具体代码
```c
while (!s_stop_requested) {
TickType_t now = xTaskGetTickCount();
bool light_standby = remote_log_light_standby();
if ((now - last_flush) >=
pdMS_TO_TICKS(CONFIG_TQ_REMOTE_LOG_FLUSH_INTERVAL_MS)) {
drain_memory_queue_to_flash();
last_flush = now;
}
if (!light_standby &&
voice_startup_upload_gate_open(startup_tick) &&
(backoff_ms == 0U || now >= next_upload_tick)) {
drain_memory_queue_to_flash();
upload_coredump_report();
upload_pending_files();
}
uint32_t poll_ms = light_standby ?
CONFIG_TQ_LIGHT_STANDBY_REMOTE_LOG_POLL_MS :
REMOTE_LOG_POLL_MS;
ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(poll_ms));
}
```
#### 功耗与影响
- 减少待机期间 HTTP、TLS/TCP 和 Wi-Fi 活动。
- 日志仍会写入 Flash,不会因为轻待机直接丢失。
- 待机期间服务端无法立即看到新日志;唤醒后再补传。
- 持续落盘仍有 Flash 写入功耗和寿命影响,但保留了诊断能力。
### 5.7 电池检测
#### 问题原因
@@ -565,7 +517,6 @@ static esp_err_t control_plane_light_standby_apply_entry_policy(void)
```c
static esp_err_t control_plane_light_standby_apply_runtime_policy(bool standby)
{
control_plane_remote_log_set_light_standby(standby);
control_plane_battery_service_set_light_standby(standby);
control_plane_runtime_diagnostics_set_light_standby(standby);
@@ -573,7 +524,6 @@ static esp_err_t control_plane_light_standby_apply_runtime_policy(bool standby)
esp_err_t wifi_err =
domain_runtime_wifi_portal_set_light_standby(standby);
if (wifi_err != ESP_OK && standby) {
control_plane_remote_log_set_light_standby(false);
control_plane_battery_service_set_light_standby(false);
control_plane_runtime_diagnostics_set_light_standby(false);
return wifi_err;
@@ -643,11 +593,10 @@ esp_err_t control_plane_light_standby_record_activity(
4. 待机时 Codec 输出静音并关闭扬声器 PA,同时保留麦克风、AFE 和唤醒词。
5. 释放步进电机线圈保持电流。
6. Wi-Fi 切换为最小 Modem 省电,同时保留连接。
7. 暂停远程日志 HTTP 上传,日志采集和落盘继续工作。
8. 电池常规采样周期放宽到 300 秒,充电状态边沿仍及时处理。
9. 内存监控采样放宽到 10 秒、周期报告放宽到 300 秒,分配失败仍及时处理。
10. 支持唤醒词、按键、SW2 抽签、模型命令和语音活动快速唤醒。
11. 唤醒后恢复正常背光、功放、Wi-Fi、日志、电池和内存监控策略。
11. 唤醒后恢复正常背光、功放、Wi-Fi、电池和内存监控策略。
12. 增加进入失败回滚和状态竞态保护。
13. 将轻待机任务栈增至 4096 字节,解决已观察到的任务栈溢出。
@@ -682,7 +631,6 @@ esp_err_t control_plane_light_standby_record_activity(
| 麦克风 | 保持运行,以满足唤醒词快速唤醒要求 |
| 电机 | 待机不保持静态扭矩,机构可能被外力移动 |
| Wi-Fi | 保持连接,但首包延迟可能增加 |
| 远程日志 | 继续采集和落盘,服务端接收会延迟到唤醒后 |
| 电池检测 | 普通电量更新变慢,充电状态边沿仍及时检测 |
| 内存监控 | 普通水位报告变慢,分配失败仍及时处理 |
| 提示音 | 真正进入待机的时间会比 5 分钟多出提示音播放时间 |
@@ -702,6 +650,6 @@ esp_err_t control_plane_light_standby_record_activity(
## 10. 结论
本次改动已经完成当前产品约束下的主要轻待机优化:保留基础表情、唤醒词和按键响应,同时降低背光、功放、电机、Wi-Fi、远程日志、电池检测和内存监控的持续功耗。实现具备统一状态管理、真实音频完成等待、进入失败回滚和快速唤醒恢复。
本次改动已经完成当前产品约束下的主要轻待机优化:保留基础表情、唤醒词和按键响应,同时降低背光、功放、电机、Wi-Fi、电池检测和内存监控的持续功耗。实现具备统一状态管理、真实音频完成等待、进入失败回滚和快速唤醒恢复。
下一步重点不是继续盲目关闭模块,而是进行真机电流和唤醒延迟测试。测试数据可以确认主要耗电来源,并判断 LCD 刷新和音频下行链路是否值得进入下一轮优化。