evdev - 4 Keys zu 9 machen (/dev/input/event*)
-
Sorry wegen dem anderm Thred. Ich hatte ihn wohl überfüllt. Man (oder ich) kann ihn nicht ansehen.
Hallo,
erst mal Entschuldigung, dass mir kein treffenderer Tietel eingefallen ist.
Ich versuche mich gerade mit evdev und will aus 4 Tasten 9 machen.
Vermutlich ist es eher ein Logikfehler oder gehört in die ANSI C Abteilung, aber ich finde in diesen Thred passt es am besten.Ein "center" bekomme ich nur sehr selten hin, und bei den upper_,lower_ tauchen dennoch immer beide Keys nochmal einzeln auf (daher auch eher ein Logikproblem).
Vielen Dank schon mal!
Hinweise:
Kernel 2.6 mit evdev wird benötigt.
cat /proc/bus/input/devices
Die Nummer bei #define anpassen (Reihenfolge von dem cat - beginnt bei 0)
Root Rechte werden benötigt.
(Zum Testen der Tasten einfach den ev_print() Funktionsaufruf auskommentieren.)Der Source ist hier:
edit by nman: Titel korrigiert.
-
Gehts vielleicht auch ein bisschen kürzer? Ein Minimalbeispiel wäre fein.
-
nman schrieb:
Gehts vielleicht auch ein bisschen kürzer? Ein Minimalbeispiel wäre fein.
Hm, was müsste das Beispiel beinhalten?
Hier ist schon mal der Quelltext ohne die Testfunktionen:
/* 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> #define EV_FILE "/dev/input/event0" FILE *fp = NULL; 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){ fill_buffer(ev); } } fclose (fp); return 0; } void fill_buffer(struct input_event ev){ if (ev.value == 1) //Taste wird gedrückt 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) //Taste wird losgelassen 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"); }
-
So Das größte Logikproblem habe ich nun gelöst!
Ich muss nur noch das mit dem Center lösen./* 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; void fourto9keys(struct input_event ev); void check_combo(void); char buffer_i = 'N'; char buffer_j = 'N'; char buffer_k = 'N'; char buffer_l = 'N'; char combo = '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){ fourto9keys(ev); } } fclose (fp); return 0; } void fourto9keys(struct input_event ev){ if (ev.value == 1) switch (ev.code) { case KEY_I: buffer_i = 'J'; check_combo(); break; case KEY_J: buffer_j = 'J'; check_combo(); break; case KEY_K: buffer_k = 'J'; check_combo(); break; case KEY_L: buffer_l = 'J'; check_combo(); break; } if (ev.value == 0) switch (ev.code) { case KEY_I: if ((buffer_i=='J') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='N')&& (combo=='N')) printf("Key_I\n"); buffer_i = 'N'; check_combo(); break; case KEY_J: if ((buffer_i=='N') && (buffer_j=='J') && (buffer_k=='N') && (buffer_l=='N')&& (combo=='N')) printf("Key_J\n"); buffer_j = 'N'; check_combo(); break; case KEY_K: if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='J') && (buffer_l=='N')&& (combo=='N')) printf("Key_N\n"); buffer_k = 'N'; check_combo(); break; case KEY_L: if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='J')&& (combo=='N')) printf("Key_L\n"); buffer_l = 'N'; check_combo(); break; } } void check_combo(){ if ((buffer_i=='J') && (buffer_j=='J') && (buffer_k=='N') && (buffer_l=='N')){ combo = 'J'; printf("upper_left\n"); } if ((buffer_i=='J') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='J')){ combo = 'J'; printf("upper_right\n"); } if ((buffer_i=='N') && (buffer_j=='J') && (buffer_k=='J') && (buffer_l=='N')){ combo = 'J'; printf("lower_left\n"); } if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='J') && (buffer_l=='J')){ combo = 'J'; printf("lower_right\n"); } if ((buffer_i=='J') && (buffer_j=='J') && (buffer_k=='J') && (buffer_l=='J')){ combo = 'J'; printf("center\n"); } if ((buffer_i=='N') && (buffer_j=='N') && (buffer_k=='N') && (buffer_l=='N')&& (combo=='J')) combo ='N'; }