Merge "[Bugfix][T106BUG_84]fix apn_type is null when get_apn_list // Only Configure: No Affected branch: master Affected module: data Is it affected on both ZXIC and MTK: only ZXIC Self-test: Yes Doc Update: No"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
index e550600..d5acfcc 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
+++ b/cap/zx297520v3/sources/meta-zxic-custom/conf/distro/vehicle_dc.conf
@@ -221,6 +221,8 @@
         gdb \
         mobiletek-tester-rdit \
         lynq-qser-voice-demo \
+        lynq-qser-fota-demo \
+        lynq-qser-gnss-demo \
 	"
 
 zxic_app_open += "${@bb.utils.contains('CONFIG_TEL_API_SUPPORT', 'RIL', 'rild', '', d)}"
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/init.d/fscheck.sh b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/init.d/fscheck.sh
index 7aa0f8a..d0db7c2 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/init.d/fscheck.sh
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-core/images/files/zx297520v3/vehicle_dc/fs/normal/rootfs/etc/init.d/fscheck.sh
@@ -4,6 +4,7 @@
 mkdir -p /mnt/userdata/cache
 mkdir -p /mnt/userdata/var/run
 mkdir -p /mnt/userdata/var/log
+mkdir -p /mnt/userdata/ril/network
 
 if [ -b /dev/mmcblk1p1 ]; then
 	if [ -f /run/media/mmcblk1p1 ]; then
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb
index 055a0c9..d6b8863 100755
--- a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/liblynq-network/liblynq-network.bb
@@ -21,7 +21,7 @@
                 'TARGET_PLATFORM = ${TARGET_PLATFORM}'"

 

 FILES_${PN} = "${base_libdir}/*.so "

-FILES_${PN} += "/data/ril/network"

+

 

 FILES_${PN}-dev = "/test \

                    ${includedir}"

@@ -55,7 +55,6 @@
     if [ -d "${WORKONSRC}" ] ; then

         install -d ${D}${includedir}/lynq_network

         cp -arf ${SRC-DIR}/include/lynq_network ${D}${includedir}/lynq_network	

-        install -d ${D}/data/ril/network		

     fi 

 }

 

diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-fota-demo/lynq-qser-fota-demo.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-fota-demo/lynq-qser-fota-demo.bb
new file mode 100644
index 0000000..ad8af28
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-fota-demo/lynq-qser-fota-demo.bb
@@ -0,0 +1,36 @@
+#inherit externalsrc package
+#inherit externalsrc package systemd
+DESCRIPTION = "lynq-qser-fota-demo"
+LICENSE = "CLOSED"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
+DEPENDS += "liblynq-qser-fota"
+#inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-qser-fota-demo"
+FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/packages/apps:"
+SRC_URI = " \
+          file://lynq-qser-fota-demo \
+          "
+
+SRC-DIR = "${S}/../lynq-qser-fota-demo"
+TARGET_CC_ARCH += "${LDFLAGS}"
+SYSTEMD_PACKAGES = "${PN}"
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'TARGET_PLATFORM = ${TARGET_PLATFORM}'\"
+EXTRA_OEMAKE += "'MOBILETEK_RIL_CFG = ${MOBILETEK_RIL_CFG}'"
+
+EXTRA_OEMAKE += "'MOBILETEK_FOTA_CFG = ${MOBILETEK_FOTA_CFG}'"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${SRC-DIR}/lynq-qser-fota-demo ${D}${bindir}/
+}
diff --git a/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-gnss-demo/lynq-qser-gnss-demo.bb b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-gnss-demo/lynq-qser-gnss-demo.bb
new file mode 100755
index 0000000..a14707b
--- /dev/null
+++ b/cap/zx297520v3/sources/meta-zxic-custom/recipes-lynq/lynq-qser-gnss-demo/lynq-qser-gnss-demo.bb
@@ -0,0 +1,35 @@
+#inherit externalsrc package
+#inherit externalsrc package systemd
+DESCRIPTION = "lynq-qser-gnss-demo"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"
+DEPENDS += "liblynq-qser-gnss"
+#inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-qser-gnss-demo"
+FILESEXTRAPATHS_prepend :="${TOPDIR}/../src/lynq/packages/apps:"
+SRC_URI = " \
+          file://lynq-qser-gnss-demo \
+          "
+
+SRC-DIR = "${S}/../lynq-qser-gnss-demo"
+TARGET_CC_ARCH += "${LDFLAGS}"
+SYSTEMD_PACKAGES = "${PN}"
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'TARGET_PLATFORM = ${TARGET_PLATFORM}'\"
+EXTRA_OEMAKE += "'MOBILETEK_RIL_CFG = ${MOBILETEK_RIL_CFG}'"
+
+EXTRA_OEMAKE += "'MOBILETEK_FOTA_CFG = ${MOBILETEK_FOTA_CFG}'"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+	if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+	else
+		oe_runmake all -C ${SRC-DIR} ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+	fi
+}
+
+do_install() {
+	install -d ${D}${bindir}/
+	install -m 0755 ${SRC-DIR}/lynq-qser-gnss-demo ${D}${bindir}/
+}
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
index 1d0b5af..22a6fac 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
@@ -23,12 +23,12 @@
 static int s_state_buffer_valid[NETWORK_STATE_BUFFER_TYPE_MAX]={false,false,false};

 

 static char* s_state_buffer_file[NETWORK_STATE_BUFFER_TYPE_MAX]={

-     "/data/ril/network/.network_register_voice_buffer",

-     "/data/ril/network/.network_register_data_buffer",

-     "/data/ril/network/.network_register_ims_buffer"

+     "/mnt/userdata/ril/network/.network_register_voice_buffer",

+     "/mnt/userdata/ril/network/.network_register_data_buffer",

+     "/mnt/userdata/ril/network/.network_register_ims_buffer"

 };

 

-#define STATE_BUFFER_CONFIG_FILE  "/data/ril/network/.state_buffer_cfg"

+#define STATE_BUFFER_CONFIG_FILE  "/mnt/userdata/ril/network/.state_buffer_cfg"

 typedef struct{

     int valid_period[NETWORK_STATE_BUFFER_TYPE_MAX];   

 }network_state_buffer_cfg;

@@ -350,7 +350,7 @@
 

 int lynq_set_state_buffer_valid_period_of_network(lynq_network_state_buffer_type type,int valid_period)

 {

-    if(type>NETWORK_STATE_BUFFER_TYPE_MAX || type <0)

+    if(type>=NETWORK_STATE_BUFFER_TYPE_MAX || type <0)

     {

         LYERRLOG("%s type %d error",__func__,type);

         return -1;

@@ -378,7 +378,7 @@
 

 int lynq_get_state_buffer_valid_period_of_network(lynq_network_state_buffer_type type)

 {

-    if(type>NETWORK_STATE_BUFFER_TYPE_MAX || type <0)

+    if(type>=NETWORK_STATE_BUFFER_TYPE_MAX || type <0)

     {

         LYERRLOG("%s type %d error",__func__,type);

         return 0;

diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
index d3d4d55..bba641e 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -450,6 +450,80 @@
     return RESULT_OK;  

 }

 

+int lynq_query_registration_state_from_parcel(Parcel* p, int num,int reject_index, int* regState,char * LAC,char * CID,int *netType,int *netRejected)

+{

+    int i;

+    char *resp[LYNQ_RESP_STRING_MAX_NUM]={0};    

+    int ret = RESULT_OK;

+    for(i=0;i<num;i++)

+    {

+        resp[i]=lynqStrdupReadString(p);

+    }            

+    if(resp[0]==NULL)

+    {

+        LYERRLOG("%s resp[0] %s is NULL",__func__,resp[0]);

+        ret = LYNQ_E_INNER_ERROR;

+        goto registration_from_parcel_return;

+    }

+    *regState = atoi(resp[0]);   

+    strcpy(CID,""); 

+    strcpy(LAC,"");

+    *netType = RADIO_TECH_UNKNOWN;            

+    *netRejected = -1;                   

+    if((*regState)==1 || (*regState)==5) 

+    {   

+        if(resp[1]!=NULL) 

+        {

+            strcpy(LAC,resp[1]);

+        }

+        else 

+        {           

+            LYERRLOG("%s resp[1] %s is NULL",__func__);

+        }

+        

+        if(resp[2]!=NULL) 

+        {

+            strcpy(CID,resp[2]);

+        }

+        else 

+        {                

+            LYERRLOG("%s resp[2] %s is NULL",__func__);

+        }

+

+        if(resp[3]!=NULL) 

+        {

+            *netType = atoi(resp[3]);

+        }

+        else 

+        {            

+            LYERRLOG("%s data resp[3] %s is NULL",__func__);

+        }

+    }

+    else if((*regState)==3 || (*regState)==13)

+    {    

+        if(resp[reject_index]==NULL)

+        {    

+            LYERRLOG("%s resp[%d] is NULL",__func__,reject_index);            

+        }  

+        else 

+        {

+            *netRejected = atoi(resp[reject_index]);            

+        }        

+    }    

+

+registration_from_parcel_return:

+

+    for(i=0;i<num;i++)

+    {

+        if(resp[i]!=NULL)

+        {

+            free(resp[i]);             

+        }            

+    }                  

+    return ret;

+}

+

+

 int lynq_query_registration_state(const char *type,int* regState,int* imsRegState,char * LAC,char * CID,int *netType,int *radioTechFam,int *netRejected)

 {

     if(g_module_init_flag != MODULE_RUNNING)

@@ -474,14 +548,14 @@
     memcpy(str,type,strlen(type)+1);

     strUpper(str);

     if(!strcmp(str,"VOICE"))

-    {

-        if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,regState,netType,netRejected,0)==0)

+    {    

+        if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,regState,netType,netRejected,2,LAC,CID)==0)

         {

             return RESULT_OK;  

         }       

         request = RIL_REQUEST_VOICE_REGISTRATION_STATE;

     }else if(!strcmp(str,"DATA")){

-        if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,regState,netType,2,LAC,CID)==0)

+        if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,3,regState,netType,netRejected,2,LAC,CID)==0)

         {

             return RESULT_OK;  

         }      

@@ -511,36 +585,15 @@
     if(!strcmp(str,"VOICE"))

     {        

         p->readInt32(&num);        

-        if(num ==15)

+        if(num >0 && num<=15)

         {

-            for(i=0;i<num;i++)

+            ret=lynq_query_registration_state_from_parcel(p, num, 13, regState, LAC,CID,netType,netRejected);

+            if(ret!=RESULT_OK)

             {

-                resp[i]=lynqStrdupReadString(p);            

+                LYERRLOG("%s call lynq_query_registration_state_from_parcel fail",__func__);             

+                goto registration_return;       

             }  

-            if(resp[0]==NULL || resp[3]==NULL)

-            {

-                LYERRLOG("%s voice resp[0] resp[3] %s %s is NULL",__func__,resp[0],resp[3]);

-                ret=LYNQ_E_INNER_ERROR;

-                goto registration_return;

-            }        

-            *regState = atoi(resp[0]);        

-            *netType = atoi(resp[3]);

-            if(*regState==3)

-            {

-                if(resp[13]==NULL)

-                {    

-                    LYERRLOG("%s resp[13] is NULL",__func__);

-                    ret=LYNQ_E_INNER_ERROR;

-                    goto registration_return;                    

-                }                

-                *netRejected = atoi(resp[13]);             

-            }    

-            else

-            {

-                *netRejected=0;

-            

-}

-            set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);

+            set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,2,LAC,CID);

             goto registration_return;

         }

         else 

@@ -552,39 +605,16 @@
     }

     else if(!strcmp(str,"DATA")){

         p->readInt32(&num);

-        if(num >=5 && num <=11)

-        {          

-            num=5;

-            for(i=0;i<num;i++)

+        if(num >0 && num <=11)

+        {        

+            ret=lynq_query_registration_state_from_parcel(p, num, 4, regState, LAC,CID,netType,netRejected);

+            if(ret!=RESULT_OK)

             {

-                resp[i]=lynqStrdupReadString(p);

-            }            

-            if(resp[0]==NULL || resp[1]==NULL || resp[2]==NULL || resp[3]==NULL)

-            {

-                LYERRLOG("%s data resp[0] resp[1] resp[2] resp[3] %s %s %s %s is NULL",__func__,resp[0],resp[1],resp[2],resp[3]);

-                ret=LYNQ_E_INNER_ERROR;

-                goto registration_return;

-            }

-            *regState = atoi(resp[0]);           

-            if(*regState==3)

-            {

-                if(resp[4]==NULL)

-                {    

-                    LYERRLOG("%s resp[4] is NULL",__func__);

-                    ret=LYNQ_E_INNER_ERROR;

-                    goto registration_return;                    

-                }                

-                *netRejected = atoi(resp[4]);             

-            }    

-            else

-            {

-                *netRejected=0;

-            

-            }

-            strcpy(LAC,resp[1]);

-            strcpy(CID,resp[2]);

-            *netType = atoi(resp[3]);

-            set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);                

+                LYERRLOG("%s call lynq_query_registration_state_from_parcel fail",__func__);             

+                goto registration_return;       

+            }              

+                        

+            set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,3,*regState,*netType,*netRejected,2,LAC,CID);                

             goto registration_return;

         }

         else 

@@ -617,15 +647,8 @@
     if(ret==RESULT_OK)

     {

         LYINFLOG("%s suc",__func__); 

-    }

-    

-    for(i=0;i<num;i++)

-    {

-        if(resp[i]!=NULL)

-        {

-            free(resp[i]);            

-        }            

-    }            

+    }    

+   

     delete p;

     return ret;

     

@@ -887,7 +910,7 @@
     }

 

     Parcel* p=NULL;

-    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN");

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN?");

     if(ret!=RESULT_OK)

     {

         LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-fota-demo/lynq-qser-fota-demo.cpp b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-fota-demo/lynq-qser-fota-demo.cpp
new file mode 100755
index 0000000..63c9504
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-fota-demo/lynq-qser-fota-demo.cpp
@@ -0,0 +1,94 @@
+#include <stdlib.h>

+#include <stdio.h>

+#include <string.h>

+#include <sys/types.h>

+#include <unistd.h>

+#include <dlfcn.h>

+#include <stdint.h>

+

+int (*lynq_get_upgrade_status)(void);

+int (*lynq_fota_set_addr_value)(char *value,int size);

+int (*lynq_fota_nrestart)(void);

+int (*lynq_rock_main)(int first_run);

+

+void *dlHandle_fota = NULL;

+

+int main(int argc,char *argv[])

+{

+    int ret = 0;

+    int reboot_flag; 

+    char *value = argv[1];

+    printf("Enter main function\n");

+    

+    const char *lynqLibPath_fota = "/lib/liblynq-fota.so";

+    dlHandle_fota = dlopen(lynqLibPath_fota, RTLD_NOW);

+    if (dlHandle_fota == NULL) 

+    {

+        printf("dlopen dlHandle_fota failed: %s\n", dlerror());

+        return -1;

+    }

+

+    lynq_fota_set_addr_value = (int (*)(char *value,int size))dlsym(dlHandle_fota, "lynq_fota_set_addr_value");

+    if(lynq_fota_set_addr_value == NULL)

+    {

+        printf("lynq fota ser addr value is null\n");

+        return -1;

+    }

+

+    lynq_get_upgrade_status = (int (*)(void))dlsym(dlHandle_fota,"lynq_get_upgrade_status");

+    if(lynq_get_upgrade_status == NULL)

+    {

+        printf("lynq_get_upgrade_status is null\n");

+        return -1;

+    }

+    lynq_fota_nrestart = (int (*)())dlsym(dlHandle_fota,"lynq_fota_nrestart");

+    if(lynq_fota_nrestart == NULL)

+    {

+        printf("lynq_fota_nrestart is null\n");

+        return -1;

+    }

+    lynq_rock_main = (int (*)(int first_run))dlsym(dlHandle_fota,"lynq_rock_main");

+    if(lynq_rock_main == NULL)

+    {

+        printf("lynq_rock_main is null\n");

+        return -1;

+    }

+    

+    ret = lynq_fota_set_addr_value(value,(int )strlen(value));

+    if(ret != 0)

+    {

+        printf("set upgrade package addr failed\n");

+        return -1;

+    }

+

+    printf("Please chose  reboot or not when upgrade done  1: reboot 0: not reboot\n");

+    scanf("%d",&reboot_flag);

+

+    switch(reboot_flag)

+    {

+        case 0:

+            printf("Not reboot when upgrade done!!!\n ");

+            ret = lynq_fota_nrestart();

+            printf("upgrade result is %d\n",ret);

+            ret = lynq_get_upgrade_status();

+            printf("get upgrade status result is %d\n",ret);

+            break;

+

+        case 1:

+            printf("Will reboot when upgrade done!!!\n ");

+            ret = lynq_rock_main(1);

+            printf("upgrade result is %d\n",ret);

+            ret = lynq_get_upgrade_status();

+            printf("get upgrade status result is %d\n",ret);

+            break;

+

+        default:

+            printf("please input right flag 1 or 0\n");

+            break;

+

+    }

+    

+    return 0;

+

+}

+

diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-fota-demo/makefile b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-fota-demo/makefile
new file mode 100755
index 0000000..7a6d23f
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-fota-demo/makefile
@@ -0,0 +1,57 @@
+SHELL = /bin/sh

+RM = rm -f

+

+LOCAL_CFLAGS := -Wall \

+                -std=gnu++14 \

+                -g -Os \

+                -flto \

+                -fPIC \

+    

+                

+ 

+ifeq ($(strip $(TARGET_PLATFORM)), T106)

+LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0

+endif

+

+LOCAL_CFLAGS += -Werror=format-security

+

+$(warning ################# rock ROOT: $(ROOT),includedir:$(includedir),)

+

+LOCAL_PATH   = .

+

+LOCAL_C_INCLUDES = \

+  -I. \

+  -I$(LOCAL_PATH)/include \

+  -I$(ROOT)$(includedir)/logger \

+  -I$(ROOT)$(includedir)/liblog \

+  -I$(ROOT)$(includedir)/glib-2.0 \

+  -I$(ROOT)$(libdir)/glib-2.0/include \

+  -I$(ROOT)$(includedir)  \

+

+

+

+LOCAL_LIBS := \

+    -L. \

+    -ldl \

+    -lstdc++ \

+

+SOURCES = lynq-qser-fota-demo.cpp

+

+EXECUTABLE = lynq-qser-fota-demo

+

+OBJECTS=$(SOURCES:.cpp=.o)

+

+OBJECTS_TOOL=$(SOURCES_TOOL:.cpp=.o)

+all: $(EXECUTABLE) 

+

+$(EXECUTABLE): $(OBJECTS)

+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@

+

+%.o : %.cpp

+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 

+

+.PHONY: clean

+clean:

+	$(RM) $(OBJECTS) $(EXECUTABLE)

+	$(RM) $(OBJECTS_TOOL) $(EXECUTABLE)

+

diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/include/lynq-qser-gnss-demo.h b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/include/lynq-qser-gnss-demo.h
new file mode 100755
index 0000000..c472cf5
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/include/lynq-qser-gnss-demo.h
@@ -0,0 +1,128 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum
+{
+                                                /**<  0  reserve  */
+    E_MT_LOC_MSG_ID_LOCATION_INFO = 1,          /**<  pv_data = &QL_LOC_LOCATION_INFO_T  */
+                                                /**<  2  reserve  */
+    E_MT_LOC_MSG_ID_NMEA_INFO = 3,              /**<  pv_data = &QL_LOC_NMEA_INFO_T  */
+}e_msg_id_t;
+
+#define MOPEN_GNSS_NMEA_MAX_LENGTH  255                 /**  NMEA string maximum length. */
+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 */
+
+struct mopen_location_info_t
+{
+    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. */
+};
+
+/*Instantiate callback function*/
+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:
+    {
+        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:
+    {
+        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;
+    }
+    }
+}
+
+typedef void (*gnss_handler_func_t)
+(
+        uint32_t    h_loc,
+        e_msg_id_t  e_msg_id,
+        void        *pv_data,
+        void        *context_ptr
+        );
+
+typedef enum {
+    DELETE_NOTHING = 0,        /**< Delete nothing. */
+    DELETE_EPHEMERIS = 1,      /**< Delete ephemeris data. */
+    DELETE_ALMANAC = 2,        /**< Delete almanac data. */
+    DELETE_POSITION_TIME = 3,  /**< Delete position and time data. */
+    DELETE_UTC = 4,            /**< Delete UTC data. */
+    DELETE_ALL = 5,            /**< Delete all location data. */
+}DELETE_AIDING_DATA_TYPE_T;
+
+typedef struct 
+{
+    uint32_t year; // >1980
+    uint32_t month; // 1-12
+    uint32_t day; // 1-31
+    uint32_t hour; // 0-23
+    uint32_t minute; // 0-59
+    uint32_t second; // 0-59
+    uint32_t millisecond; // 0-999
+}LYNQ_INJECT_TIME_INTO_T; /* Message */
+
+
+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: >> ");
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/lynq-qser-gnss-demo.cpp b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/lynq-qser-gnss-demo.cpp
new file mode 100755
index 0000000..01aa10e
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/lynq-qser-gnss-demo.cpp
@@ -0,0 +1,213 @@
+#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-qser-gnss-demo.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+int (*qser_Gnss_Init)(uint32_t *h_gnss);
+int (*qser_Gnss_Deinit)(uint32_t);
+int (*qser_AddRxIndMsgHandler)(gnss_handler_func_t handler_ptr,uint32_t);
+int (*qser_Set_Indications)(uint32_t h_gnss,e_msg_id_t);
+int (*qser_Gnss_Start)(uint32_t h_gnss);
+int (*qser_Gnss_Stop)(uint32_t h_gnss);
+int (*qser_Gnss_Delete_Aiding_Data)(uint32_t,DELETE_AIDING_DATA_TYPE_T);
+int (*qser_Gnss_InjectTime)(uint32_t,LYNQ_INJECT_TIME_INTO_T *time_info);
+void *dlHandle_gnss;
+
+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_init FAIL.\n");
+                return -1;
+            }
+            printf("mopen_gnss_client_Deinit success ");
+            return 0;
+        }
+        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\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;
+            }
+            break;
+            printf("stop success\n");
+        }
+
+        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
+            }
+            case 1:
+            {
+                ptr = DELETE_EPHEMERIS;//warm
+            }
+            case 2:
+            {
+                ptr = DELETE_ALMANAC;
+            }
+            case 3:
+            {
+                ptr = DELETE_POSITION_TIME;
+            }
+            case 4:
+            {
+                ptr = DELETE_UTC;
+            }
+            case 5:
+            {
+                ptr = DELETE_ALL;//cold
+            }
+            }
+            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("lynq_Gnss_InjectTime fail\n");
+                qser_Gnss_Deinit(ph_gnss);
+                return -1;
+            }
+            printf("lynq_Gnss_InjectTime success\n");
+            break;
+        }
+        }
+    }
+    return 0;
+}
+#ifdef __cplusplus
+}
+#endif
diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/makefile b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/makefile
new file mode 100755
index 0000000..637163d
--- /dev/null
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-gnss-demo/makefile
@@ -0,0 +1,50 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -fpermissive \
+
+ifeq ($(strip $(TARGET_PLATFORM)), T106)
+LOCAL_CFLAGS += -DBINDER_IPC_32BIT=1 -DHAVE_ENDIAN_H -DHAVE_PTHREADS -DHAVE_SYS_UIO_H -DHAVE_POSIX_FILEMAP -DHAVE_STRLCPY -DHAVE_PRCTL -DHAVE_MEMSET16 -DHAVE_MEMSET32 -DANDROID_SMP=0
+endif
+
+LOCAL_CFLAGS += -Wno-error=format-security
+
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include/ \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lstdc++ \
+    -lpthread \
+
+
+SOURCES = lynq-qser-gnss-demo.cpp
+
+EXECUTABLE = lynq-qser-gnss-demo
+
+OBJECTS=$(SOURCES:.cpp=.o)
+
+OBJECTS_TOOL=$(SOURCES_TOOL:.cpp=.o)
+all: $(EXECUTABLE) 
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+	$(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+	$(RM) $(OBJECTS_TOOL) $(EXECUTABLE)
+
diff --git a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-voice-demo/lynq-qser-voice-demo.cpp b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-voice-demo/lynq-qser-voice-demo.cpp
index 3e69508..5f421c9 100755
--- a/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-voice-demo/lynq-qser-voice-demo.cpp
+++ b/cap/zx297520v3/src/lynq/packages/apps/lynq-qser-voice-demo/lynq-qser-voice-demo.cpp
Binary files differ