Add mbtk_gnssd

Change-Id: I2e3bc0b7c9cc310c04a4fbcbe809c525b0cfafbe
diff --git a/mbtk/mbtk_gnssd/gnss_utils.c b/mbtk/mbtk_gnssd/gnss_utils.c
new file mode 100755
index 0000000..e0fa746
--- /dev/null
+++ b/mbtk/mbtk_gnssd/gnss_utils.c
@@ -0,0 +1,318 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "mbtk_type.h"
+#include "mbtk_log.h"
+
+#define DATABITS    CS8
+#define STOPBITS    0
+#define PARITYON    0
+#define PARITY      0
+#define MBTK_SLAVE_DEV_NAME_MAX_LEN       24
+
+int uart_baud_get(int baud)
+{
+    int rate = 0;
+    switch(baud)
+    {
+        case 300:
+            rate = B300;
+            break;
+        case 600:
+            rate = B600;
+            break;
+        case 1200:
+            rate = B1200;
+            break;
+        case 2400:
+            rate = B2400;
+            break;
+        case 4800:
+            rate = B4800;
+            break;
+        case 9600:
+            rate = B9600;
+            break;
+        case 19200:
+            rate = B19200;
+            break;
+        case 38400:
+            rate = B38400;
+            break;
+        case 57600:
+            rate = B57600;
+            break;
+        case 115200:
+            rate = B115200;
+            break;
+        case 230400:
+            rate = B230400;
+            break;
+        case 460800:
+            rate = B460800;
+            break;
+        case 921600:
+            rate = B921600;
+            break;
+        case 1500000:
+            rate = B1500000;
+            break;
+        case 2000000:
+            rate = B2000000;
+            break;
+        case 3000000:
+            rate = B3000000;
+            break;
+        case 4000000:
+            rate = B4000000;
+            break;
+        default:
+            rate = B115200;
+            break;
+    }
+
+    return rate;
+}
+
+int gnss_port_open(const char *dev, int flag, int baud, bool tty)
+{
+
+    int fd = -1;
+    if((fd = open(dev, flag)) < 0)
+    {
+        LOGE("Open %s fail errno = [%d].", dev, errno);
+        return -1;
+    }
+
+    LOGD("Open %s success.", dev);
+    if (tty)
+    {
+        int rate = uart_baud_get(baud);
+        /* set newtio */
+        struct termios newtio;
+        memset(&newtio, 0, sizeof(newtio));
+        //(void)fcntl(fd, F_SETFL, 0);
+        /* no flow control for uart by default */
+        newtio.c_cflag = rate | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
+        newtio.c_iflag = IGNPAR;
+        //newtio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
+        newtio.c_oflag = 0;
+        newtio.c_lflag = 0;    /* disable ECHO, ICANON, etc... */
+
+        newtio.c_cc[VERASE]   = 0x8;      /* del */
+        newtio.c_cc[VEOF]     = 4;      /* Ctrl-d */
+        newtio.c_cc[VMIN]     = 1;      /* blocking read until 1 character arrives */
+        newtio.c_cc[VEOL]     = 0xD;      /* '\0' */
+
+        tcflush(fd, TCIOFLUSH);
+        tcsetattr(fd, TCSANOW, &newtio);
+    }
+
+    return fd;
+}
+
+int gnss_port_close(int fd)
+{
+    if(fd > 0)
+    {
+        close(fd);
+    }
+    return 0;
+}
+
+int gnss_set_baudrate(int fd, int baudrate)
+{
+	struct termios options, oldtio;
+
+	if(fcntl(fd, F_SETFL, 0) < 0) {
+		LOGE("fcntl failed!");
+		return -1;
+	}
+
+	if(tcgetattr(fd, &oldtio) != 0) {
+		LOGE("setup serial error!");
+		return -1;
+	}
+
+	/* Get the current options for the port... */
+	tcgetattr(fd, &options);
+
+	/* Set the baud rates to baudrate... */
+	cfsetispeed(&options,baudrate);
+	cfsetospeed(&options,baudrate);
+	tcsetattr(fd, TCSANOW, &options);
+
+	if (0 != tcgetattr(fd, &options))
+	{
+		LOGE("get options error!");
+		return -1;
+	}
+
+	/*
+	 * 8bit Data,no partity,1 stop bit...
+	 */
+	options.c_cflag &= ~PARENB;//无奇偶校验
+	options.c_cflag &= ~CSTOPB;//停止位,1位
+	options.c_cflag &= ~CSIZE; //数据位的位掩码
+	options.c_cflag |= CS8;    //数据位,8位
+
+	cfmakeraw(&options);
+
+	/*
+	 * Set the new options for the port...
+	 */
+	if (tcsetattr(fd, TCSANOW, &options) != 0)
+	{
+		LOGE("setup serial error!");
+		return -1 ;
+	}
+
+	return 0 ;
+}
+
+uint16 get_crc16(const char *ptr, uint16 count)
+{
+	uint16 crc, i;
+
+	crc = 0;
+	while(count--)
+	{
+		crc = crc ^ (int) *ptr++ << 8;
+
+		for(i = 0; i < 8; i++)
+		{
+			if(crc & 0x8000)
+				crc = crc << 1 ^ 0x1021;
+			else
+				crc = crc << 1;
+		}
+	}
+
+	return (crc & 0xFFFF);
+}
+
+int gnss_pty_open(int *master_fd, int *slave_fd, const char *dev)
+{
+    int flags = -1;
+    int ret = -1;
+    if(*master_fd > 0) {
+        LOGD("PTY has inited.");
+        return 0;
+    }
+    char spty_name[MBTK_SLAVE_DEV_NAME_MAX_LEN] = {0};
+    int result = openpty(master_fd, slave_fd, spty_name, NULL, NULL);
+    if (-1 == result) {
+        LOGE("Failed to get a pty.");
+        return -1;
+    }
+
+    LOGD("Get a pty pair, FD -- master[%d] slave[%d]", *master_fd, *slave_fd);
+    LOGD("Slave name is:%s", spty_name);
+
+    if(access(dev, F_OK) == -1)
+    {
+        LOGD("symlink %s -> %s", spty_name, dev);
+        result = symlink(spty_name, dev);
+        if (-1 == result) {
+            LOGE("symlink error.");
+            goto ERROR;
+        }
+    }
+
+    flags = fcntl(*master_fd, F_GETFL);
+    if (flags == -1)
+    {
+        LOGE("fcntl get error.");
+        goto ERROR;
+    }
+    flags |= O_NONBLOCK;
+    flags |= O_NOCTTY;
+    ret = fcntl(*master_fd, F_SETFL, flags);
+    if(ret == -1)
+    {
+        LOGE("fcntl set error.");
+        goto ERROR;
+    }
+
+    if (1) {
+		/* set newtio */
+		struct termios newtio;
+		memset(&newtio, 0, sizeof(newtio));
+		/* no flow control for uart by default */
+		newtio.c_cflag = B115200 | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
+		newtio.c_iflag = IGNPAR;
+                //newtio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
+		newtio.c_oflag = 0;
+		newtio.c_lflag = 0;    /* disable ECHO, ICANON, etc... */
+
+		newtio.c_cc[VERASE]   = 0x8;      /* del */
+		newtio.c_cc[VEOF]     = 4;      /* Ctrl-d */
+		newtio.c_cc[VMIN]     = 1;      /* blocking read until 1 character arrives */
+		newtio.c_cc[VEOL]     = 0xD;      /* '\0' */
+
+		tcflush(*master_fd, TCIFLUSH);
+		tcsetattr(*master_fd, TCSANOW, &newtio);
+	}
+    return 0;
+
+ERROR:
+    if (0 < *master_fd) {
+        close(*master_fd);
+        *master_fd = -1;
+    }
+
+    if (0 < *slave_fd) {
+        close(*slave_fd);
+        *slave_fd = -1;
+    }
+
+    return -1;
+}
+
+int gnss_nmea_sscanf(const char *str, char *ret,...)
+{
+    const char *ptr = str;
+    char *argv[16];
+    int argc;
+    va_list ap;
+    int i = 0;
+
+    va_start(ap, ret);
+    argc = 0;
+    argv[argc] = ret; // First arg.
+
+    do {
+        i = 0;
+        while(*ptr && *ptr != ',' && *ptr != '*') {
+            argv[argc][i++] = *ptr++;
+        }
+        ptr++; // Jump ',' or '*'
+        argc++;
+    } while((argv[argc] = va_arg(ap, char*)) != 0);
+
+    va_end(ap);
+
+    return argc;
+}
+
+void gnssStartTimer(struct uloop_timeout *timeout, int timeVal)
+{
+    //UNUSED(timeout);
+    LOGD("%s: timeVal=%lu.", __FUNCTION__, timeVal);
+    uloop_timeout_set(timeout, timeVal);
+    return;
+}
+
+void gnssStopTimer(struct uloop_timeout *timeout)
+{
+    //UNUSED(timeout);
+    uloop_timeout_cancel(timeout);
+    return;
+}
+