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