gnss: add T108 gnss api

Change-Id: I28a07e17a07d388c2d1e1134f7bb9f7265697b2c
diff --git a/mbtk/include/lynq/lynq_gnss.h b/mbtk/include/lynq/lynq_gnss.h
index 6e2827a..6704b1e 100755
--- a/mbtk/include/lynq/lynq_gnss.h
+++ b/mbtk/include/lynq/lynq_gnss.h
@@ -11,11 +11,12 @@
 #include "mbtk_type.h"
 
 typedef unsigned int Uint_t;
+#define MOPEN_GNSS_NMEA_MAX_LENGTH  255                 /* NMEA string maximum length. */
 
 typedef enum
 {
-    E_MT_LOC_MSG_ID_LOCATION_INFO, /**< pv_data = & mopen_location_info_t */
-    E_MT_LOC_MSG_ID_NMEA_INFO, /**< pv_data = & mopen_gnss_nmea_info_t */
+    E_MT_LOC_MSG_ID_LOCATION_INFO = 1, /**< pv_data = & mopen_location_info_t */
+    E_MT_LOC_MSG_ID_NMEA_INFO = 3, /**< pv_data = & mopen_gnss_nmea_info_t */
 } e_msg_id_t;
 
 typedef void (*gnss_handler_func_t)
@@ -28,6 +29,29 @@
 
 typedef struct
 {
+    int64_t     timestamp;                              /**<   System Timestamp, marked for when got the nmea data */
+    int         length;                                 /**<   NMEA string length. */
+    char        nmea[MOPEN_GNSS_NMEA_MAX_LENGTH + 1];   /**<   NMEA string.*/
+}mopen_gnss_nmea_info_t;  /* Message */
+
+typedef struct
+{
+    uint32_t    size;                   /**<   Set to the size of mcm_gps_location_t. */
+    int flags;                          /**<   Contains GPS location flags bits. */
+    int position_source;                /**<   Provider indicator for HYBRID or GPS. */ //功能暂未实现,可不用添加进结构体
+    double      latitude;               /**<   Latitude in degrees. */
+    double      longitude;              /**<   Longitude in degrees. */
+    double      altitude;               /**<   Altitude in meters above the WGS 84 reference ellipsoid. */
+    float       speed;                  /**<   Speed in meters per second. */
+    float       bearing;                /**<   Heading in degrees. */ //功能暂未实现,可不用添加进结构体
+    float       accuracy;               /**<   Expected accuracy in meters. */ //功能暂未实现,可不用添加进结构体
+    int64_t     timestamp;              /**<   Timestamp for the location fix in UTC million-second base.  */
+    int32_t     is_indoor;              /**<   Location is indoors. */ //功能暂未实现,可不用添加进结构体
+    float       floor_number;           /**<   Indicates the floor number. */
+}mopen_location_info_t;//功能暂未实现,可不用添加进结构体
+
+typedef struct
+{
     uint32_t year; // 大于 1980
     uint32_t month; // 1-12
     uint32_t day; // 1-31
@@ -58,12 +82,17 @@
 
 int qser_Gnss_Stop (uint32_t h_gnss);
 
+int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency);
+
 int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info);
 
 int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags);
 
+int qser_Gnss_Server_Configuration(char *host, char *id, char *password);
+
 int qser_Gnss_download_tle();
 
 int qser_Gnss_injectEphemeris(uint32_t h_gnss);
 
+
 #endif /* _QSER_GNSS_H */
diff --git a/mbtk/lynq_lib/src/lynq_gnss.c b/mbtk/lynq_lib/src/lynq_gnss.c
index d86124c..53d6537 100755
--- a/mbtk/lynq_lib/src/lynq_gnss.c
+++ b/mbtk/lynq_lib/src/lynq_gnss.c
@@ -1,51 +1,279 @@
+#include <time.h>
 #include "lynq_gnss.h"
+#include "mbtk_gnss_5311.h"
 
+#define QSER_RESULT_SUCCESS 0
+#define QSER_RESULT_FAIL -1
+
+/**********************************VARIABLE***********************************/
+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;
+
+
+extern long timezone;
+/**********************************VARIABLE***********************************/
+
+/**********************************FUNC***********************************/
+static time_t qser_get_timestamp(char *time)
+{
+    char tmp_char[4] = {0};
+    struct tm* tmp_time = (struct tm*)malloc(sizeof(struct tm));
+
+    memset(tmp_time, 0, sizeof(struct tm));
+    memset(tmp_char, 0, sizeof(tmp_char));
+    memcpy(tmp_char, &time[4], 2);
+    tmp_time->tm_sec = atoi(tmp_char);
+    memcpy(tmp_char, &time[2], 2);
+    tmp_time->tm_min = atoi(tmp_char);
+    memcpy(tmp_char, &time[0], 2);
+    tmp_time->tm_hour = atoi(tmp_char);
+    memcpy(tmp_char, &time[6], 2);
+    tmp_time->tm_mday = atoi(tmp_char);
+    memcpy(tmp_char, &time[8], 2);
+    tmp_time->tm_mon = atoi(tmp_char) - 1;
+    memcpy(tmp_char, &time[10], 2);
+    tmp_time->tm_year = 100 + atoi(tmp_char);
+
+    time_t _t = mktime(tmp_time);//按当地时区解析tmp_time
+    //gnss_log("timestamp: %ld\n",_t);
+    tzset();   // 自动设置本地时区
+    _t = _t - timezone;
+    //gnss_log("timestamp: %ld\n",_t);
+
+    free(tmp_time);
+    return _t;
+}
+
+static time_t qser_get_gnss_time_sec(void *data, int data_len)
+{
+    int i = 0, num = 0;
+    char *nmea = (char *)data;
+    char time[15] = {0};
+    char *check_state = NULL;
+
+    //$GNRMC,024142.000,A,3039.364421,N,10403.417935,E,0.051,0.00,030124,,E,A*00
+    check_state = strstr(nmea, "RMC");
+    if(check_state != NULL)
+    {
+        for(i = 0; i < data_len; i++)
+        {
+            if(check_state[i] == ',')
+            {
+                num++;
+                i++;
+                if(num == 1 && check_state[i] >= '0' && check_state[i] <= '9')//get time
+                {
+                    memcpy(time, check_state + i, 6);
+                    LOGE("[qser_gnss] %s.", time);
+                    i += 6;
+                }
+                else if(num == 9 && check_state[i] >= '0' && check_state[i] <= '9')//get date
+                {
+                    memcpy(time + 6, check_state + i, 6);
+                    LOGE("[qser_gnss] %s.", time);
+                    break;
+                }
+                else
+                {
+                    qser_gnss_time = 0;
+                    return qser_gnss_time;
+                }
+            }
+        }
+
+        qser_gnss_time = qser_get_timestamp(time);
+    }
+
+    return qser_gnss_time;
+}
+
+static void qser_gnss_msg_cb(void *data, int data_len)
+{
+    if(data == NULL || data_len <= 0)
+    {
+        LOGE("[qser_gnss] data is NULL.");
+        return;
+    }
+
+    if(qser_gnss_callback == NULL)
+    {
+        //LOGE("[qser_gnss] qser_gnss_callback is NULL.");
+        return;
+    }
+    
+    if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_NMEA_INFO)
+    {
+        mopen_gnss_nmea_info_t qser_nmea = {0};
+        memset(&qser_nmea, 0x0, sizeof(mopen_gnss_nmea_info_t));
+        qser_nmea.length = data_len;
+        memcpy(qser_nmea.nmea, (char *)data, data_len);
+        qser_nmea.timestamp = qser_get_gnss_time_sec(data, data_len);
+
+        if(qser_gnss_callback != NULL)
+        {
+            qser_gnss_callback(NULL, qser_gnss_msg_type, (void *)(&qser_nmea), NULL);
+        }
+    }
+    else if(qser_gnss_msg_type == E_MT_LOC_MSG_ID_LOCATION_INFO)
+    {
+        //NOT USE
+    }
+    else
+    {
+        //UNKNOWN
+    }
+}
+/**********************************FUNC***********************************/
+
+/**********************************API***********************************/
 int qser_Gnss_Init (uint32_t *h_gnss)
 {
-    UNUSED(h_gnss);
+    //UNUSED(h_gnss);
+    MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
 
+    if(!inited)
+    {
+        ret = mbtk_gnss_init();
+        if(ret == MBTK_GNSS_RESULT_SUCCESS)
+        {
+            qser_info_handle_num++;
+            inited = TRUE;
+        }
+        else
+        {
+            LOGE("[qser_gnss] mbtk_gnss_init() fail.");
+            return QSER_RESULT_FAIL;
+        }
+    }
+    else
+    {
+        qser_info_handle_num++;
+        inited = TRUE;
+    }
+    *h_gnss = qser_h_sim;
 
-    return 0;
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Gnss_Deinit (uint32_t h_gnss)
 {
-    UNUSED(h_gnss);
+    //UNUSED(h_gnss);
+    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;
 
+    if(qser_info_handle_num == 1)
+    {
+        ret = mbtk_gnss_deinit();
+        if(ret == MBTK_GNSS_RESULT_SUCCESS)
+        {
+            qser_info_handle_num = 0;
+            inited = FALSE;
+        }
+        else
+        {
+            LOGE("[qser_gnss] mbtk_gnss_init() fail.");
+            return QSER_RESULT_FAIL;
+        }
+    }
+    else
+    {
+        qser_info_handle_num--;
+    }
 
-    return 0;
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_AddRxIndMsgHandler (gnss_handler_func_t handler_ptr,uint32_t h_gnss)
 {
-    UNUSED(handler_ptr);
-    UNUSED(h_gnss);
+    //UNUSED(handler_ptr);
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_sim)
+    {
+        LOGE("[qser_gnss] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
 
-
-    return 0;
+    if(handler_ptr == NULL)
+    {
+        LOGE("[qser_gnss] handler_ptr is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+    MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
+    
+    qser_gnss_callback = handler_ptr;
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Set_Indications (uint32_t h_gnss,e_msg_id_t type)
 {
-    UNUSED(h_gnss);
-    UNUSED(type);
+    //UNUSED(h_gnss);
+    //UNUSED(type);
+    if(h_gnss != qser_h_sim)
+    {
+        LOGE("[qser_gnss] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
 
+    qser_gnss_msg_type = type;
 
-    return 0;
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Gnss_Start (uint32_t h_gnss)
 {
-    UNUSED(h_gnss);
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_sim)
+    {
+        LOGE("[qser_gnss] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
 
-    return 0;
+    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)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_open is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Gnss_Stop (uint32_t h_gnss)
 {
-    UNUSED(h_gnss);
+    //UNUSED(h_gnss);
+    if(h_gnss != qser_h_sim)
+    {
+        LOGE("[qser_gnss] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
 
-    return 0;
+    MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
+    ret = mbtk_gnss_close();
+    if(ret != MBTK_GNSS_RESULT_SUCCESS)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_close is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
 }
 
 int qser_Gnss_InjectTime (uint32_t h_gnss,LYNQ_INJECT_TIME_INTO_T *time_info)
@@ -58,15 +286,66 @@
 
 int qser_Gnss_Delete_Aiding_Data (uint32_t h_gnss,DELETE_AIDING_DATA_TYPE_T flags)
 {
-    UNUSED(h_gnss);
-    UNUSED(flags);
+    //UNUSED(h_gnss);
+    //UNUSED(flags);
+    
+    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;
+    char param_buf[32] = {0};
+    int  length = 0;
+
+    switch(flags)
+    {
+        case DELETE_NOTHING:
+        {
+            memcpy(param_buf, "RESET,1", strlen("RESET,1"));
+            break;
+        }
+        case DELETE_EPHEMERIS:
+        case DELETE_ALMANAC:
+        case DELETE_POSITION_TIME:
+        case DELETE_UTC:
+        {
+            memcpy(param_buf, "RESET,2", strlen("RESET,2"));
+            break;
+        }
+        case DELETE_ALL:
+        {
+            memcpy(param_buf, "RESET,3", strlen("RESET,3"));
+            break;
+        }
+        default:
+        {
+            LOGE("[qser_gnss] flags UNKOWN.");
+            return QSER_RESULT_FAIL;
+        }
+    }
+
+    length = strlen(param_buf);
+    ret = mbtk_gnss_param_config(param_buf, length);
+    if(ret != MBTK_GNSS_RESULT_SUCCESS)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_Gnss_Server_Configuration(char *host, char *id, char *password)
+{
+    UNUSED(host);
+    UNUSED(id);
+    UNUSED(password);
     return 0;
 }
 
 int qser_Gnss_download_tle()
 {
-
     return 0;
 }
 
@@ -77,3 +356,35 @@
     return 0;
 }
 
+int qser_Gnss_Set_Frequency(uint32_t h_gnss, int frequency)
+{
+    //UNUSED(h_gnss);
+    //UNUSED(frequency);
+
+    if(h_gnss != qser_h_sim)
+    {
+        LOGE("[qser_gnss] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(frequency != 1 && frequency != 2 && frequency != 5)
+    {
+        LOGE("[qser_gnss] frequency out of range.");
+        return QSER_RESULT_FAIL;
+    }
+
+    MBTK_GNSS_5311_RESULT_TYPE ret = MBTK_GNSS_RESULT_FAIL;
+    char param_buf[32] = {0};
+    int  length = 0;
+    length = snprintf(param_buf, 32, "NAVISYSCFG,7,%d", frequency);
+    ret = mbtk_gnss_param_config(param_buf, length);
+    if(ret != MBTK_GNSS_RESULT_SUCCESS)
+    {
+        LOGE("[qser_gnss] mbtk_gnss_param_config is error.");
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+/**********************************API***********************************/
+
+
diff --git a/mbtk/test/asr1806/qser_gnss_test.c b/mbtk/test/asr1806/qser_gnss_test.c
new file mode 100644
index 0000000..c3628e3
--- /dev/null
+++ b/mbtk/test/asr1806/qser_gnss_test.c
@@ -0,0 +1,307 @@
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <termios.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <dlfcn.h>
+#include <stdint.h>
+#include "lynq_gnss.h"
+
+void cb(uint32_t h_loc, e_msg_id_t e_msg_id, void *pv_data, void *context_ptr)
+{
+    printf("e_msg_id=%d\n", e_msg_id);
+    switch(e_msg_id)
+    {
+    case E_MT_LOC_MSG_ID_LOCATION_INFO:				//选择mode1,输出定位信息
+    {
+        mopen_location_info_t *pt_location = (mopen_location_info_t *)pv_data;
+        printf("**** flag=0x%X, Latitude = %f, Longitude=%f, altitude = %f, speed = %f, timestamp = %lld ****\n",
+               pt_location->flags,
+               pt_location->latitude,
+               pt_location->longitude,
+               pt_location->altitude,
+               pt_location->speed,
+               pt_location->timestamp);
+        break;
+    }
+    case E_MT_LOC_MSG_ID_NMEA_INFO:				//选择mode3,输出nmea数据信息
+    {
+        mopen_gnss_nmea_info_t  *pt_nmea = (mopen_gnss_nmea_info_t *)pv_data;
+
+        printf("**** NMEA info: timestamp=%lld, length=%d, nmea=%s ****\n",
+               pt_nmea->timestamp, pt_nmea->length, pt_nmea->nmea);
+        break;
+    }
+    }
+}
+
+void user_help(void)
+{
+    printf("\t-1 exit\n"
+           "\t1 gnss init\n"
+           "\t2 gnss deinit \n"
+           "\t3 gnss add handle function\n"
+           "\t4 gnss set single mode\n"
+           "\t5 gnss set get_para_from_nmea mode\n"
+           "\t6 gnss start\n"
+           "\t7 gnss stop\n"
+           "\t8 gnss Delete_Aiding_Data and reset\n"
+           "\t9 gnss injecttime\n"
+           "please input operator: >> ");
+}
+void delete_type(void)
+{
+    printf("\t0 DELETE_NOTHING\n"
+           "\t1 DELETE_EPHEMERIS\n"
+           "\t2 DELETE_ALMANAC\n"
+           "\t3 DELETE_POSITION_TIME \n"
+           "\t4 DELETE_UTC\n"
+           "\t5 DELETE_ALL\n"
+           "please input operator: >> ");
+}
+
+int main(int argc, char *argv[])
+{
+    int ret;
+    int opt = 0;
+    //char *lynqLib_gnss = "/lib/liblynq-qser-gnss.so";
+    char dev_file[12] = {0};
+    uint32_t ph_gnss;
+    //dlHandle_gnss = dlopen(lynqLib_gnss, RTLD_NOW);
+    while(1)
+    {
+        printf("=========gnss main=========\n");
+        user_help();
+        scanf("%d", &opt);
+        switch (opt)
+        {
+        case -1:
+        {
+            printf("main exit\n");
+            return 0;
+        }
+
+        case 1:
+        {
+            //qser_Gnss_Init=(int(*)(uint32_t *h_gnss))dlsym(dlHandle_gnss, "qser_Gnss_Init");
+            ret = qser_Gnss_Init(&ph_gnss);
+            if(ret < 0)
+            {
+                printf("mopen_gnss_client_init FAIL.\n");
+                return -1;
+            }
+            printf("mopen_gnss_client_init success , with address=%d\n",  ph_gnss);
+            break;
+        }
+        case 2:
+        {
+            //qser_Gnss_Deinit=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_Deinit");
+            ret =qser_Gnss_Deinit(ph_gnss);
+            if(ret < 0)
+            {
+                printf("mopen_gnss_client_Deinit FAIL.\n");
+                return -1;
+            }
+            printf("mopen_gnss_client_Deinit success \n");
+            break;
+        }
+        case 3:
+        {
+            //qser_AddRxIndMsgHandler=(int(*)(gnss_handler_func_t,uint32_t))dlsym(dlHandle_gnss, "qser_AddRxIndMsgHandler");
+            ret = qser_AddRxIndMsgHandler((gnss_handler_func_t)&cb,ph_gnss);
+            if(ret < 0)
+            {
+                printf("lynq_AddRxIndMsgHandler fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("add success\n");
+            break;
+        }
+        case 4:
+        {
+            e_msg_id_t ptr2=E_MT_LOC_MSG_ID_LOCATION_INFO;
+            //qser_Set_Indications=(int(*)(uint32_t h_gnss,e_msg_id_t))dlsym(dlHandle_gnss, "qser_Set_Indications");
+            ret = qser_Set_Indications(ph_gnss,ptr2);
+            if(ret < 0)
+            {
+                printf("lynq_Set_LOCATION_INFO fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("set location mode success\n");
+            break;
+        }
+        case 5:
+        {
+            e_msg_id_t ptr4=E_MT_LOC_MSG_ID_NMEA_INFO;
+            //qser_Set_Indications=(int(*)(uint32_t h_gnss,e_msg_id_t))dlsym(dlHandle_gnss, "qser_Set_Indications");
+            ret = qser_Set_Indications(ph_gnss,ptr4);
+            if(ret < 0)
+            {
+                printf("lynq_Set_NMEA_INFO fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("set nmea mode success\n");
+            break;
+            
+        }
+        case 6:
+        {
+            //qser_Gnss_Start=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_Start");
+            ret = qser_Gnss_Start(ph_gnss);
+            if(ret < 0)
+            {
+                printf("lynq_Gnss_Start fail\n");
+                return -1;
+            }
+            printf("start success\n");
+            break;
+        }
+        case 7:
+        {
+            //qser_Gnss_Stop=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_Stop");
+            ret = qser_Gnss_Stop(ph_gnss);
+            if(ret < 0)
+            {
+                printf("lynq_Gnss_Stop fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("stop success\n");
+            break; 
+        }
+
+        case 8:
+        {
+            int opt_1;
+            DELETE_AIDING_DATA_TYPE_T ptr;
+            //qser_Gnss_Delete_Aiding_Data=(int(*)(uint32_t,DELETE_AIDING_DATA_TYPE_T))dlsym(dlHandle_gnss, "qser_Gnss_Delete_Aiding_Data");
+            printf("=========delete aiding data type=========\n");
+            delete_type();
+            scanf("%d", &opt_1);
+            switch(opt_1)
+            {
+            case 0:
+            {
+                ptr = DELETE_NOTHING;//hot
+                break;
+            }
+            case 1:
+            {
+                ptr = DELETE_EPHEMERIS;//warm
+                break;
+            }
+            case 2:
+            {
+                ptr = DELETE_ALMANAC;
+                break;
+            }
+            case 3:
+            {
+                ptr = DELETE_POSITION_TIME;
+                break;
+            }
+            case 4:
+            {
+                ptr = DELETE_UTC;
+                break;
+            }
+            case 5:
+            {
+                ptr = DELETE_ALL;//cold
+                break;
+            }
+            }
+            ret = qser_Gnss_Delete_Aiding_Data(ph_gnss,ptr);
+            if(ret < 0)
+            {
+                printf("lynq_Gnss_Delete_Aiding_Data %d fail\n",opt_1);
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("lynq_Gnss_Delete_Aiding_Data %d success\n",opt_1);
+            break;
+        }
+        case 9:
+        {
+            LYNQ_INJECT_TIME_INTO_T time_test;
+            //qser_Gnss_InjectTime=(int(*)(uint32_t,LYNQ_INJECT_TIME_INTO_T *time_info))dlsym(dlHandle_gnss, "qser_Gnss_InjectTime");
+            ret = qser_Gnss_InjectTime(ph_gnss,&time_test);
+            if(ret < 0)
+            {
+                printf("qser_Gnss_InjectTime fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("qser_Gnss_InjectTime success\n");
+            break;
+        }
+        case 10:
+        {
+            //qser_Gnss_download_tle=(int(*)())dlsym(dlHandle_gnss, "qser_Gnss_download_tle");
+            ret = qser_Gnss_download_tle();
+            if(ret < 0)
+            {
+                printf("qser_Gnss_download_tle fail\n");
+                return -1;
+            }
+            printf("qser_Gnss_download_tle success\n");
+            break;
+        }
+        case 11:
+        {
+            int frequency;
+            //qser_Gnss_Set_Frequency=(int(*)(uint32_t, int))dlsym(dlHandle_gnss, "qser_Gnss_Set_Frequency");
+            printf("=========delete aiding data type=========\n");
+            scanf("%d", &frequency);
+            ret = qser_Gnss_Set_Frequency(ph_gnss,frequency);
+            if(ret < 0)
+            {
+                printf("qser_Gnss_Set_Frequency fail\n");
+                return -1;
+            }
+            printf("frequency is %d\n",frequency);
+            printf("qser_Gnss_Set_Frequency success\n");
+            break;
+        }
+        case 12:
+        {
+            //int (*qser_Gnss_injectEphemeris)(uint32_t);
+            //qser_Gnss_injectEphemeris=(int(*)(uint32_t))dlsym(dlHandle_gnss, "qser_Gnss_injectEphemeris");
+            ret = qser_Gnss_injectEphemeris(ph_gnss);
+            if(ret < 0)
+            {
+                printf("qser_Gnss_injectEphemeris fail\n");
+                return -1;
+            }
+            printf("qser_Gnss_injectEphemeri ssuccess\n");
+            break;
+        }
+        case 13:
+        {
+            //qser_Gnss_Server_Configuration=(int(*)(char *host, char *id, char *password))dlsym(dlHandle_gnss, "qser_Gnss_Server_Configuration");
+            ret = qser_Gnss_Server_Configuration(NULL,"lcz","123456");
+            if(ret < 0)
+            {
+                printf("qser_Gnss_Server_Configuration fail\n");
+                return -1;
+            }
+            printf("qser_Gnss_Server_Configuration ssuccess\n");
+            break;
+        }
+        }
+    }
+    return 0;
+}