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;
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;
}
// 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; // 检查失败,需要冷启动
}
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);
}
}
-#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;
}
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;
+}