feat: 添加编译时模块开关配置

通过 sdkconfig.defaults 选择性启用/禁用模块,减少固件体积:

新增模块开关:
- CONFIG_MIMI_CHAN_TELEGRAM (默认 n)
- CONFIG_MIMI_CHAN_FEISHU (默认 y)
- CONFIG_MIMI_TOOL_WEB_SEARCH (默认 y)
- CONFIG_MIMI_TOOL_GPIO (默认 n)
- CONFIG_MIMI_WS_SERVER (默认 y)
- CONFIG_MIMI_WIFI_ONBOARD (默认 y)
- CONFIG_MIMI_OTA (默认 n)

技术实现:
- CMakeLists.txt 条件编译源文件
- 头文件使用 static inline stub
- CLI 命令和工具注册也支持条件编译

消除 Telegram 未配置时的 5 秒轮询警告日志
This commit is contained in:
2026-04-03 20:15:26 +08:00
parent 540bfe825f
commit 6983a1f1ba
15 changed files with 455 additions and 154 deletions

122
taolun.md
View File

@@ -124,3 +124,125 @@ timezone_show # 显示当前时区配置和本地时间
### 支持的时区格式
- POSIX: `CST-8`, `JST-9`, `EST5EDT,M3.2.0,M11.1.0`, `UTC0`
- 城市名: Asia/Shanghai, Asia/Tokyo, America/New_York 等 18 个预设
---
## 讨论:编译时模块开关(模块化配置)
**日期**2026-04-03
**分支**`feature/module-config`
**目标**:通过编译时配置选择性禁用不需要的模块,减少固件体积,消除未配置模块的警告日志
### 问题背景
1. **Task Watchdog 超时**ESP32-S3 运行一天后触发看门狗超时,怀疑是设计问题
2. **Telegram 警告日志**:用户使用飞书但未配置 Telegram控制台每 5 秒打印 "No bot token configured"
3. **代码冗余**Telegram、OpenAI 接口等未使用的模块仍然编译进固件
### 用户需求
用户希望:
1. 通过编译选项禁用不需要的模块(如 Telegram
2. 从源码层面直接过滤不用的组件,减少代码体积
3. 禁用模块后不触发警告日志
### 实现方案
#### 方案选择:编译时条件编译(方案 02
**优点**
- 直接减少 Flash 占用
- 零 RAM 占用,不创建任务
- 从源头消除警告日志
- 实现简单
**缺点**
- 切换模块需要重新编译
#### 技术实现
##### 1. 配置文件:`sdkconfig.defaults`
```c
// Channel Modules
CONFIG_MIMI_CHAN_TELEGRAM=n // 默认禁用
CONFIG_MIMI_CHAN_FEISHU=y // 默认启用
// Tool Modules
CONFIG_MIMI_TOOL_WEB_SEARCH=y
CONFIG_MIMI_TOOL_GPIO=n
// Optional Modules
CONFIG_MIMI_WS_SERVER=y
CONFIG_MIMI_WIFI_ONBOARD=y
CONFIG_MIMI_OTA=n
```
##### 2. CMakeLists.txt条件编译源文件
```cmake
if(CONFIG_MIMI_CHAN_TELEGRAM)
list(APPEND srcs "channels/telegram/telegram_bot.c")
endif()
```
##### 3. 头文件 stub调用方无感知
```c
// telegram_bot.h
#ifdef CONFIG_MIMI_CHAN_TELEGRAM
esp_err_t telegram_bot_init(void);
esp_err_t telegram_bot_start(void);
#else
static inline esp_err_t telegram_bot_init(void) { return ESP_OK; }
static inline esp_err_t telegram_bot_start(void) { return ESP_OK; }
#endif
```
### 修改文件清单
| 文件 | 修改内容 |
|------|----------|
| `sdkconfig.defaults` | 添加模块开关配置 |
| `main/CMakeLists.txt` | 条件编译源文件 |
| `main/channels/telegram/telegram_bot.h` | 添加 stub |
| `main/channels/feishu/feishu_bot.h` | 添加 stub |
| `main/gateway/ws_server.h` | 添加 stub |
| `main/onboard/wifi_onboard.h` | 添加 stub |
| `main/ota/ota_manager.h` | 添加 stub |
| `main/tools/tool_web_search.h` | 添加 stub |
| `main/tools/tool_gpio.h` | 添加 stub |
| `main/tools/tool_registry.c` | 条件注册工具 |
| `main/cli/serial_cli.c` | 条件注册 CLI 命令 |
| `main/mimi.c` | 条件调用模块 |
| `AGENTS.md` | 更新文档 |
### 模块依赖关系
- **Channel 模块**telegram、feishu
-`mimi.c` 调用init/start
-`outbound_dispatch_task` 调用send
- CLI 命令也需要条件编译
- **Tool 模块**web_search、gpio
-`tool_registry.c` 调用(注册 + 执行)
- CLI 命令也需要条件编译
- **可选模块**ws_server、wifi_onboard、ota
-`mimi.c` 调用
- `wifi_onboard` 禁用时需特殊处理(不能进入 captive portal
### 注意事项
1. **OTA 模块**:目前未初始化,但已编译
2. **工具描述中的渠道提示**cron_add 工具描述中提到 telegram可保留只是描述不影响功能
3. **get_time 工具**:使用 telegram.org 代理获取时间(技术原因,不属于 telegram_bot 模块)
### 预期效果
| 禁用项 | 效果 |
|--------|------|
| Telegram | 不编译 telegram_bot.c无 5 秒警告,节省约 15KB+ Flash |
| GPIO | 不编译 tool_gpio.c无 gpio_* 工具,节省约 5KB Flash |
| WebSocket | 不编译 ws_server.c节省约 10KB Flash |
| WiFi Onboard | 不能进入 captive portal 模式,需其他方式配置 WiFi |