Merge #2508 into sdk650pathc0423 from refs/changes/2508/head 2513/target/1
author胡传军 <1224667075@qq.com>
Wed, 15 Oct 2025 03:29:10 +0000 (03:29 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Wed, 15 Oct 2025 03:29:10 +0000 (03:29 +0000)
Code review from 胡传军

* refs/changes/2508/head: (2 commits squashed)

  - 修改ws间隔,支持参数传入,方便业务扩展

  - Merge branch &#39;sdk650pathc0423&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk650pathc0423

Signed-off-by: aliyun8003852482 <1224667075@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/2508
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c
code/sdk/zhihui/websocket/os_ws/haisi_websocket.c
code/sdk/zhihui/websocket/os_ws/haisi_websocket.h

index afd44be..0bf23ad 100644 (file)
 // 功能开关宏定义
 #define ENABLE_BINARY_DATA_INTERRUPT_CHECK 1  // 启用二进制数据间隔检查
 
+// 主线程循环间隔时长(毫秒)
+#define LN_WS_MAIN_THREAD_INTERVAL_MS 500
+
+// 心跳间隔(秒)
+#define LN_WS_HEARTBEAT_INTERVAL_SEC 30
+
+// 心跳间隔计数器阈值(基于主线程间隔计算)
+#define LN_WS_HEARTBEAT_COUNTER_THRESHOLD ((LN_WS_HEARTBEAT_INTERVAL_SEC * 1000) / LN_WS_MAIN_THREAD_INTERVAL_MS)
+
 // 打印等级定义
 typedef enum {
     LN_WS_LOG_ERROR = 0,    // 错误信息
@@ -307,8 +316,10 @@ static int ln_ws_heartbeat_callback(void)
         check_playback_completion_by_timeout();
     }
     
-    if (heartbeat_counter >= 30) { // 30秒 = 30次 * 1秒
+    if (heartbeat_counter >= LN_WS_HEARTBEAT_COUNTER_THRESHOLD) { // 30秒心跳间隔
         heartbeat_counter = 0;
+        LN_WS_DEBUG("Sending heartbeat (interval: %u ms, threshold: %u)\n", 
+                   LN_WS_MAIN_THREAD_INTERVAL_MS, LN_WS_HEARTBEAT_COUNTER_THRESHOLD);
         ln_ws_send_ping();
         return 1; // 需要发送心跳
     }
@@ -847,6 +858,7 @@ int ln_ws_start(ws_message_callback_t_ln callback, uint32_t audio_timeout_ticks)
     g_ws_callbacks.binary_callback = ai_binary_message_handler; 
     g_ws_callbacks.incomplete_callback= ln_ws_incomplete_callback;
     g_ws_callbacks.reconnect_success_callback = ln_ws_reconnect_success_callback;
+    g_ws_callbacks.main_thread_interval_ms = LN_WS_MAIN_THREAD_INTERVAL_MS;
     // 启动WebSocket服务
     int ret = uapi_ws_start(&g_ws_callbacks);
     if (ret != 0) {
@@ -1497,8 +1509,6 @@ static void ln_ws_default_message_handler(const ws_data_msg_t *data_msg, ws_comm
             LN_WS_DEBUG("Default: Processing Audio Playback End event\n");
             break;
         case WS_CMD_SENTENCE_PLAYBACK_COMPLETE:
-            //推送文本到UI
-            push_audio_playback_start_notification();
             LN_WS_DEBUG("Default: Processing Sentence Playback Complete event\n");
             break;
         case WS_CMD_AUDIO_RECORDING_START:
@@ -2522,7 +2532,6 @@ static bool check_playback_completion_by_duration(void)
         
         // 触发单句语音播放完成事件
         if (g_ws_message_callback != NULL) {
-            push_audio_playback_start_notification();
             g_ws_message_callback(NULL, WS_CMD_SENTENCE_PLAYBACK_COMPLETE);
         }
         
index 178178a..0530aef 100644 (file)
@@ -91,6 +91,7 @@ static osMessageQueueId_t g_ws_msg_queue = NULL;
 static ws_call_backs_t g_ws_callbacks = {0}; /* WebSocket回调函数结构体 */
 static volatile ws_close_status_t g_ws_close_status = WS_CLOSE_NOT_EXECUTED; /* WebSocket关闭状态标志位 */
 static volatile int g_ws_is_reconnecting = 0; /* 是否正在重连的标志位 */
+static uint32_t g_main_thread_interval_ms = 1000; /* 主线程循环间隔时长(毫秒),默认1000ms */
 
 /* 连接超时检测相关变量 */
 static time_t g_ws_connect_start_time = 0;  /* 连接开始时间 */
@@ -337,7 +338,7 @@ static void uapi_ws_main_thread(void *arg)
                         
                     case WS_MSG_TYPE_RAW_MESSAGE:
                         {
-                            HAISI_WS_DEBUG("Received raw message: %s, timestamp: %u, isBinary: %s\n", 
+                            HAISI_WS_INFO("Received raw message: %s, timestamp: %u, isBinary: %s\n", 
                                 msg->raw_data, msg->timestamp, msg->isBinary ? "true" : "false");
                             
                             // 根据消息类型调用不同的回调函数
@@ -523,11 +524,9 @@ static void uapi_ws_main_thread(void *arg)
            HAISI_WS_INFO("ws_state %s\n",uapi_ws_get_connection_state_string());
         }
         
-        /* 1秒间隔 */
-        // if(g_ws_connected!=WS_STATE_CONNECTED)
+        /* 使用动态间隔时长 */
         {
-            usleep(1000 * 1000);
-
+            usleep(g_main_thread_interval_ms * 1000); // 转换为微秒
         }
     }
   
@@ -568,7 +567,15 @@ int uapi_ws_start(const ws_call_backs_t *callbacks)
     // 注册回调函数结构体
     if (callbacks != NULL) {
         g_ws_callbacks = *callbacks;
-        HAISI_WS_INFO("WebSocket callbacks registered successfully\n");
+        
+        // 设置主线程间隔时长,如果未设置则使用默认值
+        if (g_ws_callbacks.main_thread_interval_ms > 0) {
+            g_main_thread_interval_ms = g_ws_callbacks.main_thread_interval_ms;
+        } else {
+            g_main_thread_interval_ms = 1000; // 默认1000ms
+        }
+        
+        HAISI_WS_INFO("WebSocket callbacks registered successfully, main thread interval: %u ms\n", g_main_thread_interval_ms);
         
         if (g_ws_callbacks.message_callback != NULL) {
             HAISI_WS_DEBUG("Text message callback registered\n");
@@ -1037,6 +1044,15 @@ void uapi_ws_register_reconnect_success_callback(ws_reconnect_success_callback_t
     }
 }
 
+/**
+ * @brief 获取主线程循环间隔时长(公共接口)
+ * @return 当前间隔时长(毫秒)
+ */
+uint32_t uapi_ws_get_main_thread_interval(void)
+{
+    return g_main_thread_interval_ms;
+}
+
 /**
  * @brief 重置连接超时计时器
  */
index 51beba4..76e24cb 100644 (file)
@@ -57,6 +57,7 @@ typedef struct {
     ws_heartbeat_callback_t heartbeat_callback;     /* 心跳处理回调函数 */
     ws_event_callback_t event_callback;            /* 连接事件回调函数 */
     ws_reconnect_success_callback_t reconnect_success_callback; /* 重连成功回调函数 */
+    uint32_t main_thread_interval_ms;              /* 主线程循环间隔时长(毫秒),默认1000ms */
 } ws_call_backs_t;
 
 
@@ -75,6 +76,7 @@ int uapi_ws_get_connection_state(void);
 const char* uapi_ws_get_connection_state_string(void);
 int uapi_ws_get_close_status_public(void);
 void uapi_ws_print_status_info(void);
+uint32_t uapi_ws_get_main_thread_interval(void);
 
 /* 回调函数注册接口 */
 void uapi_ws_register_message_callback(ws_message_callback_t callback);