一、新增功能
1. 聆听状态空闲超时自动退出
- 聆听状态下无用户交互(无语音对话、无按键操作、无音频播放)超过60秒后,
设备自动关闭音频通道回到idle待命状态,行为等同于手动按下BOOT按键退出
- 超时时间通过Kconfig CONFIG_LISTENING_IDLE_TIMEOUT_SECONDS可配置(范围30~300秒,默认60秒)
- speaking状态期间暂停计时,回到listening后从0重新倒计时,确保用户有完整的思考时间
2. 聆听空闲计时器外部重置接口
- 新增ResetListeningIdleTimer()公开方法,供板级按键/触摸回调调用
- 重置触发点:触摸按键(摸脑袋等)、BOOT按键、故事按键、收到服务端stt/tts/music_control/story消息
二、Bug修复
3. 修复超时退出后待命音效无声
- 原因:超时退出路径中audio_processor_.Stop()关闭了功放,之后才播放待命音效
- 修复:在SetDeviceState(kDeviceStateIdle)播放待命音效前调用codec->EnableOutput(true)确保功放开启
4. 修复WebSocket断开与tts:stop竞态导致崩溃重启
- 原因:tts:stop和WebSocket断开同时发生时,设备切换到listening触发SendStartListening失败,
竞态导致WakeWordDetect堆损坏(StoreProhibited崩溃)
- 修复:tts:stop处理中先检查IsAudioChannelOpened(),音频通道不可用时直接回退到idle
5. 修复listening状态音频通道不可用时逻辑错误
- 原因:音频通道不可用时"保持在listening状态"导致后续状态混乱
- 修复:改为直接回退到idle状态
三、优化调整
6. 版本号从1.7.5升级到1.7.6
7. ADC电量采样间隔从10ms缩短为5ms,提高采样效率
8. 日志配置调整:恢复日志输出能力用于调试
9. WiFi组件代码注释补充
10. 新增.gitignore,忽略build目录和.vscode/settings.json
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
#ifndef _WIFI_STATION_H_
|
|
#define _WIFI_STATION_H_
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <functional>
|
|
|
|
#include <esp_event.h>
|
|
#include <esp_timer.h>
|
|
#include <esp_wifi_types_generic.h>
|
|
|
|
struct WifiApRecord {
|
|
std::string ssid;
|
|
std::string password;
|
|
int channel;
|
|
wifi_auth_mode_t authmode;
|
|
uint8_t bssid[6];
|
|
};
|
|
|
|
class WifiStation {
|
|
public:
|
|
static WifiStation& GetInstance();
|
|
void AddAuth(const std::string &&ssid, const std::string &&password);
|
|
void Start();
|
|
void Stop();
|
|
bool IsConnected();
|
|
bool WaitForConnected(int timeout_ms = 10000);
|
|
int8_t GetRssi();
|
|
std::string GetSsid() const { return ssid_; }
|
|
std::string GetIpAddress() const { return ip_address_; }
|
|
uint8_t GetChannel();
|
|
void SetPowerSaveMode(bool enabled);
|
|
|
|
void OnConnect(std::function<void(const std::string& ssid)> on_connect);
|
|
void OnConnected(std::function<void(const std::string& ssid)> on_connected);
|
|
void OnScanBegin(std::function<void()> on_scan_begin);
|
|
void OnNoCandidates(std::function<void()> on_no_candidates);// 没有候选AP时调用
|
|
void OnReconnectTimeout(std::function<void()> on_reconnect_timeout);
|
|
|
|
private:
|
|
WifiStation();
|
|
~WifiStation();
|
|
WifiStation(const WifiStation&) = delete;
|
|
WifiStation& operator=(const WifiStation&) = delete;
|
|
|
|
EventGroupHandle_t event_group_;
|
|
esp_timer_handle_t timer_handle_ = nullptr;
|
|
esp_event_handler_instance_t instance_any_id_ = nullptr;
|
|
esp_event_handler_instance_t instance_got_ip_ = nullptr;
|
|
std::string ssid_;
|
|
std::string password_;
|
|
std::string ip_address_;
|
|
int reconnect_count_ = 0;
|
|
std::function<void(const std::string& ssid)> on_connect_;// 连接开始时调用
|
|
std::function<void(const std::string& ssid)> on_connected_;// 连接成功时调用
|
|
std::function<void()> on_scan_begin_;
|
|
std::function<void()> on_no_candidates_;// 没有候选AP时调用
|
|
std::function<void()> on_reconnect_timeout_;// 重新连接超时时调用
|
|
std::vector<WifiApRecord> connect_queue_;
|
|
esp_timer_handle_t reconnect_timer_handle_ = nullptr;
|
|
|
|
void HandleScanResult();
|
|
void StartConnect();
|
|
static void WifiEventHandler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data);
|
|
static void IpEventHandler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data);
|
|
};
|
|
|
|
#endif // _WIFI_STATION_H_
|