| /* | |
| * gnss_log.c | |
| * | |
| * gnss test log. | |
| * | |
| */ | |
| /****************************************************************************** | |
| EDIT HISTORY FOR FILE | |
| WHEN WHO WHAT,WHERE,WHY | |
| -------- -------------- ------------------------------------------------------- | |
| 2024/9/6 wangyouqiang Initial version | |
| ******************************************************************************/ | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <sys/types.h> | |
| #include <sys/stat.h> | |
| #include <fcntl.h> | |
| #include <unistd.h> | |
| #include <stdarg.h> | |
| #include <sys/time.h> | |
| #include <errno.h> | |
| #include <time.h> | |
| #include "gnss_log.h" | |
| #include "mbtk_log.h" | |
| #include "mbtk_utils.h" | |
| #define GNSS_LOG_FOLDER_PATH "/user_data/mbtk_log" | |
| #define GNSS_LOG_FILE_PATH "/user_data/mbtk_log/mbtk_gnss_log.txt" | |
| #define GNSS_LOG_LAST_FILE_PATH "/user_data/mbtk_log/mbtk_gnss_last_log.txt" | |
| #define GNSS_LOG_GNSS_FILE_HEAD "\n[-------------------mbtk gnss log V1.0-------------------][%ld]\n" | |
| #define GNSS_LOG_FILE_MAX_SIZE 10485760 //10 * 1024 * 1024 10M | |
| #define GNSS_TIME_CHECK_NUM 10 | |
| static int log_file_fd = -1; | |
| static long log_file_size = 0; | |
| static int mbtk_rmc_num = 0; | |
| static int log_file_init(int *fd, long *size, bool mv_flag) | |
| { | |
| int head_len = 0; | |
| int ret = -1; | |
| if(access(GNSS_LOG_FOLDER_PATH, F_OK) != 0) | |
| { | |
| ret = mkdir(GNSS_LOG_FOLDER_PATH, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); | |
| if (ret != 0) | |
| { | |
| LOGE("Failed to create folder."); | |
| return -1; | |
| } | |
| } | |
| if(access(GNSS_LOG_FILE_PATH, F_OK) == 0 && mv_flag) | |
| { | |
| char cmd[128] = {0}; | |
| memset(cmd, 0x0, 128); | |
| snprintf(cmd, 128, "mv %s %s", GNSS_LOG_FILE_PATH, GNSS_LOG_LAST_FILE_PATH); | |
| LOGE("cmd: [%s].", cmd); | |
| mbtk_system(cmd); | |
| } | |
| *fd = open(GNSS_LOG_FILE_PATH, O_CREAT | O_WRONLY | O_APPEND | O_NONBLOCK, 0644); | |
| if(*fd < 0) | |
| { | |
| LOGE("Open file fail [errno = %d].", errno); | |
| return -1; | |
| } | |
| else | |
| { | |
| char temp[128] = {0}; | |
| struct stat st; | |
| stat(GNSS_LOG_FILE_PATH, &st); | |
| *size = st.st_size; | |
| snprintf(temp, 128, GNSS_LOG_GNSS_FILE_HEAD, *size); | |
| head_len = (int)strlen(temp); | |
| ret = write(*fd, temp, head_len); | |
| if(ret == head_len) | |
| { | |
| *size += ret; | |
| } | |
| else | |
| { | |
| LOGE("write head fail [errno = %d].", errno); | |
| goto error; | |
| } | |
| } | |
| return 0; | |
| error: | |
| if(*fd > 0) { | |
| close(*fd); | |
| *fd = -1; | |
| } | |
| *size = 0; | |
| return -1; | |
| } | |
| void mbtk_gnss_time_check(time_t _time) | |
| { | |
| long diff = 0; | |
| struct timeval time; | |
| gettimeofday(&time, NULL); | |
| time_t sys_time = time.tv_sec; | |
| time_t gps_time = _time; | |
| if(gps_time > sys_time) | |
| { | |
| diff = gps_time - sys_time; | |
| } | |
| else | |
| { | |
| diff = sys_time - gps_time; | |
| } | |
| gnss_test_log("sys time[%ld], gps time[%ld], diff time[%ld]", sys_time, gps_time, diff); | |
| } | |
| int mbtk_check_num(void) | |
| { | |
| if(mbtk_rmc_num < GNSS_TIME_CHECK_NUM) | |
| { | |
| mbtk_rmc_num++; | |
| return 1; | |
| } | |
| mbtk_rmc_num = 0; | |
| return 0; | |
| } | |
| void gnss_test_log(const char* format, ...) | |
| { | |
| int ret; | |
| if(log_file_fd < 0) | |
| { | |
| ret = log_file_init(&log_file_fd, &log_file_size, false); | |
| if(ret < 0) | |
| { | |
| LOGE("log_file_init fail."); | |
| return; | |
| } | |
| else | |
| { | |
| LOGE("log fd: [%d], log size: [%ld].", log_file_fd, log_file_size); | |
| } | |
| } | |
| char tmp[50] = {0}; | |
| char param_buf[1024] = {0}; | |
| int length = 0; | |
| char write_buf[1096] = {0}; | |
| int write_length = 0; | |
| va_list ap; | |
| struct timeval log_time; | |
| va_start(ap, format); | |
| length = vsnprintf(param_buf, 1023, format, ap); | |
| va_end(ap); | |
| if (length < 0 || 0 == length) | |
| { | |
| LOGE("vsnprintf fail."); | |
| return; | |
| } | |
| else | |
| { | |
| if(param_buf[length - 1] != '\n') | |
| { | |
| param_buf[length] = '\n'; | |
| } | |
| } | |
| gettimeofday(&log_time, NULL); | |
| struct tm* tm_t = localtime(&(log_time.tv_sec)); | |
| strftime(tmp, 50, "%F %T", tm_t); | |
| write_length = snprintf(write_buf, 1096, "[%s %03d]--->%s", tmp, (int)(log_time.tv_usec / 1000), param_buf); | |
| if(write_length <= 0) | |
| { | |
| LOGE("snprintf fail."); | |
| return; | |
| } | |
| if((log_file_size + write_length) > GNSS_LOG_FILE_MAX_SIZE) | |
| { | |
| close(log_file_fd); | |
| log_file_fd = -1; | |
| log_file_size = 0; | |
| ret = log_file_init(&log_file_fd, &log_file_size, true); | |
| if(ret < 0) | |
| { | |
| LOGE("log_file_init fail."); | |
| goto error; | |
| } | |
| else | |
| { | |
| LOGE("log fd: [%d], log size: [%ld].", log_file_fd, log_file_size); | |
| } | |
| } | |
| ret = write(log_file_fd, write_buf, write_length); | |
| if(ret == write_length) | |
| { | |
| log_file_size += ret; | |
| } | |
| else | |
| { | |
| goto error; | |
| } | |
| if (log_file_fd > 2) | |
| { | |
| fsync(log_file_fd); | |
| } | |
| return; | |
| error: | |
| if(log_file_fd > 0) | |
| { | |
| close(log_file_fd); | |
| log_file_fd = -1; | |
| } | |
| log_file_size = 0; | |
| return; | |
| } |