[Bugfix][API-413][Factory-test]None AT command to read IMEI2
[BUgfix][API-490][Factory-test]The VCOM fails to be opened.

Change-Id: I2a0faaaae42fe866285bd9e7dcbdddc6cf1ae2fa
diff --git a/framework/lynq-ril-service/src/factory/lynq_factory.cpp b/framework/lynq-ril-service/src/factory/lynq_factory.cpp
index b98a1b4..ac7cd11 100755
--- a/framework/lynq-ril-service/src/factory/lynq_factory.cpp
+++ b/framework/lynq-ril-service/src/factory/lynq_factory.cpp
@@ -1,3 +1,56 @@
+#include<sys/types.h>
+#include<sys/socket.h>
+#include<unistd.h>
+#include<netinet/in.h>
+#include<arpa/inet.h>
+#include<netdb.h>
+#include<signal.h>
+#include <log/log.h>
+#include <hardware_legacy/power.h>
+#include <vendor-ril/telephony/ril.h>
+#include <telephony/ril_cdma_sms.h>
+
+#include <telephony/record_stream.h>
+#include <utils/SystemClock.h>
+#include <binder/Parcel.h>
+#include <cutils/jstring.h>
+#include <sys/types.h>
+#include <limits.h>
+#include <pwd.h>
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <ctype.h>
+#include <alloca.h>
+#include <sys/un.h>
+#include <assert.h>
+#include <netinet/in.h>
+#include <atomic>
+
+#include "utils/String8.h"
+#include "ss.h"
+
+#include "cc.h"
+#include "network.h"
+#include "stk.h"
+
+
+#include "atci/ATCI.h"
+#include "data/data.h"
+#include "data/data_gdbus.h"
+#include "ecall/eCall.h"
+#include "em/em.h"
+#include "sms/sms.h"
+#include "sms/cdma/sms_pdu_cdma.h"
+#include "stateManager/stateManager.h"
+
+
+#include "Radio_capability_switch_util.h"
+
 #include <stdio.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -9,6 +62,7 @@
 #include <string.h>
 #include<pthread.h>
 #include <cutils/properties.h>
+#include "lynq_at.h"
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -22,6 +76,7 @@
 char sgmii[32] = {0};
 int gps_set = 2;
 int g_set_output = 0;
+int ttyGS0_fd;
 pthread_t lynq_gps_tid;
 // static pthread_mutex_t s_gps_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
 // static pthread_cond_t s_gps_change_cond = PTHREAD_COND_INITIALIZER;
@@ -65,9 +120,6 @@
 #endif
 
 void *thread_test(void *arg){
-    /*open vcom port*/
-    int ttyGS3_fd = open("/dev/ttyGS0",O_RDWR);
-    /*open vcom port*/
     char gnss_buf[128] = {0};
     lynq_factory_response_ttyGS3("+GPS OPEN:OK\n");
     sprintf(gnss_buf, "%s%d%s", "echo \"GNSS_MODE=", gps_set, "\">>/etc/gnss/mnl.prop");
@@ -93,7 +145,7 @@
                 /*output nema into vcom port*/
                 if(g_set_output == 1)
                 {
-                    write(ttyGS3_fd,lynq_factory_buf,strlen(lynq_factory_buf));
+                    write(ttyGS0_fd,lynq_factory_buf,strlen(lynq_factory_buf));
                 }
                 /*output nema into vcom port*/
             }
@@ -730,8 +782,37 @@
     return 0;
 }
 
+void lynq_switch_card(char *card)
+{
+    char *sim_argv[3] = {};
+    sim_argv[0] = "SET_DEFAULT_SIM_ALL";
+    sim_argv[1] = card;
+    sim_argv[2] = "sleep";
+    android::lynqSendToRil(2,sim_argv,8888);
+    sleep(1);
+    return;
+}
+
+static void lynq_get_imei(int argc, char *argv[MAX_ARGS])
+{
+    lynqSendAt(argc,argv,1010);
+    /*switch card 1*/
+    lynq_switch_card("1");
+    lynqSendAt(argc,argv,1010);
+    /*switch card 0*/
+    lynq_switch_card("0");
+    return;
+}
+
 void lynq_nema_set(char *choice)
 {
+    /*open vcom port*/
+    ttyGS0_fd = open("/dev/ttyGS0",O_RDWR);
+    if(ttyGS0_fd == -1)
+    {
+        lynq_factory_response_ttyGS3("\n+SET NEMA:ERROR\n");
+    }
+    /*open vcom port*/
     if(choice == NULL)
     {
         lynq_factory_response_ttyGS3("INPUT ERROR\n");
@@ -741,7 +822,68 @@
     return;
 }
 
+void lynq_sendRequestToMd(int request, int id) {
+    RequestInfo* info = creatRILInfoAndInit(request, INIT, (RIL_SOCKET_ID) ((id)));
+    info->lynqEvent = 1;
+    switch(request){
+        case RIL_REQUEST_DEVICE_IDENTITY:
+        {
+            getDeviceIdentity(1, NULL, (RIL_SOCKET_ID) ((id)), info);
+            break;
+        }
+        case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE:
+        {
+            getPreferredNetworkType(1, NULL, (RIL_SOCKET_ID) ((id)), info);
+            break;
+        }
+        case RIL_REQUEST_GET_SIM_STATUS:
+        {
+            getIccCardStatus(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_DATA_REGISTRATION_STATE:
+        {
+            getDataRegistrationState(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_VOICE_REGISTRATION_STATE:
+        {
+            getVoiceRegistrationState(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_VOICE_RADIO_TECH:
+        {
+            getVoiceRadioTechnology(1, NULL, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_OEM_HOOK_RAW:
+        {
+            char* tmp[2] = {"RIL_REQUEST_OEM_HOOK_RAW", "AT+ECAL"};
+            sendATCMD(2, tmp, (RIL_SOCKET_ID) (id), info);
+            break;
+        }
+        case RIL_REQUEST_GET_RADIO_CAPABILITY:
+        {
+            getRadioCapability(1, NULL, (RIL_SOCKET_ID) ((id)), info);
+            break;
+        }
+        default:
+            RLOGE("don't support  %d in init", id);
+            if(info) {
+                free(info);
+            }
+    }
+}
+
 int lynq_get_factory_data(int num,char *argv[MAX_ARGS]){
+    if(!strcmp(argv[1],"AT+CGSN"))
+    {
+        for(int i = 0; i < 2; i++)
+        {
+            lynq_sendRequestToMd(RIL_REQUEST_DEVICE_IDENTITY,i);
+        }
+        //lynq_get_imei(num, argv);
+    }
     if(num < 4)
         return -1;
     // if(!strcmp(argv[3], "wifi")){
diff --git a/framework/lynq-ril-service/src/lynq_at_transfer_table.h b/framework/lynq-ril-service/src/lynq_at_transfer_table.h
index c2edde9..1fddd39 100755
--- a/framework/lynq-ril-service/src/lynq_at_transfer_table.h
+++ b/framework/lynq-ril-service/src/lynq_at_transfer_table.h
@@ -16,4 +16,5 @@
 {LYNQ_REQUEST_LINFO,"LINFO",7},

 {LYNQ_REQUEST_FOTA,"LYNQFOTA",7},

 {LYNQ_REQUEST_INSIDE_VERSION,"CGIR",7},

+{LYNQ_REQUEST_FACTORY,"CGSN",7},

 {-1,NULL,0},
\ No newline at end of file
diff --git a/framework/lynq-ril-service/src/ril.cpp b/framework/lynq-ril-service/src/ril.cpp
index 915b399..057790b 100755
--- a/framework/lynq-ril-service/src/ril.cpp
+++ b/framework/lynq-ril-service/src/ril.cpp
@@ -174,6 +174,7 @@
 /*For at extension to receive at buffer*/
 char *at_buf_ext[MAX_AT_CMD];
 int sockfd = 0;
+int imei_cnt = 0;
 /*lei add*/
 #if RILC_LOG
     static char printBuf[PRINTBUF_SIZE];
@@ -3903,6 +3904,31 @@
     return;
 }
 
+/**
+ * @brief To handle comma-separated strings, take the character before the first comma  eg:123456,78 ->123456
+ * 
+ * @param buf Type:[IN]
+ */
+static void parse_imei(char buf[])
+{
+    if(NULL == buf)
+    {
+        return;
+    }
+    const char s[2] = ",";
+    char *token;
+    token = strtok(buf, s);
+    return;
+}
+
+static char * lynqStrdupReadString(Parcel &p) {
+    size_t stringlen;
+    const char16_t *s16;
+
+    s16 = p.readString16Inplace(&stringlen);
+    return strndup16to8(s16, stringlen);
+}
+
 extern "C" void
 RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen) {
     RequestInfo *pRI;
@@ -4165,7 +4191,64 @@
                         }
                         printf("n = %d\n",n);
                    }
+                   break;
                }
+                /*lei add for AT+CGSN 2022/8/4*/
+                case RIL_REQUEST_DEVICE_IDENTITY:
+                {
+                    int resp_type;
+                    int request;
+                    int slot_id;
+                    int error1;
+                    int num;
+                    char imei[32] = {0};
+                    if(pRI->lynqEvent==1)
+                    {
+                        //printf("lei test %s\n" ,printBuf);
+                        p.setDataPosition(0);
+                        if(p.dataAvail() > 0)
+                        {
+                            p.readInt32(&resp_type);
+                            p.readInt32(&request);
+                            p.readInt32(&slot_id);
+                            p.readInt32(&error1);
+                            if(!error1)
+                            {
+                                p.readInt32(&num);
+                                char * test = lynqStrdupReadString(p);
+                                parse_imei(test);
+                                if(imei_cnt % 2 == 0)
+                                {
+                                    sprintf(imei,"%s%s%s", "+CGSN: ", test, "\n");
+                                    int n = write(ttyGS3_fd,imei,strlen(imei));
+                                    if(n<0)
+                                    {
+                                        perror("lynq resp write:");
+                                    }
+                                }
+                                else
+                                {
+                                    sprintf(imei,"%s%s%s", "+CGSN: ", test, "\n");
+                                    int n = write(ttyGS3_fd,imei,strlen(imei));
+                                    if(n<0)
+                                    {
+                                        perror("lynq resp write:");
+                                    }
+                                    char eBuf[64] = {0};
+                                    sprintf(eBuf,"OK\n");
+                                    n = write(ttyGS3_fd,eBuf,strlen(eBuf));
+                                    if(n<0)
+                                    {
+                                        perror("lynq resp write:");
+                                    }
+                                }
+                                imei_cnt++;
+                            }
+                        }
+                    }
+                    break;
+                }
+                /*lei add for AT+CGSN 2022/8/4*/
                default:
                    break;
                }