[Feature][T3TSK-6][AT]If the sleep command is configured,it will take effect automatically after the next startup
[Bugfix][SZZT-85][AT]if only one sim card is inserted into the module,at+mpwrsm=1 will return +CME ERROR:11
[Bugfix][SZZT-72][telephony-sh]can't read IMEI

Change-Id: I9f1bd828cbbaadea4c2530191496bbd246b05a58
diff --git a/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf
index 5c69c47..bf490ad 100755
--- a/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf
+++ b/meta/meta-mediatek-mt2731/conf/machine/auto2731evb-ivt-main.conf
@@ -50,7 +50,10 @@
 # [S] ss / dsss / dsds; [N] dsda / tsts / qsqs
 MTK_MULTI_SIM_SUPPORT = "dsds"
 # [S] C/Lf/Lt/W/T/G, Lf/Lt/W/T/G, Lf/Lt/W/G; [N] Lf/Lt/T/G, W/T/G, W/G, T/G, G
-MTK_PROTOCOL1_RAT_CONFIG = "C/Lf/Lt/W/T/G"
+#lei add for imei
+#MTK_PROTOCOL1_RAT_CONFIG = "C/Lf/Lt/W/T/G"
+MTK_PROTOCOL1_RAT_CONFIG = "Lf/Lt/W/T/G"
+#lei add for imei
 MTK_PROTOCOL2_RAT_CONFIG = "L/W/G"
 #MTK_PROTOCOL3_RAT_CONFIG = "G"
 # yes / no
diff --git a/src/lynq/framework/lynq-atsvc/src/common.cpp b/src/lynq/framework/lynq-atsvc/src/common.cpp
index 2074714..83bee1a 100755
--- a/src/lynq/framework/lynq-atsvc/src/common.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/common.cpp
@@ -48,7 +48,7 @@
 #define UNKOWN_VALUE  (-1)
 
 /*Warren add for FAW 2021/11/1 start*/
-extern int ttyGS3_fd = -1;
+int ttyGS3_fd = -1;
 /*Warren add for FAW 2021/11/1 end*/
 
 
@@ -102,6 +102,28 @@
 #endif
 } RIL_RadioNW;
 
+void parse_version_buf(char *buf){
+    char *p = buf;
+    int flag = 0;
+    int recv = 0;
+    int tmp = -1;
+    while (*p != '\0')
+    {   
+        recv++;
+        if(*p == '"'){
+            tmp = recv;        
+        }
+        if(tmp >= 0){
+            buf[flag++] = buf[tmp++];
+            if(buf[flag-1] == '\"'){
+                buf[flag-1] = '\0';
+            }
+        }
+        *p++;
+    }
+    return;
+}
+
 const char * cardStateToString(int cardStatus)
 {
     switch(cardStatus) {
@@ -327,12 +349,15 @@
 
 void set_default_sim_all(int slot_id){
     RLOGD("set_default_sim_all: %d", slot_id);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     default_sim_all =  slot_id;
     set_default_sim_all_except_data(slot_id);
     set_default_sim_data(slot_id);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
 }
 
 int get_default_sim_all(){
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     return default_sim_all;
 }
 
diff --git a/src/lynq/framework/lynq-atsvc/src/common.h b/src/lynq/framework/lynq-atsvc/src/common.h
index 2131984..05fe74c 100755
--- a/src/lynq/framework/lynq-atsvc/src/common.h
+++ b/src/lynq/framework/lynq-atsvc/src/common.h
@@ -148,10 +148,13 @@
 extern int modemStatus;
 /*Warren add for SZZT 2021/11/14 end*/
 
+
+
 extern int lynq_output_LINFO_enable;
 void lynq_output_info(const char* format,...);
 void lynq_output_LINFO(const char* format,...);
 void lynq_output_LINFO_all();
+void parse_version_buf(char *buf);
     
 typedef struct {
     char *name;           /* User printable name of the function. */
diff --git a/src/lynq/framework/lynq-atsvc/src/lynq-atsvc.service b/src/lynq/framework/lynq-atsvc/src/lynq-atsvc.service
old mode 100644
new mode 100755
index f9faa2d..a39f000
--- a/src/lynq/framework/lynq-atsvc/src/lynq-atsvc.service
+++ b/src/lynq/framework/lynq-atsvc/src/lynq-atsvc.service
@@ -3,7 +3,7 @@
 After=wmtd.service
 
 [Service]
-StandardOutput =syslog+console
+StandardOutput=syslog+console
 Type=oneshot
 RemainAfterExit=no
 ExecStart=/usr/bin/lynq-atsvc
diff --git a/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp b/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp
index 6494873..4e87815 100755
--- a/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/lynq_common.cpp
@@ -11,6 +11,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <log/log.h>
+#include <fcntl.h>
 #include "lynq_common.h"
 #include "lynq_user.h"
 #include "common.h"
@@ -20,6 +21,7 @@
 #include <sys/time.h>
 #include "utils.h"
 #include "Phone_utils.h"
+#include "pms/lynq_pms.h"
 usb_cmd_t Usb_commands[] = {
 #include "lynq_commands.h"
 };
@@ -40,6 +42,9 @@
 int g_lynq_csclk = 0;
 int g_lynq_mpwrsm = 0;//at+mpwrsm need
 int g_lynq_mwakeupcfg = 0;//at+mwakeupcfg need
+int sleep_flag = 0;
+extern pms_manager * g_pmsManagement;
+int sleep_end = 0;
 /*lei add for PMS szzt*/
 
 //int lynqSendToRil(int argc,char *argv[],int uToken);
@@ -625,6 +630,7 @@
         perror("lynq resp write:");
         return 0;
     }
+    pclose(FP);
     syncRespToUsb(0);
     return 0;
 }
@@ -697,7 +703,9 @@
     sim_argv[1] = card;
     sim_argv[2] = "sleep";
     android::lynqSendToRil(2,sim_argv,8888);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     sleep(1);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     return;
 }
 
@@ -713,6 +721,7 @@
     new_argv[0] = "RIL_REQUEST_SCREEN_STATE";
     new_argv[1] = "0";
     android::lynqSendToRil(2,new_argv,77777);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     return;
 }
 
@@ -720,7 +729,7 @@
  * @brief auto_suspend
  * @param  argv        [Type]:in     My Param doc
  */
-static void auto_suspend(int argv)
+void auto_suspend(int argv)
 {
     pthread_t thid;
     pthread_attr_t a;
@@ -731,16 +740,24 @@
         RLOGD("pthread_create error!!!");
         return;
     }
-    system("mdlogctl stop");
-    system("echo 0 > /dev/wmtWifi");
-    system("echo 7 9 0 > /proc/driver/wmt_dbg");
+    int res = system("mdlogctl stop");
+    //printf("auto_suspend mdlogctl stop ret %d\n", res);
+    res = system("echo 0 > /dev/wmtWifi");
+    //printf("auto_suspend echo 0 > /dev/wmtWifi ret %d\n", res);
+    res = system("echo 7 9 0 > /proc/driver/wmt_dbg");
+    //printf("auto_suspend echo 7 9 0 > /proc/driver/wmt_dbg ret %d\n", res);
     /*If have two cards*/
     /*Query the current card*/
     int id = get_default_sim_all();
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     lynq_switch_card("1");
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     lynq_shutdown_modem();
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     lynq_switch_card("0");
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     lynq_shutdown_modem();
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     if(id == RIL_SOCKET_2)
     {
         lynq_switch_card("1");
@@ -750,18 +767,64 @@
     {
         //autosleep
         RLOGD("auto_suspend autosleep");
-        system("echo mem > /sys/power/autosleep");
+        //printf("auto_suspend autosleep");
+        res = system("echo mem > /sys/power/autosleep");
+        //printf("auto_suspend echo 7 9 0 > /proc/driver/wmt_dbg ret %d\n", res);
         
     }
     else if (argv==0)
     {
         //state
         RLOGD("state autosleep");
-        system("echo mem > /sys/power/state");
+        //printf("state autosleep");
+        res = system("echo mem > /sys/power/state");
+        //printf("auto_suspend echo 7 9 0 > /proc/driver/wmt_dbg ret %d\n", res);
     }
     return;
 }
 
+void check_autosleep(int testnum)
+{
+    if(ttyGS3_fd != -1)
+    {
+        close(ttyGS3_fd);
+    }
+    //sleep(1);//for wait g_lynq_mwakeupcfg change
+    if(!sleep_end)//must be config and need wait autosleep
+    {
+        if(g_lynq_mwakeupcfg)//means need autosleep,so wait
+        {
+            /*wait*/
+            while (1)
+            {
+                if(sleep_end == 1)
+                {
+                    RLOGD("check_autosleep no need wait\n");
+                    break;
+                }
+                RLOGD("check_autosleep need to wait\n");//reason:1.worst:network is not online need wait 10+1(s);2.autosleep not completed
+                sleep(1);
+            }
+            /*wait*/
+            //printf("g_lynq_mwakeupcfg %d no need to wait\n", g_lynq_mwakeupcfg);
+        }
+        
+    }
+    else
+    {
+        RLOGD("[%s] sleep_end %d!!!\n",__FUNCTION__,sleep_end);
+    }
+    ttyGS3_fd = open("/dev/ttyGS3",O_RDWR);
+    RLOGD("[%s]ttyGS3_fd %d successfully testnum %d!!!\n",__FUNCTION__,ttyGS3_fd, testnum);
+    if(ttyGS3_fd == -1)
+    {
+        return;
+    }
+    //printf("[%s]open successfully!!!\n",__FUNCTION__);
+    //RLOGD("[%s]open successfully!!!\n",__FUNCTION__);
+    return;
+}
+
 /**
  * @brief check_dtr_level 0 is low, 1 is high
  * @return int 
@@ -860,6 +923,11 @@
             return;
         }
         g_lynq_csclk = atoi(argv[3]);
+
+        g_pmsManagement->lynq_write_pms_to_memory(argv[0], g_lynq_csclk);
+
+    
+
         if(g_lynq_csclk == 1)
         {
             /*if dtr is 1, at+mpwrsm will check dtr pin level*/
@@ -880,6 +948,7 @@
             return;
         }
         g_lynq_mpwrsm = atoi(argv[3]);
+        g_pmsManagement->lynq_write_pms_to_memory(argv[0], g_lynq_mpwrsm);
         /*AT+MPWRSM state*/
         if(!strcmp(argv[3], "0"))
         {
@@ -950,6 +1019,7 @@
             return;
         }
         g_lynq_mwakeupcfg = atoi(argv[3]);
+        g_pmsManagement->lynq_write_pms_to_memory(argv[0], g_lynq_mwakeupcfg);
     }
     syncRespToUsb(0);
     return;
diff --git a/src/lynq/framework/lynq-atsvc/src/lynq_common.h b/src/lynq/framework/lynq-atsvc/src/lynq_common.h
index 95e8584..4cf1b15 100755
--- a/src/lynq/framework/lynq-atsvc/src/lynq_common.h
+++ b/src/lynq/framework/lynq-atsvc/src/lynq_common.h
@@ -123,11 +123,24 @@
 */
 extern int g_lynq_mwakeupcfg;//at+mwakeupcfg need
 /*lei add for PMS*/
+
+/*
+    Can sleep sign automatically
+*/
+extern int sleep_flag;
+
+/*
+    whether can open ttyGS3
+*/
+extern int sleep_end;
+
 usb_at_transfer_t *lynqFindId(char *cmd);
 usb_cmd_t * lynqFindUsbEvent(char *cmd);
 int transferAtToRequest(char *cmd);
 //argv[2]:0 send,1 list,2 get
 int lynqParseUsbCommand(const char* cmd,char *argv[],char test[],char* parser_buf,int maxArgc);
+void auto_suspend(int argv);
+void check_autosleep(int testnum);
 
 int routeCmd(int request);
 
diff --git a/src/lynq/framework/lynq-atsvc/src/main.cpp b/src/lynq/framework/lynq-atsvc/src/main.cpp
index 57e43eb..3bf12f6 100755
--- a/src/lynq/framework/lynq-atsvc/src/main.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/main.cpp
@@ -36,8 +36,15 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <signal.h>
+#include <pthread.h>
+#include <sys/socket.h>
+#include <linux/netlink.h>
 #include "common.h"
+#include "lynq_common.h"
+#include "pms/lynq_pms.h"
+#include "network.h"
 
+#define CHECK_TIME 5 //check whether online
 #define ERR_EXIT(m) \
 do\
 {\
@@ -62,6 +69,7 @@
 
 #undef LOG_TAG
 #define LOG_TAG "DEMO_MAIN"
+#define UEVENT_BUFFER_SIZE 2048
 
 static struct RIL_Env s_rilEnv = {
     RIL_onRequestComplete,
@@ -94,44 +102,173 @@
     return;
 }
 
-void test(int sigino, siginfo_t* msg, void*mycat)
-{
-    printf("\nsigino:%d\n",sigino);
-    RLOGD("\nsigino:%d\n",sigino);
-    //lynq_ril_deinit();
-    //exit(0);
-}
+extern int sleep_flag;
+
+extern pms_manager * g_pmsManagement;
 
 void signal_handler_fun(int signum) {
-    RLOGD("catch signal %d\n", signum);
-    /*lei add fow cv2x 2022/5/17*/
-    /*reopen ttyGS3*/
-    ttyGS3_fd = open("/dev/ttyGS3",O_RDWR);
-    RLOGD("/dev/ttyGS3\n");
-    if(ttyGS3_fd==-1)
-    {
-        RLOGE("open ttyGS3 failure!!!");
-        //kill(0, SIGKILL);
-    }
-    /*reopen ttyGS3*/
-    /*lei add fow cv2x 2022/5/17*/
+    RLOGD("signal_handler_fun catch signal %d\n", signum);
+    //printf("signal_handler_fun catch signal %d\n", signum);
+    check_autosleep(signum);
+    //RLOGD("signal_handler_fun catch signal %d %d\n", signum, __LINE__);
+    //printf("signal_handler_fun catch signal %d %d\n", signum, __LINE__);
+    return;
+}
 
+static void query_network_state(int request, int slot)
+{
+    RequestInfo* info = creatRILInfoAndInit(request, INIT, (RIL_SOCKET_ID) ((slot)));
+    switch (request)
+    {
+    case RIL_REQUEST_DATA_REGISTRATION_STATE:
+        /* code */
+        getDataRegistrationState(1, NULL, (RIL_SOCKET_ID) (slot), info);
+        break;
+    case RIL_REQUEST_VOICE_REGISTRATION_STATE:
+        /* code */
+        getVoiceRegistrationState(1, NULL, (RIL_SOCKET_ID) (slot), info);
+        break;
+    default:
+        break;
+    }
+    return;
+}
+
+/**
+ * @brief 1 means can go to autosleep
+ * 
+ * @return int 
+ */
+static int lynq_ensure_online(void)
+{
+    /*ensure inject 2G/3G/4G*/
+    int slot_id = get_default_sim_all(); 
+    int i = 3;
+    while (i)
+    {
+        if(!sleep_flag)
+        {
+            RLOGD("function %s no network\n", __FUNCTION__);
+            printf("%s no network\n", __FUNCTION__);
+        }
+        else
+        {
+            RLOGD("%s network is online\n", __FUNCTION__);
+            printf("%s network is online\n",__FUNCTION__);
+            break;
+        }
+        //query_network_state(RIL_REQUEST_DATA_REGISTRATION_STATE, slot_id);
+        query_network_state(RIL_REQUEST_VOICE_REGISTRATION_STATE, slot_id);
+        sleep(1);
+        i--;
+    }
+    printf("%s i %d\n",__FUNCTION__, i);
+    return i;
+}
+
+/**
+ * @brief Get the prop                                                                                                                                                              
+ * 
+ * @param ptr 
+ */
+static char* get_pro(const char *ptr)
+{
+    FILE *fp;
+    static char res[128] = {};
+    bzero(res, 128);
+    fp = popen(ptr,"r");
+    fgets(res,sizeof(res),fp);
+    printf("buffer %s",res);
+    pclose(fp);
+    parse_version_buf(res);
+    return res;
+}
+
+void lynq_goto_sleep(void)
+{
+    if(lynq_ensure_online())//ensure online
+    {
+        if(g_lynq_mwakeupcfg != 0)//means user must be configed it
+        {
+            RLOGD("means user must be configed it go to sleep\n");
+            //printf("means user must be configed it go to sleep\n");
+            auto_suspend(g_lynq_mpwrsm);
+            //sleep(4);
+        }
+    }
+    else
+    {
+        RLOGD("can't autosleep because network is unreable %d\n", sleep_flag);
+        //printf("can't autosleep because network is unreable %d\n", sleep_flag);
+    }
+    sleep_end = 1;
+    return;
+}
+
+/*check usb connect/disconnect*/
+void * hot_usb(void * arg)
+{
+    struct sockaddr_nl client;
+    struct timeval tv;
+    int CppLive, rcvlen, ret;
+    fd_set fds;
+    int buffersize = 1024;
+    CppLive = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);
+    memset(&client, 0, sizeof(client));
+    client.nl_family = AF_NETLINK;
+    client.nl_pid = getpid();
+    client.nl_groups = 1; /* receive broadcast message*/
+    setsockopt(CppLive, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
+    bind(CppLive, (struct sockaddr*)&client, sizeof(client));
+    while (1)
+    {
+        char buf[UEVENT_BUFFER_SIZE] = { 0 };
+        FD_ZERO(&fds);
+        FD_SET(CppLive, &fds);
+        tv.tv_sec = 0;
+        tv.tv_usec = 100 * 1000;
+        ret = select(CppLive + 1, &fds, NULL, NULL, &tv);
+        if(ret < 0)
+            continue;
+        if(!(ret > 0 && FD_ISSET(CppLive, &fds)))
+            continue;
+        /* receive data */
+        rcvlen = recv(CppLive, &buf, sizeof(buf), 0);
+        if (rcvlen > 0)
+        {
+            check_autosleep(777);
+            /*You can do something here to make the program more perfect!!!*/
+        }
+    }
+    close(CppLive);
+    return NULL;
 }
 
 int main(int argc, char **argv) {
     system("route add -host 255.255.255.255 dev lo");
-    FILE *FP;
-    char BUFFER[64]={};
-    /*lei add for cv2x 2022/5/17*/
-    signal(SIGTERM,signal_handler_fun);
     signal(SIGHUP,signal_handler_fun);
-    /*lei add for cv2x 2022/5/17*/
-    // signal(SIGTERM,SIG_IGN);
-    // signal(SIGHUP,SIG_IGN);
-    FP = popen("cat /sys/kernel/ccci/boot","r");
-    fgets(BUFFER,sizeof(BUFFER),FP);
-    RLOGD("liulei buffer %s",BUFFER);
-    modemStatus = atoi(&BUFFER[4]);
+    /*lei add for hot usb plug in 2022/8/27*/
+    pthread_t thid;
+    pthread_attr_t a;
+    pthread_attr_init(&a);
+    pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
+    int ret = pthread_create(&thid, &a, hot_usb, NULL);
+    if(ret != 0){
+        RLOGD("pthread_create error!!!");
+        return 0;
+    }
+    /*lei add for hot usb plug in 2022/8/27*/
+    /*get pro*/
+    lynq_init_pms_manager();
+    g_pmsManagement->lynq_read_pms_from_memory("MPWRSM", &g_lynq_mpwrsm);
+    g_pmsManagement->lynq_read_pms_from_memory("CSCLK", &g_lynq_csclk);
+    g_pmsManagement->lynq_read_pms_from_memory("MWAKEUPCFG", &g_lynq_mwakeupcfg);
+    RLOGD("g_lynq_mpwrsm %d\n", g_lynq_mpwrsm);
+    //printf("g_lynq_mpwrsm %d\n", g_lynq_mpwrsm);
+    RLOGD("CSCLK %d\n", g_lynq_csclk);
+    //printf("CSCLK %d\n", g_lynq_csclk);
+    RLOGD("MWAKEUPCFG %d\n", g_lynq_mwakeupcfg);
+    //printf("MWAKEUPCFG %d\n", g_lynq_mwakeupcfg);
     int lock_file = open("/tmp/tel_demo_single_proc.lock", O_CREAT|O_RDWR, 0666);
     int rc = flock(lock_file,LOCK_EX|LOCK_NB);
     if(rc) {
@@ -159,7 +296,6 @@
         RLOGE("dlopen failed: %s", dlerror());
         exit(EXIT_FAILURE);
     }
-
     android::RIL_startEventLoop();
     //android::startATCILoop();
     //android::startPMLoop();
@@ -183,6 +319,7 @@
     android::startGdbusLoop();
     RLOGD("RIL_Init RIL_register completed");
     printf("DemoApp launch done!\n");
+    lynq_goto_sleep();
     while (true) {
         sleep(UINT32_MAX);
     }
diff --git a/src/lynq/framework/lynq-atsvc/src/makefile b/src/lynq/framework/lynq-atsvc/src/makefile
index f3f7b8c..744748a 100755
--- a/src/lynq/framework/lynq-atsvc/src/makefile
+++ b/src/lynq/framework/lynq-atsvc/src/makefile
@@ -71,6 +71,7 @@
   -I$(LOCAL_PATH)/fota \
   -I$(LOCAL_PATH)/temp \
   -I$(LOCAL_PATH)/time \
+  -I$(LOCAL_PATH)/pms \
   -I$(ROOT)$(includedir)/ \
   -I$(ROOT)$(includedir)/liblog \
   -I$(ROOT)$(includedir)/liblynq-thermal \
@@ -117,6 +118,7 @@
     -lnandapi  \
     -llynq-thermal  \
     -llynq-systime \
+    -lsqlite3 \
 
 ifeq ($(strip $(TARGET_PLATFORM)), mt2735)
 LOCAL_LIBS += -luciwrapper
@@ -125,7 +127,7 @@
 endif
 
 
-SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp log/*.cpp rndis/*.cpp factory/*.cpp temp/*.cpp  time/*.cpp)
+SOURCES = $(wildcard util/*.cpp *.cpp ecall/*.cpp ecall/gost/*.cpp ecall/gost/utils/*.cpp ecall/gost/sslp/*.cpp ecall/gost/sslp/auth/*.cpp ecall/gost/sslp/firmware/*.cpp ecall/gost/sslp/commands/*.cpp ecall/gost/sslp/ecall/*.cpp ecall/gost/sslp/teledata/*.cpp data/*.cpp  em/rfdesense/*.cpp em/networkinfo/*.cpp em/*.cpp sms/*.cpp sms/gsm/*.cpp sms/cdma/*.cpp atci/*.cpp stateManager/*.cpp log/*.cpp rndis/*.cpp factory/*.cpp temp/*.cpp  time/*.cpp pms/*.cpp)
 
 EXECUTABLE = lynq-atsvc
 
diff --git a/src/lynq/framework/lynq-atsvc/src/pms/lynq_pms.cpp b/src/lynq/framework/lynq-atsvc/src/pms/lynq_pms.cpp
new file mode 100755
index 0000000..6dca887
--- /dev/null
+++ b/src/lynq/framework/lynq-atsvc/src/pms/lynq_pms.cpp
@@ -0,0 +1,349 @@
+#include "lynq_pms.h"

+

+enum

+{

+    NO_INFO = 2,

+    GET_INFO = 1,

+    NOT_FIND =0

+};

+

+int pms_check_res = NOT_FIND;

+

+char pmp_content[128] = {0};

+

+pms_manager *g_pmsManagement;

+

+pms_manager:: ~ pms_manager(){}

+

+int read_pms_from_memory_cb(void *data, int argc, char **argv, char **azColName)

+{

+    return 0;

+}

+

+/**

+ * @brief Check whether the ID exists in the database

+ * 

+ * @param index 

+ * @return int 

+ * find:turn 1 

+ * not find:turn 0

+ */

+int pms_manager::lynq_check_function(char *function)

+{

+    memset(pmp_content,0,128);

+    strcpy(pmp_content, function);

+    char *zErrMsg = 0;

+    int rc;

+    char sql[128]={0};

+    /* Open database */

+    rc = sqlite3_open(PMS_DB_PATH, &pmsDb);

+    if( rc )

+    {

+        //printf("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+        return LYNQ_E_PMS_DB_FAIL;

+    }

+    sprintf(sql,"%s", "SELECT * FROM LYNQPMS W");

+    char **dbResult; 

+    int nRow=-1, nColumn=-1;

+    int i,j;

+    int rdy = 0;

+    rc = sqlite3_get_table(pmsDb,sql,&dbResult,&nRow,&nColumn,&zErrMsg); 

+    if( rc != SQLITE_OK )

+    {

+        //printf("SQL error: %s\n", zErrMsg);

+        sqlite3_free_table(dbResult);

+        sqlite3_free(zErrMsg);

+        sqlite3_close(pmsDb);

+        return LYNQ_E_PMS_DB_FAIL;

+    }

+    //printf("[%s] %s row %d\n", __FUNCTION__,sqlite3_errmsg(pmsDb),nRow);

+    int index = nColumn;

+    if(nRow == 0)

+    {

+        pms_check_res = NO_INFO;

+    }

+    else

+    {

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

+        {

+            for(j = 0; j < nColumn; j++)

+            {

+                //printf("j:%s : index:%s\n", dbResult[j],dbResult[index]);

+                if(!strcmp(dbResult[index],function))

+                {

+                    pms_check_res = GET_INFO;

+                    rdy = 1;

+                    break;

+                }

+                index++;

+            }

+        }

+        if(!rdy)

+        {

+            pms_check_res = NOT_FIND; 

+        }

+    }

+    sqlite3_free_table(dbResult);

+    sqlite3_free(zErrMsg);

+    sqlite3_close(pmsDb);

+    return 0;

+}

+

+int pms_manager::lynq_write_pms_to_pms_db(char *function, int state)

+{

+    char *zErrMsg = 0;

+    int rc;

+    char sql[128]={0};

+    //printf("function %s %s\n", __FUNCTION__, function);

+

+    if(!lynq_check_function(function))

+    {

+        rc = sqlite3_open(PMS_DB_PATH, &pmsDb);

+        if( rc )

+        {

+            //printf("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+            return LYNQ_E_PMS_DB_FAIL;

+        }

+        //printf("[%s] Opened database successfully\n",__FUNCTION__);

+        if(NO_INFO == pms_check_res)//insert

+        {

+            //printf("insert SQL %s rc %d\n", zErrMsg, rc);

+       

+            sprintf(sql,"INSERT INTO LYNQPMS (ID,FUNCTION,STATUS,NUMBER) VALUES (NULL,'%s',%d,%d);",function,state,1);

+            rc = sqlite3_exec(pmsDb, sql, NULL, NULL, &zErrMsg);

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s rc %d\n", zErrMsg, rc);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+        }

+        else if (GET_INFO == pms_check_res)//update

+        {

+            //printf("update SQL %s rc %d\n", zErrMsg, rc);

+            /*update*/

+            sprintf(sql,"%s%d%s%s%s","UPDATE LYNQPMS set STATUS = ",state," WHERE FUNCTION='",function,"'");

+            rc = sqlite3_exec(pmsDb, sql, NULL, NULL, &zErrMsg);

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s rc %d\n", zErrMsg, rc);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+        }

+        else if(NOT_FIND == pms_check_res)//insert

+        {

+            //printf("not find %s rc %d\n", zErrMsg, rc);

+            //printf("insert SQL %s rc %d\n", zErrMsg, rc);

+       

+            sprintf(sql,"INSERT INTO LYNQPMS (ID,FUNCTION,STATUS,NUMBER) VALUES (NULL,'%s',%d,%d);",function,state,1);

+            rc = sqlite3_exec(pmsDb, sql, NULL, NULL, &zErrMsg);

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s rc %d\n", zErrMsg, rc);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+        }

+        

+    }

+    sqlite3_close(pmsDb);

+    return LYNQ_E_PMS_DB_OK;

+

+}

+

+int pms_manager::lynq_write_pms_to_memory(char *function, int state)

+{

+    

+    lynq_write_pms_to_pms_db(function,state);

+    return LYNQ_E_PMS_DB_OK;

+}

+

+int pms_manager::lynq_read_pms_from_memory(char *function, int *state)

+{

+    char *zErrMsg = 0;

+    int rc;

+    char sql[128]={0};

+    if(!lynq_check_function(function))

+    {

+        rc = sqlite3_open(PMS_DB_PATH, &pmsDb);

+        if( rc )

+        {

+            //printf("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+            return LYNQ_E_PMS_DB_FAIL;

+        }

+        //printf("[%s] Opened database successfully\n",__FUNCTION__);

+        if (GET_INFO == pms_check_res)//select

+        {

+            //printf("select SQL %s rc %d\n", zErrMsg, rc);

+            /*update*/

+            //SELECT * FROM LYNQPMS WHERE FUNCTION= 'CSCLK'

+            sprintf(sql,"%s%s%s", "SELECT * FROM LYNQPMS WHERE FUNCTION ='", function, "'");

+            char **dbResult; 

+            int nRow=-1, nColumn=-1;

+            int i,j;

+            int rdy = 0;

+            rc = sqlite3_get_table(pmsDb,sql,&dbResult,&nRow,&nColumn,&zErrMsg); 

+            if( rc != SQLITE_OK )

+            {

+                //printf("SQL error: %s\n", zErrMsg);

+                sqlite3_free_table(dbResult);

+                sqlite3_free(zErrMsg);

+                sqlite3_close(pmsDb);

+                return LYNQ_E_PMS_DB_FAIL;

+            }

+            ////printf("[%s] %s row %d\n", __FUNCTION__,sqlite3_errmsg(pmsDb),nRow);

+            int index = nColumn;

+            if(nRow == 0)

+            {

+                pms_check_res = NO_INFO;

+            }

+            else

+            {

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

+                {

+                    for(j = 0; j < nColumn; j++)

+                    {

+                        ////printf("%s:%s\n", dbResult[j],dbResult[index]);

+                        if(!strcmp(dbResult[j],"STATUS"))

+                        {

+                            pms_check_res = GET_INFO;

+                            *state = atoi(dbResult[index]);

+                            rdy = 1;

+                            break;

+                        }

+                        index++;

+                    }

+                }

+                if(!rdy)

+                {

+                    pms_check_res = NOT_FIND; 

+                }

+            }

+            sqlite3_free_table(dbResult);

+            sqlite3_free(zErrMsg);

+            sqlite3_close(pmsDb);

+        }

+

+    }

+    return 0;

+}

+

+int lynq_init_pms_manager()

+{

+    g_pmsManagement = new pms_manager();

+    if(g_pmsManagement==NULL)

+    {

+        RLOGE("init class sms manager fail!!!");

+        exit(EXIT_FAILURE);

+    }

+    RLOGD("init class sms manager success!!!");

+    g_pmsManagement->initpmsManager();

+    return 0;

+}

+

+int has_sms_db_created(char *path,sqlite3* smsDb_l)

+{

+    if (path == NULL || strlen(path) == 0)

+    {

+        //printf("initSmsDb error with null path!");

+        return PMS_DB_ERR;

+    }

+    int rc = sqlite3_open_v2(path, &smsDb_l, SQLITE_OPEN_READWRITE,NULL);

+    if (rc == SQLITE_OK) 

+    {

+        //printf("check init success!");

+        return PMS_DB_READED;

+    } 

+    else 

+    {

+        //printf("db has not create %s!", sqlite3_errmsg(smsDb_l));

+        sqlite3_close_v2(smsDb_l);

+        return PMS_DB_ERR;

+    }

+}

+

+int pms_manager::create_pms_db(char *path)

+{

+    if (path == NULL || strlen(path) == 0) {

+        //printf("initSmsDb error with null path!");

+        return PMS_DB_ERR;

+    }

+    if(PMS_DB_READED==has_sms_db_created(path,pmsDb))

+    {

+        return PMS_DB_READED;

+    }

+    int rc = sqlite3_open(path, &pmsDb);

+    if (rc != SQLITE_OK) {

+        //printf("initDb failed %s", sqlite3_errcode(pmsDb));

+        return PMS_DB_ERR;

+    } else {

+        //printf("create db in %s", path);

+    }

+    sqlite3_close(pmsDb);

+    return PMS_DB_CREATE;

+}

+

+int pms_manager::initpmsManager()

+{

+    int db_ret=0;

+    int table_ret=0;

+    db_ret = create_pms_db(PMS_DB_PATH);

+    if(db_ret==PMS_DB_CREATE)

+    {

+        table_ret = create_pms_table(PMS_DB_PATH);

+        if(table_ret!=0)

+        {

+            //printf("create sms table fail!!!");

+            return 1;

+        }

+    }

+    else if(db_ret==PMS_DB_READED)

+    {

+        //printf("[%s] sms db has be build!!!",__FUNCTION__);

+    }

+    else

+    {

+        //printf("init sms db fail!!!");

+    }

+    return 0;

+}

+

+int pms_manager::create_pms_table(char*path)

+{

+    char *zErrMsg = 0;

+    int rc;

+    char *sql;

+

+    /* Open database */

+    rc = sqlite3_open(path, &pmsDb);

+    if( rc )

+    {

+        RLOGD("[%s] Can't open database: %s\n", __FUNCTION__,sqlite3_errmsg(pmsDb));

+        return 1;

+    }

+    RLOGD("[%s] Opened database successfully\n",__FUNCTION__);

+    /* Create SQL statement */

+    /*lei modify for autosleep 2022/8/25*/

+    sql = "CREATE TABLE LYNQPMS( \

+         ID                       INTEGER PRIMARY KEY AUTOINCREMENT      NOT NULL, \

+         FUNCTION                 NONE                                 NOT NULL, \

+         STATUS            INT                                 NOT NULL, \

+         NUMBER         INT                                 NOT NULL)";

+   /* Execute SQL statement */

+   /*lei modify for autosleep 2022/8/25*/

+    rc = sqlite3_exec(pmsDb, sql, NULL, 0, &zErrMsg);

+    if( rc != SQLITE_OK )

+    {

+        RLOGD("SQL error: %s\n", zErrMsg);

+        sqlite3_free(zErrMsg);

+        sqlite3_close(pmsDb);

+        return 1;

+    }

+    RLOGD("Table LYNQSMS created successfully\n");

+    sqlite3_close(pmsDb);

+    return 0;

+}
\ No newline at end of file
diff --git a/src/lynq/framework/lynq-atsvc/src/pms/lynq_pms.h b/src/lynq/framework/lynq-atsvc/src/pms/lynq_pms.h
new file mode 100755
index 0000000..57796d0
--- /dev/null
+++ b/src/lynq/framework/lynq-atsvc/src/pms/lynq_pms.h
@@ -0,0 +1,39 @@
+#ifndef __LYNQ_PMS__

+#define __LYNQ_PMS__

+#include <sqlite3.h>

+#include <log/log.h>

+#include <stdlib.h>

+#include <string.h>

+#include <pthread.h>

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+#define PMS_DB_PATH "/system/etc/tele/pms.db"

+#define LYNQ_E_PMS_DB_OK 0

+#define LYNQ_E_PMS_DB_FAIL -1

+#define PMS_DB_READED 0

+#define PMS_DB_ERR 1

+#define PMS_DB_CREATE 2

+

+class pms_manager

+{

+    public:

+        virtual ~ pms_manager();

+        int initpmsManager();

+        int lynq_write_pms_to_memory(char *function, int state);

+        int lynq_read_pms_from_memory(char *function, int *state);

+    private:

+        int create_pms_db(char *path);

+        int create_pms_table(char*path);

+        int lynq_write_pms_to_pms_db(char *function, int state);

+        int lynq_check_function(char *function);

+        sqlite3* pmsDb;

+};

+extern pms_manager *g_pmsManagement;

+int lynq_init_pms_manager();

+#ifdef __cplusplus

+}

+#endif

+

+#endif
\ No newline at end of file
diff --git a/src/lynq/framework/lynq-atsvc/src/ril.cpp b/src/lynq/framework/lynq-atsvc/src/ril.cpp
index 95d43fd..b21bff6 100755
--- a/src/lynq/framework/lynq-atsvc/src/ril.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/ril.cpp
@@ -85,6 +85,8 @@
 #include "lynq_factory.h"
 #include "lynq_at_temp.h"
 #include "lynq_at_time.h"
+#include "lynq_pms.h"
+#include "lynq_common.h"
 /*Warren add for FAW platform 2021/9/28 end*/
 
 
@@ -403,7 +405,6 @@
  */
 int simRuimStatus = -1;
 
-
 static char *
 strdupReadString(Parcel &p) {
     size_t stringlen;
@@ -3804,27 +3805,7 @@
 
 #endif
 
-static void parse_version_buf(char *buf){
-    char *p = buf;
-    int flag = 0;
-    int recv = 0;
-    int tmp = -1;
-    while (*p != '\0')
-    {   
-        recv++;
-        if(*p == '"'){
-            tmp = recv;        
-        }
-        if(tmp >= 0){
-            buf[flag++] = buf[tmp++];
-            if(buf[flag-1] == '\"'){
-                buf[flag-1] = '\0';
-            }
-        }
-        *p++;
-    }
-    return;
-}
+
 
 static int lynq_get_version(){
     FILE *fp;
@@ -3986,8 +3967,12 @@
                    tempVal = atoi((char *)p_cur[0]);
                    if(tempVal == 1 || tempVal==5){
                        sprintf(respStr,"[SIM%d]%s register is in service!",socket_id +1, respStr);
+                       /*lei add for autosleep 2022/8/23*/
+                       sleep_flag = 1;
+                       /*lei add for autosleep 2022/8/23*/
                    }else{
                        sprintf(respStr,"[SIM%d]%s register is not in service!",socket_id +1, respStr);
+                       sleep_flag =0;
                    }
                    if(numStrings >=4 && p_cur[3] != NULL)
                    {
@@ -3995,6 +3980,7 @@
                        tempVal = atoi((char *)p_cur[3]);
                        if(tempVal == RADIO_TECH_LTE){//4G
                            sprintf(respStr,"%s radioTech is 4G!",respStr);
+                           sleep_flag = 4;
                        } else if( tempVal == RADIO_TECH_GSM ||
                                   tempVal == RADIO_TECH_GPRS ||
                                   tempVal == RADIO_TECH_EDGE ||
@@ -4002,6 +3988,7 @@
                                   tempVal == RADIO_TECH_IS95B ||
                                   tempVal == RADIO_TECH_1xRTT) { //2G
                            sprintf(respStr,"%s radioTech is 2G!",respStr);
+                           sleep_flag = 2;
                        } else if( tempVal == RADIO_TECH_UMTS ||
                                   tempVal == RADIO_TECH_HSDPA ||
                                   tempVal == RADIO_TECH_HSUPA ||
@@ -4013,6 +4000,7 @@
                                   tempVal == RADIO_TECH_EVDO_A ||
                                   tempVal == RADIO_TECH_EVDO_B) { //3G
                            sprintf(respStr,"%s radioTech is 3G!",respStr);
+                           sleep_flag = 3;
 #ifdef TELEMATIC_5G_SUPPORT
                        } else if(tempVal == RADIO_TECH_NR) { //5G
                            sprintf(respStr,"%s radioTech is 5G!",respStr);
@@ -6497,12 +6485,14 @@
     }
     for(int i =0;i<argc;i++)
     {
-        printf("argv[%d]=%s\n",i,argv[i]);
+        RLOGD("argv[%d]=%s\n",i,argv[i]);
+        //printf("liulei argv[%d]=%s\n",i,argv[i]);
     }
     COMMAND *command = find_command(argv[0]);
     if(!command)
     {
         RLOGE("%s: No such command for DemoApp", argv[0]);
+        //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
         return 1;
     }
 
@@ -6519,7 +6509,9 @@
 
     if(request == -1)
     {
+        //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
         (*(command->func)) (argc, argv, id, NULL);
+        //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
         return 1;
     }
 
@@ -6533,6 +6525,7 @@
 
 
     RequestInfo *pRI  = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID)(id));
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     /*lei modify to not display RIL_REQUEST_SCREEN_STATE of ok only sleep mode*/
     if(uToken == 77777 && request == RIL_REQUEST_SCREEN_STATE)
     {
@@ -6552,7 +6545,9 @@
     GetTimeString(Time_buf);
     //FUNCTION_CALLED(Time_buf,requestToString(request));
     int waittoken = pRI->token;
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     (*(command->func)) (argc, argv, pRI->socket_id, pRI);
+    //printf("FUNCIONT %s LINE %d\n", __FUNCTION__, __LINE__);
     FUNCTION_CALLED(Time_buf,requestToString(request));
     waitResponse(waittoken);
     memset(Time_buf,0,sizeof(Time_buf));
@@ -6560,6 +6555,7 @@
     FUNCTION_RETURN(Time_buf,requestToString(request));
     return 0;
 }
+
 void startUsbLoop(void)
 {
     int nread=-1;
@@ -6571,16 +6567,14 @@
     int argc = 0;
     char *argv[MAX_ARGS];//argv[0]:at name,argv[1]:raw data,argv[2]:at type,argv[3]:paramter1,argv[4]:paramter2 ....
     char eBuf[1024];
-    ttyGS3_fd = open("/dev/ttyGS3",O_RDWR);
+    check_autosleep(999);
     if(ttyGS3_fd==-1)
     {
         RLOGE("open ttyGS3 failure!!!");
         printf("open ttyGS3 failure!!!\n");
-        //printf("%s\n",strerr(errno));
-        perror("--test--");
-        kill(0, SIGKILL);
+        return;
+        //kill(0, SIGKILL);
     }
-    printf("[%s]open %s successfully!!!\n",__FUNCTION__,ttyname(ttyGS3_fd));
     while(1)
     {
         bzero(buffer, 1024);
diff --git a/src/lynq/framework/lynq-atsvc/src/sim.cpp b/src/lynq/framework/lynq-atsvc/src/sim.cpp
old mode 100644
new mode 100755
index 2235373..021ac76
--- a/src/lynq/framework/lynq-atsvc/src/sim.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/sim.cpp
@@ -56,15 +56,21 @@
     bzero(eBuf, 64);
     if(error==RIL_E_SUCCESS)
     {
-         sprintf(eBuf,"\nOK\n\0");
+        sprintf(eBuf,"\nOK\n\0");
     }
     else
     {
         sprintf(eBuf,"\n+CME ERROR: %d\n\0",error);
     }
-    int n = write(ttyGS3_fd,eBuf,strlen(eBuf));
+    if(ttyGS3_fd == -1)
+    {
+        return;
+    }
+    int n = write(ttyGS3_fd,eBuf,strlen(eBuf));//if no usb will block
+    //printf("function %s line %d\n", __FUNCTION__, __LINE__);
     if(n<0)
     {
+        //printf("function %s line %d\n", __FUNCTION__, __LINE__);
         perror("lynq resp write:");
     }
     return;
@@ -202,28 +208,31 @@
 
 //SET_DEFAULT_SIM_ALL
 int set_default_sim_all(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI){
+    //printf("function %s line %d\n", __FUNCTION__, __LINE__);
     if((argc != 2) || (!is_valid(atoi(argv[1]))))
     {
+        //printf("function %s line %d\n", __FUNCTION__, __LINE__);
         free(pRI);
         RLOGD("the paremeters numbers isn't right , so return");
         android::emResultNotify("Set failed.\n");
         /*Warren add for FAW platform 2021/12/08 start*/
-        printf("set failed\n");
-        sendAtTottyGS(2);
+        //printf("set failed\n");
+        if(argv[2] == NULL)
+        {
+            sendAtTottyGS(2);
+        }
         /*Warren add for FAW platform 2021/12/08 end*/
         return -1;
     }
 
     if(Radio_capability_switch_util::is_sim_inserted(atoi(argv[1]))) {
+        //printf("function %s line %d\n", __FUNCTION__, __LINE__);
         set_default_sim_all(atoi(argv[1]));
+        //printf("function %s line %d\n", __FUNCTION__, __LINE__);
         android::emResultNotify("Set successful.\n");
         /*Warren add for FAW platform 2021/12/08 start*/
-        printf("set successful\n");
-        if(argv[2] != NULL)
-        {
-            /*do nothing*/
-        }
-        else
+        //printf("set successful\n");
+        if(argv[2] == NULL)
         {
             sendAtTottyGS(0);
         }
@@ -232,8 +241,11 @@
     } else {
         RLOGD("Set default all fail, SIM card absent");
         /*Warren add for FAW platform 2021/12/08 start*/
-        sendAtTottyGS(11);
-        printf("Set default all fail, SIM card absent\n");
+        if(argv[2] == NULL)
+        {
+            sendAtTottyGS(11);
+        }
+        //printf("Set default all fail, SIM card absent\n");
         /*Warren add for FAW platform 2021/12/08 end*/
         android::emResultNotify("Set default all fail, SIM card absent.\n");
         free(pRI);