[Bugfix][TAT-28] ELT port can not NMEA data,and optimization rndis boot mode

Change-Id: I840295c41ad50c28d39de379bcdc75351dcf8932
diff --git a/src/lynq/lib/liblynq-at-common/lynq_at_common.cpp b/src/lynq/lib/liblynq-at-common/lynq_at_common.cpp
index 6afe8cc..e73121d 100755
--- a/src/lynq/lib/liblynq-at-common/lynq_at_common.cpp
+++ b/src/lynq/lib/liblynq-at-common/lynq_at_common.cpp
@@ -151,13 +151,17 @@
         if(mode == 1)

         {

             g_gtarndis_mode = mode;

-            system("echo \"1\" > /data/rndis.conf");

+            system("uci set lynq_uci.rndis.status='1'");

+            usleep(10*1000);

+            system("uci commit");

             lynq_response_ok();

         }

         else if (mode == 0)

         {

             g_gtarndis_mode = mode;

-            system("echo \"0\" > /data/rndis.conf");

+            system("uci set lynq_uci.rndis.status='0'");

+            usleep(10*1000);

+            system("uci commit");

             lynq_response_ok();

         }

         else

diff --git a/src/lynq/lib/liblynq-uci/lynq_uci.config b/src/lynq/lib/liblynq-uci/lynq_uci.config
index 86f578c..4956bc1 100755
--- a/src/lynq/lib/liblynq-uci/lynq_uci.config
+++ b/src/lynq/lib/liblynq-uci/lynq_uci.config
@@ -24,5 +24,5 @@
 config  lynq_gnss_log_level 'lynq_gnss_log'

         option level '4'

 

-config  lynq_rndis  'lynq_rndis'

-        option initiate '0'

+config  rndis_status 'rndis'

+        option status '0'

diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
index 5ab32d5..3cd6be5 100755
--- a/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/lynq_atsvc_controller.c
@@ -505,102 +505,3 @@
     /*load pulgin from plugin config*/
     return 0;
 }
-
-#if 0
-
-/*
-    //填充对端地址
-    //报式传输,只发不收可以不bind,要发要收必须要bind
-    stRemoteAddr.sun_family = AF_UNIX;
-    sprintf(stRemoteAddr.sun_path, "./server"); //注意用sprintf            
- 
-    if(0 > sendto(iSocketFD, "客户端", sizeof("客户端"), 0, (void *)&stRemoteAddr, sizeof(stRemoteAddr)))
-    {
-        close(iSocketFD);
-        printf("发送数据失败!\n");
-        return -1;
-    }
-    
-    if(0 > recvfrom(iSocketFD, acBuf, sizeof(acBuf), 0, NULL, NULL))
-    {
-        close(iSocketFD);
-        printf("接收数据失败!\n");
-        return -1;
-    }
- 
-    printf("客户端接收到服务器发来的消息是:%s\n", acBuf);
-    while(1)
-	{
-	sleep(1);
-	}
-    return 0;
-*/
-
-
-
-/*listen UPD SOCKET port */
-struct sockaddr_in server_addr;
-struct sockaddr_in lynqClient_addr;
-bzero(&server_addr, sizeof(server_addr));
-server_addr.sin_family = AF_INET;
-server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
-server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
-/* create socket */
-//int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
-atsvc_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
-if(atsvc_socket_fd == -1)
-{
-    RLOGE("Create Socket Failed:");
-    exit(1);
-}
-
-/* bind socket port*/
-if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
-{
-     RLOGE("Server Bind Failed:");
-     exit(1);
-}
-/* create epoll fd,add socket to epoll */
-ep_fd = epoll_create(LYNQ_SOCKET_ENVNT_FD_MAX);
-//int len = sizeof(struct sockaddr_in);
-lynq_ev.events = EPOLLIN | EPOLLET;
-lynq_ev.data.fd = server_socket_fd;
-if(epoll_ctl(ep_fd, EPOLL_CTL_ADD, server_socket_fd, &lynq_ev) < 0) 
-{
-    fprintf(stderr, "epoll set insertion error: fd=%d\n", server_socket_fd);
-    return;
-}
-else
-{
-    printf("monitor socket add epoll success!!!\n");
-}
-char buffer[LYNQ_SOCKET_BUFFER];
-lynq_client_t *client_tmp = NULL;
-/* tranlate data */
-while(true)
-{
-    if(!s_registerCalled)
-    {
-        sleep(1);
-        continue;
-    }
-    en_fd = epoll_wait(ep_fd, lynq_events, 10000, -1);//###Check  valid
-    if(en_fd <=0 )
-    {
-        continue;
-    }
-    for (int n = 0; n < en_fd; ++n)
-    {
-        if (lynq_events[n].data.fd == server_socket_fd)
-        {
-            /* define address to catch the client addreess*/
-            //struct sockaddr_in client_addr;
-            socklen_t client_addr_length = sizeof(lynqClient_addr);
-            /* receive the data */
-            bzero(buffer, LYNQ_SOCKET_BUFFER);
-            if(recvfrom(server_socket_fd, buffer, LYNQ_SOCKET_BUFFER,0,(struct sockaddr*)&lynqClient_addr, &client_addr_length) == -1)
-            {
-                RLOGE("Receive Data Failed:");
-                continue;
-            }
-#endif
diff --git a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c
index 7a2a6e2..4d5bd8f 100755
--- a/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c
+++ b/src/telephonyware/3.0/atcid/atci/src/lynq-private/pseudo_terminal/transfer_controller.c
@@ -2,6 +2,13 @@
 #include <string.h>
 #include <stdlib.h>
 #include <termios.h>
+#include <sys/select.h>
+/* According to earlier standards */
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
 
 #include "transfer_controller.h"
 #include "atcid_serial.h"
@@ -47,8 +54,6 @@
     }
     return NULL;
 }
-
-
 int parse_terminal_config(char *path, port_conf_t * port_conf)
 {
     ALOGD("[%d][%s] enter",__LINE__,__FUNCTION__);
@@ -137,7 +142,7 @@
     tcgetattr(fd,&deviceOptions);
 
     // set raw input
-    deviceOptions.c_lflag = ICANON ;
+    //deviceOptions.c_lflag = ICANON | ECHO;
     // set raw output
     deviceOptions.c_oflag &= ~OPOST;
     deviceOptions.c_oflag &= ~OLCUC;
@@ -194,7 +199,7 @@
         ALOGD("[%d][%s] init urc port %d",__LINE__,__FUNCTION__,port_config.serial_urc_port);
         if(open_serial_device_with_id(port_config.serial_urc_port,L_URC_TYPE)!=0)
         {
-            ALOGD("[%d][%s] init urc port fail%d",__LINE__,__FUNCTION__,port_config.serial_urc_port);
+            ALOGD("[%d][%s] init urc port fail,serial_urc_port:%d,urc_fd:%d",__LINE__,__FUNCTION__,port_config.serial_urc_port,port_config.urc_fd);
         }
     }
     return 0;
@@ -206,6 +211,7 @@
     int write_len = 0;
     char buffer[out_size+1];
     int output_len = 0;
+    int count=0;
     memset(buffer,0,out_size+1);
     if(NULL == output)
     {
@@ -245,7 +251,25 @@
             ALOGE("io fd don`t opened");
             return;
         }
+        resp_try_write:
         write_len = write(port_config.io_fd, buffer,output_len);
+        if(write_len != output_len)
+        {
+            LOGATCI(LOG_DEBUG, "resp wirte_line=%d,output_len=%d,errno:%d!",write_len,output_len,errno);
+            if(write_len == -1)
+            {//meybe usb has change,eg.switch adb to rndis mode,or rndis to adb mode,so we need reopen,the reopen time is 5.
+                if(count < 5)
+                {
+                    close(port_config.io_fd);
+                    init_pseudo_terminal();
+                    usleep(500*1000);
+                    count++;
+                    LOGATCI(LOG_DEBUG, "retry times = %d",count);
+                    goto resp_try_write;
+                }
+            }
+        }
+        LOGATCI(LOG_DEBUG, "resp wirte_line=%d,output_len=%d!",write_len,output_len);
     }
     else if(type == L_URC_TYPE)
     {
@@ -254,12 +278,31 @@
             ALOGE("urc fd don`t opened");
             return;
         }
+        urc_try_write:
         write_len = write(port_config.urc_fd, buffer,output_len);
+        if(write_len != output_len)
+        {
+            LOGATCI(LOG_DEBUG, "urc wirte_line=%d,output_len=%d,errno:%d!",write_len,output_len,errno);
+            if(write_len == -1)//meybe usb has change,eg.switch adb to rndis mode,or rndis to adb mode,so we need reopen,the reopen time is 5.
+            {
+                if(count < 5)
+                {
+                    close(port_config.urc_fd);
+                    init_pseudo_terminal();
+                    usleep(100*1000);
+                    count++;
+                    LOGATCI(LOG_DEBUG, "retry times = %d",count);
+                    goto urc_try_write;
+                }
+            }
+        }
+        LOGATCI(LOG_DEBUG, "urc wirte_line=%d,output_len=%d!",write_len,output_len);
     }
     else
     {
         ALOGE("the type is invalid");
     }
+    LOGATCI(LOG_DEBUG, "end retry times = %d",count);
     return;
 }