优化GNSS HTTP服务创建,优化EG810获取ICCID。
authorpenglei <1624952103@qq.com>
Sun, 28 Sep 2025 06:23:53 +0000 (14:23 +0800)
committerpenglei <1624952103@qq.com>
Sun, 28 Sep 2025 06:23:53 +0000 (14:23 +0800)
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/fd230/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp
code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c
code/sdk/zhihui/services/gnss/inc/gnss_http_server.h
code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c
code/sdk/zhihui/services/gnss/src/gnss_http_server.c

index 2ec1c92..2dcde31 100644 (file)
@@ -618,7 +618,7 @@ static void thread_main(const void *unused)
 \r
 #ifdef SUPPORT_GNSS\r
     gnss_uart_init();\r
-    uapi_gnss_http_server_init();\r
+    // uapi_gnss_http_server_init();\r
 #endif\r
 \r
 #ifdef SUPPORT_OHOSFWK\r
index ebfd885..e7189fe 100644 (file)
@@ -48,7 +48,7 @@ void EphemerisDownloadModel::DownloadEphemeris() {
 #endif
   ephemerisDownloadStatus = EphemerisDownloadStatus::DOWNLOADING;
 #if defined(SUPPORT_GNSS)
-  do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0);
+  uapi_gnss_start_agnss_download();
 #endif
 }
 /*
index 5ecf495..68ef854 100644 (file)
@@ -47,7 +47,7 @@ void EphemerisDownloadModel::DownloadEphemeris() {
 #endif
   ephemerisDownloadStatus = EphemerisDownloadStatus::DOWNLOADING;
 #if defined(SUPPORT_GNSS)
-  do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0);
+    uapi_gnss_start_agnss_download();
 #endif
 }
 /*
index 5ecf495..68ef854 100644 (file)
@@ -47,7 +47,7 @@ void EphemerisDownloadModel::DownloadEphemeris() {
 #endif
   ephemerisDownloadStatus = EphemerisDownloadStatus::DOWNLOADING;
 #if defined(SUPPORT_GNSS)
-  do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0);
+    uapi_gnss_start_agnss_download();
 #endif
 }
 /*
index 9f07fba..1151dc7 100644 (file)
@@ -652,9 +652,6 @@ static int decodeNetStat(char* msg)
             {
                 update++;
                 cat1_api_runtime_set_cat1_imei(ppbuf);
-
-                cat1_print_info("IMEI received, sending AT+ICCID command\n");
-                cat1_at_cmd("AT+ICCID");
             }   
             continue;
         }else if(strncmp(s,"sim:",4) == 0)
@@ -1391,6 +1388,10 @@ static int udp_packet_parse(char *rx_buffer, int len)
            
                 restart_time_sync();
                 cat1_getsignal();
+                
+                cat1_print_info("IMEI received, sending AT+ICCID command\n");
+                cat1_at_cmd("AT+ICCID");
+                
                 if (g_msg_callback_func!=NULL)
                 {
                     g_msg_callback_func(MESSAGE_4G_POWERON,NULL,0);
index 880d797..a970c6f 100644 (file)
@@ -36,6 +36,7 @@
 
 // void do_gnss_http_server_send_data(int cmd,int *data,uint32_t len);
 errcode_t uapi_gnss_http_server_init(void);
+errcode_t uapi_gnss_http_server_deinit(void);
 void do_gnss_http_server_send_data(int cmd,char *data,uint32_t len);
 
 // 返回值: 过期返回0,有效返回剩余时间的分钟数,错误返回-1
@@ -52,6 +53,9 @@ int gnss_start_agnss_download_simple(void);
 
 // 测试函数
 int gnss_test_agnss_status_simple(void);
+
+// 封装的AGNSS下载接口:初始化服务并开始下载
+errcode_t uapi_gnss_start_agnss_download(void);
  
  #ifdef __cplusplus
  #if __cplusplus
index a7768cc..175b41c 100644 (file)
@@ -777,9 +777,13 @@ static int pgnss_startup_check(void)
     
     printf("4G is powered on. Starting AGNSS download process...\n");
     
-    // 第一次发送下载指令
-    printf("Sending first download command...\n");
-    do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0);
+    printf("Starting AGNSS download with integrated interface...\n");
+    errcode_t download_ret = uapi_gnss_start_agnss_download();
+    if (download_ret != ERRCODE_SUCC) {
+        printf("ERROR: Failed to start AGNSS download: %d\n", download_ret);
+        return 1;
+    }
+    printf("AGNSS download started successfully\n");
     
     // 每10秒检查一次,最多检查6次(60秒)
     int check_count = 0;
@@ -796,13 +800,17 @@ static int pgnss_startup_check(void)
         if (!check_agnss_folder_expired()) {
             printf("✓ AGNSS files downloaded successfully after %d seconds\n", check_count * 10);
             printf("=== PGNSS Startup Check Passed ===\n");
+
+            printf("Deinitializing GNSS HTTP server...\n");
+            uapi_gnss_http_server_deinit();
+            printf("GNSS HTTP server deinitialized successfully\n");
             
             return 0; // 检查通过,可以正常启动PGNSS
         }
         
         // 在第3次检查后(30秒)发送重试指令
         if (check_count == 3 && !retry_sent) {
-            printf("No files found after 30s. Sending second download command...\n");
+            printf("No files found after 30s. Sending retry download command...\n");
             do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0);
             retry_sent = 1;
         }
@@ -811,6 +819,9 @@ static int pgnss_startup_check(void)
     // 60秒后还没有数据,降级为冷启动
     printf("ERROR: No AGNSS files downloaded after 60 seconds. Need cold start mode\n");
 
+    printf("Deinitializing GNSS HTTP server...\n");
+    uapi_gnss_http_server_deinit();
+    printf("GNSS HTTP server deinitialized successfully\n");
     
     return 1; // 检查失败,需要冷启动
 }
index 4b7b4b1..2c7f960 100644 (file)
@@ -60,6 +60,11 @@ static unsigned long g_app_send_queue= 0xFFFFFFFF;
 static app_task_definition_t send_taskcfg={0};
 static app_task_definition_t recv_taskcfg={0};
 
+// 线程状态管理
+static int g_gnss_http_server_initialized = 0;
+static osThreadId_t g_send_thread_id = NULL;
+static osThreadId_t g_recv_thread_id = NULL;
+
 
 static void cleanup_agnss_response_buffer(void);
 static void agnss_accumulate_data(const char *data, size_t len);
@@ -1770,38 +1775,69 @@ static void create_gnss_http_recv_queue(void)
     }
 }
 
-#define GNSS_HTTP_BOARD_TASK_SIZE   0x2000
+
 errcode_t uapi_gnss_http_server_init(void)
 {
     PRINT("uapi_gnss_http_server_init !\r\n");
 
+    // 检查是否已经初始化
+    if (g_gnss_http_server_initialized) {
+        PRINT("GNSS HTTP server already initialized\r\n");
+        return ERRCODE_SUCC;
+    }
+
+    // 配置发送线程
     send_taskcfg.create_queue_handle = create_gnss_http_send_queue;
     send_taskcfg.attr.name="gnss_http_server_send_task";
-    send_taskcfg.attr.priority = osPriorityNormal;
-    send_taskcfg.attr.stack_size = GNSS_HTTP_BOARD_TASK_SIZE;
+    send_taskcfg.attr.priority = osPriorityNormal1;
+    send_taskcfg.attr.stack_size = 0x1000;
     send_taskcfg.func = gnss_http_server_send_task;
     send_taskcfg.use_mem = USE_EXTEND_MEM;
     
-    errcode_t ret=uapi_create_osThread_custom(&send_taskcfg);
+    // 创建发送线程
+    errcode_t ret = uapi_create_osThread_custom(&send_taskcfg);
     if(ret != ERRCODE_SUCC)
     {
         PRINT("create gnss_send_service failed %d!\r\n",ret);
         return ERRCODE_FAIL;
     }
+    g_send_thread_id = send_taskcfg.task_handle;
+    PRINT("GNSS send thread created, ID: %p\r\n", g_send_thread_id);
 
+    // 配置接收线程
     recv_taskcfg.create_queue_handle = create_gnss_http_recv_queue;
     recv_taskcfg.attr.name="gnss_http_server_recv_task";
-    recv_taskcfg.attr.priority = osPriorityNormal1;
-    recv_taskcfg.attr.stack_size = GNSS_HTTP_BOARD_TASK_SIZE;
+    recv_taskcfg.attr.priority = osPriorityNormal;
+    recv_taskcfg.attr.stack_size = 0x2000;
     recv_taskcfg.func = gnss_http_server_recv_task;
     recv_taskcfg.use_mem = USE_EXTEND_MEM;
     
-    ret=uapi_create_osThread_custom(&recv_taskcfg);
+    // 创建接收线程
+    ret = uapi_create_osThread_custom(&recv_taskcfg);
     if(ret != ERRCODE_SUCC)
     {
         PRINT("create gnss_recv_service failed %d!\r\n",ret);
+        
+        // 创建接收线程失败,需要清理发送线程
+        if (g_send_thread_id != NULL) {
+            osThreadTerminate(g_send_thread_id);
+            g_send_thread_id = NULL;
+        }
+        
+        // 清理发送队列
+        if (g_app_send_queue != 0xFFFFFFFF) {
+            osal_msg_queue_delete(g_app_send_queue);
+            g_app_send_queue = 0xFFFFFFFF;
+        }
+        
         return ERRCODE_FAIL;
     }
+    g_recv_thread_id = recv_taskcfg.task_handle;
+    PRINT("GNSS recv thread created, ID: %p\r\n", g_recv_thread_id);
+
+    // 标记为已初始化
+    g_gnss_http_server_initialized = 1;
+    PRINT("GNSS HTTP server initialized successfully\r\n");
 
     return ERRCODE_SUCC;
 }
@@ -2203,3 +2239,111 @@ int gnss_start_agnss_download_simple(void)
     printf("=== Simple AGNSS Download Completed ===\n");
     return 0;
 }
+
+/**
+ * @brief GNSS HTTP服务去初始化函数
+ * @return ERRCODE_SUCC 成功,ERRCODE_FAIL 失败
+ */
+errcode_t uapi_gnss_http_server_deinit(void)
+{
+    PRINT("uapi_gnss_http_server_deinit !\r\n");
+
+    // 检查是否已经初始化
+    if (!g_gnss_http_server_initialized) {
+        PRINT("GNSS HTTP server not initialized\r\n");
+        return ERRCODE_SUCC;
+    }
+    int ret = 0;
+    // 清理全局状态
+    g_download_status = 0;
+    g_has_valid_json_data = 0;
+    g_processing_count = 0;
+    g_total_files = 0;
+    g_downloaded_files = 0;
+    
+    // 清理响应缓冲区
+    cleanup_agnss_response_buffer();
+
+    // 终止发送线程
+    if (g_send_thread_id != NULL) {
+        // PRINT("Terminating GNSS send thread: %p\r\n", g_send_thread_id);
+        ret = osThreadTerminate(g_send_thread_id);
+        if(!ret)
+        {
+            PRINT("Terminating GNSS send thread failed\r\n");
+        }
+        g_send_thread_id = NULL;
+    }
+
+    // 终止接收线程
+    if (g_recv_thread_id != NULL) {
+        // PRINT("Terminating GNSS recv thread: %p\r\n", g_recv_thread_id);
+        ret = osThreadTerminate(g_recv_thread_id);
+        if(!ret)
+        {
+            PRINT("Terminating GNSS recv thread failed\r\n");
+        }
+        g_recv_thread_id = NULL;
+    }
+
+    // 删除发送队列
+    if (g_app_send_queue != 0xFFFFFFFF) {
+        PRINT("Deleting GNSS send queue\r\n");
+        osal_msg_queue_delete(g_app_send_queue);
+        g_app_send_queue = 0xFFFFFFFF;
+    }
+
+    // 删除接收队列
+    if (g_app_recv_queue != 0xFFFFFFFF) {
+        PRINT("Deleting GNSS recv queue\r\n");
+        osal_msg_queue_delete(g_app_recv_queue);
+        g_app_recv_queue = 0xFFFFFFFF;
+    }
+
+    // 清理CAT1资源
+#ifdef SUPPORT_CAT1_SERVICE
+    cat1_api_remove_cat1_vote();
+    cat1_api_keep_wakeup(0);
+    cat1_api_wakeup_cat1(0);
+    cat1_api_disable_cat1_cmd(0);
+    PRINT("CAT1 resources cleaned up\r\n");
+#endif
+
+    // 重置任务配置结构体
+    memset(&send_taskcfg, 0, sizeof(send_taskcfg));
+    memset(&recv_taskcfg, 0, sizeof(recv_taskcfg));
+
+    // 标记为未初始化
+    g_gnss_http_server_initialized = 0;
+    
+    PRINT("GNSS HTTP server deinitialized successfully\r\n");
+    return ERRCODE_SUCC;
+}
+
+/**
+ * @brief 封装的AGNSS下载接口:初始化服务并开始下载
+ * @return ERRCODE_SUCC 成功启动下载,ERRCODE_FAIL 启动失败
+ * @note 此函数会自动初始化GNSS HTTP服务并发送下载命令
+ *       下载完成后需要调用 uapi_gnss_http_server_deinit() 清理资源
+ */
+errcode_t uapi_gnss_start_agnss_download(void)
+{
+    PRINT("uapi_gnss_start_agnss_download: Starting AGNSS download process\r\n");
+    
+    // 1. 初始化GNSS HTTP服务
+    PRINT("Initializing GNSS HTTP server...\r\n");
+    errcode_t init_ret = uapi_gnss_http_server_init();
+    if (init_ret != ERRCODE_SUCC) {
+        PRINT("ERROR: Failed to initialize GNSS HTTP server: %d\r\n", init_ret);
+        return ERRCODE_FAIL;
+    }
+    PRINT("GNSS HTTP server initialized successfully\r\n");
+    
+    // 2. 发送AGNSS下载命令
+    PRINT("Sending AGNSS download command...\r\n");
+    do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0);
+    PRINT("AGNSS download command sent successfully\r\n");
+    
+    PRINT("uapi_gnss_start_agnss_download: AGNSS download started successfully\r\n");
+    return ERRCODE_SUCC;
+}