blob: 6d5da6b0cd476c13a194285a3b7bd40a354cf0fd [file] [log] [blame]
Dees_Troy51a0e822012-09-05 15:24:24 -04001// hardwarekeyboard.cpp - HardwareKeyboard object
Dees_Troy51a0e822012-09-05 15:24:24 -04002
3#include <stdarg.h>
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include <fcntl.h>
8#include <sys/reboot.h>
9#include <sys/stat.h>
10#include <sys/time.h>
11#include <sys/mman.h>
12#include <sys/types.h>
13#include <sys/ioctl.h>
14#include <time.h>
15#include <unistd.h>
16#include <stdlib.h>
17
18#include <string>
19
20extern "C" {
Ethan Yonkere13fa632015-01-27 11:30:03 -060021#include "../common.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040022#include "../minuitwrp/minui.h"
Ethan Yonkere13fa632015-01-27 11:30:03 -060023#include "../recovery_ui.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040024}
25
26#include "rapidxml.hpp"
27#include "objects.hpp"
Ethan Yonkere13fa632015-01-27 11:30:03 -060028#include "../data.hpp"
that9fa51532015-01-29 02:04:47 +010029#include <linux/input.h>
Dees_Troy51a0e822012-09-05 15:24:24 -040030
Ethan Yonkere13fa632015-01-27 11:30:03 -060031HardwareKeyboard::HardwareKeyboard(void) {
32 // Do Nothing
33 DataManager::SetValue("Lshift_down", 0);
34 DataManager::SetValue("Rshift_down", 0);
35 DataManager::SetValue("last_key", 0);
Dees_Troy51a0e822012-09-05 15:24:24 -040036}
37
Ethan Yonkere13fa632015-01-27 11:30:03 -060038HardwareKeyboard::~HardwareKeyboard() {
39 // Do Nothing
Dees_Troy51a0e822012-09-05 15:24:24 -040040}
41
Ethan Yonkere13fa632015-01-27 11:30:03 -060042int HardwareKeyboard::KeyDown(int key_code) {
43
44 int keyboard = -1;
45 int shiftkey, Lshift_down, Rshift_down;
46
47 DataManager::GetValue("Lshift_down", Lshift_down);
48 DataManager::GetValue("Rshift_down", Rshift_down);
49 if (Lshift_down || Rshift_down)
50 shiftkey = 1;
51 else
52 shiftkey = 0;
53
Dees_Troy51a0e822012-09-05 15:24:24 -040054#ifdef _EVENT_LOGGING
Ethan Yonkere13fa632015-01-27 11:30:03 -060055 LOGE("HardwareKeyboard::KeyDown %i\n", key_code);
Dees_Troy51a0e822012-09-05 15:24:24 -040056#endif
Ethan Yonkere13fa632015-01-27 11:30:03 -060057 switch (key_code) {
58 case KEY_LEFTSHIFT: // Left Shift
59 DataManager::SetValue("Lshift_down", 1);
60 return 0;
61 break;
62 case KEY_RIGHTSHIFT: // Right Shift
63 DataManager::SetValue("Rshift_down", 1);
64 return 0;
65 break;
66 case KEY_A:
67 if (shiftkey)
68 keyboard = 'A';
69 else
70 keyboard = 'a';
71 break;
72 case KEY_B:
73 if (shiftkey)
74 keyboard = 'B';
75 else
76 keyboard = 'b';
77 break;
78 case KEY_C:
79 if (shiftkey)
80 keyboard = 'C';
81 else
82 keyboard = 'c';
83 break;
84 case KEY_D:
85 if (shiftkey)
86 keyboard = 'D';
87 else
88 keyboard = 'd';
89 break;
90 case KEY_E:
91 if (shiftkey)
92 keyboard = 'E';
93 else
94 keyboard = 'e';
95 break;
96 case KEY_F:
97 if (shiftkey)
98 keyboard = 'F';
99 else
100 keyboard = 'f';
101 break;
102 case KEY_G:
103 if (shiftkey)
104 keyboard = 'G';
105 else
106 keyboard = 'g';
107 break;
108 case KEY_H:
109 if (shiftkey)
110 keyboard = 'H';
111 else
112 keyboard = 'h';
113 break;
114 case KEY_I:
115 if (shiftkey)
116 keyboard = 'I';
117 else
118 keyboard = 'i';
119 break;
120 case KEY_J:
121 if (shiftkey)
122 keyboard = 'J';
123 else
124 keyboard = 'j';
125 break;
126 case KEY_K:
127 if (shiftkey)
128 keyboard = 'K';
129 else
130 keyboard = 'k';
131 break;
132 case KEY_L:
133 if (shiftkey)
134 keyboard = 'L';
135 else
136 keyboard = 'l';
137 break;
138 case KEY_M:
139 if (shiftkey)
140 keyboard = 'M';
141 else
142 keyboard = 'm';
143 break;
144 case KEY_N:
145 if (shiftkey)
146 keyboard = 'N';
147 else
148 keyboard = 'n';
149 break;
150 case KEY_O:
151 if (shiftkey)
152 keyboard = 'O';
153 else
154 keyboard = 'o';
155 break;
156 case KEY_P:
157 if (shiftkey)
158 keyboard = 'P';
159 else
160 keyboard = 'p';
161 break;
162 case KEY_Q:
163 if (shiftkey)
164 keyboard = 'Q';
165 else
166 keyboard = 'q';
167 break;
168 case KEY_R:
169 if (shiftkey)
170 keyboard = 'R';
171 else
172 keyboard = 'r';
173 break;
174 case KEY_S:
175 if (shiftkey)
176 keyboard = 'S';
177 else
178 keyboard = 's';
179 break;
180 case KEY_T:
181 if (shiftkey)
182 keyboard = 'T';
183 else
184 keyboard = 't';
185 break;
186 case KEY_U:
187 if (shiftkey)
188 keyboard = 'U';
189 else
190 keyboard = 'u';
191 break;
192 case KEY_V:
193 if (shiftkey)
194 keyboard = 'V';
195 else
196 keyboard = 'v';
197 break;
198 case KEY_W:
199 if (shiftkey)
200 keyboard = 'W';
201 else
202 keyboard = 'w';
203 break;
204 case KEY_X:
205 if (shiftkey)
206 keyboard = 'X';
207 else
208 keyboard = 'x';
209 break;
210 case KEY_Y:
211 if (shiftkey)
212 keyboard = 'Y';
213 else
214 keyboard = 'y';
215 break;
216 case KEY_Z:
217 if (shiftkey)
218 keyboard = 'Z';
219 else
220 keyboard = 'z';
221 break;
222 case KEY_0:
223 if (shiftkey)
224 keyboard = ')';
225 else
226 keyboard = '0';
227 break;
228 case KEY_1:
229 if (shiftkey)
230 keyboard = '!';
231 else
232 keyboard = '1';
233 break;
234 case KEY_2:
235 if (shiftkey)
236 keyboard = '@';
237 else
238 keyboard = '2';
239 break;
240 case KEY_3:
241 if (shiftkey)
242 keyboard = '#';
243 else
244 keyboard = '3';
245 break;
246 case KEY_4:
247 if (shiftkey)
248 keyboard = '$';
249 else
250 keyboard = '4';
251 break;
252 case KEY_5:
253 if (shiftkey)
254 keyboard = '%';
255 else
256 keyboard = '5';
257 break;
258 case KEY_6:
259 if (shiftkey)
260 keyboard = '^';
261 else
262 keyboard = '6';
263 break;
264 case KEY_7:
265 if (shiftkey)
266 keyboard = '&';
267 else
268 keyboard = '7';
269 break;
270 case KEY_8:
271 if (shiftkey)
272 keyboard = '*';
273 else
274 keyboard = '8';
275 break;
276 case KEY_9:
277 if (shiftkey)
278 keyboard = '(';
279 else
280 keyboard = '9';
281 break;
282 case KEY_SPACE:
283 keyboard = ' ';
284 break;
285 case KEY_BACKSPACE:
286 keyboard = KEYBOARD_BACKSPACE;
287 break;
288 case KEY_ENTER:
289 keyboard = KEYBOARD_ACTION;
290 break;
291 case KEY_SLASH:
292 if (shiftkey)
293 keyboard = '?';
294 else
295 keyboard = '/';
296 break;
297 case KEY_DOT:
298 if (shiftkey)
299 keyboard = '>';
300 else
301 keyboard = '.';
302 break;
303 case KEY_COMMA:
304 if (shiftkey)
305 keyboard = '<';
306 else
307 keyboard = ',';
308 break;
309 case KEY_MINUS:
310 if (shiftkey)
311 keyboard = '_';
312 else
313 keyboard = '-';
314 break;
315 case KEY_GRAVE:
316 if (shiftkey)
317 keyboard = '~';
318 else
319 keyboard = '`';
320 break;
321 case KEY_EQUAL:
322 if (shiftkey)
323 keyboard = '+';
324 else
325 keyboard = '=';
326 break;
327 case KEY_LEFTBRACE:
328 if (shiftkey)
329 keyboard = '{';
330 else
331 keyboard = '[';
332 break;
333 case KEY_RIGHTBRACE:
334 if (shiftkey)
335 keyboard = '}';
336 else
337 keyboard = ']';
338 break;
339 case KEY_BACKSLASH:
340 if (shiftkey)
341 keyboard = '|';
342 else
343 keyboard = '\\';
344 break;
345 case KEY_SEMICOLON:
346 if (shiftkey)
347 keyboard = ':';
348 else
349 keyboard = ';';
350 break;
351 case KEY_APOSTROPHE:
352 if (shiftkey)
353 keyboard = '\"';
354 else
355 keyboard = '\'';
356 break;
357 case KEY_UP: // Up arrow
358 keyboard = KEYBOARD_ARROW_UP;
359 break;
360 case KEY_DOWN: // Down arrow
361 keyboard = KEYBOARD_ARROW_DOWN;
362 break;
363 case KEY_LEFT: // Left arrow
364 keyboard = KEYBOARD_ARROW_LEFT;
365 break;
366 case KEY_RIGHT: // Right arrow
367 keyboard = KEYBOARD_ARROW_RIGHT;
368 break;
369 case KEY_BACK: // back button on screen
370 mPressedKeys.insert(KEY_BACK);
371 PageManager::NotifyKey(KEY_BACK, true);
372 return 0;
373 break;
374 case KEY_HOMEPAGE: // keyboard home button
375 case KEY_HOME: // home button on screen
376 mPressedKeys.insert(KEY_HOME);
377 PageManager::NotifyKey(KEY_HOME, true);
378 return 0;
379 break;
380 case KEY_SLEEP: // keyboard lock button
381 case KEY_POWER: // tablet power button
382 mPressedKeys.insert(KEY_POWER);
383 PageManager::NotifyKey(KEY_POWER, true);
384 return 0;
385 break;
386#ifdef _EVENT_LOGGING
387 default:
388 LOGE("Unmapped keycode: %i\n", key_code);
389 break;
390#endif
391 }
392 if (keyboard != -1) {
393 DataManager::SetValue("last_key", keyboard);
394 mPressedKeys.insert(keyboard);
395 if (!PageManager::NotifyKeyboard(keyboard))
396 return 1; // Return 1 to enable key repeat
397 } else {
398 DataManager::SetValue("last_key", 0);
399 }
400 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400401}
402
Ethan Yonkere13fa632015-01-27 11:30:03 -0600403int HardwareKeyboard::KeyUp(int key_code) {
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100404 std::set<int>::iterator itr = mPressedKeys.find(key_code);
Ethan Yonkere13fa632015-01-27 11:30:03 -0600405 if (itr != mPressedKeys.end()) {
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100406 mPressedKeys.erase(itr);
407 PageManager::NotifyKey(key_code, false);
408 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400409#ifdef _EVENT_LOGGING
Ethan Yonkere13fa632015-01-27 11:30:03 -0600410 LOGE("HardwareKeyboard::KeyUp %i\n", key_code);
Dees_Troy51a0e822012-09-05 15:24:24 -0400411#endif
Ethan Yonkere13fa632015-01-27 11:30:03 -0600412 if (key_code == KEY_LEFTSHIFT) { // Left Shift
413 DataManager::SetValue("Lshift_down", 0);
414 } else if (key_code == 31) { // Right Shift
415 DataManager::SetValue("Rshift_down", 0);
416 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400417 return 0;
418}
419
Ethan Yonkere13fa632015-01-27 11:30:03 -0600420int HardwareKeyboard::KeyRepeat(void) {
421 int last_key;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100422
Ethan Yonkere13fa632015-01-27 11:30:03 -0600423 DataManager::GetValue("last_key", last_key);
Dees_Troy51a0e822012-09-05 15:24:24 -0400424#ifdef _EVENT_LOGGING
Ethan Yonkere13fa632015-01-27 11:30:03 -0600425 LOGE("HardwareKeyboard::KeyRepeat: %i\n", last_key);
Dees_Troy51a0e822012-09-05 15:24:24 -0400426#endif
Ethan Yonkere13fa632015-01-27 11:30:03 -0600427 if (last_key)
428 PageManager::NotifyKeyboard(last_key);
Dees_Troy51a0e822012-09-05 15:24:24 -0400429 return 0;
430}
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100431
Ethan Yonkere13fa632015-01-27 11:30:03 -0600432void HardwareKeyboard::ConsumeKeyRelease(int key) {
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100433 mPressedKeys.erase(key);
434}