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