优化gps冷启动 2194/1 2194/head 2394/target/1
authorpenglei <1624952103@qq.com>
Mon, 1 Sep 2025 07:44:20 +0000 (15:44 +0800)
committerpenglei <1624952103@qq.com>
Mon, 1 Sep 2025 07:44:20 +0000 (15:44 +0800)
code/sdk/drivers/peripheral/config/include/ConfigModelC.h
code/sdk/drivers/peripheral/config/src/ConfigModel.cpp
code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.c
code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.h
code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.c

index f991cdf..1543a75 100644 (file)
@@ -150,6 +150,8 @@ int set_dev_id(char *buf);
 
 int get_dev_id(char *buf);
 
+bool cm_getisFirstTimeStart(void);
+
 
 #ifdef __cplusplus
 #if __cplusplus
index d6f1c4c..74e7e81 100644 (file)
@@ -1334,6 +1334,12 @@ void cm_sync_all_config_to_disk(void)
 }
 
 
+bool cm_getisFirstTimeStart(void)
+{
+   return OHOS::ConfigModel::GetInstance()->GetisFirstTimeStart();
+}
+
+
 void cm_initScreenBrightness(void)
 {
    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "cm_initScreenBrightness");
index 5d677d4..a8d47de 100644 (file)
@@ -1,9 +1,9 @@
 /*\r
- * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
- * Description: pgnss encode\r
- * Author:\r
- * Create:\r
- */\r
+* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+* Description: pgnss encode\r
+* Author:\r
+* Create:\r
+*/\r
 #include "pgnss_encode.h"\r
 #include <stdio.h>\r
 #include <dirent.h>\r
@@ -535,19 +535,20 @@ void PgnssSendGloEph(tiot_handle handle, const char *fileName, int32_t ts)
     free(buff);\r
 }\r
 \r
-void PgnssInjectAllEphLessFiles(tiot_handle handle, uint32_t ts)\r
+int32_t PgnssInjectAllEphLessFiles(tiot_handle handle, uint32_t ts)\r
 {\r
     char fileName[FILE_PATH_LEN] = {0};\r
     if (GetNonGloEphFileName(ts, fileName) == 0) {\r
         printf("\nerror: GetNonGloEphFileName failed\r\n");\r
-        return;\r
+        return 0;  // 返回失败状态\r
     }\r
     PgnssSendNonGloEph(handle, fileName);\r
     if (GetGloEphFileName(ts, fileName) == 0) {\r
         printf("\nerror: GetGloEphFileName failed\r\n");\r
-        return;\r
+        return 0;  // 返回失败状态\r
     }\r
     PgnssSendGloEph(handle, fileName, ts);\r
+    return 1;  // 返回成功状态\r
 }\r
 \r
 void PgnssSendOtherAssistInfo(tiot_handle handle, const char *fileName)\r
@@ -589,15 +590,24 @@ void PgnssSendOtherAssistInfo(tiot_handle handle, const char *fileName)
     free(buff);\r
 }\r
 \r
-void PgnssInjectOtherAssistLessFiles(tiot_handle handle)\r
+int32_t PgnssInjectOtherAssistLessFiles(tiot_handle handle)\r
 {\r
     PgnssSendOtherAssistInfo(handle, "/user/userdata/gnss/AssistInfo.dat");\r
+    return 1;  // 返回成功状态\r
 }\r
 \r
 // 注入PGNSS解析数据合并输出接口生成的星历文件\r
-void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts)\r
+int32_t PgnssInjectLessFiles(tiot_handle handle, uint32_t ts)\r
 {\r
     // 注入Pgnss辅助数据\r
-    PgnssInjectAllEphLessFiles(handle, ts);\r
-    PgnssInjectOtherAssistLessFiles(handle);\r
+    int32_t ephRet = PgnssInjectAllEphLessFiles(handle, ts);\r
+    int32_t assistRet = PgnssInjectOtherAssistLessFiles(handle);\r
+    \r
+    // 如果星历注入失败,返回失败状态\r
+    if (ephRet == 0) {\r
+        printf("PGNSS ephemeris injection failed\r\n");\r
+        return 0;\r
+    }\r
+    \r
+    return 1;  // 返回成功状态\r
 }
\ No newline at end of file
index a666edc..10c65ec 100644 (file)
@@ -1,3 +1,11 @@
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-07-11 16:41:59\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-09-01 15:37:36\r
+ * @FilePath: /FD230/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.h\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
 /*\r
  * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
  * Description: pgnss encode\r
@@ -12,5 +20,5 @@
 \r
 int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts);\r
 void PgnssInject(tiot_handle handle, uint32_t ts);\r
-void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts);\r
+int32_t PgnssInjectLessFiles(tiot_handle handle, uint32_t ts);\r
 #endif
\ No newline at end of file
index 7a28b97..ad76147 100644 (file)
@@ -1,11 +1,15 @@
 /*\r
- * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
- * Description: pgnss sample\r
- * Author:\r
- * Create:\r
- */\r
+* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved.\r
+* Description: pgnss sample\r
+* Author:\r
+* Create:\r
+*/\r
 #include "pgnss_sample.h"\r
 #include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
 #include "securec.h"\r
 #include "tiot_service_interface.h"\r
 #include "pm_definition.h"\r
 #include "sys/time.h"\r
 #include "time.h"\r
 #include "gnss_ctl.h"\r
-#ifdef SUPPORT_CYWEE_SERVICE\r
-#include "cywee_service.h"\r
-#endif\r
-#include "uart_porting.h"\r
+#include "custom_runtime.h"\r
+#include "los_base.h"\r
+#include "ConfigModelC.h"\r
+// #include "gnss_sample.h"\r
 \r
 #define PGNSS_FIXMODEALL_NMEADEF_SAMPLE            0\r
 #define PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE 0\r
@@ -47,6 +51,9 @@ static gps_data_t g_global_gpsData={0};
 static int g_is_pgnss_poweron=0;\r
 static int g_is_pgnss_logon=0;\r
 static int g_pgnss_stopflag=0;\r
+static int g_cold_start_pgnss_stopflag = 0;\r
+\r
+static char *pgnss_log = NULL;\r
 \r
 static int32_t QryVersion(tiot_handle handle)\r
 {\r
@@ -73,10 +80,6 @@ static int decode_nmea(char c)
             memcpy_s(&g_global_gpsData,sizeof(gps_data_t),&(g_nmeadata.gpsData),sizeof(gps_data_t));\r
             ret = 1;\r
             memset(&g_nmeadata,0,sizeof(g_nmeadata));\r
-#ifdef SUPPORT_CYWEE_SERVICE\r
-            if(uapi_dev_runtime_get_train_status())\r
-                do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GNSS_UPDATE,NULL);\r
-#endif\r
         }\r
     } \r
 \r
@@ -89,55 +92,66 @@ gps_data_t * getPGPSGlobaldata(void)
 }\r
 \r
 \r
-// 注入PGNSS,使用默认配置启动\r
-int32_t InjectPgnssCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle)\r
-{\r
-    const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03};\r
+// 添加普通GNSS冷启动配置函数的声明和实现\r
+// 从gnss_sample.c中复制冷启动相关的命令定义\r
 \r
-    // 配置log级别:info级别。\r
-    int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo));\r
+// 函数声明\r
+void PGnssServerStartColdStart(void);\r
+const uint8_t cfgColdStartCmd[] = {0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01};\r
+const uint8_t cfgFixModeAllCmd[] = {0x03, 0x00, 0x23, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x00};\r
+const uint8_t cfgNmeaAllCmd[] = {0x03, 0x00, 0x04, 0x01, 0x00, 0x00, 0x06, 0x00, 0x03, 0x00, 0x02, 0x00, 0xff, 0x00};\r
+const uint8_t CFG_TRK_LPW_DISABLE[] = {0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00};\r
+const uint8_t CFG_ACQ_LPW_DISABLE[] = {0x03, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00};\r
+const uint8_t CFG_ANTIJAM_ENABLE[] = {0x03, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00};\r
+\r
+// 普通GNSS冷启动配置函数实现\r
+int32_t CfgColdStartFixModeGpsNmeaAll(tiot_handle handle)\r
+{\r
+    // 配置启动模式:冷启动模式\r
+    int32_t ret = tiot_service_write(handle, cfgColdStartCmd, sizeof(cfgColdStartCmd));\r
     if (ret < 0) {\r
-        printf("\nerror: cfgLogLevelInfo error: %d\r\n", ret);\r
+        printf("\nerror: cfgColdStartCmd error: %d\r\n", ret);\r
         return 0;\r
     }\r
 \r
-    // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间\r
-    GnssUtcTime utcTime = {2024, 2, 26, 6, 0, 0, 0, 1}; // 需要用当前的UTC时间替换\r
-\r
-    time_t rawtime;\r
-    struct tm* timeinfo;\r
-\r
-    time(&rawtime);          // 获取UTC时间戳\r
-    timeinfo = gmtime(&rawtime);  // 转换为UTC时间(无时区偏移)\r
-\r
-    utcTime.year = timeinfo->tm_year + 1900;\r
-    utcTime.month = timeinfo->tm_mon + 1;\r
-    utcTime.day = timeinfo->tm_mday;\r
-    utcTime.hour = timeinfo->tm_hour;\r
-    utcTime.minute = timeinfo->tm_min;\r
-    utcTime.second = timeinfo->tm_sec;\r
+    // 配置使能的GNSS星座:GPS\r
+    ret = tiot_service_write(handle, cfgFixModeAllCmd, sizeof(cfgFixModeAllCmd));\r
+    if (ret < 0) {\r
+        printf("\nerror: cfgFixModeAllCmd error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
 \r
-    printf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n",\r
-    utcTime.year,utcTime.month,utcTime.day,\r
-    utcTime.hour,utcTime.minute,utcTime.second);\r
+    // 配置上报NMEA类型:PNT/ZDA/VTG/RMC/GSV/GSA/GLL/GGA\r
+    ret = tiot_service_write(handle, cfgNmeaAllCmd, sizeof(cfgNmeaAllCmd));\r
+    if (ret < 0) {\r
+        printf("\nerror: cfgNmeaAllCmd error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
 \r
-    uint32_t ts = 0;\r
-    ret = PgnssInjectUtcTime(handle, &utcTime, &ts);\r
-    if (ret == 0) {\r
-        printf("\nerror: PgnssInjectUtcTime failed!\r\n");\r
+    ret = tiot_service_write(handle, CFG_TRK_LPW_DISABLE, sizeof(CFG_TRK_LPW_DISABLE));\r
+    if (ret < 0) {\r
+        printf("\nerror: CFG_TRK_LPW_DISABLE error: %d\r\n", ret);\r
         return 0;\r
     }\r
-    printf("\nPgnssInjectUtcTime success!\r\n");\r
 \r
-    // PGNSS注入\r
-    // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换\r
-    PgnssInject(handle, ts);\r
+    ret = tiot_service_write(handle, CFG_ACQ_LPW_DISABLE, sizeof(CFG_ACQ_LPW_DISABLE));\r
+    if (ret < 0) {\r
+        printf("\nerror: CFG_ACQ_LPW_DISABLE error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
 \r
+    ret = tiot_service_write(handle, CFG_ANTIJAM_ENABLE, sizeof(CFG_ANTIJAM_ENABLE));\r
+    if (ret < 0) {\r
+        printf("\nerror: CFG_ANTIJAM_ENABLE error: %d\r\n", ret);\r
+        return 0;\r
+    }\r
+    \r
+    printf("Cold start mode configured successfully\r\n");\r
     return 1;\r
 }\r
 \r
-// 注入PGNSS,使用默认配置启动\r
-int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle)\r
+// 修改后的PGNSS配置函数,支持降级到普通GNSS\r
+int32_t InjectPgnssWithFallbackToColdStart(tiot_handle handle)\r
 {\r
     const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03};\r
 \r
@@ -149,7 +163,7 @@ int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle
     }\r
 \r
     // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间\r
-    GnssUtcTime utcTime = {2024, 3, 14, 12, 0, 0, 0, 1}; // 需要用当前的UTC时间替换\r
+    GnssUtcTime utcTime = {2024, 2, 26, 6, 0, 0, 0, 1}; // 需要用当前的UTC时间替换\r
 \r
     time_t rawtime;\r
     struct tm* timeinfo;\r
@@ -168,7 +182,6 @@ int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle
     utcTime.year,utcTime.month,utcTime.day,\r
     utcTime.hour,utcTime.minute,utcTime.second);\r
 \r
-\r
     uint32_t ts = 0;\r
     ret = PgnssInjectUtcTime(handle, &utcTime, &ts);\r
     if (ret == 0) {\r
@@ -179,11 +192,35 @@ int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle
 \r
     // PGNSS注入\r
     // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换\r
-    PgnssInjectLessFiles(handle, ts);\r
+    int32_t injectRet = PgnssInjectLessFiles(handle, ts);\r
+    if (injectRet == 0) {\r
+        // PGNSS注入失败,设置停止标志并重新启动\r
+        printf("PGNSS injection failed, restarting with cold start mode\r\n");\r
+        // if(uapi_dev_runtime_get_cat1_powerstat())\r
+        // {\r
+\r
+        // }\r
+        // else\r
+        // {           \r
+            // 设置停止标志\r
+            g_cold_start_pgnss_stopflag = 1;\r
+        // }\r
+\r
+        return 0; // 返回0表示需要重新启动\r
+    }\r
 \r
+    printf("PGNSS injection completed successfully\r\n");\r
     return 1;\r
 }\r
 \r
+\r
+// 注入PGNSS,使用默认配置启动\r
+int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle)\r
+{\r
+    // 调用新的带降级功能的函数\r
+    return InjectPgnssWithFallbackToColdStart(handle);\r
+}\r
+\r
 static const GnssSamplesCfgTable g_gnssSamplesCfg[] = {\r
     // {PGNSS_FIXMODEALL_NMEADEF_SAMPLE,            InjectPgnssCfgAutoStartFixModeAndNmeaDefault},\r
     {PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault}\r
@@ -246,6 +283,18 @@ static void ListenGnssData(tiot_handle handle)
                     if (decode_nmea(pbuf[index])==1)\r
                     {\r
                         // dump_location_data(&g_global_gpsData);\r
+                        char temp_buf[512];\r
+                        dump_location_data_to_buf(&g_global_gpsData, temp_buf, sizeof(temp_buf));\r
+                        \r
+                        // 追加到pgnss_log中\r
+                        if (pgnss_log != NULL) {\r
+                            int current_len = strlen(pgnss_log);\r
+                            int data_len = strlen(temp_buf);\r
+                            if (current_len + data_len < 2047) {  // 留1字节给字符串结束符\r
+                                snprintf(pgnss_log + current_len, 2048 - current_len, "%s", temp_buf);\r
+                            }\r
+                        }\r
+                        \r
                         printf("decode_nmea done\r\n");\r
                     }\r
                 }\r
@@ -281,13 +330,161 @@ int PGnssLogEnable(bool enable)
     return g_is_pgnss_logon;\r
 }\r
 \r
+// 直接启动冷启动模式的函数\r
+void PGnssServerStartColdStart(void)\r
+{\r
+    printf("\nenter cold start mode\r\n");\r
+    \r
+    if (pgnss_log == NULL) \r
+    {\r
+        pgnss_log = (char *)malloc(2048);\r
+        if (pgnss_log == NULL) {\r
+            printf("error: malloc pgnss_log failed!\n");\r
+            return;\r
+        }\r
+        memset(pgnss_log, 0, 2048);\r
+    }\r
+\r
+    uapi_pm_add_sleep_veto(PM_ID_SYS);\r
+\r
+    #ifdef DOWNLOAD_GNSS_SWITCH\r
+    download_gnss_switch(SWITCH_TO_GNSS);\r
+    #endif\r
+    g_is_pgnss_poweron = 1;\r
+    g_pgnss_stopflag = 0;\r
+    g_cold_start_pgnss_stopflag = 0;\r
+    sw_debug_uart_deinit();\r
+    \r
+    // Step1: init\r
+    int32_t ret = tiot_service_init();\r
+    if (ret != 0) {\r
+        printf("tiot service init fail\r\n");\r
+        g_is_pgnss_poweron = 0;\r
+        g_pgnss_stopflag = 1;\r
+        if (pgnss_log != NULL) {\r
+            free(pgnss_log);\r
+            pgnss_log = NULL;\r
+        }\r
+        return;\r
+    }\r
+\r
+    // 打开日志文件\r
+    if (g_is_pgnss_logon)\r
+    {\r
+        g_gnssLogFp = fopen("/user/log/gnss.log", "w");\r
+        if (g_gnssLogFp == NULL) {\r
+            printf("error: open log file error\n");\r
+            if (pgnss_log != NULL) {\r
+                free(pgnss_log);\r
+                pgnss_log = NULL;\r
+            }\r
+            return;\r
+        }\r
+    }\r
+    printf("before open tiot service for cold start\n");\r
+\r
+    // Step2: power on gnss\r
+    tiot_handle handle = tiot_service_open("gn71", NULL);\r
+    if (handle == 0) {\r
+        printf("open tiot service fail\r\n");\r
+        g_is_pgnss_poweron = 0;\r
+        g_pgnss_stopflag = 1;\r
+        if (pgnss_log != NULL) {\r
+            free(pgnss_log);\r
+            pgnss_log = NULL;\r
+        }\r
+        return;\r
+    }\r
+    printf("open tiot service success for cold start\n");\r
+\r
+    // 直接配置为冷启动模式\r
+    printf("Configuring cold start mode...\r\n");\r
+    int32_t cfgRet = CfgColdStartFixModeGpsNmeaAll(handle);\r
+    if (cfgRet == 0) {\r
+        printf("Cold start configuration failed\r\n");\r
+        tiot_service_close(handle);\r
+        return;\r
+    }\r
+    printf("Cold start mode configured successfully\r\n");\r
+    \r
+    QryVersion(handle);\r
+\r
+    // Step4: start gnss\r
+    if (StartGnss(handle) == 0) {\r
+        printf("Start GNSS failed\r\n");\r
+        tiot_service_close(handle);\r
+        return;\r
+    }\r
+    \r
+    // Step5: listening gnss data\r
+    ListenGnssData(handle);\r
+    \r
+    // Step6: stop gnss\r
+    if (StopGnss(handle) == 0) {\r
+        printf("Stop GNSS failed\r\n");\r
+    }\r
+    \r
+    // Step7: power off gnss\r
+    tiot_service_close(handle);\r
+    \r
+    // 关日志文件\r
+    if (g_is_pgnss_logon)\r
+    {\r
+        fclose(g_gnssLogFp);\r
+        g_gnssLogFp = NULL;\r
+    }\r
+    \r
+    // Step8: deinit\r
+    tiot_service_deinit();\r
+\r
+    #ifdef DOWNLOAD_GNSS_SWITCH\r
+    download_gnss_switch(SWITCH_TO_DOWNLOAD);\r
+    #endif\r
+    uapi_pm_remove_sleep_veto(PM_ID_SYS);\r
+\r
+    g_is_pgnss_poweron = 0;\r
+    sw_debug_uart_deinit();\r
+    uart_config_init();\r
+    printf("finish cold start mode\r\n");\r
+    \r
+    printf("gnss_log: %s\r\n", pgnss_log);\r
+    // 释放pgnss_log内存\r
+    if (pgnss_log != NULL) {\r
+        free(pgnss_log);\r
+        pgnss_log = NULL;\r
+    }\r
+}\r
+\r
 \r
 void PGnssServerStart(void)\r
 {\r
+    //未绑定直接冷启动\r
+    if(cm_getisFirstTimeStart())\r
+    {\r
+        printf("PGnssServerStartColdStart \n");\r
+        PGnssServerStartColdStart();\r
+        return;\r
+    }\r
+\r
     printf("\nenter gnss samples\r\n");\r
+    \r
+    if (pgnss_log == NULL) \r
+    {\r
+        pgnss_log = (char *)malloc(2048);\r
+        if (pgnss_log == NULL) {\r
+            printf("error: malloc pgnss_log failed!\n");\r
+            return;\r
+        }\r
+        memset(pgnss_log, 0, 2048);\r
+    }\r
+\r
     if(g_is_pgnss_poweron == 1)\r
     {\r
         printf("gnss already on\r\n");\r
+        if (pgnss_log != NULL) {\r
+            free(pgnss_log);\r
+            pgnss_log = NULL;\r
+        }\r
         return ;\r
     }\r
     uapi_pm_add_sleep_veto(PM_ID_SYS);\r
@@ -297,16 +494,19 @@ void PGnssServerStart(void)
     #endif\r
     g_is_pgnss_poweron = 1;\r
     g_pgnss_stopflag = 0;\r
-\r
+    g_cold_start_pgnss_stopflag = 0;\r
     sw_debug_uart_deinit();\r
-    // uart_config_init();\r
-\r
     // Step1: init\r
     int32_t ret = tiot_service_init();\r
     if (ret != 0) {\r
         printf("tiot service init fail\r\n");\r
         g_is_pgnss_poweron = 0;\r
         g_pgnss_stopflag = 1;\r
+        if (pgnss_log != NULL) {\r
+            free(pgnss_log);\r
+            pgnss_log = NULL;\r
+        }\r
+        return;\r
     }\r
 \r
     // 打开日志文件\r
@@ -315,6 +515,10 @@ void PGnssServerStart(void)
         g_gnssLogFp = fopen("/user/log/gnss.log", "w");\r
         if (g_gnssLogFp == NULL) {\r
             printf("error: open log file error\n");\r
+            if (pgnss_log != NULL) {\r
+                free(pgnss_log);\r
+                pgnss_log = NULL;\r
+            }\r
             return;\r
         }\r
     }\r
@@ -326,6 +530,11 @@ void PGnssServerStart(void)
         printf("open tiot service fail\r\n");\r
         g_is_pgnss_poweron = 0;\r
         g_pgnss_stopflag = 1;\r
+        g_cold_start_pgnss_stopflag = 1;\r
+        if (pgnss_log != NULL) {\r
+            free(pgnss_log);\r
+            pgnss_log = NULL;\r
+        }\r
         return;\r
     }\r
     printf("open tiot service success\r\n");\r
@@ -340,7 +549,8 @@ void PGnssServerStart(void)
                 cfgRet = g_gnssSamplesCfg[i].cfgHandle(handle);\r
             }\r
             if (cfgRet == 0) {\r
-                continue;\r
+                // continue;\r
+                break;\r
             }\r
             printf("cfg sample id:%u\r\n", g_gnssSamplesCfg[i].sampleId);\r
             QryVersion(handle);\r
@@ -373,8 +583,22 @@ void PGnssServerStart(void)
     download_gnss_switch(SWITCH_TO_DOWNLOAD);\r
     #endif\r
     uapi_pm_remove_sleep_veto(PM_ID_SYS);\r
-    g_is_pgnss_poweron=0;\r
+    if(!g_cold_start_pgnss_stopflag)\r
+        g_is_pgnss_poweron = 0;\r
     sw_debug_uart_deinit();\r
     uart_config_init();\r
     printf("finish gnss samples\r\n");\r
+    \r
+    printf("pgnss_log: %s\r\n", pgnss_log);\r
+    // 释放pgnss_log内存\r
+    if (pgnss_log != NULL) {\r
+        free(pgnss_log);\r
+        pgnss_log = NULL;\r
+    }\r
+    if(g_cold_start_pgnss_stopflag == 1)\r
+    {\r
+        // GnssServerStart();\r
+        PGnssServerStartColdStart();\r
+    }\r
+\r
 }\r