From 659c470eba542383987aad227b7f918100f131fa Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期五, 11 九月 2026 15:09:05 +0800
Subject: [PATCH] 小智终端 5种 场景模式 OK

---
 xiaozhi-esp32-2.2.6/main/protocols/protocol.cc |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/xiaozhi-esp32-2.2.6/main/protocols/protocol.cc b/xiaozhi-esp32-2.2.6/main/protocols/protocol.cc
index 470cc91..360e277 100644
--- a/xiaozhi-esp32-2.2.6/main/protocols/protocol.cc
+++ b/xiaozhi-esp32-2.2.6/main/protocols/protocol.cc
@@ -48,10 +48,20 @@
     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);
+bool Protocol::SendWakeWordDetected(const std::string& wake_word) {
+    cJSON* root = cJSON_CreateObject();
+    cJSON_AddStringToObject(root, "session_id", session_id_.c_str());
+    cJSON_AddStringToObject(root, "type", "listen");
+    cJSON_AddStringToObject(root, "state", "detect");
+    cJSON_AddStringToObject(root, "text", wake_word.c_str());
+    char* json = cJSON_PrintUnformatted(root);
+    cJSON_Delete(root);
+    if (json == nullptr) {
+        return false;
+    }
+    bool ok = SendText(json);
+    cJSON_free(json);
+    return ok;
 }
 
 void Protocol::SendStartListening(ListeningMode mode) {
@@ -78,13 +88,21 @@
     SendText(message);
 }
 
+bool Protocol::IsAudioChannelConnected() const {
+    return IsAudioChannelOpened();
+}
+
+void Protocol::MarkIncomingActivity() {
+    last_incoming_time_ = std::chrono::steady_clock::now();
+}
+
 bool Protocol::IsTimeout() const {
     const int kTimeoutSeconds = 120;
     auto now = std::chrono::steady_clock::now();
     auto duration = std::chrono::duration_cast<std::chrono::seconds>(now - last_incoming_time_);
     bool timeout = duration.count() > kTimeoutSeconds;
     if (timeout) {
-        ESP_LOGE(TAG, "Channel timeout %ld seconds", (long)duration.count());
+        ESP_LOGW(TAG, "Channel idle %ld seconds (socket may still be up)", (long)duration.count());
     }
     return timeout;
 }

--
Gitblit v1.9.1