优化GPS 3319/1 3319/head 3320/target/1
authorCaisking <Casiking@zhihuishixun.com>
Mon, 30 Mar 2026 12:57:15 +0000 (20:57 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Mon, 30 Mar 2026 12:57:15 +0000 (20:57 +0800)
code/sdk/zhihui/services/gnss/inc/uart_gnss.h
code/sdk/zhihui/services/gnss/src/gnss_ctl.c
code/sdk/zhihui/services/gnss/src/uart_gnss.c

index 29c26f7..1528f38 100644 (file)
@@ -32,7 +32,7 @@ typedef enum
     GNSS_CMD_MAX
 } gnss_cfg_cmd_type_t;
 
-void do_gnss_cmd(int cmd,uint8_t *buffer,uint32_t size);
+int32_t do_gnss_cmd(int cmd,uint8_t *buffer,uint32_t size);
 
 void gnss_receive_handler(uint8_t *buffer, int32_t size);
 
index 1c3a432..93e3a0e 100644 (file)
@@ -123,16 +123,20 @@ errcode_t gnss_start(void)
 {
     // do_gnss_cmd(GNSS_CMD_WRITEDATA,g_cfg_all_nmea_cmd,sizeof(g_cfg_all_nmea_cmd)); 
     uint8_t cmd = GNSS_CMD_START;
-    do_gnss_cmd(GNSS_CMD_WRITEDATA, &cmd,1);
+    int32_t ret = do_gnss_cmd(GNSS_CMD_WRITEDATA, &cmd, 1);
+    if (ret != ERRCODE_SUCC) {
+        PRINT("gnss_start queue cmd failed, ret %d\n", ret);
+        return ret;
+    }
     g_gnss_status = 1;
-    return 0;
+    return ERRCODE_SUCC;
 }
 
 errcode_t gnss_stop(void)
 {
     // uint8_t cmd = GNSS_CMD_STOP;
     // do_gnss_cmd(GNSS_CMD_WRITEDATA, &cmd,1);
-    // g_gnss_status = 0;
+    g_gnss_status = 0;
     // GnssServerStop();
     PGnssServerStop();
     return 0;
index 327d6df..24a54df 100644 (file)
@@ -75,14 +75,14 @@ void do_gnss_cmd_head(int cmd,uint8_t *buffer,uint32_t size)
     }
     
 }
-void do_gnss_cmd(int cmd,uint8_t *buffer,uint32_t size)
+int32_t do_gnss_cmd(int cmd,uint8_t *buffer,uint32_t size)
 {
     int ret;
 
     if (buffer == NULL || size == 0 ) 
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"input buffer is NULL or size == 0"NEWLINE );
-        return ;
+        return ERRCODE_FAIL;
     }
     gnss_cmd_t mail = {0};
     if(cmd == GNSS_CMD_READDATA)
@@ -90,7 +90,7 @@ void do_gnss_cmd(int cmd,uint8_t *buffer,uint32_t size)
         mail.buffer = osal_kmalloc(size+1, OSAL_GFP_KERNEL);
         if (mail.buffer == NULL) {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"uart message buffer memory alloc fail, length is %d "NEWLINE, size);
-            return;
+            return ERRCODE_FAIL;
         }
         memset_s(mail.buffer,size+1,0,size+1);
         memcpy_s(mail.buffer,MAX_BUFFER_SIZE,buffer,size);
@@ -107,8 +107,13 @@ void do_gnss_cmd(int cmd,uint8_t *buffer,uint32_t size)
                                     sizeof(gnss_cmd_t), 0);
     if (ret != OSAL_SUCCESS) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"Error gnss cmd msg %d send failed! err=0x%02X!"NEWLINE,cmd, ret);
+        if ((cmd == GNSS_CMD_READDATA) && (mail.buffer != NULL)) {
+            osal_kfree(mail.buffer);
+            mail.buffer = NULL;
+        }
+        return ret;
     }
-    
+    return ERRCODE_SUCC;
 }
 
 uint32_t gnss_write_cmd(uint8_t * cmdbuf,uint16_t cmdlen)
@@ -189,7 +194,12 @@ static void uart_event_task(void const *arg)
                 case GNSS_CMD_START:
                     // gnss_get_start_cmd(&buf,&len);
                     // GnssServerStart();
-                    PGnssServerStart();
+                    if (is_gnss_on()) {
+                        PGnssServerStart();
+                    } else {
+                        WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,
+                                      "drop stale GNSS_CMD_START because gnss_status=0\r\n");
+                    }
                     last_cfg_cmd_index = 0xFF; //last_cfg_cmd_index=0xFF 代表cfg结束写入,开始检测其他指令
                     handled_no_uart_write = true;
                 break;
@@ -214,8 +224,7 @@ static void uart_event_task(void const *arg)
                 WEARABLE_LOGW(WEARABLE_LOG_MODULE_MAIN_SERVICE,"GNSS_CMD_WRITEDATA cmdtype %d failed \r\n",mail.cmd_type);
             }
         }
-        if(mail.cmd == GNSS_CMD_READDATA)
-        {
+        if ((mail.cmd == GNSS_CMD_READDATA) && (mail.buffer != NULL)) {
             osal_kfree(mail.buffer); //只有接收的缓存需要free,发送的都是静态数组,无需申请缓存
             mail.buffer = NULL;
         }
@@ -227,7 +236,7 @@ void gnss_receive_handler(uint8_t *buffer, int32_t size)
        // WEARABLE_LOGD(WEARABLE_LOG_MODULE_MAIN_SERVICE,"gnss_receive_handler %d \n",size);
     if (g_gnss_cmd_queue!= 0xFFFFFFFF)
     {
-        do_gnss_cmd(GNSS_CMD_READDATA,buffer,size);
+        (void)do_gnss_cmd(GNSS_CMD_READDATA,buffer,size);
     }  
 }