[Feature][T8TSK-103/104][GNSS]add AT AT+CGPS and AT+CGPSNMEA

Change-Id: Ifce0da081368b298de4643e5973749c5c1d9751e
diff --git a/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h b/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
index e7e3816..5f27015 100755
--- a/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
+++ b/src/lynq/lib/liblynq-gnss/include/lynq_gnss.h
@@ -78,6 +78,10 @@
     gnss_measurement_ext_callback lynq_measurement_callback;

 }lynq_raw_gnss_cbs;

 

+typedef void ( *lynq_atsvc_incb )(const char *input,const int length);

+typedef void ( *lynq_atsvc_outcb )(char *output,int out_size,int type);

+lynq_atsvc_incb lynq_register_gnss(lynq_atsvc_outcb out_cb);

+lynq_atsvc_outcb atsvc_gnss_outcb;

 

 int lynq_gnss_init(void);

 

diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_callback.c b/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
index 09f6d2b..b8a402f 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_callback.c
@@ -141,3 +141,69 @@
 {

     return &lynq_test_raw_callbacks;

 }

+

+

+void lynq_at_gps_location_callback(lynq_GpsLocation_ext* location)

+{

+

+}

+

+void lynq_at_gps_status_callback(GpsStatus* status)

+{

+

+}

+

+#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)

+    {

+        if(strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA))==0 || strncmp(nmea+3,NMEA_RMC,strlen(NMEA_RMC)) == 0 || \

+            strncmp(nmea+3,NMEA_GGA,strlen(NMEA_GGA)) == 0 || strncmp(nmea+3,NMEA_VTG,strlen(NMEA_VTG)) == 0|| \

+            strncmp(nmea+3,NMEA_GSV,strlen(NMEA_GSV)) == 0)

+            {

+                atsvc_gnss_outcb(nmea,strlen(nmea),1);

+            }

+    }

+}

+

+

+

+pthread_t lynq_at_gps_create_thread(const char* name, void (*start)(void *), void* arg)

+{

+    pthread_t at_ntid = 0;

+    int ret = 0;

+

+    ret = pthread_create(&at_ntid, NULL, (void *(*)(void *))start, arg);

+

+    if(ret != 0)

+    {

+        printf("thread %s create fail(%s)!\r\n", name, strerror(errno));

+        at_ntid = 0;

+    }

+    else

+    {

+        printf("tread %s create success!\r\n", name);

+    }

+

+    return at_ntid;

+}

+

+lynq_gnss_cb lynq_at_gnss_callbacks = {

+    .size = sizeof(lynq_gnss_cb),

+    .lynq_location_cb =lynq_at_gps_location_callback,

+    .lynq_status_cb = lynq_at_gps_status_callback,

+    .lynq_nmea_cb = lynq_at_gps_nmea_callback,

+    .lynq_create_thread_cb = lynq_at_gps_create_thread,

+};

+

+lynq_gnss_cb* lynq_at_get__gnss_callbacks(void)

+{

+    return &lynq_at_gnss_callbacks;

+}

diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
index 12e717e..baf4ef3 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
@@ -15,6 +15,7 @@
 #include <semaphore.h>

 #include <pthread.h>

 #include <log/log.h>

+#include <stdlib.h>

 

 #include "lynq_gnss.h"

 #include "gpshal.h"

@@ -33,6 +34,7 @@
 GpsCallbacks_ext* turn_cbs = NULL;

 GpsMeasurementCallbacks_ext* raw_cbs = NULL;

 

+lynq_gnss_cb* lynq_at_callbacks = NULL ;

 /**

  * @brief mark gnss initialization state

  * 0: deinit state

@@ -304,3 +306,274 @@
     mnld_write_cfg(LYNQ_OUTPUT_FREQUENCY,freq);

     return 0;

 }

+

+lynq_atsvc_outcb atsvc_gnss_outcb;

+void atsvc_incb_entity(const char *input,const int length);

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

+{

+    int i=0;

+    while(1)

+    {

+        if(str[i]=='\0')

+        {

+            break;

+        }

+        if(str[i]>='a'&&str[i]<='z')

+        {

+             str[i]=str[i]-32;

+        }

+        i++;

+    }

+    return 0;      

+}

+

+int gnss_at_cmd_parse(char *cmd,char *parse_cmd[],int* at_type)

+{

+    if (NULL == cmd || NULL == parse_cmd || NULL == at_type)

+    {

+        return -1;

+    }

+    int ret = 0;

+    int at_type_jug = 0;

+    int cmd_size;

+    char cmd_buf[128] = {0};

+    char buffer1[128] = {0};

+    char buffer2[128] = {0};

+    bzero(cmd_buf,128);

+    bzero(buffer1,128);

+    bzero(buffer2,128);

+    cmd_size = strlen(cmd);

+    memcpy(cmd_buf,cmd,cmd_size);

+    strUpper(cmd_buf);

+    ret = sscanf(cmd_buf, "%[^=]=%[^=]", buffer1,buffer2);

+    if (ret == 1)

+    {

+        *at_type = 1;

+        sscanf(buffer1, "%[^?]", buffer2);

+        strcpy(parse_cmd[0],buffer2);

+        return 0;

+    }

+    else if (ret == 2)

+    {

+        at_type_jug = strcmp(buffer2,"?");

+        RLOGD("at_type_jug :%d",at_type_jug);

+        if (at_type_jug == 0)

+        {

+            *at_type = 0;

+            strcpy(parse_cmd[0],buffer1);

+            return 0;

+        }

+        else 

+        {

+            *at_type = 2;

+            RLOGD("Buffertest1:buffer1 :%s  buffer2 :%s",buffer1,buffer2);

+            strcpy(parse_cmd[0],buffer1);

+            strcpy(parse_cmd[1],buffer2);

+            RLOGD("buffer1 :%s  buffer2 :%s",parse_cmd[0],parse_cmd[1]);

+            return 0;

+        }

+    }

+    else

+    {

+        RLOGD("unknown paramters");

+        return -1;

+    }

+}

+

+lynq_atsvc_incb lynq_register_gnss(lynq_atsvc_outcb out_cb)

+{

+    char reg_return[100] = {0};

+    if(NULL == out_cb)

+    {

+        RLOGD("out cb is null");

+        return NULL;

+    }

+    atsvc_gnss_outcb=out_cb;

+    memcpy(reg_return,"gnss register success\r\n",24);

+    atsvc_gnss_outcb(reg_return,24,0);

+    return atsvc_incb_entity;

+}

+

+

+void atsvc_incb_entity(const char *input,const int length)

+{

+    int res = 0;

+    int income_at_type = 0;

+    char at_cmd[512]={0};

+    char gnss_at_cmd[100] = {0};

+    char *parse_atcmd[128]; //argv[0]:at cmd,argv[2]:at paramter

+    if(NULL == input)

+    {

+        RLOGD("input is null");

+        memcpy(gnss_at_cmd,"+CME ERROR: 100\r\n",strlen("+CME ERROR: 100\r\n"));

+        atsvc_gnss_outcb(gnss_at_cmd,strlen("+CME ERROR: 100\r\n"),0);

+        return -1;

+    }

+    if (strlen(input) >= 128)

+    {

+        RLOGD("input size more than 128");

+        memcpy(gnss_at_cmd,"+CME ERROR: 100\r\n",strlen("+CME ERROR: 100\r\n"));

+        atsvc_gnss_outcb(gnss_at_cmd,strlen("+CME ERROR: 100\r\n"),0);

+        return -1;

+    }

+    bzero(at_cmd,512);

+    memcpy(at_cmd,input,strlen(input));

+    res = gnss_at_cmd_parse(at_cmd,parse_atcmd,&income_at_type);

+    if (res != 0)

+    {

+        RLOGD("parse at cmd error");

+        return -1;

+    }

+

+    if (!strcmp(parse_atcmd[0], "AT+CGPS"))

+    {

+        res = lynq_at_cgps(income_at_type,parse_atcmd[1]);

+        if (res != 0)

+        {

+            RLOGD("cgps unknown error");

+        }

+    }

+    else if (!strcmp(parse_atcmd[0], "AT+CGPSNMEA"))

+    {

+        lynq_at_cgpsnmea(income_at_type,parse_atcmd[1]);

+    }

+    else 

+    {

+        memcpy(gnss_at_cmd,"+CME ERROR: 100\r\n",strlen("+CME ERROR: 100\r\n"));

+    }

+    memcpy(gnss_at_cmd,"OK\r\n",4);

+    atsvc_gnss_outcb(gnss_at_cmd,4,0);

+}

+

+

+int lynq_at_cgps(int at_type,char *at_paramter)

+{

+    int ret = 0;

+    char cgps_at_res[512]={};

+

+    if (at_type == LYNQ_ATCMD_TEST)

+    {

+        bzero(cgps_at_res,512);

+        memcpy(cgps_at_res,"+CGPS:(0,1)[,(1-3)]\r\n",strlen("+CGPS:(0,1)[,(1-3)]"));

+        atsvc_gnss_outcb(cgps_at_res,strlen("+CGPS:(0,1)[,(1-3)]\r\n"),0);

+        return 0;

+    }

+    else if(at_type == LYNQ_ATCMD_READ)

+    {

+        bzero(cgps_at_res,512);

+        sprintf(cgps_at_res,"+CGPS:<%d>",at_gps_status);

+        atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);

+        return 0;

+    }

+    else if(at_type == LYNQ_ATCMD_WRITE)

+    {

+        if (at_gps_status != atoi(at_paramter))

+        {

+            at_gps_status = atoi(at_paramter);

+        }

+        else

+        {

+            bzero(cgps_at_res,512);

+            memcpy(cgps_at_res,"+CGPS ERROR: same status\r\n",strlen("+CGPS ERROR: same status\r\n"));

+            atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);

+            return -1;

+        }

+        if (at_gps_status == 0)

+        {

+            ret = lynq_gnss_stop();

+            if (ret != 0)

+            {

+                RLOGD("lynq gnss stop fail");

+                return -1;

+            }

+            ret = lynq_gnss_deinit();

+            if (ret != 0)

+            {

+                RLOGD("lynq gnss deinit fail");

+                return -1;

+            }

+            bzero(cgps_at_res,512);

+            memcpy(cgps_at_res,"+CGPS OK\r\n",strlen("+CGPS OK\r\n"));

+            atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);

+        }

+        else if(at_gps_status == 1)

+        {

+            lynq_at_callbacks = lynq_at_get__gnss_callbacks();

+            ret = lynq_gnss_callback_reg(lynq_at_callbacks);

+            if (ret != 0)

+            {

+                RLOGD("lynq gnss callback reg fail");

+                return -1;

+            }

+            ret = lynq_gnss_init();

+            if (ret != 0)

+            {

+                RLOGD("lynq gnss init fail");

+                return -1;

+            }

+            ret = lynq_gnss_start();

+            if (ret != 0)

+            {

+                RLOGD("lynq gnss init fail");

+                return -1;

+            }

+            bzero(cgps_at_res,512);

+            memcpy(cgps_at_res,"+CGPS OK\r\n",strlen("+CGPS OK\r\n"));

+            atsvc_gnss_outcb(cgps_at_res,strlen(cgps_at_res),0);

+        }

+        else

+        {

+            RLOGD("unknown at paramters");

+            bzero(cgps_at_res,512);

+            memcpy(cgps_at_res,"+CGPS ERROR: 100\r\n",strlen("+CGPS ERROR: 100\r\n"));

+            atsvc_gnss_outcb(cgps_at_res,strlen("+CGPS ERROR: 100\r\n"),0);

+        }

+        return 0;

+    }

+}

+

+

+int lynq_at_cgpsnmea(int at_type,char *at_paramter)

+{

+    int ret = 0;

+    char cgpsnmea_at_res[512]={};

+

+    if (at_type == LYNQ_ATCMD_TEST)

+    {

+        bzero(cgpsnmea_at_res,512);

+        memcpy(cgpsnmea_at_res,"+CGPSNMEA:(0,1)\r\n",strlen("+CGPSNMEA:(0,1)"));

+        atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);

+        return 0;

+    }

+    else if(at_type == LYNQ_ATCMD_READ)

+    {

+        bzero(cgpsnmea_at_res,512);

+        sprintf(cgpsnmea_at_res,"+CGPSNMEA:<%d>",at_gpsnmea_status);

+        atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);

+        return 0;

+    }

+    else if(at_type == LYNQ_ATCMD_WRITE)

+    {

+        if (at_gpsnmea_status != atoi(at_paramter))

+        {

+            at_gpsnmea_status = atoi(at_paramter);

+            bzero(cgpsnmea_at_res,512);

+            memcpy(cgpsnmea_at_res,"+CGPSNMEA OK\r\n",strlen("+CGPSNMEA OK\r\n"));

+            atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);

+        }

+        else

+        {

+            RLOGD("unknown at paramters");

+            bzero(cgpsnmea_at_res,512);

+            memcpy(cgpsnmea_at_res,"+CGPSNMEA ERROR: 100\r\n",strlen("+CGPSNMEA ERROR: 100\r\n"));

+            atsvc_gnss_outcb(cgpsnmea_at_res,strlen(cgpsnmea_at_res),0);

+        }

+        return 0;

+    }

+}
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h b/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
index a7687fe..04938c9 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnsshal.h
@@ -6,6 +6,7 @@
 #endif

 

 #include<pthread.h>

+#include "lynq_gnss.h"

 #include "hardware/gps_mtk.h"

 #include "hal2mnl_interface.h"

 #include "gpshal.h"

@@ -37,6 +38,17 @@
 

 GpsMeasurementCallbacks_ext* lynq_gnss_get_raw_callbacks(void);

 

+lynq_gnss_cb* lynq_at_get__gnss_callbacks(void);

+

+extern lynq_atsvc_outcb atsvc_gnss_outcb;

+extern int at_gpsnmea_status;

+

+typedef enum{

+    LYNQ_ATCMD_TEST = 0,

+    LYNQ_ATCMD_READ,

+    LYNQ_ATCMD_WRITE

+}LYNQ_ATCMD_TYPE;

+

 #ifdef __cplusplus

 }

 #endif

diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml
index 7f88859..389f4f8 100755
--- a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_plugin.xml
@@ -4,8 +4,8 @@
                  register="lynq_register_test_data"
                  cmd="AT+LETEST;AT+LEABC;AT+LEDEF"
   />
-   <module name="/lib64/xxx.so"
-                 register="lynq_register_xxx"
-                 cmd="AT+LETEST;AT+LEABC;AT+LEDEF"
+   <module name="/lib64/liblynq-gnss.so"
+                 register="lynq_register_gnss"
+                 cmd="AT+CGPS;AT+CGPSNMEA"
   />
 </lynq_atsvc_plugin>
\ No newline at end of file