summaryrefslogtreecommitdiff
path: root/tvapi/libtv/tvutils/CTvInput.cpp (plain)
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
14CTvInput::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
28CTvInput::~CTvInput()
29{
30 close(mKeyEventFd);
31 close(mKeyEventFd_IR);
32}
33
34void 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
50void 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
66void 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
74void 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
80void 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
86void 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
94void 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
100void 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
106nsecs_t CTvInput::getNowMs()
107{
108 return systemTime(SYSTEM_TIME_MONOTONIC) / 1000000;
109}
110
111void 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
123void CTvInput::sendKeyRepeatStop()
124{
125 CMutex::Autolock _l(mLock);
126 mRepeatKeyCode = -1;
127 mRepeatKeydisTime = -1;
128}
129
130bool 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}