From: penglei <1624952103@qq.com> Date: Mon, 21 Jul 2025 07:15:59 +0000 (+0800) Subject: 优化PGNSS数据注入 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=45655f794d9a54538fe48235f7e5e12bcd0d7360;p=mirrors%2FFD230.git 优化PGNSS数据注入 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/producttest/include/testGPS.h b/code/sdk/application/wearable/fd230app/nativeui/producttest/include/testGPS.h index 382013c52..95ad12d04 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/producttest/include/testGPS.h +++ b/code/sdk/application/wearable/fd230app/nativeui/producttest/include/testGPS.h @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2025-06-06 15:56:46 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-06-06 15:57:04 + * @LastEditTime: 2025-07-21 14:07:39 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/producttest/include/testGPS.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -77,6 +77,7 @@ namespace OHOS UILabel *InitLabel(LabelConfig &labelConfig); bool testGPSScrollViewcrollViewinit(uint8_t); UIScrollView *testGPSScrollView{nullptr}; + UIImageView *tempImage{nullptr}; UILabel *label_1_GPS_MSG=NULL; UILabel *label_1_GPS_on_or_off{nullptr}; UILabelButtonExt* GPSbutton[2]{nullptr}; diff --git a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testGPS.cpp b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testGPS.cpp index 4341286c2..3813dcede 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testGPS.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/producttest/src/testGPS.cpp @@ -8,11 +8,12 @@ #if defined(SUPPORT_GNSS) #include "NMEA0183.h" +#include "pgnss_sample.h" // code/sdk/zhihui/services/gnss/inc/.h #include "producttest/include/testView.h" #include "producttest/include/testGPS.h" -#include "gnss_sample.h" +// #include "gnss_sample.h" #include "graphic_service.h" namespace OHOS { @@ -85,6 +86,11 @@ namespace OHOS GPSbutton[1]=nullptr; } + if(tempImage) + { + delete tempImage; + tempImage = nullptr; + } delete testGPSScrollView; @@ -142,7 +148,7 @@ namespace OHOS { if (label_1_GPS_MSG != nullptr) { - gps_data_t * gpsdata=getGPSGlobaldata(); + gps_data_t * gpsdata=getPGPSGlobaldata(); gps_data_t gpsd={0}; if (gpsdata->last_gps_time_ms>0) { @@ -152,7 +158,7 @@ namespace OHOS dump_location_data_to_buf(&gpsd,msgtmp,sizeof(msgtmp)); label_1_GPS_MSG->SetText(msgtmp); - if (getGnssServerStat()==1) + if (getPGnssServerStat()==1) { label_1_GPS_on_or_off->SetText("GPS开"); }else{ @@ -181,6 +187,7 @@ namespace OHOS testGPSScrollView->SetStyle(STYLE_BORDER_RADIUS, 0); testGPSScrollView->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); testGPSScrollView->SetStyle(STYLE_BORDER_COLOR, Color::Yellow().blue); + testGPSScrollView->SetScrollBlankSize(75); LabelConfig Config = { .left = 50, @@ -266,6 +273,20 @@ namespace OHOS testGPSScrollView->Add(Title); + if (tempImage == nullptr) + { + tempImage = new UIImageView(); + if (tempImage == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "tempImage can not be nullptr!"); + return false; + } + } + tempImage->SetPosition(193, GPSbutton[0]->GetY()+GPSbutton[0]->GetHeight() + 60, 40, 40); + testGPSScrollView->Add(tempImage); + + + testGPSScrollView->SetTouchable(true); testGPSScrollView->SetDraggable(true); uint32_t tick; diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp index fdcfced2f..b7ac223f4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp @@ -58,7 +58,7 @@ #if defined(SUPPORT_GNSS) #include "NMEA0183.h" #include "gnss_ctl.h" -#include "gnss_sample.h" +#include "pgnss_sample.h" #include "graphic_service.h" gps_data_t send_gps_data = {0}; #endif @@ -204,7 +204,7 @@ static void Training_Notify(void *args, const Topic topic, Request *request) { #endif #if defined(SUPPORT_GNSS) //训练GPS - gps_data_t *gps_data = getGPSGlobaldata(); + gps_data_t *gps_data = getPGPSGlobaldata(); if (gps_data == NULL) { PRINT("gps_data == NULL \n"); return; @@ -3046,7 +3046,7 @@ static void Traing_TimerCallbackProc(int data) { // return; } #if defined(SUPPORT_GNSS) - gps_data_t *gps_data = getGPSGlobaldata(); + gps_data_t *gps_data = getPGPSGlobaldata(); if (gps_data == NULL) { PRINT("gps_data == NULL \n"); return; diff --git a/code/sdk/drivers/peripheral/gnss/CMakeLists.txt b/code/sdk/drivers/peripheral/gnss/CMakeLists.txt index 85161725c..52c7e1893 100644 --- a/code/sdk/drivers/peripheral/gnss/CMakeLists.txt +++ b/code/sdk/drivers/peripheral/gnss/CMakeLists.txt @@ -73,4 +73,5 @@ build_component() -add_subdirectory(sample/gnss_sample) +# add_subdirectory(sample/gnss_sample) +add_subdirectory(sample/pgnss_sample) \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/gnss/inc/NMEA0183.h b/code/sdk/drivers/peripheral/gnss/inc/NMEA0183.h index ba7690ca7..831baecc9 100644 --- a/code/sdk/drivers/peripheral/gnss/inc/NMEA0183.h +++ b/code/sdk/drivers/peripheral/gnss/inc/NMEA0183.h @@ -258,6 +258,7 @@ char* get_gps_sentence_type_str(sentence_types sentencetype); void dump_location_data(gps_data_t *locationdata); void dump_location_data_to_buf(gps_data_t *locationdata,char* buf,int max_buflen); gps_data_t * getGPSGlobaldata(void); +gps_data_t * getPGPSGlobaldata(void); void dump_location_data_to_factory(gps_data_t *locationdata,char* buf,int max_buflen); diff --git a/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/CMakeLists.txt b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/CMakeLists.txt new file mode 100644 index 000000000..2e4b6034d --- /dev/null +++ b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/CMakeLists.txt @@ -0,0 +1,42 @@ +#=============================================================================== +# @brief cmake make file +# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. +#=============================================================================== +set(COMPONENT_NAME "pgnss_sample") + +set(SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/pgnss_sample.c + ${CMAKE_CURRENT_SOURCE_DIR}/pgnss_encode.c +) + +set(PRIVATE_HEADER + ${TIOT_HEADER_LIST} +) + +set(PUBLIC_HEADER + ${CMAKE_CURRENT_SOURCE_DIR} +) + +set(PRIVATE_DEFINES +) + +set(PUBLIC_DEFINES +CONFIG_PGNSS_SAMPLE +) + +set(COMPONENT_CCFLAGS + -Wno-implicit-function-declaration +) + +set(WHOLE_LINK +true +) + +set(BUILD_AS_OBJ +false +) + +set(MAIN_COMPONENT +false +) +build_component() diff --git a/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/gnss_datatypes.h b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/gnss_datatypes.h new file mode 100644 index 000000000..4d4a9a3b1 --- /dev/null +++ b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/gnss_datatypes.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: gnss datatypes + * Author: + * Create: + */ +#ifndef GNSS_DATATYPES_H +#define GNSS_DATATYPES_H + +#include + +#define MSG_CONTENT_IDX 2 +#define LISTEN_TIME_THR 1000 +#define REPORT_MAX_BYTES 10000 + +// 消息类型 +typedef enum { + CMD_INJECT_HIS_INFO = 0x0101, // 历史信息注入 + CMD_PGNSS_INJECT_REF_GPS_TIME = 0x0201, // GPS时间注入 + CMD_PGNSS_INJECT_REF_LOC = 0x0202, // 参考位置注入 + CMD_PGNSS_INJECT_EPH_GPS = 0x0203, // GPS星历注入 + CMD_PGNSS_INJECT_EPH_GANSS = 0x0204, // 非GPS星历注入 + CMD_PGNSS_INJECT_UTC_GPS = 0x0205, // GPS UTC注入 + CMD_PGNSS_INJECT_RTI_GPS = 0x0206, // GPS完好性信息注入 + CMD_PGNSS_INJECT_RTI_GANSS = 0x0207, // 非GPS完好性信息注入 + CMD_PGNSS_INJECT_ION_GPS = 0x0208, // GPS电离层参数注入 + CMD_PGNSS_INJECT_AUX_GANSS = 0x0209, // 非GPS频点转换关系信息注入 + CMD_XGNSS_INJECT_UTC_TIME = 0x0404, // 最开始注入的UTC时间 + CMD_BUTT, +} GnssCmdType; + +#pragma pack(1) +typedef struct { + uint16_t cmd; // 消息类型 + uint16_t checkSum; // 校验和,只计算实际数据部分,不包含头 + uint16_t sequence; // 序列号,host下发 + uint16_t dataLength; // 数据长度,实际数据的长度,不包含头 + uint8_t data[0]; +} GnssMsg; + +typedef struct { + uint16_t year; // YYYY + uint8_t month; // MM, 1~12 + uint8_t day; // DD, 1~31 + uint8_t hour; // hh, 0~23 + uint8_t minute; // mm, 0~59 + uint8_t second; // ss, 0~59 + uint16_t ms; // ms, 0~999 + uint8_t valid; // 0: invalid, 1: valid +} GnssUtcTime; + +typedef struct { + uint32_t time; // eph reference time + uint16_t cmd; // cmd type to injected eph + uint32_t len; // actual length of injected eph +} EphHeadInfo; + +typedef struct { + uint16_t cmd; // cmd type to injected other assist info + uint32_t len; // actual length of injected other assist info +} OtherAssistHeadInfo; + +#pragma pack() + +#endif \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.c b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.c new file mode 100644 index 000000000..a205bc4b1 --- /dev/null +++ b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.c @@ -0,0 +1,603 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss encode + * Author: + * Create: + */ +#include "pgnss_encode.h" +#include +#include +#include +#include "securec.h" +#include "tiot_service_interface.h" +#include "gnss_datatypes.h" +#include "cywee_hal.h" + +#define GNSS_ENCODE_BUFF_MAX_LEN 9300 +#define FILE_PATH_LEN 1024 +#define GLO_EPH_VALID_TIME 900 +#define OTHER_EPH_VALID_TIME 7200 +#define ONE_CENTURY_YEARS 100 +#define FOUR_CENTURY_YEARS 400 +#define LEAP_YEAR_LENGTH 4 +#define UNIX_TIME_START_YEAR 1970 // start year of unix time +#define TIME_UNIT 1000 +#define SECONDS_PER_MIN (60) +#define SECONDS_PER_HOUR (60 * SECONDS_PER_MIN) +#define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR) +#define SECONDS_PER_NORMAL_YEAR (365 * SECONDS_PER_DAY) +#define NON_GLO_GNSS_TYPES 4 +#define GLO_EPH_NUM_ONE_FILE 8 +#define OTHER_ASSIST_TYPES 7 +#define INJECT_SLEEP_MS_TIME 500 +#define PGNSS_FILE_MAX_SIZE 1024000 + +/** days per month on normal and leap year */ +int32_t g_normMonthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +int32_t g_leapMonthDays[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +// 监听消息 +static uint8_t g_ackBuff[REPORT_MAX_BYTES] = { 0 }; + +/* 获取begin和end年份之间的闰年数 */ +int32_t GetLeapYearNum(uint16_t begin, uint16_t end) +{ + if (end <= begin || end < 1) { + return 0; + } + int32_t numPer400Year = (end - 1) / FOUR_CENTURY_YEARS - begin / FOUR_CENTURY_YEARS; + int32_t numPer100Year = (end - 1) / ONE_CENTURY_YEARS - begin / ONE_CENTURY_YEARS; + int32_t numPer4Year = (end - 1) / LEAP_YEAR_LENGTH - begin / LEAP_YEAR_LENGTH; + return (numPer400Year + numPer4Year - numPer100Year); +} + +/* 闰年判断 */ +int32_t CheckIfLeapYear(uint16_t year) +{ + if ((year % ONE_CENTURY_YEARS) == 0) { + if ((year % FOUR_CENTURY_YEARS) == 0) { + return 1; + } + } else { + if ((year % LEAP_YEAR_LENGTH) == 0) { + return 1; + } + } + return 0; +} + +/* 将日历时(年月日时分秒) 转换为 unix时间(1970å¹´1月1日起的时间秒数) */ +int32_t Utc2UnixTime(GnssUtcTime utcTime, uint32_t *unixTime) +{ + if (unixTime == NULL) { + CWM_OS_dbgPrintf("\nerror: [Utc2UnixTime] null pointer!\n"); + return 0; + } + + if (utcTime.month > 12 || utcTime.valid == 0) { + CWM_OS_dbgPrintf("\nerror: [Utc2UnixTime] utcTime invalid!\n"); + return 0; + } + + // 判断是否为闰年 + int32_t *monthDays = (CheckIfLeapYear(utcTime.year) == 1) ? g_leapMonthDays : g_normMonthDays; + + // 计算从1970.01.01开始的unix 秒数 + uint32_t timestamp = 0; + timestamp += (uint32_t)(utcTime.year - UNIX_TIME_START_YEAR) * SECONDS_PER_NORMAL_YEAR; + timestamp += (uint32_t)GetLeapYearNum(UNIX_TIME_START_YEAR, utcTime.year) * SECONDS_PER_DAY; + + for (int32_t i = 1; i < utcTime.month; i++) { + timestamp += (uint32_t)monthDays[i - 1] * SECONDS_PER_DAY; + } + + timestamp += (uint32_t)(utcTime.day - 1) * SECONDS_PER_DAY; + timestamp += (uint32_t)utcTime.hour * SECONDS_PER_HOUR; + timestamp += (uint32_t)utcTime.minute * SECONDS_PER_MIN; + uint32_t timestampSec = (uint32_t)(utcTime.second + utcTime.ms / TIME_UNIT); + + *unixTime = timestamp + timestampSec; + return 1; +} + +/* 计算命令内容校准和 */ +static uint16_t CalcChecksum(uint8_t *buff, uint16_t len) +{ + uint16_t checksum = 0; + uint16_t i = 0; + while (i++ < len) { + checksum += *buff; + buff++; + } + return checksum; +} + +int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts) +{ + uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN); + if (buff == NULL) { + CWM_OS_dbgPrintf("\nerror: malloc failed in PgnssINjectUtcTime\r\n"); + return 0; + } + memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN); + + GnssMsg *hdr = (GnssMsg *)buff; + hdr->cmd = 0x0404; + hdr->sequence = 0; + errno_t copyRet = memcpy_s(hdr->data, (GNSS_ENCODE_BUFF_MAX_LEN - sizeof(GnssMsg)), utcTime, sizeof(GnssUtcTime)); + if (copyRet != EOK) { + CWM_OS_dbgPrintf("\nmemcpy UtcTime failed! Errno is %d\r\n", copyRet); + free(buff); + return 0; + } + hdr->dataLength = sizeof(GnssUtcTime); + hdr->checkSum = CalcChecksum(hdr->data, hdr->dataLength); + int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + hdr->dataLength)); + if (ret < 0) { + CWM_OS_dbgPrintf("\nerror: PgnssInjectUtcTime error: %d\r\n", ret); + free(buff); + return 0; + } + if (Utc2UnixTime((*utcTime), ts) == 0) { + CWM_OS_dbgPrintf("\nerror: Utc2UnixTime error\r\n"); + free(buff); + return 0; + } + + free(buff); + return 1; +} + +static uint16_t FillGnssMessageData(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen) +{ + errno_t ret = memcpy_s(outBuff, outLen, inBuff, inLen); + if (ret != EOK) { + CWM_OS_dbgPrintf("memcpy XgnssData failed! Errno is %d \r\n", ret); + return 0; + } + + return inLen; +} + +static int32_t EncodeGnssMsg(uint8_t *inBuff, uint32_t inLen, uint8_t *outBuff, uint32_t outLen) +{ + uint16_t len = FillGnssMessageData(inBuff, inLen, outBuff, outLen); + if (len > 0) { + return 1; + } + return 0; +} + +static void ListenAck(tiot_handle handle) +{ + int32_t i = 0; + for (;;) { + // 监听 + int32_t ret = tiot_service_read(handle, g_ackBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR); + if (ret > 0) { + uint16_t *type = (uint16_t *)g_ackBuff; + // 二进制消息类型 + if (type[0] == 0) { + g_ackBuff[ret] = '\0'; + CWM_OS_dbgPrintf("%s\r\n", (char *)&g_ackBuff[MSG_CONTENT_IDX]); + } + i++; + } + if (i >= 1) { + CWM_OS_dbgPrintf("\r\ncnt enough\r\n"); + break; + } + } +} + +static int32_t EncodeAndInjectCmd(tiot_handle handle, GnssCmdType cmdType, uint8_t* inBuff, uint32_t inLen) +{ + // 获取GNSS业务消息头 + int32_t len = 0; + uint8_t *buff = (uint8_t *)malloc(GNSS_ENCODE_BUFF_MAX_LEN); + if (buff == NULL) { + CWM_OS_dbgPrintf("\r\nerror: malloc failed in EncodeAndInjectCmd\r\n"); + return 0; + } + memset_s(buff, GNSS_ENCODE_BUFF_MAX_LEN, 0, GNSS_ENCODE_BUFF_MAX_LEN); + + GnssMsg *gnssHdr = (GnssMsg *)buff; + len += sizeof(GnssMsg); + + gnssHdr->sequence = 0; + + int32_t retLen = EncodeGnssMsg(inBuff, inLen, buff + len, (GNSS_ENCODE_BUFF_MAX_LEN - len)); + if (retLen != 1) { + CWM_OS_dbgPrintf("\nerror: Encode Cmd failed: %d\r\n", cmdType); + free(buff); + return retLen; + } + gnssHdr->cmd = cmdType; + gnssHdr->dataLength = inLen; + gnssHdr->checkSum = CalcChecksum(gnssHdr->data, gnssHdr->dataLength); + int32_t ret = tiot_service_write(handle, buff, (sizeof(GnssMsg) + gnssHdr->dataLength)); + if (ret < 0) { + CWM_OS_dbgPrintf("\r\nerror: Inject Cmd failed: %d\r\n", cmdType); + free(buff); + return 0; + } + ListenAck(handle); + CWM_OS_dbgPrintf("\r\nInject Cmd SUCCESS: %x\r\n", cmdType); + free(buff); + return 1; +} + +void PgnssSendFileContent(tiot_handle handle, const char *fileName, GnssCmdType cmdType) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + CWM_OS_dbgPrintf("\r\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + CWM_OS_dbgPrintf("\r\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + CWM_OS_dbgPrintf("\r\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + CWM_OS_dbgPrintf("\r\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + EncodeAndInjectCmd(handle, cmdType, buff, len); + free(buff); +} + +int32_t FormatFileName(char *fileName, char *dName) +{ + int32_t ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%s", "/user/userdata/gnss/", dName); + if (ret <= 0) { + return 0; + } + return 1; +} + +int32_t GetEphFileName(int32_t ts, const char *prefix, char *fileName) +{ + int32_t interval = (strcmp(prefix, "GLO") == 0) ? GLO_EPH_VALID_TIME : OTHER_EPH_VALID_TIME; + DIR *dir = opendir("/user/userdata/gnss/"); + if (dir == NULL) { + CWM_OS_dbgPrintf("Failed to open /user/xgnss directory.\r\n"); + return 0; + } + int32_t time, ret; + struct dirent *entry; + for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) { + // 检查文件名 + if (strstr(entry->d_name, ".eph") != NULL) { + char *p = strrchr(entry->d_name, '_'); + if (p != NULL) { + char *q = strstr(entry->d_name, prefix); + if (q != NULL) { + time = atoi(p + 1); + if (abs(time - ts) <= interval) { + ret = FormatFileName(fileName, entry->d_name); + closedir(dir); + return ret; + } + else + { + CWM_OS_dbgPrintf("time:%d,ts:%d,interval:%d\r\n",time,ts,interval); + } + } + } + } + } + closedir(dir); + CWM_OS_dbgPrintf("closedir(dir);\r\n"); + return 0; +} + +void PgnssSendEphFile(tiot_handle handle, const char *prefix, GnssCmdType cmdType, uint32_t ts) +{ + char fileName[FILE_PATH_LEN] = {0}; + int32_t ret = GetEphFileName(ts, prefix, fileName); + if (ret == 0) { + CWM_OS_dbgPrintf("\r\nerror: GetEphFileName failed\r\n"); + return; + } + CWM_OS_dbgPrintf("\nGetEphFileName success\r\n"); + PgnssSendFileContent(handle, fileName, cmdType); +} + +void PgnssInjectAllEph(tiot_handle handle, uint32_t ts) +{ + PgnssSendEphFile(handle, "GPS", CMD_PGNSS_INJECT_EPH_GPS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GPS eph success\r\n"); + PgnssSendEphFile(handle, "GLO", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GLO eph success\r\n"); + PgnssSendEphFile(handle, "BDS", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send BDS eph success\r\n"); + PgnssSendEphFile(handle, "GAL", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GAL eph success\r\n"); + PgnssSendEphFile(handle, "QZS", CMD_PGNSS_INJECT_EPH_GANSS, ts); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send QZS eph success\r\n"); +} + +void PgnssInjectOtherAssist(tiot_handle handle) +{ + PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_UTC.dat", CMD_PGNSS_INJECT_UTC_GPS); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GPS_UTC success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_RTI.dat", CMD_PGNSS_INJECT_RTI_GPS); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GPS_RTI success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GPS_ION.dat", CMD_PGNSS_INJECT_ION_GPS); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GPS_ION success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GLO_RTI success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GLO_AUX.dat", CMD_PGNSS_INJECT_AUX_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GLO_AUX success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/BDS_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send BDS_RTI success\r\n"); + PgnssSendFileContent(handle, "/user/userdata/gnss/GAL_RTI.dat", CMD_PGNSS_INJECT_RTI_GANSS); + osal_msleep(INJECT_SLEEP_MS_TIME); + CWM_OS_dbgPrintf("send GAL_RTI success\r\n"); +} + +void PgnssInject(tiot_handle handle, uint32_t ts) +{ + // 注入Pgnss辅助数据 + PgnssInjectAllEph(handle, ts); + PgnssInjectOtherAssist(handle); +} + + +// 以下为使用PGNSS解析数据合并输出接口生成的星历文件进行注入的代码 +int32_t GetNonGloEphFileName(int32_t ts, char *fileName) +{ + const char prefix[] = "NonGlo"; + DIR *dir = opendir("/user/userdata/gnss/"); + if (dir == NULL) { + CWM_OS_dbgPrintf("Failed to open /user/xgnss directory.\r\n"); + return 0; + } + int32_t time, ret; + int32_t minDist = OTHER_EPH_VALID_TIME; + int32_t closestTime = 0; + struct dirent *entry; + for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) { + // 检查文件名 + if (strstr(entry->d_name, ".eph") != NULL) { + char *p = strrchr(entry->d_name, '_'); + if (p != NULL) { + char *q = strstr(entry->d_name, prefix); + if (q != NULL) { + time = atoi(p + 1); + // 查找星历文件时间戳与当前时间相差2小时以内且距离最近的 + if (abs(time - ts) < minDist) { + minDist = abs(time - ts); + closestTime = time; + } + else + { + CWM_OS_dbgPrintf("time:%d,ts:%d,minDist:%d\r\n",time,ts,minDist); + } + } + } + } + } + if (closestTime != 0) { + ret = snprintf_s(fileName, FILE_PATH_LEN, (FILE_PATH_LEN - 1), "%s%d%s", "/user/userdata/gnss/NonGlo_", closestTime, + ".eph"); + CWM_OS_dbgPrintf("closest eph fileName:%s\r\n", fileName); + closedir(dir); + return ((ret <= 0) ? 0 : 1); + } + else + { + CWM_OS_dbgPrintf("closestTime == 0\r\n"); + } + closedir(dir); + return 0; +} + +int32_t GetGloEphFileName(int32_t ts, char *fileName) +{ + const char prefix[] = "GLO"; + DIR *dir = opendir("/user/userdata/gnss/"); + if (dir == NULL) { + CWM_OS_dbgPrintf("Failed to open /user/xgnss directory.\r\n"); + return 0; + } + int32_t ephTime, ret; + struct dirent *entry; + for (entry = readdir(dir); entry != NULL; entry = readdir(dir)) { + // 检查文件名 + if (strstr(entry->d_name, ".eph") != NULL) { + char *p = strrchr(entry->d_name, '_'); + if (p != NULL) { + char *q = strstr(entry->d_name, prefix); + if (q != NULL) { + ephTime = atoi(p + 1); + CWM_OS_dbgPrintf("ephTime:%ld, ts:%ld\n", ephTime, ts); + // 当前时间大于GLO星历文件时间戳,则需要选取相差2小时以内的星历 + // 当前时间小于GLO星历文件时间戳,则需要选取相差小于15分钟的星历 + if (((ts - ephTime) >= 0 && abs(ephTime - ts) < OTHER_EPH_VALID_TIME) || + ((ts - ephTime) <= 0 && abs(ephTime - ts) < GLO_EPH_VALID_TIME)) { + ret = FormatFileName(fileName, entry->d_name); + CWM_OS_dbgPrintf("glo eph fileName:%s\n", fileName); + closedir(dir); + return ret; + } + } + } + } + } + closedir(dir); + return 0; +} + +void PgnssSendNonGloEph(tiot_handle handle, const char *fileName) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + CWM_OS_dbgPrintf("\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + int32_t fileLen = 0; + for (int32_t i = 0; i < NON_GLO_GNSS_TYPES && fileLen <= len; i++) { + EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen); + EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len); + fileLen += (ephHdr->len + sizeof(EphHeadInfo)); + osal_msleep(INJECT_SLEEP_MS_TIME); + } + free(buff); +} + +void PgnssSendGloEph(tiot_handle handle, const char *fileName, int32_t ts) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + CWM_OS_dbgPrintf("\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + int32_t fileLen = 0; + for (int32_t i = 0; i < GLO_EPH_NUM_ONE_FILE && fileLen <= len; i++) { + EphHeadInfo *ephHdr = (EphHeadInfo *)(buff + fileLen); + CWM_OS_dbgPrintf("glo eph, time:%u, ts:%d\r\n", ephHdr->time, ts); + if (abs((int32_t)ephHdr->time - ts) < GLO_EPH_VALID_TIME) { + EncodeAndInjectCmd(handle, ephHdr->cmd, (buff + fileLen + sizeof(EphHeadInfo)), ephHdr->len); + osal_msleep(INJECT_SLEEP_MS_TIME); + break; + } + fileLen += (ephHdr->len + sizeof(EphHeadInfo)); + } + free(buff); +} + +void PgnssInjectAllEphLessFiles(tiot_handle handle, uint32_t ts) +{ + char fileName[FILE_PATH_LEN] = {0}; + if (GetNonGloEphFileName(ts, fileName) == 0) { + CWM_OS_dbgPrintf("\nerror: GetNonGloEphFileName failed\r\n"); + return; + } + PgnssSendNonGloEph(handle, fileName); + if (GetGloEphFileName(ts, fileName) == 0) { + CWM_OS_dbgPrintf("\nerror: GetGloEphFileName failed\r\n"); + return; + } + PgnssSendGloEph(handle, fileName, ts); +} + +void PgnssSendOtherAssistInfo(tiot_handle handle, const char *fileName) +{ + FILE *fp = fopen(fileName, "rb"); + if (fp == NULL) { + CWM_OS_dbgPrintf("\nerror: open file failed: %s\r\n", fileName); + return; + } + fseek(fp, 0, SEEK_END); + int32_t len = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (len < 0 || len > PGNSS_FILE_MAX_SIZE) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: get file len failed: %s\r\n", fileName); + return; + } + uint8_t *buff = (uint8_t *)malloc(len); + if (buff == NULL) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: malloc file len failed: %s\r\n", fileName); + return; + } + int32_t dataSize = fread(buff, len, 1, fp); + if (dataSize < 0) { + fclose(fp); + CWM_OS_dbgPrintf("\nerror: read file failed: %s\r\n", fileName); + free(buff); + return; + } + fclose(fp); + int32_t fileLen = 0; + for (int32_t i = 0; i < OTHER_ASSIST_TYPES && fileLen <= len; i++) { + OtherAssistHeadInfo *otherHdr = (OtherAssistHeadInfo *)(buff + fileLen); + EncodeAndInjectCmd(handle, otherHdr->cmd, (buff + fileLen + sizeof(OtherAssistHeadInfo)), otherHdr->len); + fileLen += (otherHdr->len + sizeof(OtherAssistHeadInfo)); + osal_msleep(INJECT_SLEEP_MS_TIME); + } + free(buff); +} + +void PgnssInjectOtherAssistLessFiles(tiot_handle handle) +{ + PgnssSendOtherAssistInfo(handle, "/user/userdata/gnss/AssistInfo.dat"); +} + +// 注入PGNSS解析数据合并输出接口生成的星历文件 +void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts) +{ + // 注入Pgnss辅助数据 + PgnssInjectAllEphLessFiles(handle, ts); + PgnssInjectOtherAssistLessFiles(handle); +} \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.h b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.h new file mode 100644 index 000000000..a666edc91 --- /dev/null +++ b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_encode.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss encode + * Author: + * Create: + */ +#ifndef PGNSS_ENCODE_H +#define PGNSS_ENCODE_H + +#include "gnss_datatypes.h" +#include "tiot_service_interface.h" + +int32_t PgnssInjectUtcTime(tiot_handle handle, GnssUtcTime *utcTime, uint32_t* ts); +void PgnssInject(tiot_handle handle, uint32_t ts); +void PgnssInjectLessFiles(tiot_handle handle, uint32_t ts); +#endif \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.c b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.c new file mode 100644 index 000000000..a153c14ef --- /dev/null +++ b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.c @@ -0,0 +1,376 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss sample + * Author: + * Create: + */ +#include "pgnss_sample.h" +#include +#include "securec.h" +#include "tiot_service_interface.h" +#include "pm_definition.h" +#include "gnss_datatypes.h" +#include "pgnss_encode.h" +#include "NMEA0183.h" +#include "sys/time.h" +#include "time.h" +#include "gnss_ctl.h" +#ifdef SUPPORT_CYWEE_SERVICE +#include "cywee_hal.h" +#include "cywee_service.h" +#endif + + +#define PGNSS_FIXMODEALL_NMEADEF_SAMPLE 0 +#define PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE 0 + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif +#define MSG_TYPE_BINRY 0 +#define MSG_TYPE_ASCII 1 +#define LISTEN_DATA_MAX_LINES 1000 + +static FILE* g_gnssLogFp = NULL; +static uint8_t g_gnssServiceBuff[REPORT_MAX_BYTES] = { 0 }; + +typedef int32_t (*GnssCfgFunc)(tiot_handle handle); + +typedef struct { + uint16_t sampleId; + GnssCfgFunc cfgHandle; +} GnssSamplesCfgTable; + +static NMEA0183 g_nmeadata={0}; +static gps_data_t g_global_gpsData={0}; + +/**GPS状态位*/ +static int g_is_pgnss_poweron=0; +static int g_is_pgnss_logon=0; +static int g_pgnss_stopflag=0; + +static int32_t QryVersion(tiot_handle handle) +{ + const uint8_t qryVersion[] = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}; + // 查询版本号 + int32_t ret = tiot_service_write(handle, qryVersion, sizeof(qryVersion)); + if (ret < 0) { + CWM_OS_dbgPrintf("\nerror: QryVersion error: %d\r\n", ret); + return 0; + } + return 1; +} + +static int decode_nmea(char c) +{ + int ret=0; + ret=0; + if(nmea_decode(&g_nmeadata,c) ==1 ) ///调用解析函数 + { + dump_nmea_str(&(g_nmeadata.gpsParse)); + if (g_nmeadata.gpsParse.sentence_type == GPS_SENTENCE_TH002 ) + { + //一组数据最后一条 + memcpy_s(&g_global_gpsData,sizeof(gps_data_t),&(g_nmeadata.gpsData),sizeof(gps_data_t)); + ret = 1; + memset(&g_nmeadata,0,sizeof(g_nmeadata)); +#ifdef SUPPORT_CYWEE_SERVICE + if(uapi_dev_runtime_get_train_status()) + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GNSS_UPDATE,NULL); +#endif + } + } + + return ret; +} + +gps_data_t * getPGPSGlobaldata(void) +{ + return &g_global_gpsData; +} + + +// 注入PGNSS,使用默认配置启动 +int32_t InjectPgnssCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle) +{ + const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03}; + + // 配置log级别:info级别。 + int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo)); + if (ret < 0) { + CWM_OS_dbgPrintf("\nerror: cfgLogLevelInfo error: %d\r\n", ret); + return 0; + } + + // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间 + GnssUtcTime utcTime = {2024, 2, 26, 6, 0, 0, 0, 1}; // 需要用当前的UTC时间替换 + + time_t rawtime; + struct tm* timeinfo; + + time(&rawtime); // 获取UTC时间戳 + timeinfo = gmtime(&rawtime); // 转换为UTC时间(无时区偏移) + + utcTime.year = timeinfo->tm_year + 1900; + utcTime.month = timeinfo->tm_mon + 1; + utcTime.day = timeinfo->tm_mday; + utcTime.hour = timeinfo->tm_hour; + utcTime.minute = timeinfo->tm_min; + utcTime.second = timeinfo->tm_sec; + + CWM_OS_dbgPrintf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n", + utcTime.year,utcTime.month,utcTime.day, + utcTime.hour,utcTime.minute,utcTime.second); + + uint32_t ts = 0; + ret = PgnssInjectUtcTime(handle, &utcTime, &ts); + if (ret == 0) { + CWM_OS_dbgPrintf("\nerror: PgnssInjectUtcTime failed!\r\n"); + return 0; + } + CWM_OS_dbgPrintf("\nPgnssInjectUtcTime success!\r\n"); + + // PGNSS注入 + // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换 + PgnssInject(handle, ts); + + return 1; +} + +// 注入PGNSS,使用默认配置启动 +int32_t InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault(tiot_handle handle) +{ + const uint8_t cfgLogLevelInfo[] = {0x03, 0x00, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x10, 0x01, 0x00, 0x03}; + + // 配置log级别:info级别。 + int32_t ret = tiot_service_write(handle, cfgLogLevelInfo, sizeof(cfgLogLevelInfo)); + if (ret < 0) { + CWM_OS_dbgPrintf("\nerror: cfgLogLevelInfo error: %d\r\n", ret); + return 0; + } + + // 注入UTC时间, 注入Pgnss辅助数据前必须先注入参考时间 + GnssUtcTime utcTime = {2024, 3, 14, 12, 0, 0, 0, 1}; // 需要用当前的UTC时间替换 + + time_t rawtime; + struct tm* timeinfo; + + time(&rawtime); // 获取UTC时间戳 + timeinfo = gmtime(&rawtime); // 转换为UTC时间(无时区偏移) + + utcTime.year = timeinfo->tm_year + 1900; + utcTime.month = timeinfo->tm_mon + 1; + utcTime.day = timeinfo->tm_mday; + utcTime.hour = timeinfo->tm_hour; + utcTime.minute = timeinfo->tm_min; + utcTime.second = timeinfo->tm_sec; + + CWM_OS_dbgPrintf("year[%d], mon[%d], day[%d], hour[%d], min[%d], sec[%d] \r\n", + utcTime.year,utcTime.month,utcTime.day, + utcTime.hour,utcTime.minute,utcTime.second); + + + uint32_t ts = 0; + ret = PgnssInjectUtcTime(handle, &utcTime, &ts); + if (ret == 0) { + CWM_OS_dbgPrintf("\nerror: PgnssInjectUtcTime failed!\r\n"); + return 0; + } + CWM_OS_dbgPrintf("\nPgnssInjectUtcTime success!\r\n"); + + // PGNSS注入 + // 注意,默认PGNSS星历文件存放在/user/xgnss/目录中,如修改目录,请全局搜索替换 + PgnssInjectLessFiles(handle, ts); + + return 1; +} + +static const GnssSamplesCfgTable g_gnssSamplesCfg[] = { + // {PGNSS_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssCfgAutoStartFixModeAndNmeaDefault}, + {PGNSS_LESS_FILES_FIXMODEALL_NMEADEF_SAMPLE, InjectPgnssLessFilesCfgAutoStartFixModeAndNmeaDefault} +}; + +static int32_t StartGnss(tiot_handle handle) +{ + const uint8_t startCmd[] = {0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; + // 启动GNSS + int32_t ret = tiot_service_write(handle, startCmd, sizeof(startCmd)); + if (ret < 0) { + CWM_OS_dbgPrintf("\nerror: start gnss error: %d\r\n", ret); + return 0; + } + CWM_OS_dbgPrintf("\nstart gnss\r\n"); + return 1; +} + +static int32_t StopGnss(tiot_handle handle) +{ + const uint8_t stopCmd[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + // 停止GNSS + int32_t ret = tiot_service_write(handle, stopCmd, sizeof(stopCmd)); + if (ret < 0) { + CWM_OS_dbgPrintf("\nerror: stop gnss error: %d\r\n", ret); + return 0; + } + CWM_OS_dbgPrintf("\nstop gnss\r\n"); + return 1; +} + + +static void ListenGnssData(tiot_handle handle) +{ + int32_t i = 0; + // 写日志 + for (;;) { // 写日志条件 + + if (i >= LISTEN_DATA_MAX_LINES) { + CWM_OS_dbgPrintf("\r\ncnt enough\r\n"); + break; + } + if (g_pgnss_stopflag == 1) + { + break; + } + // 监听 + int32_t ret = tiot_service_read(handle, g_gnssServiceBuff, REPORT_MAX_BYTES, LISTEN_TIME_THR); + if (ret > 0) { + uint16_t *type = (uint16_t *)g_gnssServiceBuff; + if (type[0] == MSG_TYPE_ASCII) { + g_gnssServiceBuff[ret] = '\0'; + char* pbuf=(char *)&g_gnssServiceBuff[MSG_CONTENT_IDX]; + CWM_OS_dbgPrintf("%s\r\n", pbuf); + if (g_is_pgnss_logon) + fprintf(g_gnssLogFp, "%s\n", pbuf); + for (int index=0;index < ret ;index++) + { + if (decode_nmea(pbuf[index])==1) + { + // dump_location_data(&g_global_gpsData); + CWM_OS_dbgPrintf("decode_nmea done\r\n"); + } + } + } + i++; + } + + } +} + +void PGnssServerStop(void) +{ + g_pgnss_stopflag=1; +} + +int getPGnssServerStat(void) +{ + return g_is_pgnss_poweron; +} + +int is_PGnssLogEnabled(void) +{ + return g_is_pgnss_logon; +} + +int PGnssLogEnable(bool enable) +{ + if (enable) + g_is_pgnss_logon = 1; + else + g_is_pgnss_logon = 0; + + return g_is_pgnss_logon; +} + + +void PGnssServerStart(void) +{ + CWM_OS_dbgPrintf("\nenter gnss samples\r\n"); + if(g_is_pgnss_poweron == 1) + { + CWM_OS_dbgPrintf("gnss already on\r\n"); + return ; + } + uapi_pm_add_sleep_veto(PM_ID_SYS); + + #ifdef DOWNLOAD_GNSS_SWITCH + download_gnss_switch(SWITCH_TO_GNSS); + #endif + g_is_pgnss_poweron = 1; + g_pgnss_stopflag = 0; + + // Step1: init + int32_t ret = tiot_service_init(); + if (ret != 0) { + CWM_OS_dbgPrintf("tiot service init fail\r\n"); + g_is_pgnss_poweron = 0; + g_pgnss_stopflag = 1; + } + + // 打开日志文件 + if (g_is_pgnss_logon) + { + g_gnssLogFp = fopen("/user/log/gnss.log", "w"); + if (g_gnssLogFp == NULL) { + CWM_OS_dbgPrintf("error: open log file error\n"); + return; + } + } + CWM_OS_dbgPrintf("before open tiot service\n"); + + // Step2: power on gnss + tiot_handle handle = tiot_service_open("gn71", NULL); + if (handle == 0) { + CWM_OS_dbgPrintf("open tiot service fail\r\n"); + g_is_pgnss_poweron = 0; + g_pgnss_stopflag = 1; + return; + } + CWM_OS_dbgPrintf("open tiot service success\r\n"); + + int32_t cfgRet; + // ---- loop ---------- + for (uint16_t i = 0; i < ARRAY_SIZE(g_gnssSamplesCfg); i++) { + cfgRet = 0; + if (g_gnssSamplesCfg[i].sampleId == i) { + // Step3: config gnss + if (g_gnssSamplesCfg[i].cfgHandle != NULL) { + cfgRet = g_gnssSamplesCfg[i].cfgHandle(handle); + } + if (cfgRet == 0) { + continue; + } + CWM_OS_dbgPrintf("cfg sample id:%u\r\n", g_gnssSamplesCfg[i].sampleId); + QryVersion(handle); + + // Step4: start gnss + if (StartGnss(handle) == 0) { + continue; + } + // Step5: listening gnss data + ListenGnssData(handle); + // Step6: stop gnss + if (StopGnss(handle) == 0) { + continue; + } + } + } + // --------------------- + // Step7: power off gnss + tiot_service_close(handle); + // 关日志文件 + if (g_is_pgnss_logon) + { + fclose(g_gnssLogFp); + g_gnssLogFp = NULL; + } + // Step8: deinit + tiot_service_deinit(); + + #ifdef DOWNLOAD_GNSS_SWITCH + download_gnss_switch(SWITCH_TO_DOWNLOAD); + #endif + uapi_pm_remove_sleep_veto(PM_ID_SYS); + g_is_pgnss_poweron=0; + CWM_OS_dbgPrintf("finish gnss samples\r\n"); +} diff --git a/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.h b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.h new file mode 100644 index 000000000..37d7d51dd --- /dev/null +++ b/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.h @@ -0,0 +1,26 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-07-11 16:41:59 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-18 17:39:28 + * @FilePath: /FD230/code/sdk/drivers/peripheral/gnss/sample/pgnss_sample/pgnss_sample.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2024-2024. All rights reserved. + * Description: pgnss sample + * Author: + * Create: + */ +#ifndef PGNSS_SAMPLE_H +#define PGNSS_SAMPLE_H +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ +void PGnssServerStart(void); +void PGnssServerStop(void); +int getPGnssServerStat(void); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif \ No newline at end of file diff --git a/code/sdk/drivers/peripheral/gnss/src/gnss_ctl.c b/code/sdk/drivers/peripheral/gnss/src/gnss_ctl.c index e73a5bf0e..57eca614d 100644 --- a/code/sdk/drivers/peripheral/gnss/src/gnss_ctl.c +++ b/code/sdk/drivers/peripheral/gnss/src/gnss_ctl.c @@ -30,7 +30,8 @@ #include "gnss_ctl.h" #include "gpio.h" #include "uart_gnss.h" -#include "gnss_sample.h" +// #include "gnss_sample.h" +#include "pgnss_sample.h" // #include "cywee_hal.h" errcode_t gnss_power_on(void) @@ -129,7 +130,8 @@ errcode_t gnss_stop(void) // uint8_t cmd = GNSS_CMD_STOP; // do_gnss_cmd(GNSS_CMD_WRITEDATA, &cmd,1); // g_gnss_status = 0; - GnssServerStop(); + // GnssServerStop(); + PGnssServerStop(); return 0; } diff --git a/code/sdk/drivers/peripheral/gnss/src/uart_gnss.c b/code/sdk/drivers/peripheral/gnss/src/uart_gnss.c index 024893b5a..506b3b2ec 100644 --- a/code/sdk/drivers/peripheral/gnss/src/uart_gnss.c +++ b/code/sdk/drivers/peripheral/gnss/src/uart_gnss.c @@ -30,6 +30,7 @@ #include "uart_gnss.h" #include "gnss_ctl.h" #include "tiot_board_pin_port.h" +#include "pgnss_sample.h" // errcode_t gnss_get_next_cmd(uint8_t cmd_index,uint8_t** cmdbuf,int *cmdlen); // errcode_t gnss_get_current_cmd(uint8_t cmd_index,uint8_t** cmdbuf,int *cmdlen); // errcode_t gnss_get_nmea_cfg_cmd(uint8_t** cmdbuf,int *cmdlen); @@ -181,7 +182,8 @@ static void uart_event_task(void const *arg) break; case GNSS_CMD_START: // gnss_get_start_cmd(&buf,&len); - GnssServerStart(); + // GnssServerStart(); + PGnssServerStart(); last_cfg_cmd_index = 0xFF; //last_cfg_cmd_index=0xFF 代表cfg结束写入,开始检测其他指令 break; case GNSS_CMD_STOP: