修改ai线程启动限制,防止因操作过快导致的线程锁死问题
authorhcj <1224667075@qq.com>
Fri, 1 Aug 2025 03:26:03 +0000 (11:26 +0800)
committerhcj <1224667075@qq.com>
Fri, 1 Aug 2025 03:26:03 +0000 (11:26 +0800)
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server.cpp
code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp

index 3c6823e..0247e7d 100644 (file)
@@ -56,7 +56,7 @@
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
-
+#include "cmsis_os2.h"
 #include "bk_websocket.h"
 
 #include <stdint.h>
@@ -106,6 +106,12 @@ WebSocketClient *chat_client=NULL;
 
 WebSocketClient *tts_client=NULL;
 
+static int asr_client_ping=0;
+
+static int tts_client_ping=0;
+
+static int chat_client_ping=0;
+
 
 errcode_t chat_server_init(void);
 
@@ -527,7 +533,7 @@ void bk_websocket_demo(void *data) {
             //  uapi_start_tts_single_txt("2025英超夏季转会窗分阶段开启第一阶段2025年6月1日至2025年6月11日凌晨2:00北京时间第二阶段常规夏窗2025年6月16日至2025年9月2日凌晨2:00北京时间本贴将持续更新2025年夏窗以曼联转会相关为主的新闻和消息。");
         }
 
-        
+        printf("chat_client succ");
         // send_ai_txt(1,"你是谁");
 
         set_ai_chat_service_init_flag(1);
@@ -541,7 +547,15 @@ void bk_websocket_demo(void *data) {
                 printf("disconnect_server  chat_client");
                 break;
             }
-            chat_result_analysis(recv_buf);
+            if(type==WS_PONG)
+            {
+                chat_client_ping=0;
+            }
+            else
+            {
+                chat_result_analysis(recv_buf);
+            }
+           
             if(chat_reconnect==1)
             {
                 break;
@@ -559,7 +573,12 @@ void bk_websocket_demo(void *data) {
             goto char_reconnet;
         }
         is_bk_websocket_chat=0;
-        return ;
+
+        chat_client_ping=0;
+
+        // osThreadExit();
+        printf("bk_websocket_demo end\r\n");
+        return;
     }
 }
 
@@ -575,27 +594,48 @@ void bk_websocket_demo(void *data) {
 #define CAT1_SERVICE_TASK_PRIO       5
 
 
+app_task_definition_t chat_taskcfg={0};
 
 
+// typedef enum {
+//   osThreadInactive        =  0,         ///< Inactive.
+//   osThreadReady           =  1,         ///< Ready.
+//   osThreadRunning         =  2,         ///< Running.
+//   osThreadBlocked         =  3,         ///< Blocked.
+//   osThreadTerminated      =  4,         ///< Terminated.
+//   osThreadError           = -1,         ///< Error.
+//   osThreadReserved        = 0x7FFFFFFF  ///< Prevents enum down-size compiler optimization.
+// } osThreadState_t;
 
 
 errcode_t chat_server_init(void)
 {
-    if(chat_client || is_bk_websocket_chat)
+    int osThreadGetState_t= osThreadGetState(chat_taskcfg.task_handle);
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"chat osThreadGetState_t %d!\r\n",osThreadGetState_t);
+    if(osThreadGetState_t!=osThreadReady &&  osThreadGetState_t!=osThreadError && osThreadGetState_t !=osThreadInactive)
+    {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %d!\r\n",osThreadGetState_t);
+         return ERRCODE_FAIL;
+    }
+
+    if(chat_client || is_bk_websocket_chat )
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init is connet!\r\n");
         return ERRCODE_FAIL;
     }
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init !\r\n");
-    app_task_definition_t taskcfg={0};
-    taskcfg.create_queue_handle = NULL;
-    taskcfg.attr.name="chat_server_init";
-    taskcfg.attr.priority = TASK_PRIORITY_APP;
-    taskcfg.attr.stack_size = 0x1000;
-    taskcfg.func = bk_websocket_demo;
-    taskcfg.use_mem = USE_EXTEND_MEM;
+    
+    chat_taskcfg.create_queue_handle = NULL;
+    chat_taskcfg.attr.name="chat_server_init";
+    chat_taskcfg.attr.priority = TASK_PRIORITY_APP;
+    chat_taskcfg.attr.stack_size = 0x1000;
+    chat_taskcfg.func = bk_websocket_demo;
+    chat_taskcfg.use_mem = USE_EXTEND_MEM;
+
+   
   
-    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+    errcode_t ret=uapi_create_osThread_custom(&chat_taskcfg);
 
 
     if(ret != ERRCODE_SUCC)
@@ -832,7 +872,7 @@ const char* ws_snicker_test_server_url="ws://110.42.224.129:8910/asr/ws";
 
 int g_test_server_index = 0; //0 正式版本, 1 测试版本, 2 Snicker 服务器测试版本
 
-static int asr_client_ping=0;
+
 
 int asr_client_sockfd_last_id=-1;
 
@@ -985,9 +1025,19 @@ void bk_websocket_asr(void *data) {
 }
 
 
+ app_task_definition_t asr_taskcfg={0};
 
 errcode_t asr_server_init(void)
 {
+     int osThreadGetState_t= osThreadGetState(asr_taskcfg.task_handle);
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"chat osThreadGetState_t %d!\r\n",osThreadGetState_t);
+    if(osThreadGetState_t!=osThreadReady && osThreadGetState_t!=osThreadError && osThreadGetState_t !=osThreadInactive)
+    {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %s!\r\n",osThreadGetState_t);
+         return ERRCODE_FAIL;
+    }
+
     if(is_bk_websocket_asr || asr_client!=NULL)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init is connet!\r\n");
@@ -996,15 +1046,15 @@ errcode_t asr_server_init(void)
    
 
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"asr_server_init !\r\n");
-    app_task_definition_t taskcfg={0};
-    taskcfg.create_queue_handle = NULL;
-    taskcfg.attr.name="asr_server_init";
-    taskcfg.attr.priority = TASK_PRIORITY_APP;
-    taskcfg.attr.stack_size = 0x1000;
-    taskcfg.func = bk_websocket_asr;
-    taskcfg.use_mem = USE_EXTEND_MEM;
+   
+    asr_taskcfg.create_queue_handle = NULL;
+    asr_taskcfg.attr.name="asr_server_init";
+    asr_taskcfg.attr.priority = TASK_PRIORITY_APP;
+    asr_taskcfg.attr.stack_size = 0x1000;
+    asr_taskcfg.func = bk_websocket_asr;
+    asr_taskcfg.use_mem = USE_EXTEND_MEM;
   
-    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+    errcode_t ret=uapi_create_osThread_custom(&asr_taskcfg);
 
 
     if(ret != ERRCODE_SUCC)
@@ -1264,7 +1314,7 @@ void bk_websocket_tts(void *data) {
             }
             else
             {
-                 printf("tts_client init_websocket_client succ \r\n");
+                printf("tts_client init_websocket_client succ \r\n");
                 break;
             }
         }
@@ -1324,6 +1374,10 @@ void bk_websocket_tts(void *data) {
                 bk_websocket_tts_tick=0;
                 // tts_paly();
             }
+            if(type==WS_PONG)
+            {
+                tts_client_ping=0;
+            }
             // aer_result_analysis(asr_recv_buf);
         }
 
@@ -1345,30 +1399,42 @@ void bk_websocket_tts(void *data) {
             }
             tts_reconnect=0;
         }
-        // return;
+       
     }
-      is_bk_websocket_tts=0;
+    is_bk_websocket_tts=0;
+    tts_client_ping=0;
+    return;
    
 }
 
+app_task_definition_t tts_taskcfg={0};
 
 errcode_t tts_server_init(void)
 {
+    int osThreadGetState_t= osThreadGetState(tts_taskcfg.task_handle);
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"tts osThreadGetState_t %d!\r\n",osThreadGetState_t);
+    if(osThreadGetState_t!=osThreadReady && osThreadGetState_t!=osThreadError && osThreadGetState_t !=osThreadInactive)
+    {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %d!\r\n",osThreadGetState_t);
+         return ERRCODE_FAIL;
+    }
 
     if(tts_client!=NULL || is_bk_websocket_tts)
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %d!\r\n",osThreadGetState_t);
         return ERRCODE_FAIL;
     }
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"tts_server_init !\r\n");
-    app_task_definition_t taskcfg={0};
-    taskcfg.create_queue_handle = NULL;
-    taskcfg.attr.name="tts_server_init";
-    taskcfg.attr.priority = TASK_PRIORITY_APP;
-    taskcfg.attr.stack_size = 0x1000;
-    taskcfg.func = bk_websocket_tts;
-    taskcfg.use_mem = USE_EXTEND_MEM;
+   
+    tts_taskcfg.create_queue_handle = NULL;
+    tts_taskcfg.attr.name="tts_server_init";
+    tts_taskcfg.attr.priority = TASK_PRIORITY_APP;
+    tts_taskcfg.attr.stack_size = 0x1000;
+    tts_taskcfg.func = bk_websocket_tts;
+    tts_taskcfg.use_mem = USE_EXTEND_MEM;
   
-    errcode_t ret=uapi_create_osThread_custom(&taskcfg);
+    errcode_t ret=uapi_create_osThread_custom(&tts_taskcfg);
 
 
     if(ret != ERRCODE_SUCC)
@@ -1425,45 +1491,84 @@ int32_t uapi_tts_paly_stop(void)
 
 void asr_server_deinit(void)
 {
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE");
-    send_websocket_message(asr_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE);
+    
+    if(send_websocket_message(asr_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE))
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE");
+    }
 }
 
 
 void chat_server_deinit(void)
 {
-    send_websocket_message(chat_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE);
+ 
+    if(send_websocket_message(chat_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE))
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE");
+    }
 }
 
 
 void tts_server_deinit(void)
 {
-    send_websocket_message(tts_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE);
-
-    
+   
+    if(send_websocket_message(tts_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE))
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE");
+    }
 }
 
 
 
 static void time_sync_func(void)
 {
-if(asr_client)
+    if(asr_client)
     {
         if(asr_client_ping)
         {
-            // asr_server_deinit();
-            // lwip_close_websocket_client(asr_client);
-            // asr_client=NULL;
+            asr_server_deinit();
+            lwip_close_websocket_client(asr_client);
+            asr_client=NULL;
         }
         else
         {
-            // if(0==send_websocket_message(asr_client,( const unsigned char *)"ping",strlen("ping"),WS_PING))
+            if(0==send_websocket_message(asr_client,(uint8_t *)"ping",strlen("ping"),WS_PING))
             {
                 asr_client_ping=1;
             }
-
         }
-        
+    }
+    if(chat_client)
+    {
+        if(chat_client_ping)
+        {
+            chat_server_deinit();
+            lwip_close_websocket_client(chat_client);
+            chat_client=NULL;
+        }
+        else
+        {
+            if(0==send_websocket_message(chat_client,(uint8_t *)"ping",strlen("ping"),WS_PING))
+            {
+                chat_client_ping=1;
+            }
+        }
+    }
+    if(tts_client)
+    {
+        if(tts_client_ping)
+        {
+            tts_server_deinit();
+            lwip_close_websocket_client(tts_client);
+            tts_client=NULL;
+        }
+        else
+        {
+            if(0==send_websocket_message(tts_client,(uint8_t *)"ping",strlen("ping"),WS_PING))
+            {
+                tts_client_ping=1;
+            }
+        }
     }
 
 }
@@ -1480,7 +1585,7 @@ bool init_ai_task(uint8_t type)
         g_timer_time_sync = osTimerNew((osTimerFunc_t)time_sync_func, osTimerPeriodic, NULL, NULL);
         if (g_timer_time_sync == NULL)
         {
-              WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"g_timer_time_sync create failed\n");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"g_timer_time_sync create failed\n");
         }
         type_ai=type;
         uapi_tts_paly_init();
index 201a2e9..c3bb844 100644 (file)
@@ -468,7 +468,7 @@ int send_websocket_message(WebSocketClient *client, uint8_t *message, size_t mes
 
     if(client==NULL||message==NULL )
     {
-         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message client or message is NULL\r\n");
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message client or message is NULL %s %s\r\n",client,message);
         return -1;
     }
     uint8_t* frame=( uint8_t *)aic_zalloc(message_len + 50);
@@ -870,7 +870,7 @@ client_ERROR:
 void lwip_close_websocket_client(WebSocketClient *client) {
     if(client)
     {
-        printf("lwip_close_websocket_client ");
+        printf("lwip_close_websocket_client %s %s",client->host,client->path);
         lwip_shutdown(client->sockfd,SHUT_RDWR);
         bk_sleep(10);
         int err= lwip_close(client->sockfd);