gnss: add T108 agps api

Change-Id: If0efbf5fa712c01fd6b5ce5da7f9a201c8b125ae
diff --git a/mbtk/include/mbtk/mbtk_gnss_5311.h b/mbtk/include/mbtk/mbtk_gnss_5311.h
index 71ba515..f9badcd 100644
--- a/mbtk/include/mbtk/mbtk_gnss_5311.h
+++ b/mbtk/include/mbtk/mbtk_gnss_5311.h
@@ -59,4 +59,6 @@
 MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_get_status(const char *status_buf, int status_buf_len, int *get_status_len);
 MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_add_nmea_out_func(mbtk_gnss_nmea_func_t cb);
 MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_set_nmea_out_type(MBTK_GNSS_MSG_INFO_TYPE type);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_5311_download_tle(char *host, int alam_flag);
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_injectEphemeris(void);
 #endif
\ No newline at end of file
diff --git a/mbtk/lynq_lib/src/lynq_gnss.c b/mbtk/lynq_lib/src/lynq_gnss.c
index f62df24..bd910b2 100755
--- a/mbtk/lynq_lib/src/lynq_gnss.c
+++ b/mbtk/lynq_lib/src/lynq_gnss.c
@@ -2,16 +2,26 @@
 #include "lynq_gnss.h"
 #include "mbtk_gnss_5311.h"
 
+#define QSER_LEN_MAX 128
+
 #define QSER_RESULT_SUCCESS 0
 #define QSER_RESULT_FAIL -1
 
 /**********************************VARIABLE***********************************/
+typedef struct
+{
+    char host[QSER_LEN_MAX];
+    char id[QSER_LEN_MAX];
+    char passwd[QSER_LEN_MAX];
+}qser_gnss_info;
+
 static bool inited = FALSE;
 static int qser_info_handle_num = 0;
 static uint 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};
 
 
 extern long timezone;
@@ -167,7 +177,6 @@
     else
     {
         qser_info_handle_num++;
-        inited = TRUE;
     }
     *h_gnss = qser_h_sim;
 
@@ -239,7 +248,6 @@
     }
 
     qser_gnss_msg_type = type;
-
     return QSER_RESULT_SUCCESS;
 }
 
@@ -253,14 +261,13 @@
     }
 
     MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
-    
+
     ret = mbtk_gnss_add_nmea_out_func(qser_gnss_msg_cb);
     if(ret != MBTK_GNSS_RESULT_SUCCESS)
     {
         LOGE("[qser_gnss] mbtk_gnss_add_nmea_out_func fail.");
         return QSER_RESULT_FAIL;
     }
-    
     ret = mbtk_gnss_open();
     if(ret != MBTK_GNSS_RESULT_SUCCESS)
     {
@@ -353,22 +360,58 @@
 
 int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
 {
-    UNUSED(host);
-    UNUSED(id);
-    UNUSED(password);
-    return 0;
+    //UNUSED(host);
+    //UNUSED(id);
+    //UNUSED(password);
+
+    if(host != NULL)
+    {
+        memcpy(qser_agps_info_save.host, host, QSER_LEN_MAX);
+    }
+
+    if(id != NULL)
+    {
+        memcpy(qser_agps_info_save.id, id, QSER_LEN_MAX);
+    }
+
+    if(password != NULL)
+    {
+        memcpy(qser_agps_info_save.passwd, password, QSER_LEN_MAX);
+    }
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Gnss_download_tle()
 {
-    return 0;
+    MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
+    char host[128] = {0};
+    ret = mbtk_gnss_5311_download_tle(host, 0);
+    if(ret != MBTK_GNSS_RESULT_DOWNLOAD_SUCCESS)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_5311_download_tle is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Gnss_injectEphemeris(uint32_t h_gnss)
 {
-    UNUSED(h_gnss);
+    //UNUSED(h_gnss);
 
-    return 0;
+    if(h_gnss != qser_h_sim)
+    {
+        LOGE("[qser_gnss] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
+    ret = mbtk_gnss_injectEphemeris();
+    if(ret != MBTK_GNSS_RESULT_SEND_SUCCESS)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_injectEphemeris is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
diff --git a/mbtk/mbtk_lib/src/mbtk_gnss_5311.c b/mbtk/mbtk_lib/src/mbtk_gnss_5311.c
index a3df60c..2a5540a 100755
--- a/mbtk/mbtk_lib/src/mbtk_gnss_5311.c
+++ b/mbtk/mbtk_lib/src/mbtk_gnss_5311.c
@@ -34,6 +34,10 @@
 #define MBTK_GNSS_UBUS_SET "gnss_setting"
 #define MBTK_GNSS_UBUS_SET_PARAM "gnss_setting_param"
 #define MBTK_GNSS_UBUS_GET_STATUS "gnss_get_state"
+#define MBTK_GNSS_UBUS_AGPS_SERVER "server_name"
+#define MBTK_GNSS_UBUS_ALAM_FLAG "alam_flag"
+#define MBTK_GNSS_UBUS_GET_AGPS "gnss_get_agps"
+#define MBTK_GNSS_UBUS_SET_AGPS "gnss_set_agps"
 
 #define MBTK_RESULT_FAIL -1
 #define MBTK_RESULT_SUCCESS 0
@@ -341,7 +345,8 @@
     char                nmea_buf[1025] = {0};
     struct epoll_event  events[2];
     int                 ne, nevents;
-    int                 cmd = -1, ret = -1;
+    int                 ret = -1;
+    char                cmd = 0;
     char                c;
 
     int pos = 0;
@@ -384,6 +389,7 @@
                     do {
                             ret = read( fd, &cmd, 1 );
                     } while (ret < 0 && errno == EINTR);
+                    LOGE("[mbtk_gnss_api] entry nmea thread quit cmd = [%d]!", cmd);
                     if (cmd == 1)
                     {
                         epoll_deregister( epoll_fd, control_fd );
@@ -451,7 +457,7 @@
     if(nmea_state.init == 1)
     {
         LOGE("[mbtk_gnss_api] nmea thread is open.");
-        return MBTK_RESULT_FAIL;
+        return MBTK_RESULT_SUCCESS;
     }
 
     mbtk_gnss_open_port(&nmea_state.fd, MBTK_GNSS_NMEA_PORT, O_RDWR | O_NONBLOCK | O_NOCTTY, 1);
@@ -611,6 +617,7 @@
         LOGE("[mbtk_gnss_api] mbtk_gnss_nmea_thread_init fail.");
         return MBTK_GNSS_RESULT_FAIL;
     }
+
     return MBTK_GNSS_RESULT_SUCCESS;
 }
 
@@ -641,7 +648,7 @@
 
     //UBUS_STATUS_OK
     ret = mbtk_invoke_reply_data_cb(MBTK_GNSS_UBUS_SERVER, MBTK_GNSS_UBUS_INIT, outBlob.head,
-                                    (ubus_data_handler_t *)mbtk_gnss_ubus_result_callback, &ubus_gnss_result, 8000);
+                                    (ubus_data_handler_t *)mbtk_gnss_ubus_result_callback, &ubus_gnss_result, 25000);
     blob_buf_free(&outBlob);
     if (ret != 0)
     {
@@ -887,6 +894,82 @@
     return MBTK_GNSS_RESULT_SUCCESS;
 }
 
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_5311_download_tle(char *host, int alam_flag)
+{
+    if (mbtk_gnss_uloop_init == 0)
+    {
+        LOGE("[mbtk_gnss_api] gnss not init.");
+        return MBTK_GNSS_RESULT_DOWNLOAD_FAIL;
+    }
+
+    if(mbtk_gnss_status == MBTK_GNSS_CLOSE)
+    {
+        LOGE("[mbtk_gnss_api] gnss not open.");
+        return MBTK_GNSS_RESULT_DOWNLOAD_FAIL;
+    }
+
+    int ret = -1;
+    MBTK_GNSS_5311_RESULT_TYPE ubus_gnss_result = MBTK_GNSS_RESULT_DOWNLOAD_SUCCESS;
+    struct blob_buf outBlob;
+    memset(&outBlob, 0, sizeof(outBlob));
+    
+    blob_buf_init(&outBlob, 0);
+    blobmsg_add_string(&outBlob, MBTK_GNSS_UBUS_AGPS_SERVER, host);
+    blobmsg_add_u32(&outBlob, MBTK_GNSS_UBUS_ALAM_FLAG, alam_flag);
+
+    //UBUS_STATUS_OK
+    ret = mbtk_invoke_reply_data_cb(MBTK_GNSS_UBUS_SERVER, MBTK_GNSS_UBUS_GET_AGPS, outBlob.head,
+                                    (ubus_data_handler_t *)mbtk_gnss_ubus_result_callback, &ubus_gnss_result, 8000);
+    blob_buf_free(&outBlob);
+    if (ret != 0)
+    {
+        LOGE("[mbtk_gnss_api] mbtk_invoke_reply_data_cb fail.");
+        return MBTK_GNSS_RESULT_DOWNLOAD_FAIL;
+    }
+
+    if(ubus_gnss_result != MBTK_GNSS_RESULT_DOWNLOAD_SUCCESS)
+    {
+        LOGE("[mbtk_gnss_api] ubus_gnss_result = [%d].", ubus_gnss_result);
+        return MBTK_GNSS_RESULT_DOWNLOAD_FAIL;
+    }
+
+    return MBTK_GNSS_RESULT_DOWNLOAD_SUCCESS;
+}
+
+MBTK_GNSS_5311_RESULT_TYPE mbtk_gnss_injectEphemeris(void)
+{
+    if (mbtk_gnss_uloop_init == 0)
+    {
+        LOGE("[mbtk_gnss_api] gnss not init.");
+        return MBTK_GNSS_RESULT_SEND_FAIL;
+    }
+
+    if(mbtk_gnss_status == MBTK_GNSS_CLOSE)
+    {
+        LOGE("[mbtk_gnss_api] gnss not open.");
+        return MBTK_GNSS_RESULT_SEND_FAIL;
+    }
+
+    int ret = -1;
+    MBTK_GNSS_5311_RESULT_TYPE ubus_gnss_result = MBTK_GNSS_RESULT_SUCCESS;
+
+    //UBUS_STATUS_OK
+    ret = mbtk_invoke_reply_data_cb(MBTK_GNSS_UBUS_SERVER, MBTK_GNSS_UBUS_SET_AGPS, NULL,
+                                    (ubus_data_handler_t *)mbtk_gnss_ubus_result_callback, &ubus_gnss_result, 8000);
+    if (ret != 0)
+    {
+        LOGE("[mbtk_gnss_api] mbtk_invoke_reply_data_cb fail.");
+        return MBTK_GNSS_RESULT_SEND_FAIL;
+    }
+
+    if(ubus_gnss_result != MBTK_GNSS_RESULT_SEND_SUCCESS)
+    {
+        LOGE("[mbtk_gnss_api] ubus_gnss_result = [%d].", ubus_gnss_result);
+        return MBTK_GNSS_RESULT_SEND_FAIL;
+    }
+
+    return MBTK_GNSS_RESULT_SEND_SUCCESS;
+}
 
 /**********************************API***********************************/
 
diff --git a/mbtk/test/asr1806/qser_gnss_test.c b/mbtk/test/asr1806/qser_gnss_test.c
index c3628e3..9baabfa 100644
--- a/mbtk/test/asr1806/qser_gnss_test.c
+++ b/mbtk/test/asr1806/qser_gnss_test.c
@@ -57,7 +57,11 @@
            "\t7 gnss stop\n"
            "\t8 gnss Delete_Aiding_Data and reset\n"
            "\t9 gnss injecttime\n"
-           "please input operator: >> ");
+           "\t10 gnss download agps\n"
+           "\t11 gnss set frequency\n"
+           "\t12 gnss send agps data to 5311\n"
+           "\t13 gnss config agps server info\n"
+           "please input operator: >> \n");
 }
 void delete_type(void)
 {
@@ -67,7 +71,7 @@
            "\t3 DELETE_POSITION_TIME \n"
            "\t4 DELETE_UTC\n"
            "\t5 DELETE_ALL\n"
-           "please input operator: >> ");
+           "please input operator: >> \n");
 }
 
 int main(int argc, char *argv[])