#ifndef _APPLICATION_H_ #define _APPLICATION_H_ #include "AudioDevice.h" #include "OpusEncoder.h" #include "OpusResampler.h" #include "WebSocket.h" #include "Display.h" #include "Ml307AtModem.h" #include "FirmwareUpgrade.h" #include "Ml307Http.h" #include "EspHttp.h" #include "opus.h" #include "resampler_structs.h" #include "freertos/event_groups.h" #include "freertos/queue.h" #include "freertos/task.h" #include "esp_afe_sr_models.h" #include "esp_nsn_models.h" #include #include #define DETECTION_RUNNING 1 #define COMMUNICATION_RUNNING 2 #define WAKE_WORD_ENCODED 4 #define PROTOCOL_VERSION 2 struct BinaryProtocol { uint16_t version; uint16_t type; uint32_t reserved; uint32_t timestamp; uint32_t payload_size; uint8_t payload[]; } __attribute__((packed)); enum ChatState { kChatStateIdle, kChatStateConnecting, kChatStateListening, kChatStateSpeaking, kChatStateWakeWordDetected, kChatStateTesting, kChatStateUpgrading }; class Application { public: static Application& GetInstance() { static Application instance; return instance; } void Start(); // 删除拷贝构造函数和赋值运算符 Application(const Application&) = delete; Application& operator=(const Application&) = delete; private: Application(); ~Application(); AudioDevice audio_device_; #ifdef CONFIG_USE_ML307 Ml307AtModem ml307_at_modem_; Ml307Http http_; #else EspHttp http_; #endif FirmwareUpgrade firmware_upgrade_; #ifdef CONFIG_USE_DISPLAY Display display_; #endif std::recursive_mutex mutex_; WebSocket* ws_client_ = nullptr; esp_afe_sr_data_t* afe_detection_data_ = nullptr; esp_afe_sr_data_t* afe_communication_data_ = nullptr; EventGroupHandle_t event_group_; char* wakenet_model_ = NULL; volatile ChatState chat_state_ = kChatStateIdle; // Audio encode / decode TaskHandle_t audio_feed_task_ = nullptr; StaticTask_t audio_encode_task_buffer_; StackType_t* audio_encode_task_stack_ = nullptr; QueueHandle_t audio_encode_queue_ = nullptr; TaskHandle_t audio_decode_task_ = nullptr; StaticTask_t audio_decode_task_buffer_; StackType_t* audio_decode_task_stack_ = nullptr; QueueHandle_t audio_decode_queue_ = nullptr; OpusEncoder opus_encoder_; OpusDecoder* opus_decoder_ = nullptr; int opus_duration_ms_ = 60; int opus_decode_sample_rate_ = CONFIG_AUDIO_OUTPUT_SAMPLE_RATE; OpusResampler opus_resampler_; OpusResampler test_resampler_; std::vector test_pcm_; TaskHandle_t wake_word_encode_task_ = nullptr; StaticTask_t wake_word_encode_task_buffer_; StackType_t* wake_word_encode_task_stack_ = nullptr; std::list wake_word_pcm_; std::string wake_word_opus_; TaskHandle_t check_new_version_task_ = nullptr; StaticTask_t check_new_version_task_buffer_; StackType_t* check_new_version_task_stack_ = nullptr; BinaryProtocol* AllocateBinaryProtocol(void* payload, size_t payload_size); void SetDecodeSampleRate(int sample_rate); void SetChatState(ChatState state); void StartDetection(); void StartCommunication(); void StartWebSocketClient(); void StoreWakeWordData(uint8_t* data, size_t size); void EncodeWakeWordData(); void SendWakeWordData(); void CheckTestButton(); void PlayTestAudio(); void CheckNewVersion(); void UpdateDisplay(); void AudioFeedTask(); void AudioDetectionTask(); void AudioCommunicationTask(); void AudioEncodeTask(); void AudioDecodeTask(); }; #endif // _APPLICATION_H_