[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