summaryrefslogtreecommitdiff
path: root/tvapi/libtv/tvutils/CTvInput.cpp (plain)
blob: 3c88e0c3369aea6b4aec4a50a3ddb64ef6032747
1#include "CTvInput.h"
2#include <fcntl.h>
3#include <CTvLog.h>
4#include <utils/Timers.h>
5#define LOG_TAG "FBC"
6CTvInput::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
20CTvInput::~CTvInput()
21{
22 close(mKeyEventFd);
23 close(mKeyEventFd_IR);
24}
25
26void 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
42void 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
58void 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
66void CTvInput::sendkeyCode_Up(const int &code)
67{
68 sendkeyEvent(1 , code, 0); //up
69 sendkeyEvent(0, 0, 0); //clear
70}
71
72void CTvInput::sendkeyCode_Down(const int &code)
73{
74 sendkeyEvent(1 , code, 1); //down
75 sendkeyEvent(0, 0, 0); //clear
76}
77void 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
85void CTvInput::sendIRkeyCode_Up(const int &code)
86{
87 sendIRkeyEvent(1 , code, 0); //up
88 sendIRkeyEvent(0, 0, 0); //clear
89}
90
91void CTvInput::sendIRkeyCode_Down(const int &code)
92{
93 sendIRkeyEvent(1 , code, 1); //down
94 sendIRkeyEvent(0, 0, 0); //clear
95}
96
97nsecs_t CTvInput::getNowMs()
98{
99 return systemTime(SYSTEM_TIME_MONOTONIC) / 1000000;
100}
101void 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
113void CTvInput::sendKeyRepeatStop()
114{
115 CMutex::Autolock _l(mLock);
116 mRepeatKeyCode = -1;
117 mRepeatKeydisTime = -1;
118}
119
120bool 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}