/*\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
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
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
}\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
}\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
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
\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
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
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
#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
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("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
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
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