gnss: add gnss async api

Change-Id: I439e1e4c41cfdb17133ecdffae04201efa0eeef9
diff --git a/mbtk/liblynq_lib/src/lynq_gnss.c b/mbtk/liblynq_lib/src/lynq_gnss.c
index bd910b2..51e586a 100755
--- a/mbtk/liblynq_lib/src/lynq_gnss.c
+++ b/mbtk/liblynq_lib/src/lynq_gnss.c
@@ -1,4 +1,6 @@
 #include <time.h>
+#include <pthread.h>
+
 #include "lynq_gnss.h"
 #include "mbtk_gnss_5311.h"
 
@@ -17,17 +19,28 @@
 
 static bool inited = FALSE;
 static int qser_info_handle_num = 0;
-static uint qser_h_sim = 0x5F6F7F8F;
+static uint32_t qser_h_sim = 0x5F6F7F8F;
 gnss_handler_func_t qser_gnss_callback = NULL;
 e_msg_id_t qser_gnss_msg_type = E_MT_LOC_MSG_ID_NMEA_INFO;
 static time_t qser_gnss_time = 0;
 qser_gnss_info qser_agps_info_save = {0};
-
+gnss_async_func_t qser_gnss_async_callback = NULL;
 
 extern long timezone;
 /**********************************VARIABLE***********************************/
 
 /**********************************FUNC***********************************/
+static void qser_gnss_async_set_cb(gnss_async_func_t cb)
+{
+    qser_gnss_async_callback = cb;
+}
+
+static gnss_async_func_t qser_gnss_async_get_cb(void)
+{
+    return qser_gnss_async_callback;
+}
+
+
 static time_t qser_get_timestamp(char *time)
 {
     char tmp_char[4] = {0};
@@ -152,6 +165,25 @@
         //UNKNOWN
     }
 }
+
+static void* gnss_async_thread(void* arg)
+{
+    qser_gnss_error_e state = QSER_GNSS_ERROR_SUCCESS;
+    gnss_async_func_t cb = qser_gnss_async_get_cb();
+    int ret = qser_Gnss_Start(qser_h_sim);
+    if(ret != QSER_RESULT_SUCCESS)
+    {
+        LOGE("[qser_gnss] gnss_async_thread() fail.");
+        state = QSER_GNSS_ERROR_FAIL;
+    }
+
+    if(cb != NULL)
+    {
+        cb(state);
+    }
+    return NULL;
+}
+
 /**********************************FUNC***********************************/
 
 /**********************************API***********************************/
@@ -251,6 +283,12 @@
     return QSER_RESULT_SUCCESS;
 }
 
+int qser_Gnss_Set_Async_Callback(gnss_async_func_t cb)
+{
+    qser_gnss_async_set_cb(cb);
+    return QSER_RESULT_SUCCESS;
+}
+
 int qser_Gnss_Start (uint32_t h_gnss)
 {
     //UNUSED(h_gnss);
@@ -278,6 +316,36 @@
     return QSER_RESULT_SUCCESS;
 }
 
+int qser_Gnss_Start_Async(uint32_t h_gnss)
+{
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_sim)
+    {
+        LOGE("[qser_gnss] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    pthread_attr_t thread_attr;
+    pthread_t gnss_thread_id;
+    pthread_attr_init(&thread_attr);
+    if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
+    {
+        LOGE("[qser_gnss] pthread_attr_setdetachstate() fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    //memcpy(&qser_data_backup, data_call, sizeof(qser_data_call_s));
+    if(pthread_create(&gnss_thread_id, &thread_attr, gnss_async_thread, NULL))
+    {
+        LOGE("[qser_gnss] pthread_create() fail.");
+        return QSER_RESULT_FAIL;
+    }
+    pthread_attr_destroy(&thread_attr);
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+
 int qser_Gnss_Stop (uint32_t h_gnss)
 {
     //UNUSED(h_gnss);