更新LYNQ_SLEEP接口以及添加对应测试demo

Change-Id: I0df3fded32b288d691b64f0b7d0d3d6f5bc1575e
diff --git a/mbtk/lynq_lib/src/lynq_sleep.c b/mbtk/lynq_lib/src/lynq_sleep.c
index b7592bd..ea5a048 100755
--- a/mbtk/lynq_lib/src/lynq_sleep.c
+++ b/mbtk/lynq_lib/src/lynq_sleep.c
@@ -8,7 +8,10 @@
 #include <fcntl.h>
 #include <pthread.h>
 #include <string.h>
-
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/epoll.h>
+#include <linux/input.h>
 
 #include "mbtk_type.h"
 #include "mbtk_log.h"
@@ -27,21 +30,39 @@
 static bool nw_off = FALSE;
 static bool sms_off = FALSE;
 static bool data_off = FALSE;
+static bool set_off = FALSE;
 
-pthread_t lpm_t;
+static pthread_t lpm_t;
 static int edge_t = 0;
+static int epoll_fd_t = -1;
+static int fd_t = -1;
+static int socket_t[2];
 
 typedef struct{
     qser_lpm_wakeupin_data_t wakeupin;
     qser_lpm_wakeupout_data_t wakeupout;
+    qser_lpm_Handler_t wakehandle;
 }lynq_wake_t;
 
 static lynq_wake_t lpm_init;
 
 
+typedef struct
+{
+    int fd;
+    char name[64];
+} lock_name;
+
+#define LOCK_MAX_SIZE 129
+
+lock_name lynq_lock_name[LOCK_MAX_SIZE]={0};
+static bool autosleep_enable = FALSE;
+
+static mbtk_info_handle_t* whitelist_info_handle = NULL;
+
 static int powerrind_get()
 {
-    char buffer[50];
+    char buffer[4];
     int ret = 0;
 
     int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
@@ -56,19 +77,34 @@
     return ret;
 }
 
-
-
-typedef struct
+#if 1
+static int sleep_epoll_deregister(int epoll_fd,int fd )
 {
-    int fd;
-    char name[128];
-} lock_name;
+    int  ret;
+    do {
+        ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );
+    } while (ret < 0 && errno == EINTR);
+    return ret;
+}
 
-lock_name lynq_lock_name[512]={0};
-static bool autosleep_enable = FALSE;
+static int sleep_epoll_register(int epoll_fd, int fd)
+{
+    struct epoll_event  ev;
+    int    ret, flags;
 
-static mbtk_info_handle_t* whitelist_info_handle = NULL;
+    /* important: make the fd non-blocking */
+    flags = fcntl(fd, F_GETFL);
+    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
 
+    ev.events  = EPOLLIN;
+    ev.data.fd = fd;
+    do {
+        ret = epoll_ctl( epoll_fd, EPOLL_CTL_ADD, fd, &ev );
+    } while (ret < 0 && errno == EINTR);
+    
+    return ret;
+}
+#endif
 
 int qser_autosuspend_enable(char enable)
 {
@@ -116,14 +152,21 @@
         return -1;
     }
 
-    if(name != NULL && len < 127)
+    if((name != NULL) && (len < 33))
     {
         int i;
-        for(i=0;i<512;i++)
+        for(i=1 ;i<LOCK_MAX_SIZE;i++)
         {
             if(lynq_lock_name[i].fd == 0)
                 break;
         }
+        
+        if (i >= LOCK_MAX_SIZE)
+        {
+            LOGE("Fd is full.\n");
+            return -1;
+        }
+
         memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
         lynq_lock_name[i].fd = i;
         return lynq_lock_name[i].fd;
@@ -143,13 +186,14 @@
         return -1;
     }
 
+    
     int i;
-    for(i=0;i<512;i++)
+    for(i=1;i<LOCK_MAX_SIZE;i++)
     {
         if(lynq_lock_name[i].fd == fd)
             break;
     }
-    if(i == 512)
+    if(i == LOCK_MAX_SIZE)
         return -1;
 
     if(!access("/sys/power/wake_lock", W_OK))
@@ -161,7 +205,7 @@
     }
     else
     {
-        printf("/sys/power/wake_lock can not write.");
+        LOGE("/sys/power/wake_lock can not write.");
         return -1;
     }
 
@@ -178,12 +222,12 @@
     }
 
     int i;
-    for(i=0;i<512;i++)
+    for(i=1;i<LOCK_MAX_SIZE;i++)
     {
         if(lynq_lock_name[i].fd == fd)
             break;
     }
-    if(i == 512)
+    if(i == LOCK_MAX_SIZE)
         return -1;
 
     if(!access("/sys/power/wake_unlock", W_OK))
@@ -195,7 +239,7 @@
     }
     else
     {
-        printf("/sys/power/wake_unlock can not write.");
+        LOGE("/sys/power/wake_unlock can not write.");
         return -1;
     }
 
@@ -212,12 +256,12 @@
     }
 
     int i;
-    for(i=0;i<512;i++)
+    for(i=1;i<LOCK_MAX_SIZE;i++)
     {
         if(lynq_lock_name[i].fd == fd)
         break;
     }
-    if(i == 512)
+    if(i == LOCK_MAX_SIZE)
         return -1;
     else
     {
@@ -232,9 +276,104 @@
 void *threadFunction(void *arg)
 {
     int pinValue;
-    
+    char buf[8] = {0};
+    struct input_event ev_input = { 0 };
+    const int size = sizeof(struct input_event);
 
-    edge_t = pinValue;
+    epoll_fd_t = epoll_create(2);
+/*
+    struct epoll_event event;
+    memset(&event, 0, sizeof(struct epoll_event));
+    event.events = EPOLLIN | EPOLLET;
+    event.data.fd = open("/dev/input/event0", O_RDONLY); // 根据实际情况指定正确的GPIO设备文件名
+
+    fd_t = event.data.fd;
+    if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
+    {
+         LOGE("Failed to add GPIO device file.");
+         return NULL;
+    }
+
+    memset(&event, 0, sizeof(struct epoll_event));
+    event.events = EPOLLIN | EPOLLET;
+    event.data.fd = socket_t[0];
+    LOGE("threadFunction event.data.fd =[%d] ", event.data.fd);
+
+    if (epoll_ctl(epoll_fd_t, EPOLL_CTL_ADD, event.data.fd, &event) == -1)
+    {
+         LOGE("Failed to add GPIO device file.");
+         return NULL;
+    }
+*/
+    fd_t = open("/dev/input/event0", O_RDONLY);
+
+    sleep_epoll_register(epoll_fd_t, fd_t);
+    sleep_epoll_register(epoll_fd_t, socket_t[1]);
+
+    while (true)
+    {
+        struct epoll_event events[2];
+        struct epoll_event ev;
+        int cmd = 0;
+
+        int numEvents = epoll_wait(epoll_fd_t, events, 2, -1);
+
+        for (int i = 0; i < numEvents; ++i)
+        {
+            if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP))
+            {
+                LOGE("Error on GPIO device.");
+                return NULL;
+            }
+            else if ((events[i].events & EPOLLIN) || (events[i].events & EPOLLET))
+            {
+                //handleInterrupt(events[i].data.fd);
+                if (events[i].data.fd == socket_t[1])
+                {
+                    memset(buf, 0, sizeof(buf));
+                    read(socket_t[1], buf, sizeof(buf));
+                    if (1 == atoi(buf))
+                    {
+                        if(close(fd_t) == 0)
+                            LOGI("close(fd_t)ing");
+
+                        sleep_epoll_deregister(epoll_fd_t, socket_t[1]);
+                        sleep_epoll_deregister(epoll_fd_t, fd_t);
+                        /*
+                        memset(&ev, 0, sizeof(struct epoll_event));
+                        ev.events = EPOLLIN | EPOLLET;
+                        ev.data.fd = socket_t[1];
+                        epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
+                        
+                        memset(&ev, 0, sizeof(struct epoll_event));
+                        ev.events = EPOLLIN | EPOLLET;
+                        ev.data.fd = fd_t;
+                        epoll_ctl( epoll_fd_t, EPOLL_CTL_DEL, ev.data.fd, &ev);
+                        */
+                        LOGI("do pthread_exit");
+                        return NULL;
+                    }
+                }
+                else if (events[i].data.fd == fd_t)
+                {
+                    memset(&ev_input, 0x00, size);
+                    read(fd_t, &ev_input, size);
+                    LOGI("ev_input type = %x, code = %x, value = %x", ev_input.type, ev_input.code,ev_input.value);
+                    if (ev_input.code == 2)
+                    {
+                        LOGI(">>>>ev_input.value = [%d]",ev_input.value);
+                        pinValue = (int)ev_input.value;
+                        edge_t = pinValue;
+                        lpm_init.wakehandle(edge_t);
+                    }
+                }
+                else
+                {
+                    LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
+                }
+            }
+       }
+    }
     return NULL;
 }
 
@@ -242,50 +381,86 @@
 {
     //UNUSED(qser_lpm_handler);
     //UNUSED(qser_lpm_cfg);
+    if (socketpair( AF_LOCAL, SOCK_STREAM, 0, socket_t ) < 0 ) 
+    {
+        LOGE("[qser_lpm_init] could not create thread control socket pair: %s", strerror(errno));
 
+        /*close the control socket pair && Retry again.*/
+        if(socket_t[0] > 0)
+        {
+            close(socket_t[0] );
+            socket_t[0] = -1;
+        }
+        
+        if(socket_t[1] > 0)
+        {
+            close(socket_t[1] );
+            socket_t[1] = -1;
+        }
+        return -1;
+    }
     lpm_init.wakeupin.wakeupin_pin = qser_lpm_cfg->wakeupin.wakeupin_pin;
-    printf(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
+    LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
     lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->wakeupin.wakeupin_edge;
-    printf(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
+    LOGI(">>edge = %d",lpm_init.wakeupin.wakeupin_edge);
     edge_t = qser_lpm_cfg->wakeupin.wakeupin_edge;//保留原始状态值 0 or 1
+    lpm_init.wakehandle = qser_lpm_handler;
 
-    //pthread_attr_t thread_attr;
-    //pthread_attr_init(&thread_attr);
-    /*
+    pthread_attr_t thread_attr;
+    pthread_attr_init(&thread_attr);
+
     if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
     {
-        printf("pthread_attr_setdetachstate() fail\n");
+        LOGE("pthread_attr_setdetachstate() fail");
         return -1;
     }
-    */
-    //if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
-    if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
+
+    if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
+    //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
     {
-        printf("qser_lpm_init can't create thread\n");
+        LOGE("qser_lpm_init can't create thread");
         return -1;
     }
 
-    //pthread_attr_destroy(&thread_attr);
+    pthread_attr_destroy(&thread_attr);
 
-    if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
-        qser_lpm_handler(edge_t);
+    //if (edge_t != qser_lpm_cfg->wakeupin.wakeupin_edge)//说明有变化,并且和原来的值不相同
+        //qser_lpm_handler(edge_t);
 
     return 0;
 }
 
 int qser_lpm_deinit(void)
 {
+    char buf[4]={0};
 
-    if(pthread_cancel(lpm_t) != 0)
-    {
-        printf("qser_lpm_deinit pthread_cancel err\n");
-        return -1;
-    }
+    if (fd_t == -1)
+        return 0;
 
-    if(pthread_join(lpm_t,NULL) != 0)
+    if (fd_t != -1)
     {
-        printf("qser_lpm_deinit pthread_join err\n");
-        return -1;
+        //char   cmd = 1;
+        strcpy(buf, "1");
+        void*  dummy = NULL;
+        write( socket_t[0], buf, sizeof(buf) );
+        //pthread_join(lpm_t, &dummy);
+
+        sleep(1);
+        // close the control socket pair
+        if(socket_t[0] > 0)
+        {
+            close(socket_t[0] );
+            socket_t[0] = -1;
+        }
+        if(socket_t[1] > 0)
+        {
+            close(socket_t[1] );
+            socket_t[1] = -1;
+        }
+
+        //重置还原
+        fd_t = -1;
+
     }
 
     return 0;
@@ -299,20 +474,6 @@
 目标文件"/system/etc/powerind"
 如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
 
-
-白名单的状态由四位数字组成,第一位代表是否屏蔽电话唤醒,第二
-位代表是否屏蔽网络注册状态唤醒,第三位代表是否屏蔽数据业务唤
-醒,第四位代表是否屏蔽短信唤醒。其中 1 代表屏蔽,其他不会屏
-蔽。
-第一位:1:打开电话唤醒,其他:屏蔽电话唤醒
-第二位:1:打开网络注册状态唤醒,其他:屏蔽网络注册状态唤醒
-第三位:1:打开数据业务唤醒,其他:屏蔽数据业务唤醒
-第四位:1:打开短信唤醒,其他屏蔽短信唤醒
-当四位都不为 1 时(比如默认的状态:0000),则代表白名单为空,
-所有唤醒都不会屏蔽。
-
-从左往右判断
-
 */
 
 int qser_whitelist_set(char* whitelish)
@@ -325,7 +486,7 @@
 
     if (len != 4)
     {
-        printf("whitelish num error num=[%d]\n",len);
+        LOGE("whitelish num error num=[%d]",len);
         return -1;
     }
 
@@ -358,7 +519,7 @@
 
     if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
     {
-        on = 2;//0000的情况,所有上报源都不屏蔽,SIM的上报会一直被包含在内
+        on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
     }
     else
     {
@@ -382,19 +543,21 @@
         else
             sms_t = 0;
 
-        on = 31 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
+        on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
     }
 
+    set_off = TRUE;//初始状态改变
+
     if(whitelist_info_handle == NULL)
     {
         whitelist_info_handle = mbtk_info_handle_get();
         if(whitelist_info_handle)
         {
-            printf("creat whitelist_info_handle is success\n");
+            LOGI("creat whitelist_info_handle is success");
         }
         else
         {
-            printf("creat whitelist_info_handle is fail\n");
+            LOGE("creat whitelist_info_handle is fail");
             return -1;
         }
     }
@@ -402,14 +565,9 @@
     int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
     if(err)
     {
-        printf("Error : %d\n", err);
+        LOGE("whitelist_info_handle Error : %d", err);
         return -1;
     }
-    else
-    {
-        printf("wakeup set success.\n");
-    }
-
 
     return 0;
 }
@@ -420,35 +578,78 @@
     //UNUSED(whitelish);
     char list[10]={0};
     int call_t, nw_t, data_t, sms_t;
+    int get_tmp;
 
-    if (call_Off == TRUE)
-        call_t = 1;
-    else
-        call_t = 0;
-    
-    if (nw_off == TRUE)
-        nw_t = 1;
-    else
-        nw_t = 0;
-    
-    if (data_off == TRUE)
-        data_t = 1;
-    else
-        data_t = 0;
-    
-    if (sms_off == TRUE)
-        sms_t = 1;
-    else
-        sms_t = 0;
+    get_tmp = powerrind_get();
+    //LOGI(">>>get_tmp: %d",get_tmp);
 
-    sprintf(list, "%d%d%d%d", call_t, nw_t, data_t, sms_t);
-    //printf(">>>whitelist: %s\n",list);
+    //call 8   nw 1   data 16  sms 4    SIM的上报会一直被包含在内
+    switch(get_tmp)
+    {
+        case 0:
+            sprintf(list, "%d%d%d%d", 1, 1, 1, 1);
+            break;
+        case 8:
+            sprintf(list, "%d%d%d%d", 0, 1, 1, 1);
+            break;
+        case 1:
+            sprintf(list, "%d%d%d%d", 1, 0, 1, 1);
+            break;
+        case 16:
+            sprintf(list, "%d%d%d%d", 1, 1, 0, 1);
+            break;
+        case 4:
+            sprintf(list, "%d%d%d%d", 1, 1, 1, 0);
+            break;
+
+        case 9:
+            sprintf(list, "%d%d%d%d", 0, 0, 1, 1);
+            break;
+        case 24:
+            sprintf(list, "%d%d%d%d", 0, 1, 0, 1);
+            break;
+        case 12:
+            sprintf(list, "%d%d%d%d", 0, 1, 1, 0);
+            break;
+        case 17:
+            sprintf(list, "%d%d%d%d", 1, 0, 0, 1);
+            break;
+        case 5:
+            sprintf(list, "%d%d%d%d", 1, 0, 1, 0);
+            break;
+        case 20:
+            sprintf(list, "%d%d%d%d", 1, 1, 0, 0);
+            break;
+
+        case 25:
+            sprintf(list, "%d%d%d%d", 0, 0, 0, 1);
+            break;
+        case 13:
+            sprintf(list, "%d%d%d%d", 0, 0, 1, 0);
+            break;
+        case 28:
+            sprintf(list, "%d%d%d%d", 0, 1, 0, 0);
+            break;
+        case 21:
+            sprintf(list, "%d%d%d%d", 1, 0, 0, 0);
+            break;
+
+        case 29:
+            sprintf(list, "%d%d%d%d", 0, 0, 0, 0);
+            break;
+
+         default :
+            LOGE("qser_whitelist_get is error");
+            break;
+    }
+
+    //LOGI(">>>get list: %s",list);
     strncpy(whitelish, list, strlen(list));
 
     if(whitelist_info_handle != NULL)
     {
         mbtk_info_handle_free(&whitelist_info_handle);
-        printf("deinit whitelist_info_handle is succuess\n");
+        LOGI("deinit whitelist_info_handle is succuess");
     }
 
     return 0;