blob: 0e1ba35a6cd79169fbfdb4342e5e0e4cff81f589 [file] [log] [blame]
yq.wang069ea922024-09-08 19:29:35 -07001/*
2* gnss_log.c
3*
4* gnss test log.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------------- -------------------------------------------------------
132024/9/6 wangyouqiang Initial version
14
15******************************************************************************/
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <sys/types.h>
20#include <sys/stat.h>
21#include <fcntl.h>
22#include <unistd.h>
23#include <stdarg.h>
24#include <sys/time.h>
25#include <errno.h>
26#include <time.h>
27
28#include "gnss_log.h"
29#include "mbtk_log.h"
b.liu9e8584b2024-11-06 19:21:28 +080030#include "mbtk_utils.h"
yq.wang069ea922024-09-08 19:29:35 -070031
32#define GNSS_LOG_FOLDER_PATH "/user_data/mbtk_log"
33#define GNSS_LOG_FILE_PATH "/user_data/mbtk_log/mbtk_gnss_log.txt"
34#define GNSS_LOG_LAST_FILE_PATH "/user_data/mbtk_log/mbtk_gnss_last_log.txt"
b.liu9e8584b2024-11-06 19:21:28 +080035#define GNSS_LOG_GNSS_FILE_HEAD "\n[-------------------mbtk gnss log V1.0-------------------][%ld]\n"
yq.wang069ea922024-09-08 19:29:35 -070036#define GNSS_LOG_FILE_MAX_SIZE 10485760 //10 * 1024 * 1024 10M
37#define GNSS_TIME_CHECK_NUM 10
38
39static int log_file_fd = -1;
40static long log_file_size = 0;
41
42static int mbtk_rmc_num = 0;
43
44static int log_file_init(int *fd, long *size, bool mv_flag)
45{
46 int head_len = 0;
47 int ret = -1;
b.liu9e8584b2024-11-06 19:21:28 +080048 if(access(GNSS_LOG_FOLDER_PATH, F_OK) != 0)
yq.wang069ea922024-09-08 19:29:35 -070049 {
50 ret = mkdir(GNSS_LOG_FOLDER_PATH, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
b.liu9e8584b2024-11-06 19:21:28 +080051 if (ret != 0)
yq.wang069ea922024-09-08 19:29:35 -070052 {
53 LOGE("Failed to create folder.");
54 return -1;
55 }
56 }
57
b.liu9e8584b2024-11-06 19:21:28 +080058 if(access(GNSS_LOG_FILE_PATH, F_OK) == 0 && mv_flag)
yq.wang069ea922024-09-08 19:29:35 -070059 {
60 char cmd[128] = {0};
61 memset(cmd, 0x0, 128);
62 snprintf(cmd, 128, "mv %s %s", GNSS_LOG_FILE_PATH, GNSS_LOG_LAST_FILE_PATH);
63 LOGE("cmd: [%s].", cmd);
b.liu9e8584b2024-11-06 19:21:28 +080064 mbtk_system(cmd);
yq.wang069ea922024-09-08 19:29:35 -070065 }
66
67 *fd = open(GNSS_LOG_FILE_PATH, O_CREAT | O_WRONLY | O_APPEND | O_NONBLOCK, 0644);
b.liu9e8584b2024-11-06 19:21:28 +080068 if(*fd < 0)
yq.wang069ea922024-09-08 19:29:35 -070069 {
70 LOGE("Open file fail [errno = %d].", errno);
71 return -1;
72 }
b.liu9e8584b2024-11-06 19:21:28 +080073 else
yq.wang069ea922024-09-08 19:29:35 -070074 {
75 char temp[128] = {0};
76 struct stat st;
77 stat(GNSS_LOG_FILE_PATH, &st);
78 *size = st.st_size;
79 snprintf(temp, 128, GNSS_LOG_GNSS_FILE_HEAD, *size);
80 head_len = (int)strlen(temp);
81 ret = write(*fd, temp, head_len);
b.liu9e8584b2024-11-06 19:21:28 +080082 if(ret == head_len)
yq.wang069ea922024-09-08 19:29:35 -070083 {
84 *size += ret;
85 }
b.liu9e8584b2024-11-06 19:21:28 +080086 else
yq.wang069ea922024-09-08 19:29:35 -070087 {
88 LOGE("write head fail [errno = %d].", errno);
89 goto error;
90 }
91 }
92
93 return 0;
94error:
95 if(*fd > 0) {
96 close(*fd);
97 *fd = -1;
98 }
99 *size = 0;
100 return -1;
101}
102
103void mbtk_gnss_time_check(time_t _time)
104{
105 long diff = 0;
106 struct timeval time;
107 gettimeofday(&time, NULL);
108 time_t sys_time = time.tv_sec;
109 time_t gps_time = _time;
110
111 if(gps_time > sys_time)
112 {
113 diff = gps_time - sys_time;
114 }
115 else
116 {
117 diff = sys_time - gps_time;
118 }
b.liu9e8584b2024-11-06 19:21:28 +0800119
yq.wang069ea922024-09-08 19:29:35 -0700120 gnss_test_log("sys time[%ld], gps time[%ld], diff time[%ld]", sys_time, gps_time, diff);
121}
122
123int mbtk_check_num(void)
124{
125 if(mbtk_rmc_num < GNSS_TIME_CHECK_NUM)
126 {
127 mbtk_rmc_num++;
128 return 1;
129 }
130
131 mbtk_rmc_num = 0;
132 return 0;
133}
134
135void gnss_test_log(const char* format, ...)
136{
137 int ret;
b.liu9e8584b2024-11-06 19:21:28 +0800138
139 if(log_file_fd < 0)
yq.wang069ea922024-09-08 19:29:35 -0700140 {
141 ret = log_file_init(&log_file_fd, &log_file_size, false);
b.liu9e8584b2024-11-06 19:21:28 +0800142 if(ret < 0)
yq.wang069ea922024-09-08 19:29:35 -0700143 {
144 LOGE("log_file_init fail.");
145 return;
146 }
b.liu9e8584b2024-11-06 19:21:28 +0800147 else
yq.wang069ea922024-09-08 19:29:35 -0700148 {
149 LOGE("log fd: [%d], log size: [%ld].", log_file_fd, log_file_size);
150 }
151 }
152
153 char tmp[50] = {0};
154 char param_buf[1024] = {0};
155 int length = 0;
156 char write_buf[1096] = {0};
157 int write_length = 0;
b.liu9e8584b2024-11-06 19:21:28 +0800158
yq.wang069ea922024-09-08 19:29:35 -0700159 va_list ap;
160 struct timeval log_time;
161
162 va_start(ap, format);
163 length = vsnprintf(param_buf, 1023, format, ap);
164 va_end(ap);
b.liu9e8584b2024-11-06 19:21:28 +0800165
166 if (length < 0 || 0 == length)
yq.wang069ea922024-09-08 19:29:35 -0700167 {
168 LOGE("vsnprintf fail.");
169 return;
170 }
171 else
172 {
173 if(param_buf[length - 1] != '\n')
174 {
175 param_buf[length] = '\n';
176 }
177 }
178
179 gettimeofday(&log_time, NULL);
180 struct tm* tm_t = localtime(&(log_time.tv_sec));
181 strftime(tmp, 50, "%F %T", tm_t);
b.liu9e8584b2024-11-06 19:21:28 +0800182
yq.wang069ea922024-09-08 19:29:35 -0700183 write_length = snprintf(write_buf, 1096, "[%s %03d]--->%s", tmp, (int)(log_time.tv_usec / 1000), param_buf);
184 if(write_length <= 0)
185 {
186 LOGE("snprintf fail.");
187 return;
188 }
b.liu9e8584b2024-11-06 19:21:28 +0800189
190 if((log_file_size + write_length) > GNSS_LOG_FILE_MAX_SIZE)
yq.wang069ea922024-09-08 19:29:35 -0700191 {
192 close(log_file_fd);
193 log_file_fd = -1;
194 log_file_size = 0;
195
196 ret = log_file_init(&log_file_fd, &log_file_size, true);
b.liu9e8584b2024-11-06 19:21:28 +0800197 if(ret < 0)
yq.wang069ea922024-09-08 19:29:35 -0700198 {
199 LOGE("log_file_init fail.");
200 goto error;
201 }
b.liu9e8584b2024-11-06 19:21:28 +0800202 else
yq.wang069ea922024-09-08 19:29:35 -0700203 {
204 LOGE("log fd: [%d], log size: [%ld].", log_file_fd, log_file_size);
205 }
206 }
b.liu9e8584b2024-11-06 19:21:28 +0800207
yq.wang069ea922024-09-08 19:29:35 -0700208 ret = write(log_file_fd, write_buf, write_length);
b.liu9e8584b2024-11-06 19:21:28 +0800209 if(ret == write_length)
yq.wang069ea922024-09-08 19:29:35 -0700210 {
211 log_file_size += ret;
212 }
b.liu9e8584b2024-11-06 19:21:28 +0800213 else
yq.wang069ea922024-09-08 19:29:35 -0700214 {
215 goto error;
216 }
b.liu9e8584b2024-11-06 19:21:28 +0800217
218
219 if (log_file_fd > 2)
yq.wang069ea922024-09-08 19:29:35 -0700220 {
221 fsync(log_file_fd);
b.liu9e8584b2024-11-06 19:21:28 +0800222 }
yq.wang069ea922024-09-08 19:29:35 -0700223 return;
224error:
b.liu9e8584b2024-11-06 19:21:28 +0800225 if(log_file_fd > 0)
yq.wang069ea922024-09-08 19:29:35 -0700226 {
227 close(log_file_fd);
228 log_file_fd = -1;
229 }
230 log_file_size = 0;
231 return;
232}