130 lines
4.1 KiB
C++
130 lines
4.1 KiB
C++
#ifndef _APPLICATION_H_
|
||
#define _APPLICATION_H_
|
||
|
||
#include <freertos/FreeRTOS.h>
|
||
#include <freertos/event_groups.h>
|
||
#include <freertos/task.h>
|
||
#include <esp_timer.h>
|
||
|
||
#include <string>
|
||
#include <mutex>
|
||
#include <deque>
|
||
#include <memory>
|
||
|
||
#include "protocol.h"
|
||
#include "ota.h"
|
||
#include "audio_service.h"
|
||
#include "device_state_event.h"
|
||
#include "alarm_manager.h"
|
||
|
||
|
||
#define MAIN_EVENT_SCHEDULE (1 << 0)
|
||
#define MAIN_EVENT_SEND_AUDIO (1 << 1)
|
||
#define MAIN_EVENT_WAKE_WORD_DETECTED (1 << 2)
|
||
#define MAIN_EVENT_VAD_CHANGE (1 << 3)
|
||
#define MAIN_EVENT_ERROR (1 << 4)
|
||
#define MAIN_EVENT_CHECK_NEW_VERSION_DONE (1 << 5)
|
||
#define MAIN_EVENT_CLOCK_TICK (1 << 6)
|
||
|
||
|
||
enum AecMode {
|
||
kAecOff,
|
||
kAecOnDeviceSide,
|
||
kAecOnServerSide,
|
||
};
|
||
|
||
class Application {
|
||
public:
|
||
static Application& GetInstance() {
|
||
static Application instance;
|
||
return instance;
|
||
}
|
||
// 删除拷贝构造函数和赋值运算符
|
||
Application(const Application&) = delete;
|
||
Application& operator=(const Application&) = delete;
|
||
|
||
void Start();
|
||
void MainEventLoop();
|
||
DeviceState GetDeviceState() const { return device_state_; }
|
||
bool IsVoiceDetected() const { return audio_service_.IsVoiceDetected(); }
|
||
void Schedule(std::function<void()> callback);
|
||
void SetDeviceState(DeviceState state);
|
||
void Alert(const char* status, const char* message, const char* emotion = "", const std::string_view& sound = "");
|
||
void DismissAlert();
|
||
void AbortSpeaking(AbortReason reason);
|
||
void ToggleChatState();
|
||
void StartListening();
|
||
void StopListening();
|
||
void Reboot();
|
||
void WakeWordInvoke(const std::string& wake_word);
|
||
bool UpgradeFirmware(Ota& ota, const std::string& url = "");
|
||
bool CanEnterSleepMode();
|
||
void SendMcpMessage(const std::string& payload);
|
||
void SetAecMode(AecMode mode);
|
||
AecMode GetAecMode() const { return aec_mode_; }
|
||
void PlaySound(const std::string_view& sound);
|
||
// 新增:接收外部音频数据(如音乐播放)
|
||
void AddAudioData(AudioStreamPacket&& packet);
|
||
AudioService& GetAudioService() { return audio_service_; }
|
||
|
||
// 闹钟功能
|
||
AlarmManager& GetAlarmManager() { return AlarmManager::GetInstance(); }
|
||
std::vector<std::string> GetDefaultAlarmMusicList() const;
|
||
|
||
private:
|
||
Application();
|
||
~Application();
|
||
|
||
std::mutex mutex_;
|
||
std::deque<std::function<void()>> main_tasks_;
|
||
std::unique_ptr<Protocol> protocol_;
|
||
EventGroupHandle_t event_group_ = nullptr;
|
||
esp_timer_handle_t clock_timer_handle_ = nullptr;
|
||
volatile DeviceState device_state_ = kDeviceStateUnknown;
|
||
ListeningMode listening_mode_ = kListeningModeAutoStop;
|
||
AecMode aec_mode_ = kAecOff;
|
||
std::string last_error_message_;
|
||
AudioService audio_service_;
|
||
|
||
bool has_server_time_ = false;
|
||
bool aborted_ = false;
|
||
int clock_ticks_ = 0;
|
||
TaskHandle_t check_new_version_task_handle_ = nullptr;
|
||
TaskHandle_t main_event_loop_task_handle_ = nullptr;
|
||
|
||
void OnWakeWordDetected();
|
||
void CheckNewVersion(Ota& ota);
|
||
void CheckAssetsVersion();
|
||
void ShowActivationCode(const std::string& code, const std::string& message);
|
||
void SetListeningMode(ListeningMode mode);
|
||
|
||
// 闹钟相关私有方法
|
||
void OnAlarmTriggered(const AlarmItem& alarm);
|
||
void OnAlarmSnoozed(const AlarmItem& alarm);
|
||
void OnAlarmStopped(const AlarmItem& alarm);
|
||
|
||
// 音乐进度跟踪相关
|
||
void UpdateMusicProgress();
|
||
std::string current_music_name_;
|
||
int64_t music_start_time_ms_ = 0; // 音乐开始播放的时间戳
|
||
int music_duration_seconds_ = 180; // 默认歌曲长度(3分钟)
|
||
bool is_music_playing_ = false;
|
||
};
|
||
|
||
|
||
class TaskPriorityReset {
|
||
public:
|
||
TaskPriorityReset(BaseType_t priority) {
|
||
original_priority_ = uxTaskPriorityGet(NULL);
|
||
vTaskPrioritySet(NULL, priority);
|
||
}
|
||
~TaskPriorityReset() {
|
||
vTaskPrioritySet(NULL, original_priority_);
|
||
}
|
||
|
||
private:
|
||
BaseType_t original_priority_;
|
||
};
|
||
|
||
#endif // _APPLICATION_H_
|