From 1baf802f73f7e2c5d017e0b1d1fe68ea3ed552f3 Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Thu, 27 Nov 2025 14:47:08 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E5=93=84=E7=9D=A1=E6=A8=A1?= =?utf8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../thunderbird/src/ThunderBirdModel.cpp | 8 +-- .../leiniao/imsl_ln/ln_api_story_random.c | 61 ++++++++++++++++++- .../zhihui/leiniao/imsl_ln/ln_api_websocket.c | 6 ++ 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp index d2684dbe9..ccc797449 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp @@ -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; diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_story_random.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_story_random.c index 5498f6d4c..8e677dbc1 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_story_random.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_story_random.c @@ -2,6 +2,13 @@ #include #include #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"); } diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c index 4c305f392..b96db84eb 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c @@ -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; +} + /* ============================ 公共回调函数接口 ============================ */ /** -- 2.17.1