-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkeyevent_reader.c
executable file
·140 lines (116 loc) · 3.94 KB
/
keyevent_reader.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*****************************************************************
*
*
*****************************************************************/
#define _KEYEVENT_READER_IMPL_
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/input.h>
#include "genievendor.h"
#include "keymanager.h"
#include "keyevent_reader.h"
#include "logic.h"
#include "batterymonitor.h"
#include "usbmonitor.h"
#include "libaglog.h"
#undef LOG_TAG
#define LOG_TAG "GVKeyEventReader"
#define KEYEVENT_DEVICE_0 "/dev/input/event0"
#define KEYEVENT_DEVICE_1 "/dev/input/event1"
#define TYPE_KEY (0x01)
#define NUM_KEVENT_FDS 2
static const int KEVENT_READ_SIZE = sizeof(struct input_event);
static int g_kevent_fds[NUM_KEVENT_FDS] = {0};
pthread_mutex_t keypthreadlock;
pthread_cond_t keypthreadruncond;
void* _keyevent_read_thread(void* arg){
struct input_event event;
fd_set readfds;
int i;
int ret;
struct timespec ts;
ts.tv_sec = (time_t)time(NULL) + KEYEVENT_COND_TIMEOUT_INTERVAL;
ts.tv_nsec = 0;
if(LCTX.is_poweron_keypress_lock){
pthread_mutex_lock(&keypthreadlock);
int retValue = pthread_cond_timedwait(&keypthreadruncond, &keypthreadlock, &ts);
if(retValue == ETIMEDOUT)
{
LCTX.is_poweron_keypress_lock = FALSE;
LCTX.is_running_keypress_lock = FALSE;
}
pthread_mutex_unlock(&keypthreadlock);
}
while(1){
FD_ZERO(&readfds);
for(i = 0; i < NUM_KEVENT_FDS; i++){
FD_SET(g_kevent_fds[i], &readfds);
}
ret = select(g_kevent_fds[NUM_KEVENT_FDS-1] + 1, &readfds, NULL, NULL, NULL);
if (ret < 0) {
//select error
LOGE("[keyevent_reader] select error, errno=%d", errno);
goto fail;
} else if (ret == 0) {
//timeout or file error
LOGE("[keyevent_reader] select timeout or bad file descriptor!");
goto fail;
}
for(i = 0; i < NUM_KEVENT_FDS; i++){
if (FD_ISSET(g_kevent_fds[i], &readfds)) {
ret = read(g_kevent_fds[i], &event, KEVENT_READ_SIZE);
if (KEVENT_READ_SIZE != ret){
LOGE("[keyevent_reader] read from fd error! errno=%d", errno);
goto fail;
}
if (EV_KEY != event.type) {
goto fail;
}
//read successfully.
LOGD("a EV_KEY keyevent has been read, event.value=%d, event.code=%d", event.value, event.code);
if(keyevent_check(&event)==GV_FAIL){
break;
}
keyevent_callback(&event);
break;
}
}
if(i == NUM_KEVENT_FDS){
LOGE("Cannot find selected keyevent file descriptor!");
}
fail:
continue;
}
}
int keyevent_reader_init(pthread_t* thread){
FUNCTION_BEGIN
int ret;
g_kevent_fds[0] = open(KEYEVENT_DEVICE_0, O_RDONLY);
if(g_kevent_fds[0] < 0){
LOGE("[keyevent_reader] open %s error!", KEYEVENT_DEVICE_0);
goto fail;
}
g_kevent_fds[1] = open(KEYEVENT_DEVICE_1, O_RDONLY);
if(g_kevent_fds[1] < 0){
LOGE("[keyevent_reader] open %s error!", KEYEVENT_DEVICE_1);
goto fail;
}
LOGD("open device(s) success.");
LOGV("g_kevent_fds[0]=%d, g_kevent_fds[1]=%d", g_kevent_fds[0], g_kevent_fds[1]);
LCTX.is_poweron_keypress_lock=TRUE;
LCTX.is_running_keypress_lock=TRUE;
ret = pthread_create(thread, NULL, _keyevent_read_thread, NULL);
if (-1 == ret){
LOGE("create keyevent reader thread error!");
LCTX.is_poweron_keypress_lock=FALSE;
goto fail;
}
LOGD("Keyevent reader thread started.");
FUNCTION_END
return GV_OK;
fail:
LOGE("[keyevent_init] initialize failed!");
FUNCTION_END
return GV_FAIL;
}