blob: ef3204cdc0278bdee4a4ebf9abc8c72cecad07bb [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"
30
31#define GNSS_LOG_FOLDER_PATH "/user_data/mbtk_log"
32#define GNSS_LOG_FILE_PATH "/user_data/mbtk_log/mbtk_gnss_log.txt"
33#define GNSS_LOG_LAST_FILE_PATH "/user_data/mbtk_log/mbtk_gnss_last_log.txt"
34#define GNSS_LOG_GNSS_FILE_HEAD "\n[-------------------mbtk gnss log V1.0-------------------][%d]\n"
35#define GNSS_LOG_FILE_MAX_SIZE 10485760 //10 * 1024 * 1024 10M
36#define GNSS_TIME_CHECK_NUM 10
37
38static int log_file_fd = -1;
39static long log_file_size = 0;
40
41static int mbtk_rmc_num = 0;
42
43static int log_file_init(int *fd, long *size, bool mv_flag)
44{
45 int head_len = 0;
46 int ret = -1;
47 if(access(GNSS_LOG_FOLDER_PATH, F_OK) != 0)
48 {
49 ret = mkdir(GNSS_LOG_FOLDER_PATH, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
50 if (ret != 0)
51 {
52 LOGE("Failed to create folder.");
53 return -1;
54 }
55 }
56
57 if(access(GNSS_LOG_FILE_PATH, F_OK) == 0 && mv_flag)
58 {
59 char cmd[128] = {0};
60 memset(cmd, 0x0, 128);
61 snprintf(cmd, 128, "mv %s %s", GNSS_LOG_FILE_PATH, GNSS_LOG_LAST_FILE_PATH);
62 LOGE("cmd: [%s].", cmd);
63 system(cmd);
64 }
65
66 *fd = open(GNSS_LOG_FILE_PATH, O_CREAT | O_WRONLY | O_APPEND | O_NONBLOCK, 0644);
67 if(*fd < 0)
68 {
69 LOGE("Open file fail [errno = %d].", errno);
70 return -1;
71 }
72 else
73 {
74 char temp[128] = {0};
75 struct stat st;
76 stat(GNSS_LOG_FILE_PATH, &st);
77 *size = st.st_size;
78 snprintf(temp, 128, GNSS_LOG_GNSS_FILE_HEAD, *size);
79 head_len = (int)strlen(temp);
80 ret = write(*fd, temp, head_len);
81 if(ret == head_len)
82 {
83 *size += ret;
84 }
85 else
86 {
87 LOGE("write head fail [errno = %d].", errno);
88 goto error;
89 }
90 }
91
92 return 0;
93error:
94 if(*fd > 0) {
95 close(*fd);
96 *fd = -1;
97 }
98 *size = 0;
99 return -1;
100}
101
102void mbtk_gnss_time_check(time_t _time)
103{
104 long diff = 0;
105 struct timeval time;
106 gettimeofday(&time, NULL);
107 time_t sys_time = time.tv_sec;
108 time_t gps_time = _time;
109
110 if(gps_time > sys_time)
111 {
112 diff = gps_time - sys_time;
113 }
114 else
115 {
116 diff = sys_time - gps_time;
117 }
118
119 gnss_test_log("sys time[%ld], gps time[%ld], diff time[%ld]", sys_time, gps_time, diff);
120}
121
122int mbtk_check_num(void)
123{
124 if(mbtk_rmc_num < GNSS_TIME_CHECK_NUM)
125 {
126 mbtk_rmc_num++;
127 return 1;
128 }
129
130 mbtk_rmc_num = 0;
131 return 0;
132}
133
134void gnss_test_log(const char* format, ...)
135{
136 int ret;
137
138 if(log_file_fd < 0)
139 {
140 ret = log_file_init(&log_file_fd, &log_file_size, false);
141 if(ret < 0)
142 {
143 LOGE("log_file_init fail.");
144 return;
145 }
146 else
147 {
148 LOGE("log fd: [%d], log size: [%ld].", log_file_fd, log_file_size);
149 }
150 }
151
152 char tmp[50] = {0};
153 char param_buf[1024] = {0};
154 int length = 0;
155 char write_buf[1096] = {0};
156 int write_length = 0;
157
158 va_list ap;
159 struct timeval log_time;
160
161 va_start(ap, format);
162 length = vsnprintf(param_buf, 1023, format, ap);
163 va_end(ap);
164
165 if (length < 0 || 0 == length)
166 {
167 LOGE("vsnprintf fail.");
168 return;
169 }
170 else
171 {
172 if(param_buf[length - 1] != '\n')
173 {
174 param_buf[length] = '\n';
175 }
176 }
177
178 gettimeofday(&log_time, NULL);
179 struct tm* tm_t = localtime(&(log_time.tv_sec));
180 strftime(tmp, 50, "%F %T", tm_t);
181
182 write_length = snprintf(write_buf, 1096, "[%s %03d]--->%s", tmp, (int)(log_time.tv_usec / 1000), param_buf);
183 if(write_length <= 0)
184 {
185 LOGE("snprintf fail.");
186 return;
187 }
188
189 if((log_file_size + write_length) > GNSS_LOG_FILE_MAX_SIZE)
190 {
191 close(log_file_fd);
192 log_file_fd = -1;
193 log_file_size = 0;
194
195 ret = log_file_init(&log_file_fd, &log_file_size, true);
196 if(ret < 0)
197 {
198 LOGE("log_file_init fail.");
199 goto error;
200 }
201 else
202 {
203 LOGE("log fd: [%d], log size: [%ld].", log_file_fd, log_file_size);
204 }
205 }
206
207 ret = write(log_file_fd, write_buf, write_length);
208 if(ret == write_length)
209 {
210 log_file_size += ret;
211 }
212 else
213 {
214 goto error;
215 }
216
217
218 if (log_file_fd > 2)
219 {
220 fsync(log_file_fd);
221 }
222 return;
223error:
224 if(log_file_fd > 0)
225 {
226 close(log_file_fd);
227 log_file_fd = -1;
228 }
229 log_file_size = 0;
230 return;
231}