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:

    http://pastebin.ca/79695

    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';
    }
    

Anmelden zum Antworten