/* This is a Testprogramm
Here I want to find out how /dev/input/event works.
some parts are taken from esekey which is released under the GPL.
This source is also under the terms of the GPL.
regards nice
*/
#include <stdio.h>
#include <linux/input.h>
#include <sys/time.h>
#define EV_FILE "/dev/input/event0"
FILE *fp = NULL;
struct input_event ev;
char *get_ev_type(struct input_event ev);
char *get_ev_key(struct input_event ev);
char *get_ev_value(struct input_event ev);
long int get_ev_time_sec(struct input_event ev);
long int get_ev_time_usec(struct input_event ev);
void four2nineKeys(void);
void fill_buffer(struct input_event ev);
char buffer_i = 'N';
char buffer_j = 'N';
char buffer_k = 'N';
char buffer_l = 'N';
int main () {
if (!(fp = fopen (EV_FILE, "r"))) {
printf ("can`t open %s\n",EV_FILE);
return -4;
}
while (fread (&ev, sizeof (struct input_event), 1, fp)) {
if (ev.type == EV_KEY){
// ev_print(ev,get_ev_time_sec(ev),get_ev_time_usec(ev),get_ev_type(ev),get_ev_key(ev),get_ev_value(ev));
fill_buffer(ev);
//printf("BUFFER_I: %c\nBUFFER_J: %c\n",buffer_i,buffer_j);
}
}
fclose (fp);
return 0;
}
void fill_buffer(struct input_event ev){
if (ev.value == 1)
switch (ev.code) {
case KEY_I:
buffer_i = 'J';
four2nineKeys();
break;
case KEY_J:
buffer_j = 'J';
four2nineKeys();
break;
case KEY_K:
buffer_k = 'J';
four2nineKeys();
break;
case KEY_L:
buffer_l = 'J';
four2nineKeys();
break;
}
if (ev.value == 0)
switch (ev.code) {
case KEY_I:
buffer_i = 'N';
four2nineKeys();
break;
case KEY_J:
buffer_j = 'N';
four2nineKeys();
break;
case KEY_K:
buffer_k = 'N';
four2nineKeys();
break;
case KEY_L:
buffer_l = 'N';
four2nineKeys();
break;
}
}
void four2nineKeys(void){
//center
if ((buffer_i=='J') && (buffer_j=='J') && (buffer_k=='J') && (buffer_l=='J'))
printf("center\n");
//upper_left
if ((buffer_i=='J') && (buffer_j=='J') && (buffer_k=='N') && (buffer_l=='N'))
printf("upper_left\n");
//upper_right
if ((buffer_i=='J') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='J'))
printf("upper_right\n");
//lower_left
if ((buffer_i=='N') && (buffer_j=='J') && (buffer_k=='J') && (buffer_l=='N'))
printf("lower_left\n");
//lower_right
if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='J') && (buffer_l=='J'))
printf("lower_right\n");
//Key_I
if ((buffer_i=='J') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='N'))
printf("Key_I\n");
//Key_J
if ((buffer_i=='N') && (buffer_j=='J') && (buffer_k=='N') && (buffer_l=='N'))
printf("Key_J\n");
//Key_K
if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='J') && (buffer_l=='N'))
printf("Key_K\n");
//Key_L
if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='J'))
printf("Key_L\n");
//Key_not_in_rage
// else if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='N'))
// printf("keys are not pressed\n");
// else
// printf("WOW, we are in serious trouble");
//printf("BUFFER_I: %c\nBUFFER_J: %c\n",buffer_i,buffer_j);
}
int ev_print(struct input_event ev,long int ev_time_sec,long int ev_time_usec,char *ev_type,char *ev_key,char *ev_value){
printf("TIME: SEC(%li) USEC(%li)\nTYPE %s\nKEY: %s\nVALUE: %s\n",ev_time_sec,ev_time_usec,ev_type,ev_key,ev_value);
}
long int get_ev_time_sec(struct input_event ev) {
//to do: write some parser and give back the timestemp
return ev.time.tv_sec;
}
long int get_ev_time_usec(struct input_event ev) {
//to do: write some parser and give back the timestemp
return ev.time.tv_usec;
}
char *get_ev_type(struct input_event ev) {
switch (ev.type) {
case EV_SYN:
return "EV_SYN";
case EV_KEY:
return"EV_KEY";
case EV_REL:
return "EV_REL";
case EV_ABS:
return "EV_ABS";
case EV_MSC:
return "EV_MSC";
case EV_LED:
return "EV_LED";
case EV_SND:
return "EV_SND";
case EV_REP:
return "EV_REP";
case EV_FF:
return "EV_FF";
case EV_PWR:
return "EV_PWR";
case EV_FF_STATUS:
return "EV_FF_STATUS";
case EV_MAX:
return "EV_MAX";
default:
return "ERROR";
}
}
//parser.c from esekey
char*
get_ev_key(struct input_event ev)
{
switch (ev.code) {
case 1:
return "ESC";
case 2:
return "1";
case 3:
return "2";
case 4:
return "3";
case 5:
return "4";
case 6:
return "5";
case 7:
return "6";
case 8:
return "7";
case 9:
return "8";
case 10:
return "9";
case 11:
return "0";
case 12:
return "MINUS";
case 13:
return "EQUAL";
case 14:
return "BACKSPACE";
case 15:
return "TAB";
case 16:
return "Q";
case 17:
return "W";
case 18:
return "E";
case 19:
return "R";
case 20:
return "T";
case 21:
return "Y";
case 22:
return "U";
case 23:
return "I";
case 24:
return "O";
case 25:
return "P";
case 26:
return "LEFTBRACE";
case 27:
return "RIGHTBRACE";
case 28:
return "ENTER";
case 29:
return "LEFTCTRL";
case 30:
return "A";
case 31:
return "S";
case 32:
return "D";
case 33:
return "F";
case 34:
return "G";
case 35:
return "H";
case 36:
return "J";
case 37:
return "K";
case 38:
return "L";
case 39:
return "SEMICOLON";
case 40:
return "APOSTROPHE";
case 41:
return "GRAVE";
case 42:
return "LEFTSHIFT";
case 43:
return "BACKSLASH";
case 44:
return "Z";
case 45:
return "X";
case 46:
return "C";
case 47:
return "V";
case 48:
return "B";
case 49:
return "N";
case 50:
return "M";
case 51:
return "COMMA";
case 52:
return "DOT";
case 53:
return "SLASH";
case 54:
return "RIGHTSHIFT";
case 55:
return "KPASTERISK";
case 56:
return "LEFTALT";
case 57:
return "SPACE";
case 58:
return "CAPSLOCK";
case 59:
return "F1";
case 60:
return "F2";
case 61:
return "F3";
case 62:
return "F4";
case 63:
return "F5";
case 64:
return "F6";
case 65:
return "F7";
case 66:
return "F8";
case 67:
return "F9";
case 68:
return "F10";
case 69:
return "NUMLOCK";
case 70:
return "SCROLLLOCK";
case 71:
return "KP7";
case 72:
return "KP8";
case 73:
return "KP9";
case 74:
return "KPMINUS";
case 75:
return "KP4";
case 76:
return "KP5";
case 77:
return "KP6";
case 78:
return "KPPLUS";
case 79:
return "KP1";
case 80:
return "KP2";
case 81:
return "KP3";
case 82:
return "KP0";
case 83:
return "KPDOT";
case 85:
return "ZENKAKUHANKAKU";
case 86:
return "102ND";
case 87:
return "F11";
case 88:
return "F12";
case 89:
return "RO";
case 90:
return "KATAKANA";
case 91:
return "HIRAGANA";
case 92:
return "HENKAN";
case 93:
return "KATAKANAHIRAGANA";
case 94:
return "MUHENKAN";
case 95:
return "KPJPCOMMA";
case 96:
return "KPENTER";
case 97:
return "RIGHTCTRL";
case 98:
return "KPSLASH";
case 99:
return "SYSRQ";
case 100:
return "RIGHTALT";
case 101:
return "LINEFEED";
case 102:
return "HOME";
case 103:
return "UP";
case 104:
return "PAGEUP";
case 105:
return "LEFT";
case 106:
return "RIGHT";
case 107:
return "END";
case 108:
return "DOWN";
case 109:
return "PAGEDOWN";
case 110:
return "INSERT";
case 111:
return "DELETE";
case 112:
return "MACRO";
case 113:
return "MUTE";
case 114:
return "VOLUMEDOWN";
case 115:
return "VOLUMEUP";
case 116:
return "POWER";
case 117:
return "KPEQUAL";
case 118:
return "KPPLUSMINUS";
case 119:
return "PAUSE";
case 121:
return "KPCOMMA";
case 122:
return "HANGUEL";
case 123:
return "HANJA";
case 124:
return "YEN";
case 125:
return "LEFTMETA";
case 126:
return "RIGHTMETA";
case 127:
return "COMPOSE";
case 128:
return "STOP";
case 129:
return "AGAIN";
case 130:
return "PROPS";
case 131:
return "UNDO";
case 132:
return "FRONT";
case 133:
return "COPY";
case 134:
return "OPEN";
case 135:
return "PASTE";
case 136:
return "FIND";
case 137:
return "CUT";
case 138:
return "HELP";
case 139:
return "MENU";
case 140:
return "CALC";
case 141:
return "SETUP";
case 142:
return "SLEEP";
case 143:
return "WAKEUP";
case 144:
return "FILE";
case 145:
return "SENDFILE";
case 146:
return "DELETEFILE";
case 147:
return "XFER";
case 148:
return "PROG1";
case 149:
return "PROG2";
case 150:
return "WWW";
case 151:
return "MSDOS";
case 152:
return "COFFEE";
case 153:
return "DIRECTION";
case 154:
return "CYCLEWINDOWS";
case 155:
return "MAIL";
case 156:
return "BOOKMARKS";
case 157:
return "COMPUTER";
case 158:
return "BACK";
case 159:
return "FORWARD";
case 160:
return "CLOSECD";
case 161:
return "EJECTCD";
case 162:
return "EJECTCLOSECD";
case 163:
return "NEXTSONG";
case 164:
return "PLAYPAUSE";
case 165:
return "PREVIOUSSONG";
case 166:
return "STOPCD";
case 167:
return "RECORD";
case 168:
return "REWIND";
case 169:
return "PHONE";
case 170:
return "ISO";
case 171:
return "CONFIG";
case 172:
return "HOMEPAGE";
case 173:
return "REFRESH";
case 174:
return "EXIT";
case 175:
return "MOVE";
case 176:
return "EDIT";
case 177:
return "SCROLLUP";
case 178:
return "SCROLLDOWN";
case 179:
return "KPLEFTPAREN";
case 180:
return "KPRIGHTPAREN";
case 183:
return "F13";
case 184:
return "F14";
case 185:
return "F15";
case 186:
return "F16";
case 187:
return "F17";
case 188:
return "F18";
case 189:
return "F19";
case 190:
return "F20";
case 191:
return "F21";
case 192:
return "F22";
case 193:
return "F23";
case 194:
return "F24";
case 200:
return "PLAYCD";
case 201:
return "PAUSECD";
case 202:
return "PROG3";
case 203:
return "PROG4";
case 205:
return "SUSPEND";
case 206:
return "CLOSE";
case 207:
return "PLAY";
case 208:
return "FASTFORWARD";
case 209:
return "BASSBOOST";
case 210:
return "PRINT";
case 211:
return "HP";
case 212:
return "CAMERA";
case 213:
return "SOUND";
case 214:
return "QUESTION";
case 215:
return "EMAIL";
case 216:
return "CHAT";
case 217:
return "SEARCH";
case 218:
return "CONNECT";
case 219:
return "FINANCE";
case 220:
return "SPORT";
case 221:
return "SHOP";
case 222:
return "ALTERASE";
case 223:
return "CANCEL";
case 224:
return "BRIGHTNESSDOWN";
case 225:
return "BRIGHTNESSUP";
case 226:
return "MEDIA";
case 227:
return "SWITCHVIDEOMODE";
case 228:
return "KBDILLUMTOGGLE";
case 229:
return "KBDILLUMDOWN";
case 230:
return "KBDILLUMUP";
case 240:
return "UNKNOWN";
case 352:
return "OK";
case 353:
return "SELECT";
case 354:
return "GOTO";
case 355:
return "CLEAR";
case 356:
return "POWER2";
case 357:
return "OPTION";
case 358:
return "INFO";
case 359:
return "TIME";
case 360:
return "VENDOR";
case 361:
return "ARCHIVE";
case 362:
return "PROGRAM";
case 363:
return "CHANNEL";
case 364:
return "FAVORITES";
case 365:
return "EPG";
case 366:
return "PVR";
case 367:
return "MHP";
case 368:
return "LANGUAGE";
case 369:
return "TITLE";
case 370:
return "SUBTITLE";
case 371:
return "ANGLE";
case 372:
return "ZOOM";
case 373:
return "MODE";
case 374:
return "KEYBOARD";
case 375:
return "SCREEN";
case 376:
return "PC";
case 377:
return "TV";
case 378:
return "TV2";
case 379:
return "VCR";
case 380:
return "VCR2";
case 381:
return "SAT";
case 382:
return "SAT2";
case 383:
return "CD";
case 384:
return "TAPE";
case 385:
return "RADIO";
case 386:
return "TUNER";
case 387:
return "PLAYER";
case 388:
return "TEXT";
case 389:
return "DVD";
case 390:
return "AUX";
case 391:
return "MP3";
case 392:
return "AUDIO";
case 393:
return "VIDEO";
case 394:
return "DIRECTORY";
case 395:
return "LIST";
case 396:
return "MEMO";
case 397:
return "CALENDAR";
case 398:
return "RED";
case 399:
return "GREEN";
case 400:
return "YELLOW";
case 401:
return "BLUE";
case 402:
return "CHANNELUP";
case 403:
return "CHANNELDOWN";
case 404:
return "FIRST";
case 405:
return "LAST";
case 406:
return "AB";
case 407:
return "NEXT";
case 408:
return "RESTART";
case 409:
return "SLOW";
case 410:
return "SHUFFLE";
case 411:
return "BREAK";
case 412:
return "PREVIOUS";
case 413:
return "DIGITS";
case 414:
return "TEEN";
case 415:
return "TWEN";
case 448:
return "DEL_EOL";
case 449:
return "DEL_EOS";
case 450:
return "INS_LINE";
case 451:
return "DEL_LINE";
case 464:
return "FN";
case 465:
return "FN_ESC";
case 466:
return "FN_F1";
case 467:
return "FN_F2";
case 468:
return "FN_F3";
case 469:
return "FN_F4";
case 470:
return "FN_F5";
case 471:
return "FN_F6";
case 472:
return "FN_F7";
case 473:
return "FN_F8";
case 474:
return "FN_F9";
case 475:
return "FN_F10";
case 476:
return "FN_F11";
case 477:
return "FN_F12";
case 478:
return "FN_1";
case 479:
return "FN_2";
case 480:
return "FN_D";
case 481:
return "FN_E";
case 482:
return "FN_F";
case 483:
return "FN_S";
case 484:
return "FN_B";
case 511:
return "MAX";
default:
return "ERROR";
}
return NULL;
}
char *get_ev_value(struct input_event ev) {
switch (ev.value) {
case 0:
return "Release";
case 1:
return "Press";
case 2:
return "Autorepeat";
default:
return "ERROR";
}
}