[Feature][T8TSK-289]merge sync time and output to elt from zk

Only Configure: No
Affected branch: LYNQ_PUBLIC
Affected module: gnss
Is it affected on both ZXIC and MTK: only MTK
Self-test: No
Doc Update: No

Change-Id: Ic8d54a7658c651cad23b23f25c71577c2e656abe
diff --git a/IC_meta/mtk/2735/liblynq-gnss/liblynq-gnss.bb b/IC_meta/mtk/2735/liblynq-gnss/liblynq-gnss.bb
index fbe7ce6..d9c78b8 100755
--- a/IC_meta/mtk/2735/liblynq-gnss/liblynq-gnss.bb
+++ b/IC_meta/mtk/2735/liblynq-gnss/liblynq-gnss.bb
@@ -17,6 +17,12 @@
                 'TARGET_PLATFORM = ${TARGET_PLATFORM}'"

 

 

+MOBILETEK_GNSS_ELT_OUTPUT_CFG ?= "no"

+EXTRA_OEMAKE += "'MOBILETEK_GNSS_ELT_OUTPUT_CFG = ${MOBILETEK_GNSS_ELT_OUTPUT_CFG}'"

+

+MOBILETEK_GNSS_SYNC_TIME_CFG ?= "no"

+EXTRA_OEMAKE += "'MOBILETEK_GNSS_SYNC_TIME_CFG = ${MOBILETEK_GNSS_SYNC_TIME_CFG}'"

+

 FILES_${PN} = "${base_libdir}/*.so \

                ${base_bindir}\

                ${base_sbindir} \

@@ -62,4 +68,4 @@
 addtask bachclean

 do_bachclean () {

     oe_runmake clean

-}
\ No newline at end of file
+}

diff --git a/IC_src/mtk/lib/liblynq-gnss/include/lynq_gnss.h b/IC_src/mtk/lib/liblynq-gnss/include/lynq_gnss.h
index 362baaf..fac71b0 100755
--- a/IC_src/mtk/lib/liblynq-gnss/include/lynq_gnss.h
+++ b/IC_src/mtk/lib/liblynq-gnss/include/lynq_gnss.h
@@ -7,7 +7,7 @@
 

 #include "gpshal.h"

 #include "hal2mnl_interface.h"

-

+#define DEV "/dev/ttyGS3"

 typedef enum{

     LYNQ_MODE_GPS_GLONASS = 0,

     LYNQ_MODE_GPS_BEIDOU,

diff --git a/IC_src/mtk/lib/liblynq-gnss/makefile b/IC_src/mtk/lib/liblynq-gnss/makefile
index f1ca7fc..fcf6780 100755
--- a/IC_src/mtk/lib/liblynq-gnss/makefile
+++ b/IC_src/mtk/lib/liblynq-gnss/makefile
@@ -32,8 +32,19 @@
 	-lcutils \

 	-lgnsshal \

 	-lpthread \

+	-llynq-uci \

 #    -llynq-log \

 

+

+

+ifeq ($(strip $(MOBILETEK_GNSS_ELT_OUTPUT_CFG)), yes)

+    LOCAL_CFLAGS += -DGNSS_ELT_OUTPUT_CFG

+endif

+

+ifeq ($(strip $(MOBILETEK_GNSS_SYNC_TIME_CFG)), yes)

+    LOCAL_CFLAGS += -DGNSS_SYNC_TIME_CFG

+endif

+

 $(warning libs=$(LOCAL_LIBS))

 

 CXXSRC=\

diff --git a/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c b/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c
index b8a402f..59a866a 100755
--- a/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c
+++ b/IC_src/mtk/lib/liblynq-gnss/src/lynq_callback.c
@@ -3,11 +3,26 @@
 #include<unistd.h>

 #include<errno.h>

 #include<string.h>

+#include <sys/time.h>

+#include <time.h>

+#include <log/log.h>

+#include <sys/types.h>

+#include <fcntl.h>

+#include <sys/stat.h>

+#include <time.h>

 

 #include"lynq_gnsshal.h"

 #include"mtk_lbs_utility.h"

 #include"lynq_gnss.h"

 

+#define NMEA_ACC "ACCURACY"

+#define NMEA_GSA "GSA"

+#define NMEA_RMC "RMC"

+#define NMEA_GGA "GGA"

+#define NMEA_VTG "VTG"

+#define NMEA_GSV "GSV"

+

+time_t reopen_start;

 extern lynq_gnss_cb* lynq_callbacks;

 extern lynq_raw_gnss_cbs *lynq_meas_callbacks;

 

@@ -40,9 +55,89 @@
 {

 

 }

+#ifdef GNSS_SYNC_TIME_CFG

+extern int g_gnss_sync_enable_flag;

+extern int g_gnss_sync_done;

+#endif

+#ifdef GNSS_ELT_OUTPUT_CFG

+extern int g_ttyGS_fd;

+extern bool Open_ELT;

+#endif

+

+static inline int update_systime_time(GpsUtcTime gpstime)

+{

+    struct timeval tv;

+    int ret = gettimeofday(&tv, NULL);

+    if (ret == -1) {

+        perror("gettimeofday");

+        return -1;

+    }

+    if (tv.tv_sec == gpstime / 1000)

+    {

+        return 0;

+    }

+    printf("Now: %ld.%06ld\n", tv.tv_sec, tv.tv_usec);

+    tv.tv_sec = gpstime / 1000;

+    tv.tv_usec = (gpstime % 1000) * 1000;

+    ret = settimeofday(&tv, NULL);

+    if (ret == -1) {

+        perror("settimeofday");

+        return -1;

+    }

+

+    return 0;

+}

 

 void lynq_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)

 {

+#ifdef GNSS_ELT_OUTPUT_CFG

+    int ret;

+    time_t reopen_end;

+#endif

+#ifdef GNSS_SYNC_TIME_CFG

+    if (g_gnss_sync_enable_flag == 1 && g_gnss_sync_done == 0)

+    {

+        if( strncmp(nmea+3,NMEA_RMC,strlen(NMEA_RMC)) == 0 && nmea[18] == 'A')

+        {

+            if (update_systime_time(timestamp) == 0)

+            {

+                g_gnss_sync_done = 1;

+            }

+        }

+    }

+#endif

+#ifdef GNSS_ELT_OUTPUT_CFG

+    if(Open_ELT)

+    {

+        if(g_ttyGS_fd >= 0)

+        {

+            ret = write(g_ttyGS_fd,nmea,length);

+            if(ret<0)

+            {

+                close(g_ttyGS_fd);

+                g_ttyGS_fd = -1;

+                reopen_start = time(NULL);

+            }

+        }

+

+        else

+        {

+            reopen_end = time(NULL);

+            if(difftime(reopen_end,reopen_start) > 3)

+            {

+                g_ttyGS_fd= open(DEV, O_RDWR | O_NOCTTY | O_NDELAY);

+                if(g_ttyGS_fd < 0)

+                {

+                    reopen_start = time(NULL);

+                }

+                else

+                {

+                    RLOGD("Open dev success\n");

+                }

+            }

+        }

+    }

+#endif

     lynq_callbacks->lynq_nmea_cb(timestamp,nmea,length);

 

 }

@@ -153,13 +248,6 @@
 

 }

 

-#define NMEA_ACC "ACCURACY"

-#define NMEA_GSA "GSA"

-#define NMEA_RMC "RMC"

-#define NMEA_GGA "GGA"

-#define NMEA_VTG "VTG"

-#define NMEA_GSV "GSV"

-

 void lynq_at_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)

 {

     if (at_gpsnmea_status == 1)

diff --git a/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c b/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c
index a812738..6c8ba42 100755
--- a/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c
+++ b/IC_src/mtk/lib/liblynq-gnss/src/lynq_gnss.c
@@ -16,6 +16,9 @@
 #include <pthread.h>

 #include <log/log.h>

 #include <stdlib.h>

+#include <sys/types.h>

+#include <fcntl.h>

+#include <sys/stat.h>

 

 #include "lynq_gnss.h"

 #include "gpshal.h"

@@ -24,6 +27,7 @@
 #include "mtk_lbs_utility.h"

 #include "lynq_prop.h"

 #include "mnldinf_utility.h"

+#include "include/lynq_uci.h"

 

 #define LOG_TAG "LYNQ_GNSS"

 

@@ -43,13 +47,22 @@
 static int g_lynq_gnss_init_flag = 0;

 

 static int g_lynq_gnss_calback_flag = 0;

-

+#ifdef GNSS_SYNC_TIME_CFG

+int g_gnss_sync_enable_flag = 0;

+int g_gnss_sync_done = 0;

+#endif

 /**

  * @brief mark gnss raw meas state

  * 0: deinit state

  * 1: init state

  */

 static int g_lynq_gnss_raw_meas_flag = 0;

+int at_gps_status = 0;

+int at_gpsnmea_status = 0;

+#ifdef GNSS_ELT_OUTPUT_CFG

+int g_ttyGS_fd= -1;

+bool Open_ELT = true;

+#endif

 

 int lynq_gnss_init(void)

 {

@@ -67,6 +80,16 @@
     gpshal_set_gps_state_intent(GPSHAL_STATE_INIT);

     gpshal2mnl_gps_init();

     g_gpshal_ctx.mnl_retry_timer = mnldinf_init_timer(gpshal_mnl_retry_routine);

+#ifdef GNSS_ELT_OUTPUT_CFG

+    if(Open_ELT)

+    {

+        g_ttyGS_fd= open(DEV, O_RDWR | O_NOCTTY | O_NDELAY);

+        if(g_ttyGS_fd < 0)

+        {

+            RLOGD("Open dev fail");

+        }

+    }

+#endif

     return 0;

 }

 

@@ -132,6 +155,13 @@
     RLOGD("timer de init end");

     g_lynq_gnss_calback_flag = 0;

     g_lynq_gnss_init_flag = 0;

+#ifdef GNSS_ELT_OUTPUT_CFG

+    if(g_ttyGS_fd >= 0)

+    {

+        close(g_ttyGS_fd);

+        g_ttyGS_fd = -1;

+    }

+#endif

     return 0;

 }

 

@@ -142,6 +172,12 @@
         RLOGD("start is not allowed");

         return -1;

     }

+#ifdef GNSS_SYNC_TIME_CFG

+    char gnss_sync_enable[24] = "";

+    lynq_get_value("lynq_uci", "lynq_sync_time", "lynq_gnss_sync_time_enable" , gnss_sync_enable);

+    g_gnss_sync_enable_flag = atoi(gnss_sync_enable);

+    g_gnss_sync_done = 0;

+#endif

     //memset(&lynq_debug_data, 0, sizeof(DebugData));

     gpshal_set_gps_state_intent(GPSHAL_STATE_START);

     gpshal2mnl_gps_start();

@@ -353,8 +389,6 @@
 int lynq_at_cgps(int at_type,char *at_paramter);

 int lynq_at_cgpsnmea(int at_type,char *at_paramter);

 

-int at_gps_status = 0;

-int at_gpsnmea_status = 0;

 

 int strUpper(char * str)

 {

@@ -527,6 +561,9 @@
         }

         if (at_gps_status == 0)

         {

+#ifdef GNSS_ELT_OUTPUT_CFG

+            Open_ELT = true;

+#endif

             ret = lynq_gnss_stop();

             if (ret != 0)

             {

@@ -545,6 +582,9 @@
         }

         else if(at_gps_status == 1)

         {

+#ifdef GNSS_ELT_OUTPUT_CFG

+            Open_ELT = false;

+#endif

             lynq_at_callbacks = lynq_at_get__gnss_callbacks();

             ret = lynq_gnss_callback_reg(lynq_at_callbacks);

             if (ret != 0)