blob: 7e3af967ca269a5379342dde3dab14e54d14e2ab
1 | #include "CTvInput.h" |
2 | #include <stdio.h> |
3 | #include <string.h> |
4 | #include <errno.h> |
5 | #include <fcntl.h> |
6 | #include <CTvLog.h> |
7 | #include <utils/Timers.h> |
8 | |
9 | #define LOG_TAG "FBC" |
10 | |
11 | #define SEND_KEY_ACTION_UP 0x00 |
12 | #define SEND_KEY_ACTION_DOWN 0x01 |
13 | |
14 | CTvInput::CTvInput() |
15 | { |
16 | mKeyEventFd_IR = open(KEY_EVENT_0, O_RDWR); |
17 | mKeyEventFd = open(KEY_EVENT_1, O_RDWR); |
18 | if (mKeyEventFd < 0 || mKeyEventFd_IR < 0) { |
19 | LOGD( "could not open /dev/input/event1\n "); |
20 | return; |
21 | } |
22 | mRepeatKeyCode = -1; |
23 | mRepeatKeydisTime = -1; |
24 | mWhenTimeRepeatKeyStartToSend = -1; |
25 | mTimeoutCount = 0; |
26 | } |
27 | |
28 | CTvInput::~CTvInput() |
29 | { |
30 | close(mKeyEventFd); |
31 | close(mKeyEventFd_IR); |
32 | } |
33 | |
34 | void CTvInput::sendkeyEvent(const int &type, const int &code, const int &value) |
35 | { |
36 | int ret; |
37 | struct input_event event; |
38 | |
39 | memset(&event, 0, sizeof(event)); |
40 | event.type = type; |
41 | event.code = code ; |
42 | event.value = value; |
43 | ret = write(mKeyEventFd, &event, sizeof(event)); |
44 | if (ret < sizeof(event)) { |
45 | LOGD("sendkeyEvent :write event failed, %s\n", strerror(errno)); |
46 | return; |
47 | } |
48 | } |
49 | |
50 | void CTvInput::sendIRkeyEvent(const int &type, const int &code, const int &value) |
51 | { |
52 | int ret; |
53 | struct input_event event; |
54 | |
55 | memset(&event, 0, sizeof(event)); |
56 | event.type = type; |
57 | event.code = code ; |
58 | event.value = value; |
59 | ret = write(mKeyEventFd_IR, &event, sizeof(event)); |
60 | if (ret < sizeof(event)) { |
61 | LOGD("sendIRkeyEvent :write event failed, %s\n", strerror(errno)); |
62 | return; |
63 | } |
64 | } |
65 | |
66 | void CTvInput::sendkeyCode(const int &code) |
67 | { |
68 | sendkeyEvent(EV_KEY , code, SEND_KEY_ACTION_DOWN); //down |
69 | sendkeyEvent(EV_SYN, 0, 0); //clear |
70 | sendkeyEvent(EV_KEY , code, SEND_KEY_ACTION_UP); //up |
71 | sendkeyEvent(EV_SYN, 0, 0); //clear |
72 | } |
73 | |
74 | void CTvInput::sendkeyCode_Up(const int &code) |
75 | { |
76 | sendkeyEvent(EV_KEY , code, SEND_KEY_ACTION_UP); //up |
77 | sendkeyEvent(EV_SYN, 0, 0); //clear |
78 | } |
79 | |
80 | void CTvInput::sendkeyCode_Down(const int &code) |
81 | { |
82 | sendkeyEvent(EV_KEY , code, SEND_KEY_ACTION_DOWN); //down |
83 | sendkeyEvent(EV_SYN, 0, 0); //clear |
84 | } |
85 | |
86 | void CTvInput::sendIRkeyCode(const int &code) |
87 | { |
88 | sendIRkeyEvent(EV_KEY , code, SEND_KEY_ACTION_DOWN); //down |
89 | sendIRkeyEvent(EV_SYN, 0, 0); //clear |
90 | sendIRkeyEvent(EV_KEY , code, SEND_KEY_ACTION_UP); //up |
91 | sendIRkeyEvent(EV_SYN, 0, 0); //clear |
92 | } |
93 | |
94 | void CTvInput::sendIRkeyCode_Up(const int &code) |
95 | { |
96 | sendIRkeyEvent(EV_KEY , code, SEND_KEY_ACTION_UP); //up |
97 | sendIRkeyEvent(EV_SYN, 0, 0); //clear |
98 | } |
99 | |
100 | void CTvInput::sendIRkeyCode_Down(const int &code) |
101 | { |
102 | sendIRkeyEvent(EV_KEY , code, SEND_KEY_ACTION_DOWN); //down |
103 | sendIRkeyEvent(EV_SYN, 0, 0); //clear |
104 | } |
105 | |
106 | nsecs_t CTvInput::getNowMs() |
107 | { |
108 | return systemTime(SYSTEM_TIME_MONOTONIC) / 1000000; |
109 | } |
110 | |
111 | void CTvInput::sendKeyRepeatStart(const int &code, int disTime, int repeatDisTime) |
112 | { |
113 | CMutex::Autolock _l(mLock); |
114 | mTimeoutCount = 0; |
115 | mRepeatKeyCode = code; |
116 | mRepeatKeydisTime = disTime; |
117 | mWhenTimeRepeatKeyStartToSend = disTime + getNowMs(); |
118 | mRepeatKeyRepeateDisTime = repeatDisTime; |
119 | LOGD("sendKeyRepeatStart when = %lld", mWhenTimeRepeatKeyStartToSend); |
120 | mSendKeyCondition.signal(); |
121 | } |
122 | |
123 | void CTvInput::sendKeyRepeatStop() |
124 | { |
125 | CMutex::Autolock _l(mLock); |
126 | mRepeatKeyCode = -1; |
127 | mRepeatKeydisTime = -1; |
128 | } |
129 | |
130 | bool CTvInput::threadLoop() |
131 | { |
132 | int sleeptime = 100;//ms |
133 | |
134 | while (!exitPending()) { //requietexit() or requietexitWait() not call |
135 | LOGD("threadLoop0 when = %lld", mWhenTimeRepeatKeyStartToSend); |
136 | while (mRepeatKeyCode < 0 || mRepeatKeydisTime < 0) { //msg queue is empty |
137 | mLock.lock(); |
138 | mSendKeyCondition.wait(mLock);//first unlock,when return,lock again,so need,call unlock |
139 | mLock.unlock(); |
140 | } |
141 | LOGD("threadLoop1 when = %lld", mWhenTimeRepeatKeyStartToSend); |
142 | int disToSend = -1; |
143 | do { |
144 | disToSend = mWhenTimeRepeatKeyStartToSend - getNowMs(); |
145 | LOGD("dis when = %lld", disToSend); |
146 | if (disToSend <= 0) break; |
147 | |
148 | mLock.lock(); |
149 | mSendKeyCondition.waitRelative(mLock, disToSend);//first unlock,when return,lock again,so need,call unlock |
150 | mLock.unlock(); |
151 | } while (disToSend > 0); // |
152 | LOGD("threadLoop2 when = %lld ", mWhenTimeRepeatKeyStartToSend); |
153 | if (mTimeoutCount < 30) { |
154 | LOGD("mTimeoutCount = %d \n", mTimeoutCount); |
155 | |
156 | mTimeoutCount++; |
157 | if (mRepeatKeyCode == 955) { |
158 | sendkeyCode_Down(mRepeatKeyCode); |
159 | } else { |
160 | sendkeyCode(mRepeatKeyCode); |
161 | } |
162 | } else { |
163 | LOGD("mTimeoutCount = %d,so stop sending long press msg.\n", mTimeoutCount); |
164 | } |
165 | usleep(mRepeatKeyRepeateDisTime * 1000); |
166 | } |
167 | //exit |
168 | //return true, run again, return false,not run. |
169 | return false; |
170 | } |