#include "protocol.h" #include #define TAG "Protocol" void Protocol::OnIncomingJson(std::function callback) { on_incoming_json_ = callback; } void Protocol::OnIncomingAudio(std::function packet)> callback) { on_incoming_audio_ = callback; } void Protocol::OnAudioChannelOpened(std::function callback) { on_audio_channel_opened_ = callback; } void Protocol::OnAudioChannelClosed(std::function callback) { on_audio_channel_closed_ = callback; } void Protocol::OnNetworkError(std::function callback) { on_network_error_ = callback; } void Protocol::SetError(const std::string& message) { error_occurred_ = true; if (on_network_error_ != nullptr) { on_network_error_(message); } } void Protocol::SendAbortSpeaking(AbortReason reason) { std::string message = "{\"session_id\":\"" + session_id_ + "\",\"type\":\"abort\""; if (reason == kAbortReasonWakeWordDetected) { message += ",\"reason\":\"wake_word_detected\""; } message += "}"; SendText(message); } void Protocol::SendWakeWordDetected(const std::string& wake_word) { std::string json = "{\"session_id\":\"" + session_id_ + "\",\"type\":\"listen\",\"state\":\"detect\",\"text\":\"" + wake_word + "\"}"; SendText(json); } void Protocol::SendStartListening(ListeningMode mode) { std::string message = "{\"session_id\":\"" + session_id_ + "\""; message += ",\"type\":\"listen\",\"state\":\"start\""; if (mode == kListeningModeRealtime) { message += ",\"mode\":\"realtime\""; } else if (mode == kListeningModeAutoStop) { message += ",\"mode\":\"auto\""; } else { message += ",\"mode\":\"manual\""; } message += "}"; SendText(message); } void Protocol::SendStopListening() { std::string message = "{\"session_id\":\"" + session_id_ + "\",\"type\":\"listen\",\"state\":\"stop\"}"; SendText(message); } void Protocol::SendMcpMessage(const std::string& payload) { std::string message = "{\"session_id\":\"" + session_id_ + "\",\"type\":\"mcp\",\"payload\":" + payload + "}"; SendText(message); } bool Protocol::IsTimeout() const { const int kTimeoutSeconds = 120; auto now = std::chrono::steady_clock::now(); auto duration = std::chrono::duration_cast(now - last_incoming_time_); bool timeout = duration.count() > kTimeoutSeconds; if (timeout) { ESP_LOGE(TAG, "Channel timeout %ld seconds", (long)duration.count()); } return timeout; }