[Feature] add GA346 baseline version
Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/connectivity/gps/2.0/gpslog/gpslog.c b/src/connectivity/gps/2.0/gpslog/gpslog.c
new file mode 100644
index 0000000..be845ad
--- /dev/null
+++ b/src/connectivity/gps/2.0/gpslog/gpslog.c
@@ -0,0 +1,277 @@
+#include <stdio.h> /* Standard input/output definitions */
+#include <stdbool.h> /* Standard bool true/false definitions */
+#include <string.h> /* String function definitions */
+#include <unistd.h> /* UNIX standard function definitions */
+#include <fcntl.h> /* File control definitions */
+#include <errno.h> /* Error number definitions */
+#include <termios.h> /* POSIX terminal control definitions */
+#include <time.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <netdb.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <sys/epoll.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <strings.h>
+#include <semaphore.h>
+
+#include "gpslog_log.h"
+#include "gpslog_utility.h"
+#include "gpslog_socket_utils.h"
+#include "gpslog_socket_data_coder.h"
+
+#define GPSLOG_UDP_ADDR "mtk_lbs_log_v2s"
+
+#define PRINT_TITLE(...) { printf("\E[0;30;43m"); printf(__VA_ARGS__); printf("\E[0m"); fflush(stdout); }
+#define PRINT_RAW(...) { printf(__VA_ARGS__); fflush(stdout);}
+
+#define GPSLOG_INTERFACE_BUFF_SIZE (80*1024)
+#define GPSLOG_PATH_SIZE (256)
+
+typedef enum {
+ GPSLOG_OPEN_LOG = 0,
+ GPSLOG_CLOSE_LOG = 1,
+ GPSLOG_WRITE_LOG = 2,
+} gpslog_msg_id;
+
+typedef struct {
+ char* sock_addr;
+}log_db;
+
+log_db gpslog_db;
+
+typedef struct {
+ bool (*create_logfile)(const char* path);
+ bool (*write_logdata)(char* data, int len);
+ bool (*close_logfile)();
+} gpslog_inf;
+
+static bool gpslog_handle_open_logfile(const char* file_name) {
+ time_t tm;
+ struct tm *p = NULL;
+ char full_file_name[256] = {0};
+
+ if (time(&tm)==((time_t)-1)) {
+ LOGE("time() fail(%s)!!\r\n", strerror(errno));
+ }
+ p = localtime(&tm);
+
+ if(p == NULL) {
+ LOGE("Get localtime fail:[%s]%d", strerror(errno), errno);
+ return false;
+ }
+
+ snprintf(full_file_name, sizeof(full_file_name), "%s_%04d_%02d%02d_%02d%02d%02d", file_name,
+ 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday,
+ p->tm_hour, p->tm_min, p->tm_sec);
+
+ PRINT_RAW("\r\n==============GPSLog start, %s=============\r\n", full_file_name);
+ return true;
+}
+
+static bool gpslog_handle_write_logdata(char* data, int len) {
+ //PRINT_RAW("%s", data);
+ if(write(STDOUT_FILENO, data, len) != len) {
+ LOGW("STDOUT print fail:[le:%d][%s]", len, data);
+ return false;
+ }
+ return true;
+}
+
+static bool gpslog_handle_close_logfile() {
+ PRINT_RAW("\r\n==============GPSLog end=============\r\n");
+ return true;
+}
+
+static gpslog_inf gpslog_handler_interface = {
+ gpslog_handle_open_logfile,
+ gpslog_handle_write_logdata,
+ gpslog_handle_close_logfile
+};
+
+char gpslog_buff[GPSLOG_INTERFACE_BUFF_SIZE] = {0};
+
+static bool gpslog_hdlr(int fd, log_db* database, gpslog_inf* hdlr) {
+ int offset = 0;
+
+ gpslog_msg_id cmd;
+ int ptype;
+ int log_type;
+ int read_len = 0;
+ bool ret = true;
+
+ if (NULL == database) {
+ LOGE("gpslog_hdlr, database not valid");
+ return false;
+ }
+
+ if (NULL == hdlr) {
+ LOGE("[%s]gpslog_hdlr, hdlr not valid", database->sock_addr);
+ return false;
+ }
+
+ if (fd < 0) {
+ LOGE("[%s]gpslog_hdlr, fd not valid", database->sock_addr);
+ return false;
+ }
+ memset(gpslog_buff, 0, sizeof(gpslog_buff));
+ read_len = gpslog_safe_recv(fd, gpslog_buff, sizeof(gpslog_buff)-1);
+ if (read_len <= 0) {
+ LOGE("[%s]gpslog_hdlr() gpslog_safe_recv() failed read_len=%d", database->sock_addr, read_len);
+ return false;
+ }
+ ptype = gpslog_socket_get_int(gpslog_buff, &offset);
+ UNUSED(ptype);
+ cmd = gpslog_socket_get_int(gpslog_buff, &offset);
+ log_type = gpslog_socket_get_int(gpslog_buff, &offset);
+ UNUSED(log_type);
+
+ switch (cmd) {
+ case GPSLOG_OPEN_LOG: {
+ if (hdlr->create_logfile) {
+ char path[GPSLOG_PATH_SIZE] = {0};
+ //gpslog_socket_get_string(gpslog_buff, &offset, path, sizeof(path));
+ sprintf(path, "GPSHostLog");
+ if (!hdlr->create_logfile(path)) {
+ LOGE("[%s]gpslog_hdlr() create_logfile fail", database->sock_addr);
+ }
+ } else {
+ LOGE("[%s]gpslog_hdlr() create_logfile is NULL", database->sock_addr);
+ ret = false;
+ }
+ break;
+ }
+
+ case GPSLOG_WRITE_LOG: {
+ if (hdlr->write_logdata) {
+ unsigned int len_logdata = gpslog_socket_get_int(gpslog_buff, &offset);
+ if (len_logdata <= GPSLOG_INTERFACE_BUFF_SIZE) {
+ if (!hdlr->write_logdata(gpslog_buff+offset, len_logdata)) {
+ LOGE("[%s]gpslog_hdlr() write_logdata fail", database->sock_addr);
+ }
+ } else {
+ LOGE("[%s]gpslog_hdlr() len_logdata:%u overflow", database->sock_addr, len_logdata);
+ ret = false;
+ }
+ } else {
+ LOGE("[%s]gpslog_hdlr() write_logdata is NULL", database->sock_addr);
+ ret = false;
+ }
+ break;
+ }
+
+ case GPSLOG_CLOSE_LOG: {
+ if (hdlr->close_logfile) {
+ if (!hdlr->close_logfile()) {
+ LOGE("[%s]gpslog_hdlr() close_logfile fail", database->sock_addr);
+ }
+ } else {
+ LOGE("[%s]gpslog_hdlr() close_logfile is NULL", database->sock_addr);
+ ret = false;
+ }
+ break;
+ }
+
+ default: {
+ LOGE("[%s]gpslog_hdlr() unknown cmd=%d", database->sock_addr, cmd);
+ ret = false;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static void* gpslog_write_thread(void *database)
+{
+ #define EPOLL_MAX_NUM 4
+ int fd = -1;
+ int i = 0;
+ int n = 0;
+ int epfd = epoll_create(EPOLL_MAX_NUM);
+ struct epoll_event events[EPOLL_MAX_NUM];
+ log_db* data = (log_db*)database;
+
+ if (NULL == data) {
+ LOGE("gpslog_write_thread exit, database not valid");
+ return 0;
+ }
+
+ LOGD("[%s]gpslog_write_thread created", data->sock_addr);
+
+ if (-1 == epfd) {
+ LOGE("[%s]gpslog_write_thread epoll_create failure, reason=[%s]", data->sock_addr, strerror(errno));
+ return 0;
+ }
+
+ //fd = gpslog_socket_bind_udp(data->sock_addr);
+ fd = gpslog_socket_server_bind_local(data->sock_addr, SOCK_NS_ABSTRACT);
+
+ if (fd < 0) {
+ LOGE("[%s]gpslog_write_thread create fd failed, reason=[%s]", data->sock_addr, strerror(errno));
+ return 0;
+ }
+
+ if (gpslog_epoll_add_fd(epfd, fd) == -1) {
+ LOGE("[%s]gpslog_write_thread failed for fd_hal failed, reason=[%s]", data->sock_addr, strerror(errno));
+ return 0;
+ }
+
+ while (1) {
+ n = epoll_wait(epfd, events, EPOLL_MAX_NUM , -1);
+ if (-1 == n) {
+ if (errno == EINTR) {
+ continue;
+ } else {
+ LOGE("[%s]gpslog_write_thread epoll_wait failure reason=[%s]", data->sock_addr, strerror(errno));
+ return 0;
+ }
+ }
+ for (i = 0; i < n; i++) {
+ if (events[i].data.fd == fd) {
+ if (events[i].events & EPOLLIN) {
+ if (!gpslog_hdlr(fd, data, &gpslog_handler_interface)) {
+ LOGE("[%s]gpslog_hdlr failure reason=[%s]", data->sock_addr, strerror(errno));
+ }
+ }
+ } else {
+ LOGE("[%s]mnld_main_thread() unknown fd=%d", data->sock_addr, events[i].data.fd);
+ }
+ }
+ }
+ LOGE("[%s]gpslog_write_thread exit", data->sock_addr);
+ return 0;
+}
+
+static void gpslog_database_init() {
+ memset(&gpslog_db, 0x0, sizeof(gpslog_db));
+
+ //GPS LOG config
+ gpslog_db.sock_addr = GPSLOG_UDP_ADDR;
+}
+
+int gpslog_init() {
+ pthread_t pthread_gps;
+
+ LOGD("gpslog_init");
+ gpslog_database_init();
+
+ pthread_create(&pthread_gps, NULL, gpslog_write_thread, (char*)(&gpslog_db));
+ return 0;
+}
+
+int main(void) {
+ LOGD("LBS debug daemon begin running");
+ if (gpslog_init() != 0) {
+ LOGE("gpslog_init error, exit");
+ return -1;
+ }
+
+ gpslog_block_here();
+ return 0;
+}