add_suspend_timer

Change-Id: I08ff7fba743466ef3460f2c2406d61e18723621f
diff --git a/mbtk/liblynq_lib/src/lynq_sleep.c b/mbtk/liblynq_lib/src/lynq_sleep.c
old mode 100755
new mode 100644
index a293fd5..0741ab5
--- a/mbtk/liblynq_lib/src/lynq_sleep.c
+++ b/mbtk/liblynq_lib/src/lynq_sleep.c
@@ -1,706 +1,813 @@
-#include "lynq-qser-autosuspend.h"
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stddef.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#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"
-#include "mbtk_info_api.h"
-#include "mbtk_power.h"
-
-/*
-This module is system sleep, the system cannot sleep when the lock exists
-To verify whether it is in sleep state, it is necessary to test the power consumption
-Power management principle, as long as a wakelock lock exists, the system will not enter the Suspend state
-So the name can be arbitrarily chosen to indicate that such a lock is needed so that the system does not sleep
-*/
-#if defined(MBTK_PLATFORM_KERNEL_5)
-#define MTBK_POWERIND           "/system/etc/powerind"      //1806
-#elif defined(MBTK_PLATFORM_KERNEL_3)
-#define MTBK_POWERIND           "/etc/powerind"             //1803
-#endif
-
-static bool call_Off  = FALSE;
-static bool nw_off = FALSE;
-static bool sms_off = FALSE;
-static bool data_off = FALSE;
-
-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
+#include "lynq-qser-autosuspend.h"

+

+#include <stdio.h>

+#include <unistd.h>

+#include <stddef.h>

+#include <sys/types.h>

+#include <sys/stat.h>

+#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"

+#include "mbtk_info_api.h"

+#include "mbtk_power.h"

+

+/*

+This module is system sleep, the system cannot sleep when the lock exists

+To verify whether it is in sleep state, it is necessary to test the power consumption

+Power management principle, as long as a wakelock lock exists, the system will not enter the Suspend state

+So the name can be arbitrarily chosen to indicate that such a lock is needed so that the system does not sleep

+*/

+#if defined(MBTK_PLATFORM_KERNEL_5)

+#define MTBK_POWERIND           "/system/etc/powerind"      //1806

+#elif defined(MBTK_PLATFORM_KERNEL_3)

+#define MTBK_POWERIND           "/etc/powerind"             //1803

+#endif

+

+static bool call_Off  = FALSE;

+static bool nw_off = FALSE;

+static bool sms_off = FALSE;

+static bool data_off = FALSE;

+

+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;

+

+

+#define EPOLL_SIZE_HINT    128 

+int mEpollFd = -1;

+mbtk_info_callback_func g_sleep_timer_cb;

+

+

+

+static int powerrind_get()

+{

+    char buffer[4];

+    int ret = 0;

+

+    int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);

+    if (fd != -1)

+    {

+        read(fd, buffer, strlen(buffer)+1);

+        close(fd);

+    }

+

+    ret = atoi(buffer);

+

+    return ret;

+}

+

+#if 1

+static int sleep_epoll_deregister(int epoll_fd,int fd )

+{

+    int  ret;

+    do {

+        ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );

+    } while (ret < 0 && errno == EINTR);

+    return ret;

+}

+

+static int sleep_epoll_register(int epoll_fd, int fd)

+{

+    struct epoll_event  ev;

+    int    ret, flags;

+

+    /* 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)

+{

+    //UNUSED(enable);

+

+    if((enable == 1) || enable == '1')

+    {

+        //if(!mbtk_system_sleep())

+        if(!access("/sys/power/autosleep", W_OK))

+        {

+            system("echo mem > /sys/power/autosleep");

+            autosleep_enable = TRUE;

+            return 0;

+        }

+        else

+        {

+            LOGE("/sys/power/autosleep can not write.");

+            return -1;

+        }

+    }

+    else if((enable == 0) || enable == '0')

+    {

+        if(!access("/sys/power/autosleep", W_OK))

+        {

+            system("echo off > /sys/power/autosleep");

+            autosleep_enable = FALSE;

+            return 0;

+        }

+        else

+        {

+            LOGE("/sys/power/autosleep can not write.");

+            return -1;

+        }

+    }

+    else

+    {

+        LOGE("qser_autosuspend_enablecan enable err.");

+        return -1;

+    }

+

+    return 0;

+}

+

+int qser_wakelock_create(const char* name , size_t len)

+{

+    //UNUSED(name);

+    //UNUSED(len);

+    int len_t;

+/*

+    if(!autosleep_enable) {

+        LOGE("Autosleep not enable.");

+        return -1;

+    }

+*/

+    len_t = strlen(name);

+

+    if((name != NULL) && (len < 33) && (len_t < 33))

+    {

+        int i;

+        //name

+        for(i=1 ;i<LOCK_MAX_SIZE;i++)

+        {

+            if(strcmp(lynq_lock_name[i].name, name) == 0)

+            {

+                LOGE("Repeated names.");

+                return -1;

+            }

+        }

+

+        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.");

+            return -1;

+        }

+

+        memcpy(lynq_lock_name[i].name, name, strlen(name)+1);

+        lynq_lock_name[i].fd = i;

+        return lynq_lock_name[i].fd -1;//Starting from scratch

+    }

+    else

+        return -1;

+

+    return -1;

+}

+

+int qser_wakelock_lock(int fd)

+{

+    //UNUSED(fd);

+/*

+    if(!autosleep_enable) {

+        LOGE("Autosleep not enable.");

+        return -1;

+    }

+*/

+    int i;

+    for(i=1;i<LOCK_MAX_SIZE;i++)

+    {

+        if(lynq_lock_name[i].fd -1 == fd)

+            break;

+    }

+    if(i == LOCK_MAX_SIZE)

+    {

+        LOGE("LOCK_MAX_SIZE is full\n");

+        return -1;

+    }

+

+    if(!access("/sys/power/wake_lock", W_OK))

+    {

+        char cmd[128]={0};

+        sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);

+        system(cmd);

+        return 0;

+    }

+    else

+    {

+        LOGE("/sys/power/wake_lock can not write.");

+        return -1;

+    }

+

+    return 0;

+}

+

+int qser_wakelock_unlock(int fd)

+{

+    //UNUSED(fd);

+/*

+    if(!autosleep_enable) {

+        LOGE("Autosleep not enable.");

+        return -1;

+    }

+*/

+    int i;

+    for(i=1;i<LOCK_MAX_SIZE;i++)

+    {

+        if(lynq_lock_name[i].fd -1 == fd)

+            break;

+    }

+    if(i == LOCK_MAX_SIZE)

+    {

+        LOGE("LOCK_MAX_SIZE is full\n");

+        return -1;

+    }

+

+    if(!access("/sys/power/wake_unlock", W_OK))

+    {

+        char cmd[128]={0};

+        sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);

+        system(cmd);

+        return 0;

+    }

+    else

+    {

+        LOGE("/sys/power/wake_unlock can not write.");

+        return -1;

+    }

+

+    return 0;

+}

+

+int qser_wakelock_destroy(int fd)

+{

+    //UNUSED(fd);

+/*

+    if(!autosleep_enable) {

+        LOGE("Autosleep not enable.");

+        return -1;

+    }

+*/

+    int i;

+    for(i=1;i<LOCK_MAX_SIZE;i++)

+    {

+        if(lynq_lock_name[i].fd -1 == fd)

+        break;

+    }

+

+    if(i == LOCK_MAX_SIZE)

+    {

+        LOGE("LOCK_MAX_SIZE is full\n");

+        return -1;

+    }

+    else

+    {

+        lynq_lock_name[i].fd = 0;

+        memset(lynq_lock_name[i].name, 0, 64);

+        return 0;

+    }

+

+    return 0;

+}

+

+void *threadFunction(void *arg)

+{

+    int pinValue;

+    int i;

+    char buf[8] = {0};

+    struct input_event ev_input = { 0 };

+    const int size = sizeof(struct input_event);

+

+    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;

+    }

+*/

+

+#if defined(MBTK_SG_SUPPORT)

+    fd_t = open("/dev/input/event1", O_RDONLY);

+    LOGI("init pthread_event1");

+#else

+    fd_t = open("/dev/input/event2", O_RDONLY);

+    LOGI("init pthread_event2");

+#endif

+

+    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 (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)

+                {

+                    LOGI("go pthread_event");

+                    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 defined(MBTK_SG_SUPPORT)

+                        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

+                        if (ev_input.type == 4 && ev_input.code == 3)

+                        {

+                            LOGI(">>>>ev_input.value = [%d]",ev_input.value);

+                            pinValue = (int)ev_input.value;

+                            edge_t = pinValue;

+                            lpm_init.wakehandle(edge_t);

+                        }

+#endif

+

+                }

+                else

+                {

+                    LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);

+                }

+            }

+       }

+    }

+    return NULL;

+}

+

+int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)

+{

+    //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;

+    LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);

+    lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->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);

+

+    if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))

+    {

+        LOGE("pthread_attr_setdetachstate() fail");

+        return -1;

+    }

+

+    if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))

+    //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))

+    {

+        LOGE("qser_lpm_init can't create thread");

+        return -1;

+    }

+

+    pthread_attr_destroy(&thread_attr);

+

+    //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 (fd_t == -1)

+        return 0;

+

+    if (fd_t != -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;

+}

+

+/*

+例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,

+其中PS DATA目前暂时不支持,只是保留了这个标志位;

+AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA

+0 means resume all.

+目标文件"/system/etc/powerind"

+如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13

+

+*/

+

+int qser_whitelist_set(char* whitelish)

+{

+    //UNUSED(whitelish);

+    uint32 on = 0;

+    int call_t, nw_t, data_t, sms_t, tmp;

+

+    int len = strlen(whitelish);

+

+    if (len != 4)

+    {

+        LOGE("whitelish num error num=[%d]",len);

+        return -1;

+    }

+

+    tmp = atoi(whitelish);

+

+    call_t = tmp/1000;

+    nw_t = tmp%1000/100;

+    data_t = tmp%1000%100/10;

+    sms_t = tmp%1000%100%10;

+

+    if (call_t == 1)

+        call_Off = TRUE;

+    else

+        call_Off = FALSE;

+

+    if (nw_t == 1)

+        nw_off = TRUE;

+    else

+        nw_off = FALSE;

+

+    if (data_t == 1)

+        data_off = TRUE;

+    else

+        data_off = FALSE;

+

+    if (sms_t == 1)

+        sms_off = TRUE;

+    else

+        sms_off = FALSE;

+

+    if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)

+    {

+        on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内

+    }

+    else

+    {

+        if (call_Off == TRUE)

+            call_t = 8;

+        else

+            call_t = 0;

+

+        if (nw_off == TRUE)

+            nw_t = 1;

+        else

+            nw_t = 0;

+

+        if (data_off == TRUE)

+            data_t = 16;

+        else

+            data_t = 0;

+

+        if (sms_off == TRUE)

+            sms_t = 4;

+        else

+            sms_t = 0;

+

+        on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内

+    }

+

+    if(whitelist_info_handle == NULL)

+    {

+        whitelist_info_handle = mbtk_info_handle_get();

+        if(whitelist_info_handle)

+        {

+            LOGI("creat whitelist_info_handle is success");

+        }

+        else

+        {

+            LOGE("creat whitelist_info_handle is fail");

+            return -1;

+        }

+    }

+

+    int err = mbtk_wakeup_state_set(whitelist_info_handle, on);

+    if(err)

+    {

+        LOGE("whitelist_info_handle Error : %d", err);

+        return -1;

+    }

+

+    return 0;

+}

+

+

+int qser_whitelist_get(char* whitelish)

+{

+    //UNUSED(whitelish);

+    char list[10]={0};

+    int call_t, nw_t, data_t, sms_t;

+    int get_tmp;

+

+    get_tmp = powerrind_get();

+    //LOGI(">>>get_tmp: %d",get_tmp);

+

+    //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);

+        LOGI("deinit whitelist_info_handle is succuess");

+    }

+

+    return 0;

+}

+

+static void* suspend_timer_thread_run(void* arg)

 {
-    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[4];
-    int ret = 0;
-
-    int fd = open(MTBK_POWERIND, O_RDWR | O_SYNC, 0662);
-    if (fd != -1)
-    {
-        read(fd, buffer, strlen(buffer)+1);
-        close(fd);
+    struct epoll_event eventItems[EPOLL_SIZE_HINT];
+    int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_SIZE_HINT, -1);
+        
+    int timerFd = -1;
+    int eventIndex = 0;
+    uint64_t readCounter;
+ 
+    if (eventCount < 0) {
+        LOGE("Poll failed with an unexpected error: %s\n", strerror(errno));

+        return -1;
     }
-
-    ret = atoi(buffer);
-
-    return ret;
-}
-
-#if 1
-static int sleep_epoll_deregister(int epoll_fd,int fd )
-{
-    int  ret;
-    do {
-        ret = epoll_ctl( epoll_fd, EPOLL_CTL_DEL, fd, NULL );
-    } while (ret < 0 && errno == EINTR);
-    return ret;
-}
-
-static int sleep_epoll_register(int epoll_fd, int fd)
-{
-    struct epoll_event  ev;
-    int    ret, flags;
-
-    /* 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);
+ 
+    for (; eventIndex < eventCount; ++eventIndex) {
+        timerFd = eventItems[eventIndex].data.fd;
+ 
+        int retRead = read(timerFd, &readCounter, sizeof(uint64_t));
+        if (retRead < 0) {
+            LOGE("read %d failed...\n", timerFd);

+ 
+            continue;
+        } else {
+

+            g_sleep_timer_cb(NULL, 0);

+            qser_autosuspend_enable(0);

+            LOGI("suspend_timer_success\n");

+        }
+    }
     
-    return ret;
-}
-#endif
-
-int qser_autosuspend_enable(char enable)
-{
-    //UNUSED(enable);
-
-    if((enable == 1) || enable == '1')
-    {
-        //if(!mbtk_system_sleep())
-        if(!access("/sys/power/autosleep", W_OK))
-        {
-            system("echo mem > /sys/power/autosleep");
-            autosleep_enable = TRUE;
-            return 0;
-        }
-        else
-        {
-            LOGE("/sys/power/autosleep can not write.");
-            return -1;
-        }
-    }
-    else if((enable == 0) || enable == '0')
-    {
-        if(!access("/sys/power/autosleep", W_OK))
-        {
-            system("echo off > /sys/power/autosleep");
-            autosleep_enable = FALSE;
-            return 0;
-        }
-        else
-        {
-            LOGE("/sys/power/autosleep can not write.");
-            return -1;
-        }
-    }
-    else
-    {
-        LOGE("qser_autosuspend_enablecan enable err.");
-        return -1;
-    }
-
     return 0;
-}
-
-int qser_wakelock_create(const char* name , size_t len)
-{
-    //UNUSED(name);
-    //UNUSED(len);
-    int len_t;
-/*
-    if(!autosleep_enable) {
-        LOGE("Autosleep not enable.");
-        return -1;
-    }
-*/
-    len_t = strlen(name);
-
-    if((name != NULL) && (len < 33) && (len_t < 33))
-    {
-        int i;
-        //name
-        for(i=1 ;i<LOCK_MAX_SIZE;i++)
-        {
-            if(strcmp(lynq_lock_name[i].name, name) == 0)
-            {
-                LOGE("Repeated names.");
-                return -1;
-            }
-        }
-
-        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.");
-            return -1;
-        }
-
-        memcpy(lynq_lock_name[i].name, name, strlen(name)+1);
-        lynq_lock_name[i].fd = i;
-        return lynq_lock_name[i].fd -1;//Starting from scratch
-    }
-    else
-        return -1;
-
-    return -1;
-}
-
-int qser_wakelock_lock(int fd)
-{
-    //UNUSED(fd);
-/*
-    if(!autosleep_enable) {
-        LOGE("Autosleep not enable.");
-        return -1;
-    }
-*/
-    int i;
-    for(i=1;i<LOCK_MAX_SIZE;i++)
-    {
-        if(lynq_lock_name[i].fd -1 == fd)
-            break;
-    }
-    if(i == LOCK_MAX_SIZE)
-    {
-        LOGE("LOCK_MAX_SIZE is full\n");
-        return -1;
-    }
-
-    if(!access("/sys/power/wake_lock", W_OK))
-    {
-        char cmd[128]={0};
-        sprintf(cmd, "echo %s > /sys/power/wake_lock", lynq_lock_name[i].name);
-        system(cmd);
+}

+

+

+

+int suspend_timer_timer_init(void)

+{

+    int ret = -1;

+

+ 

+    pthread_attr_t thread_attr;

+    pthread_t net_led_thread_id;

+    pthread_t status_led_thread_id;

+    pthread_attr_init(&thread_attr);

+    if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))

+    {

+        LOGE("[suspend] pthread_attr_setdetachstate() fail.");

+        return -1;

+    }

+

+    if(pthread_create(&net_led_thread_id, &thread_attr, suspend_timer_thread_run, NULL))

+    {

+        LOGE("[suspend] pthread_create() fail.");

+        return -1;

+    }

+

+    pthread_attr_destroy(&thread_attr);

+    return 0;

+}

+

+

+int qser_suspend_timer_set(int time, mbtk_info_callback_func cb)

+{

+    mEpollFd = epoll_create(EPOLL_SIZE_HINT);

+    
+    int fd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0);
+    if (fd < 0) {
+        LOGE("Could not create timer fd: %s\n", strerror(errno));

         return 0;
     }
-    else
-    {
-        LOGE("/sys/power/wake_lock can not write.");
-        return -1;
-    }
-
-    return 0;
-}
-
-int qser_wakelock_unlock(int fd)
-{
-    //UNUSED(fd);
-/*
-    if(!autosleep_enable) {
-        LOGE("Autosleep not enable.");
-        return -1;
-    }
-*/
-    int i;
-    for(i=1;i<LOCK_MAX_SIZE;i++)
-    {
-        if(lynq_lock_name[i].fd -1 == fd)
-            break;
-    }
-    if(i == LOCK_MAX_SIZE)
-    {
-        LOGE("LOCK_MAX_SIZE is full\n");
-        return -1;
-    }
-
-    if(!access("/sys/power/wake_unlock", W_OK))
-    {
-        char cmd[128]={0};
-        sprintf(cmd, "echo %s > /sys/power/wake_unlock", lynq_lock_name[i].name);
-        system(cmd);
+ 
+    struct itimerspec timerSet;
+    timerSet.it_interval.tv_sec = 0;
+    timerSet.it_interval.tv_nsec = 0;
+    timerSet.it_value.tv_sec = time;

+    timerSet.it_value.tv_nsec = 0;
+    if (timerfd_settime(fd, 0, &timerSet, NULL) != 0) {
+        LOGE("timerfd_settime failed: %s\n", strerror(errno));

+        close(fd);
         return 0;
     }
-    else
-    {
-        LOGE("/sys/power/wake_unlock can not write.");
-        return -1;
+ 
+    struct epoll_event eventItem;
+    memset(&eventItem, 0, sizeof(eventItem));
+    eventItem.events = EPOLLIN | EPOLLET;
+    eventItem.data.fd = fd;
+    int result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem);
+    if (result != 0) {
+        LOGE("Could not add timer fd(%d) to epoll instance: %s\n", fd, strerror(errno));

     }
-
-    return 0;
-}
-
-int qser_wakelock_destroy(int fd)
-{
-    //UNUSED(fd);
-/*
-    if(!autosleep_enable) {
-        LOGE("Autosleep not enable.");
-        return -1;
-    }
-*/
-    int i;
-    for(i=1;i<LOCK_MAX_SIZE;i++)
-    {
-        if(lynq_lock_name[i].fd -1 == fd)
-        break;
-    }
-
-    if(i == LOCK_MAX_SIZE)
-    {
-        LOGE("LOCK_MAX_SIZE is full\n");
-        return -1;
-    }
-    else
-    {
-        lynq_lock_name[i].fd = 0;
-        memset(lynq_lock_name[i].name, 0, 64);
-        return 0;
-    }
-
-    return 0;
-}
-
-void *threadFunction(void *arg)
-{
-    int pinValue;
-    int i;
-    char buf[8] = {0};
-    struct input_event ev_input = { 0 };
-    const int size = sizeof(struct input_event);
-
-    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;
-    }
-*/
-
-#if defined(MBTK_SG_SUPPORT)
-    fd_t = open("/dev/input/event1", O_RDONLY);
-    LOGI("init pthread_event1");
-#else
-    fd_t = open("/dev/input/event2", O_RDONLY);
-    LOGI("init pthread_event2");
-#endif
-
-    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 (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)
-                {
-                    LOGI("go pthread_event");
-                    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 defined(MBTK_SG_SUPPORT)
-                        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
-                        if (ev_input.type == 4 && ev_input.code == 3)
-                        {
-                            LOGI(">>>>ev_input.value = [%d]",ev_input.value);
-                            pinValue = (int)ev_input.value;
-                            edge_t = pinValue;
-                            lpm_init.wakehandle(edge_t);
-                        }
-#endif
-
-                }
-                else
-                {
-                    LOGE("Unknown events[i].data.fd = %d", events[i].data.fd);
-                }
-            }
-       }
-    }
-    return NULL;
-}
-
-int qser_lpm_init(qser_lpm_Handler_t qser_lpm_handler, qser_pm_cfg_t *qser_lpm_cfg)
-{
-    //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;
-    LOGI(">>pin = %d",lpm_init.wakeupin.wakeupin_pin);
-    lpm_init.wakeupin.wakeupin_edge = qser_lpm_cfg->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);
-
-    if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
-    {
-        LOGE("pthread_attr_setdetachstate() fail");
-        return -1;
-    }
-
-    if(pthread_create(&lpm_t, &thread_attr, threadFunction, NULL))
-    //if(pthread_create(&lpm_t, NULL, threadFunction, NULL))
-    {
-        LOGE("qser_lpm_init can't create thread");
-        return -1;
-    }
-
-    pthread_attr_destroy(&thread_attr);
-
-    //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 (fd_t == -1)
-        return 0;
-
-    if (fd_t != -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;
-}
-
-/*
-例如AT*POWERIND=31,就相当于设置NETWORK、SIM、SMS、CS CALL、PS DATA变化时都不主动上报,
-其中PS DATA目前暂时不支持,只是保留了这个标志位;
-AP power state: 1~31 means suspend, bitmap: bit0 - NETWORK;bit1 - SIM;bit2 - SMS;bit3 - CS CALL;bit4 - PS DATA
-0 means resume all.
-目标文件"/system/etc/powerind"
-如果bit0-bit3都配置可以采用的值是1-15,如果是当前采用NETWORK SMS CALL 则值的取值是 1 4 8 5 9 12 13
-
-*/
-
-int qser_whitelist_set(char* whitelish)
-{
-    //UNUSED(whitelish);
-    uint32 on = 0;
-    int call_t, nw_t, data_t, sms_t, tmp;
-
-    int len = strlen(whitelish);
-
-    if (len != 4)
-    {
-        LOGE("whitelish num error num=[%d]",len);
-        return -1;
-    }
-
-    tmp = atoi(whitelish);
-
-    call_t = tmp/1000;
-    nw_t = tmp%1000/100;
-    data_t = tmp%1000%100/10;
-    sms_t = tmp%1000%100%10;
-
-    if (call_t == 1)
-        call_Off = TRUE;
-    else
-        call_Off = FALSE;
-
-    if (nw_t == 1)
-        nw_off = TRUE;
-    else
-        nw_off = FALSE;
-
-    if (data_t == 1)
-        data_off = TRUE;
-    else
-        data_off = FALSE;
-
-    if (sms_t == 1)
-        sms_off = TRUE;
-    else
-        sms_off = FALSE;
-
-    if (call_Off == FALSE && nw_off == FALSE && data_off == FALSE && sms_off == FALSE)
-    {
-        on = 29;//0000的情况,所有上报源都屏蔽,SIM的上报会一直被包含在内
-    }
-    else
-    {
-        if (call_Off == TRUE)
-            call_t = 8;
-        else
-            call_t = 0;
-
-        if (nw_off == TRUE)
-            nw_t = 1;
-        else
-            nw_t = 0;
-
-        if (data_off == TRUE)
-            data_t = 16;
-        else
-            data_t = 0;
-
-        if (sms_off == TRUE)
-            sms_t = 4;
-        else
-            sms_t = 0;
-
-        on = 29 - (call_t + nw_t + data_t + sms_t);//SIM的上报会一直被包含在内
-    }
-
-    if(whitelist_info_handle == NULL)
-    {
-        whitelist_info_handle = mbtk_info_handle_get();
-        if(whitelist_info_handle)
-        {
-            LOGI("creat whitelist_info_handle is success");
-        }
-        else
-        {
-            LOGE("creat whitelist_info_handle is fail");
-            return -1;
-        }
-    }
-
-    int err = mbtk_wakeup_state_set(whitelist_info_handle, on);
-    if(err)
-    {
-        LOGE("whitelist_info_handle Error : %d", err);
-        return -1;
-    }
-
-    return 0;
-}
-
-
-int qser_whitelist_get(char* whitelish)
-{
-    //UNUSED(whitelish);
-    char list[10]={0};
-    int call_t, nw_t, data_t, sms_t;
-    int get_tmp;
-
-    get_tmp = powerrind_get();
-    //LOGI(">>>get_tmp: %d",get_tmp);
-
-    //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);
-        LOGI("deinit whitelist_info_handle is succuess");
-    }
-
-    return 0;
-}
-
+

+    qser_autosuspend_enable(1);

+    g_sleep_timer_cb = cb;

+    suspend_timer_timer_init();

+

+

+    return 0;

+}

+

+