fix: 小智云聊修正AEC记忆+适配UI setup调整 (#1809)

* fix: 小智云聊修正AEC记忆+适配UI setup调整

* feat: 小智云聊增加双击切换AEC功能
This commit is contained in:
zczc365
2026-03-05 19:34:16 +08:00
committed by GitHub
parent 05f1a034ce
commit e37a24bea8
2 changed files with 49 additions and 13 deletions

View File

@ -4,9 +4,9 @@
小智云聊 S3 是小智 AI 的魔改项目,是首个 2.8 寸护眼大屏+大字体+2000mah 大电池的量产成品,做了大量创新和优化。
## 合并
## 官方
合并版代码在小智 AI 主项目中维护跟随主项目的一起版本更新便于用户自行扩展和第三方固件扩展。支持语音唤醒、语音打断、OTA、4G 自由切换等功能。
官方版代码在小智 AI 主项目中维护跟随主项目的一起版本更新便于用户自行扩展和第三方固件扩展。支持语音唤醒、语音打断、OTA、4G 自由切换等功能。
> ### 按键操作
>
@ -14,11 +14,12 @@
> - **关机**: 开机状态,长按 1 秒后释放按键,标题栏会显示'请稍候',再等 2 秒自动关机。
> - **唤醒/打断**: 正常通话环境下,单击按键。
> - **切换 4G/Wifi**: 启动过程或者配网界面1 秒钟内双击按键(需安装 4G 模块)。
> - **切换语音(AEC)打断模式**: 正常启动后在空闲无对话模式下1 秒钟内双击按键,循环切换语音打断模式。
> - **重新配网**: 开机状态1 秒钟内三击按键,会自动重启并进入配网界面。
> ### 语音指令
>
> - **打开/关闭语音打断模式**: 在播放音乐时,需要关闭语音打断模式,否则可能会打断音乐播放。
> - **打开/关闭语音(AEC)打断模式**: 在播放音乐时,需要关闭语音打断模式,否则可能会打断音乐播放。
> - **切换 IPS 屏幕显示模式**: 新版小智云聊 S3 升级了 IPS 屏幕,需要切换屏幕显示模式后才能正常显示,可以来回切换。
## 魔改版
@ -36,7 +37,7 @@
## 版本区别
> | 特性 | 合并版 | 魔改版 |
> | 特性 | 官方版 | 魔改版 |
> | -------------- | ------ | ------ |
> | 语音打断 | ✓ | ✓ |
> | 4G 功能 | ✓ | ✓ |
@ -50,7 +51,7 @@
> | 扫码访问控制台 | X | ✓ |
> | 繁日英文界面 | X | ✓ |
> | 多语言支持 | 需自行编译 | ✓ |
> | 外接蓝牙音箱 | ✓ | ✓ |
> | 外接蓝牙音箱/耳机 | ✓ | ✓ |
# 编译配置命令

View File

@ -15,11 +15,35 @@
#define TAG "YunliaoS3"
class YunliaoDisplay : public SpiLcdDisplay {
public:
YunliaoDisplay(esp_lcd_panel_io_handle_t io_handle,
esp_lcd_panel_handle_t panel_handle,
int width,
int height,
int offset_x,
int offset_y,
bool mirror_x,
bool mirror_y,
bool swap_xy)
: SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy) {
}
virtual void SetupUI() override {
SpiLcdDisplay::SetupUI();
auto& theme_manager = LvglThemeManager::GetInstance();
auto theme = theme_manager.GetTheme("dark");
if (theme != nullptr) {
SetTheme(theme);
}
}
};
class YunliaoS3 : public DualNetworkBoard {
private:
i2c_master_bus_handle_t codec_i2c_bus_;
Button boot_button_;
SpiLcdDisplay* display_;
YunliaoDisplay* display_;
PowerSaveTimer* power_save_timer_;
PowerManager* power_manager_;
@ -83,6 +107,11 @@ class YunliaoS3 : public DualNetworkBoard {
if (app.GetDeviceState() == kDeviceStateStarting ||
app.GetDeviceState() == kDeviceStateWifiConfiguring) {
SwitchNetworkType();
}else if(app.GetDeviceState() == kDeviceStateIdle){
bool enableAec = app.GetAecMode() == kAecOff;
SetAecMode(enableAec);
Settings settings("aec", true);
settings.SetInt("mode", enableAec);
}
});
boot_button_.OnMultipleClick(
@ -133,15 +162,10 @@ class YunliaoS3 : public DualNetworkBoard {
esp_lcd_panel_invert_color(panel, currentIpsMode);
esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY);
esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y);
display_ = new SpiLcdDisplay(panel_io, panel, DISPLAY_WIDTH,
display_ = new YunliaoDisplay(panel_io, panel, DISPLAY_WIDTH,
DISPLAY_HEIGHT, DISPLAY_OFFSET_X,
DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X,
DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY);
auto& theme_manager = LvglThemeManager::GetInstance();
auto theme = theme_manager.GetTheme("dark");
if (theme != nullptr) {
display_->SetTheme(theme);
}
}
void InitializeTools(){
auto& mcp_server = McpServer::GetInstance();
@ -218,7 +242,18 @@ class YunliaoS3 : public DualNetworkBoard {
power_manager_->Enable4G();
}
power_manager_->OnBtLinkStatusChanged([this](bool is_connected) {
SetAecMode(!is_connected);
auto& app = Application::GetInstance();
if (is_connected) {
if (app.GetAecMode() != kAecOff) {
SetAecMode(false);
}
} else {
Settings settings("aec", false);
int storedMode = settings.GetInt("mode", kAecOnDeviceSide);
if (storedMode != kAecOff && app.GetAecMode() == kAecOff) {
SetAecMode(storedMode == kAecOnDeviceSide);
}
}
});
power_manager_->InitializeBtModul();
InitializeTools();