refactor(logging): remove remote logging subsystem
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 刷新和音频下行链路是否值得进入下一轮优化。
|
||||
|
||||
Reference in New Issue
Block a user