优化哄睡模式
authorxue <2144439972@qq.com>
Thu, 27 Nov 2025 06:47:08 +0000 (14:47 +0800)
committerxue <2144439972@qq.com>
Thu, 27 Nov 2025 06:47:08 +0000 (14:47 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp
code/sdk/zhihui/leiniao/imsl_ln/ln_api_story_random.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c

index d2684db..ccc7974 100644 (file)
@@ -2488,15 +2488,15 @@ extern "C" {
                 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4);
                 //清空文本队列
                 ClearAudioTextQueue();
-                ln_ws_audio_init();//功耗优化
-                ln_ws_send_random_story_request("随机故事");
+                do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0);
+                // 故事请求已在协议解析阶段处理(ln_parse_sleep_mode_start),此处不再发送
            }
            else//意图识别结果
            {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleSleepModeStart: 意图识别结果,跳转到2");
                 //看后续是否需要
                 ln_ws_end_audio_chat();//结束对话
-                g_sleep_mode_active = true;
+                // g_sleep_mode_active = true;
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleSleepModeStart: 睡眠模式已开始");
                 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_2);
            }
@@ -2707,7 +2707,7 @@ extern "C" {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackEnd: 故事模式finished且音频播放结束,结束故事模式");
             // 重置标志
             m_storyModeFinished = false;
-            g_sleep_mode_active = false;
+            // g_sleep_mode_active = false;
             // 结束故事模式
             HandleSleepModeEnd();
             return;
index 5498f6d..8e677db 100644 (file)
@@ -2,6 +2,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "cJSON.h"
+// 睡眠模式状态标志位:true表示睡眠模式已开始,false表示未开始或已结束
+static bool g_sleep_mode_active = false;
+
+#ifdef SUPPORT_CAT1_SERVICE
+#include "custom_runtime.h"  // 用于获取网络状态
+#endif
+#include "soc_osal.h"  // 用于LOS_Msleep
 
 uint32_t ln_story_random_http(const char *device_id,
                               const char *device_token,
@@ -270,10 +277,19 @@ void ln_parse_voice_chat_response(const char *json_str, int json_len)
     }
     cJSON_Delete(root);
 }
+void uapi_set_sleep_mode_active(bool active)
+{
+    g_sleep_mode_active = active;
+}
 
 /* 解析哄睡模式开始:提取data.storyTheme并触发随机故事 */
 void ln_parse_sleep_mode_start(const char *json_str, int json_len)
 {
+    if(g_sleep_mode_active)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] sleep mode already active\n");
+        return;
+    }
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] parse json\n");
        (void)json_len;
        if (json_str == NULL) {
@@ -292,7 +308,6 @@ void ln_parse_sleep_mode_start(const char *json_str, int json_len)
                        }
                }
        }
-
        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] storyTheme=%s\n", theme);
     // 该接口不需要任何参数,系统会自动生成随机主题的故事
     // storyTheme=随机
@@ -300,8 +315,44 @@ void ln_parse_sleep_mode_start(const char *json_str, int json_len)
         theme = "随机";
     }
     push_sleep_mode_start_notification(theme, 0);//0小程序直接发起,不是意图识别结果
-    //通知websocket发送随机故事请求
-    ln_ws_send_random_story_request(theme);
+    g_sleep_mode_active = true;
+    
+    // 等待音频初始化完成后再发送随机故事请求
+    // 等待音频初始化超时时间:5秒,每100ms检查一次
+    #define MAX_AUDIO_WAIT_COUNT 50  // 5秒
+    #define WAIT_INTERVAL_MS 100
+    int audio_wait_count = 0;
+    int audio_ready = 0;
+    
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] Waiting for audio initialization...\n");
+    
+    while (audio_wait_count < MAX_AUDIO_WAIT_COUNT) {
+        if (ln_ws_is_audio_initialized()) {
+            audio_ready = 1;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] Audio initialized after %d ms\n", 
+                   audio_wait_count * WAIT_INTERVAL_MS);
+            break;
+        }
+        
+        // 每1秒打印一次状态(减少日志噪音)
+        if (audio_wait_count % 10 == 0 && audio_wait_count > 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] Waiting for audio initialization... (elapsed:%d ms)\n", 
+                   audio_wait_count * WAIT_INTERVAL_MS);
+        }
+        
+        LOS_Msleep(WAIT_INTERVAL_MS);
+        audio_wait_count++;
+    }
+    
+    if (audio_ready) {
+        // 音频已初始化,发送随机故事请求
+        ln_ws_send_random_story_request(theme);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] send story request success\n");
+    } else {
+        // 音频初始化超时,记录日志但不发送请求
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_START] Audio initialization timeout after %d ms, skipping story request\n", 
+               audio_wait_count * WAIT_INTERVAL_MS);
+    }
     ln_ws_send_sleep_mode_start_ack(true, "哄睡模式开始");
     if (root) cJSON_Delete(root);
 }
@@ -316,4 +367,8 @@ void ln_parse_sleep_mode_end(const char *json_str, int json_len)
     ln_voice_chat_interrupt("哄睡模式结束");
     push_sleep_mode_end_notification();
     ln_ws_send_sleep_mode_end_ack(true, "哄睡模式结束");
+    
+    // 清除睡眠模式已开始标志
+    g_sleep_mode_active = false;
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[LN][SLEEP_END] sleep mode flag cleared\n");
 }
index 4c305f3..b96db84 100644 (file)
@@ -1641,6 +1641,12 @@ const char* ln_ws_get_connection_state_string(void)
     }
 }
 
+/* 获取WebSocket关闭状态(公共接口) */
+int ln_ws_get_close_status_public(void)
+{
+    return (int)g_ws_close_status;
+}
+
 /* ============================ 公共回调函数接口 ============================ */
 
 /**