// hardwarekeyboard.cpp - HardwareKeyboard object
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/reboot.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>
extern "C" {
#include "../common.h"
#include "../minuitwrp/minui.h"
#include "../recovery_ui.h"
}
#include "rapidxml.hpp"
#include "objects.hpp"
#include "../data.hpp"
#include <linux/input.h>
HardwareKeyboard::HardwareKeyboard(void) {
// Do Nothing
DataManager::SetValue("Lshift_down", 0);
DataManager::SetValue("Rshift_down", 0);
DataManager::SetValue("last_key", 0);
}
HardwareKeyboard::~HardwareKeyboard() {
// Do Nothing
}
int HardwareKeyboard::KeyDown(int key_code) {
int keyboard = -1;
int shiftkey, Lshift_down, Rshift_down;
DataManager::GetValue("Lshift_down", Lshift_down);
DataManager::GetValue("Rshift_down", Rshift_down);
if (Lshift_down || Rshift_down)
shiftkey = 1;
else
shiftkey = 0;
#ifdef _EVENT_LOGGING
LOGE("HardwareKeyboard::KeyDown %i\n", key_code);
#endif
switch (key_code) {
case KEY_LEFTSHIFT: // Left Shift
DataManager::SetValue("Lshift_down", 1);
return 0;
break;
case KEY_RIGHTSHIFT: // Right Shift
DataManager::SetValue("Rshift_down", 1);
return 0;
break;
case KEY_A:
if (shiftkey)
keyboard = 'A';
else
keyboard = 'a';
break;
case KEY_B:
if (shiftkey)
keyboard = 'B';
else
keyboard = 'b';
break;
case KEY_C:
if (shiftkey)
keyboard = 'C';
else
keyboard = 'c';
break;
case KEY_D:
if (shiftkey)
keyboard = 'D';
else
keyboard = 'd';
break;
case KEY_E:
if (shiftkey)
keyboard = 'E';
else
keyboard = 'e';
break;
case KEY_F:
if (shiftkey)
keyboard = 'F';
else
keyboard = 'f';
break;
case KEY_G:
if (shiftkey)
keyboard = 'G';
else
keyboard = 'g';
break;
case KEY_H:
if (shiftkey)
keyboard = 'H';
else
keyboard = 'h';
break;
case KEY_I:
if (shiftkey)
keyboard = 'I';
else
keyboard = 'i';
break;
case KEY_J:
if (shiftkey)
keyboard = 'J';
else
keyboard = 'j';
break;
case KEY_K:
if (shiftkey)
keyboard = 'K';
else
keyboard = 'k';
break;
case KEY_L:
if (shiftkey)
keyboard = 'L';
else
keyboard = 'l';
break;
case KEY_M:
if (shiftkey)
keyboard = 'M';
else
keyboard = 'm';
break;
case KEY_N:
if (shiftkey)
keyboard = 'N';
else
keyboard = 'n';
break;
case KEY_O:
if (shiftkey)
keyboard = 'O';
else
keyboard = 'o';
break;
case KEY_P:
if (shiftkey)
keyboard = 'P';
else
keyboard = 'p';
break;
case KEY_Q:
if (shiftkey)
keyboard = 'Q';
else
keyboard = 'q';
break;
case KEY_R:
if (shiftkey)
keyboard = 'R';
else
keyboard = 'r';
break;
case KEY_S:
if (shiftkey)
keyboard = 'S';
else
keyboard = 's';
break;
case KEY_T:
if (shiftkey)
keyboard = 'T';
else
keyboard = 't';
break;
case KEY_U:
if (shiftkey)
keyboard = 'U';
else
keyboard = 'u';
break;
case KEY_V:
if (shiftkey)
keyboard = 'V';
else
keyboard = 'v';
break;
case KEY_W:
if (shiftkey)
keyboard = 'W';
else
keyboard = 'w';
break;
case KEY_X:
if (shiftkey)
keyboard = 'X';
else
keyboard = 'x';
break;
case KEY_Y:
if (shiftkey)
keyboard = 'Y';
else
keyboard = 'y';
break;
case KEY_Z:
if (shiftkey)
keyboard = 'Z';
else
keyboard = 'z';
break;
case KEY_0:
if (shiftkey)
keyboard = ')';
else
keyboard = '0';
break;
case KEY_1:
if (shiftkey)
keyboard = '!';
else
keyboard = '1';
break;
case KEY_2:
if (shiftkey)
keyboard = '@';
else
keyboard = '2';
break;
case KEY_3:
if (shiftkey)
keyboard = '#';
else
keyboard = '3';
break;
case KEY_4:
if (shiftkey)
keyboard = '$';
else
keyboard = '4';
break;
case KEY_5:
if (shiftkey)
keyboard = '%';
else
keyboard = '5';
break;
case KEY_6:
if (shiftkey)
keyboard = '^';
else
keyboard = '6';
break;
case KEY_7:
if (shiftkey)
keyboard = '&';
else
keyboard = '7';
break;
case KEY_8:
if (shiftkey)
keyboard = '*';
else
keyboard = '8';
break;
case KEY_9:
if (shiftkey)
keyboard = '(';
else
keyboard = '9';
break;
case KEY_SPACE:
keyboard = ' ';
break;
case KEY_BACKSPACE:
keyboard = KEYBOARD_BACKSPACE;
break;
case KEY_ENTER:
keyboard = KEYBOARD_ACTION;
break;
case KEY_SLASH:
if (shiftkey)
keyboard = '?';
else
keyboard = '/';
break;
case KEY_DOT:
if (shiftkey)
keyboard = '>';
else
keyboard = '.';
break;
case KEY_COMMA:
if (shiftkey)
keyboard = '<';
else
keyboard = ',';
break;
case KEY_MINUS:
if (shiftkey)
keyboard = '_';
else
keyboard = '-';
break;
case KEY_GRAVE:
if (shiftkey)
keyboard = '~';
else
keyboard = '`';
break;
case KEY_EQUAL:
if (shiftkey)
keyboard = '+';
else
keyboard = '=';
break;
case KEY_LEFTBRACE:
if (shiftkey)
keyboard = '{';
else
keyboard = '[';
break;
case KEY_RIGHTBRACE:
if (shiftkey)
keyboard = '}';
else
keyboard = ']';
break;
case KEY_BACKSLASH:
if (shiftkey)
keyboard = '|';
else
keyboard = '\\';
break;
case KEY_SEMICOLON:
if (shiftkey)
keyboard = ':';
else
keyboard = ';';
break;
case KEY_APOSTROPHE:
if (shiftkey)
keyboard = '\"';
else
keyboard = '\'';
break;
case KEY_UP: // Up arrow
keyboard = KEYBOARD_ARROW_UP;
break;
case KEY_DOWN: // Down arrow
keyboard = KEYBOARD_ARROW_DOWN;
break;
case KEY_LEFT: // Left arrow
keyboard = KEYBOARD_ARROW_LEFT;
break;
case KEY_RIGHT: // Right arrow
keyboard = KEYBOARD_ARROW_RIGHT;
break;
case KEY_BACK: // back button on screen
mPressedKeys.insert(KEY_BACK);
PageManager::NotifyKey(KEY_BACK, true);
return 0;
break;
case KEY_HOMEPAGE: // keyboard home button
case KEY_HOME: // home button on screen
mPressedKeys.insert(KEY_HOME);
PageManager::NotifyKey(KEY_HOME, true);
return 0;
break;
case KEY_SLEEP: // keyboard lock button
case KEY_POWER: // tablet power button
mPressedKeys.insert(KEY_POWER);
PageManager::NotifyKey(KEY_POWER, true);
return 0;
break;
#ifdef _EVENT_LOGGING
default:
LOGE("Unmapped keycode: %i\n", key_code);
break;
#endif
}
if (keyboard != -1) {
DataManager::SetValue("last_key", keyboard);
mPressedKeys.insert(keyboard);
if (!PageManager::NotifyKeyboard(keyboard))
return 1; // Return 1 to enable key repeat
} else {
DataManager::SetValue("last_key", 0);
}
return 0;
}
int HardwareKeyboard::KeyUp(int key_code) {
std::set<int>::iterator itr = mPressedKeys.find(key_code);
if (itr != mPressedKeys.end()) {
mPressedKeys.erase(itr);
PageManager::NotifyKey(key_code, false);
}
#ifdef _EVENT_LOGGING
LOGE("HardwareKeyboard::KeyUp %i\n", key_code);
#endif
if (key_code == KEY_LEFTSHIFT) { // Left Shift
DataManager::SetValue("Lshift_down", 0);
} else if (key_code == 31) { // Right Shift
DataManager::SetValue("Rshift_down", 0);
}
return 0;
}
int HardwareKeyboard::KeyRepeat(void) {
int last_key;
DataManager::GetValue("last_key", last_key);
#ifdef _EVENT_LOGGING
LOGE("HardwareKeyboard::KeyRepeat: %i\n", last_key);
#endif
if (last_key)
PageManager::NotifyKeyboard(last_key);
return 0;
}
void HardwareKeyboard::ConsumeKeyRelease(int key) {
mPressedKeys.erase(key);
}