[Feature][T106][task-view-517]Add AT+GNSSMODE for The startup method of GNSS(COLD/WARM/HOT)

Only Configure :No
Affected branch: master
Affected module: gnss/AT
Is it affected on both ZXIC and MTK:only ZXIC
Self-test: Yes
Doc Update: No

Change-Id: Ibf6f079b69d93e8e584bab893498e23cf1f2aef4
diff --git a/cap/zx297520v3/src/lynq/framework/lynq-atcid/lynq_atsvc_plugin.xml b/cap/zx297520v3/src/lynq/framework/lynq-atcid/lynq_atsvc_plugin.xml
index ce7d965..8c61ab5 100755
--- a/cap/zx297520v3/src/lynq/framework/lynq-atcid/lynq_atsvc_plugin.xml
+++ b/cap/zx297520v3/src/lynq/framework/lynq-atcid/lynq_atsvc_plugin.xml
@@ -6,7 +6,7 @@
   />
   <module name="/lib/liblynq-qser-gnss.so"
                  register="lynq_register_gnss"
-                 cmd="AT+CGPS;AT+CGPSNMEA;AT+NAVSAT;AT+GNSSVER;AT+GNSSOTA"
+                 cmd="AT+CGPS;AT+CGPSNMEA;AT+NAVSAT;AT+GNSSVER;AT+GNSSOTA;AT+GNSSMODE"
   />
   <module name="/lib/liblynq-at-common.so"
                  register="lynq_register_at_common"
diff --git a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp
index 776cace..6fc81a7 100755
--- a/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp
+++ b/cap/zx297520v3/src/lynq/lib/liblynq-qser-gnss/src/lynq_qser_gnss.cpp
@@ -795,6 +795,57 @@
     
 }
 
+int lynq_at_gnssmode(int gnss_state_type)
+{
+    char hot_start[] = {0xF1,0xD9,0x06,0x40,0x01,0x00,0x03,0x4A,0x24};
+    char warm_start[] = {0xF1,0xD9,0x06,0x40,0x01,0x00,0x02,0x49,0x23};
+    char cold_start[] = {0xF1,0xD9,0x06,0x40,0x01,0x00,0x01,0x48,0x22};
+    int ret;
+    int buf_length;
+    char *send_buf = NULL;
+    int fd = open(MBTK_GNSS_DEV, O_RDWR | O_NOCTTY | O_NDELAY);
+    if(fd < 0) {
+        ALOGE("open error\n");
+        return -1;
+    }
+    switch(gnss_state_type)
+    {
+        case 1:
+        {
+            send_buf = cold_start;
+            buf_length = sizeof(cold_start);
+            break;
+        }
+        case 2:
+        {
+            send_buf = hot_start;
+            buf_length = sizeof(hot_start);
+            break;
+        }
+        case 3:
+        {
+            send_buf = warm_start;
+            buf_length = sizeof(warm_start);
+            break;
+        }
+        default:
+        {
+            close(fd);
+            return -2;
+        }
+    }
+    ret = write(fd, send_buf, buf_length);
+    if(ret < 0)
+    {
+        ALOGE("modify cmd send faild\n");
+        close(fd);
+        return -1;
+    }
+    usleep(100000);
+    close(fd);
+    return 0;
+}
+
 void atsvc_incb_entity(char *input,int length)
 {
     int res = 0;
@@ -868,6 +919,23 @@
             return;
         }
     }
+    else if (!strcmp(parse_atcmd, "AT+GNSSMODE"))
+    {
+        res = lynq_at_gnssmode(gnss_state_type);
+        if (res != 0)
+        {
+            sprintf(gnss_at_cmd,"+CME ERROR: 100\r\n");
+            atsvc_gnss_outcb(gnss_at_cmd,strlen(gnss_at_cmd),0);
+            return;
+        }
+    }
+    else
+    {
+        ALOGE("unknown at cmd\r\n");
+        sprintf(gnss_at_cmd,"+CME ERROR: 100\r\n");
+        atsvc_gnss_outcb(gnss_at_cmd,strlen(gnss_at_cmd),0);
+        return;
+    }
     sprintf(gnss_at_cmd,"OK\r\n");
     atsvc_gnss_outcb(gnss_at_cmd,strlen(gnss_at_cmd),0);
     return;