[Bugfix][API-967][GPIO]optimize thegpio test paln for factory

Change-Id: I4e33e01215a678dc76649d3eb30b76886f753894
(cherry picked from commit 25ed1823001e22b3e9d7dc9acdd7f1700e732eb8)
diff --git a/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp b/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp
index f4cb966..84e8896 100755
--- a/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp
+++ b/src/lynq/lib/liblynq-at-factory/lynq_at_factory.cpp
@@ -125,12 +125,43 @@
     while(fgets(buf, sizeof(buf), fp) != NULL){

         lynq_response_ok();

         pclose(fp);

-        return;   

+        return;

     }

     lynq_response_error(100);

     pclose(fp);

 }

 

+static int set_all_gpio_status_and_check(int lynq_gpio_arr[], char status)

+{

+    int m =0;

+    FILE *fp;

+    char lynq_set_gpio_arr[256] = {0};

+    char lynq_get_gpio_state[512] = {0};

+    for(m = 0; m < 85; m++)

+    {

+        bzero(lynq_set_gpio_arr, 256);

+        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);

+        system(lynq_set_gpio_arr);

+        bzero(lynq_set_gpio_arr, 256);

+        sprintf(lynq_set_gpio_arr,"echo out %d %c > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m], status);

+        system(lynq_set_gpio_arr);

+    }

+

+    bzero(lynq_set_gpio_arr, 256);

+    sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

+    fp=popen(lynq_set_gpio_arr, "r");

+    bzero(lynq_get_gpio_state, 512);

+    fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

+    pclose(fp);

+    

+    if(lynq_get_gpio_state[7] != status)

+    {

+        return 1;

+    }

+    //usleep(10000);

+    return 0;

+}

+

 void lynq_handle_gpio(char *input)

 {

     FILE *fp;

@@ -140,76 +171,134 @@
     char lynq_show_gpio_state[64] = {0};

     int lynq_gpio_low = 0;

     int lynq_gpio_hig = 0;

-    int i = 0,m = 0;

+    int lynq_gpio_test_env_error = 1;

+    int i = 0,m = 0,j = 0;

+    int need_int = 1;

     int lynq_gpio_beta_state = 1;

-

-    for(m = 0; m < 85; m++)

+    RLOGD("start function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+    

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

     {

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);

-        system(lynq_set_gpio_arr);

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);

-        system(lynq_set_gpio_arr);

-    }

 

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

-    {

-        lynq_gpio_low = 0;

-        lynq_gpio_hig = 0;

-

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

-        system(lynq_set_gpio_arr);

-

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"echo out %d 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

-        system(lynq_set_gpio_arr);

-

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

-        fp=popen(lynq_set_gpio_arr, "r");

-        bzero(lynq_get_gpio_state, 512);

-        fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

-        pclose(fp);

-        if(lynq_get_gpio_state[7] == '1')

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

         {

-            lynq_gpio_hig = 1;

-        }

+            if  (j > 0) // reset gpio when retry

+            {

+                need_int = 1;

+            }

 

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

-        system(lynq_set_gpio_arr);

-        

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

-        fp=popen(lynq_set_gpio_arr, "r");

-        bzero(lynq_get_gpio_state, 512);

-        fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

-        pclose(fp);

-        if(lynq_get_gpio_state[7] == '0')

+            if (need_int == 1)

+            {

+                if (set_all_gpio_status_and_check(lynq_gpio_arr, '0') != 0)

+                {

+                    continue;

+                }

+                else

+                {

+                    need_int = 0;

+                }

+                RLOGD("finsh peizhi function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+            }

+

+            lynq_gpio_low = 0;

+            lynq_gpio_hig = 0;

+

+            for(int n=0;n<3;n++)

+            {

+                bzero(lynq_set_gpio_arr, 256);

+                sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

+                system(lynq_set_gpio_arr);

+

+                bzero(lynq_set_gpio_arr, 256);

+                sprintf(lynq_set_gpio_arr,"echo out %d 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

+                system(lynq_set_gpio_arr);

+

+

+                bzero(lynq_set_gpio_arr, 256);

+                sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

+                fp=popen(lynq_set_gpio_arr, "r");

+                bzero(lynq_get_gpio_state, 512);

+                fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

+                pclose(fp);

+                if(lynq_get_gpio_state[7] == '1')

+                {

+                    RLOGD("high function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+                    lynq_gpio_hig = 1;

+                    lynq_gpio_test_env_error = 0;

+                    break;

+                }

+                else

+                {

+                    RLOGD("high function %s line %d input %s num %d\n", __FUNCTION__, __LINE__, input,lynq_gpio_arr[i]);

+                    if(i == 0 && j == 0)

+                    {

+

+                        lynq_gpio_test_env_error = set_all_gpio_status_and_check(lynq_gpio_arr, '1') == 0 ? 0 : 1;

+                    }

+

+                }

+            }

+            if (lynq_gpio_test_env_error == 1)

+                break;

+            bzero(lynq_set_gpio_arr, 256);

+            sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

+            system(lynq_set_gpio_arr);

+            

+            bzero(lynq_set_gpio_arr, 256);

+            sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

+            fp=popen(lynq_set_gpio_arr, "r");

+            bzero(lynq_get_gpio_state, 512);

+            fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

+            pclose(fp);

+            if(lynq_get_gpio_state[7] == '0')

+            {

+                RLOGI("*low function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+                lynq_gpio_low = 1;

+            }

+            else

+            {

+                RLOGD("low function fail %s line %d input %s num %d\n", __FUNCTION__, __LINE__, input,lynq_gpio_arr[i]);

+            }

+            bzero(lynq_show_gpio_state, 64);

+            if((lynq_gpio_low != 1) || (lynq_gpio_hig != 1))

+            {

+                RLOGD("fail function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+            }

+            else

+            {

+                RLOGD("success function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+                sprintf(lynq_show_gpio_state,"gpio%d\n",(char *)lynq_gpio_arr[i]);

+                handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);

+                break; // do not retry when pass

+            }

+        } // for(j=0;j<3;j++)

+        if (lynq_gpio_test_env_error == 1)

         {

-            lynq_gpio_low = 1;

+            lynq_gpio_beta_state = 0;

+            break;

         }

-        bzero(lynq_show_gpio_state, 64);

-        if((lynq_gpio_low != 1) || (lynq_gpio_hig != 1))

+        if (j >= 3 )

         {

             lynq_gpio_beta_state = 0;

             sprintf(lynq_show_gpio_state,"[gpio%d][result]:FAIL \n",(char *)lynq_gpio_arr[i]);

             handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);

         }

-        else

-        {

-            sprintf(lynq_show_gpio_state,"gpio%d\n",(char *)lynq_gpio_arr[i]);

-            handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);

-        }

+

+    } // for(i=0; i < 85; i++)

+

+    if(lynq_gpio_test_env_error == 1)

+    {

+        handle_output("tool error", strlen("tool error"), Response);

     }

+

     if(lynq_gpio_beta_state == 1)

     {

+        RLOGD("total success function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

         lynq_response_ok();

     }

     else

     {

+        RLOGD("total fail function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

         lynq_response_error(100);

     }

 }

@@ -329,15 +418,15 @@
 

 static Command commands[] = 

 {

-{"adc",lynq_handle_adc},

-{"sink",lynq_handle_sink},

-{"emmc",lynq_handle_emmc},

-{"gpio",lynq_handle_gpio},

-{"pcie",lynq_handle_pcie},

-{"rgmii",lynq_handle_rgmii},

-{"sgmii",lynq_handle_sgmii},

-{"usb",lynq_handle_usb},

-{NULL, NULL}

+    {"adc",lynq_handle_adc},

+    {"sink",lynq_handle_sink},

+    {"emmc",lynq_handle_emmc},

+    {"gpio",lynq_handle_gpio},

+    {"pcie",lynq_handle_pcie},

+    {"rgmii",lynq_handle_rgmii},

+    {"sgmii",lynq_handle_sgmii},

+    {"usb",lynq_handle_usb},

+    {NULL, NULL}

 };

 

 Command* find_command (char *input)