[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)