- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 21 bis 30 von 33

Thema: C/C++ lib für Sonderzeichenkombinationen (F1-12, +shift, alt, ctrl) als Scancode

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #13
    HaWe
    Gast
    hallo, super, das Programm läuft!
    es werden jetzt in 1 Zeile alle modifier plus die gedrückte "echte" Taste angezeigt.

    Was hältst du davon, wenn man daraus einen eigenen Scancode generiert?

    einfache Taste, Bereich 0...255, so wie jetzt bereits ausgegeben.

    Modifier:
    shift (links oder rechts, egal): = 1*1024
    ctrl (links oder rechts, egal): = 2*1024
    alt (links): = 4*1024
    altgr (==ctrl+alt) : = 6*1024

    diese werden dann zum Rest der gedrückten Tasten dazu addiert.

    dann könnte man eine Funktion schreiben, die ausschließlich diesen Scancode berechnet und in einer globalen Variablen speichert.

    Dazu könnte ich ein paar Konstanten entwerfen wie z.B.
    Code:
    #define F1     59
    #define F2     60
    #define F3     61
    ...
    
    #define F1_shft     59+1024
    #define F2_shft     60+1024
    #define F3_shft     61+1024
    ...
    
    #define F1_ctrl     59+2048
    #define F2_ctrl     60+2048
    #define F3_ctrl     61+2048
    ...
    
    #define F1_alt      59+4092
    #define F2_alt      60+4092
    #define F3_alt      61+4092
    ...
    usw


    Code:
    // global)
    volatile int _kbscode_=0;
    
    
    void  getkbscancode() {
       int modkeycode = 0; 
       //...
       // hier jetzt deine Abfrage auf Druck ohne Wiederholung, 
       // dann modkeycode berechnen wie oben aus Summe aus
       // shift (links oder rechts, egal): = 1*1024
       // ctrl (links oder rechts, egal):  = 2*1024
       // alt (links oder rechts, egal):  = 4*1024
    
      _kbscode_ = ev[1].code + modkeycode  // hier jetzt die Sondertasten als Vielfache von 1024 dazuaddieren
    }
    sodass man die kbstates abfragen kann per
    Code:
    if(_kbscode_==F1) {...}
    else
    //...
    else
    if(_kbscode_==F3_alt) {...}
    ...
    else
    if(_kbscode_==F1_shiftalt) {...}
    //alternativ)
    if(_kbscode_==F1 +1024+4048) {...}
    usw...

    Die Frage wäre, ob man dann einen eigenen Task dafür spendiert, der ausschließlich void getkbscancode() wiederholt aufruft und so automatisch als keypress-Watcher funktioniert.
    Alternativ könnte man diese Funktion auch in jedem anderen, bereits laufenden Task aufrufen, quasi als zusätzliche Unterfunktion.

    zwischenstadium:

    Code:
    // Compile with: g++ -o /var/scripte/tastaturtest1 /var/scripte/tastaturtest1.c  -L/usr/local/lib -lpthread
    // /var/scripte/tastaturtest1
    // 05.04.2016 - peterfido
    // variant 06.04.2016 - hawe
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdint.h>
    #include <sys/sysinfo.h>
    #include <time.h>
    #include <linux/input.h>
    #include <pthread.h>
    #include <errno.h>
    #include <termios.h>
    #include <signal.h>
    #include <sys/types.h>
    #include <fcntl.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <sys/select.h>
    
    int ziffer=0;
    int beenden=2;
    int zeit=0;
    int shiftl=0;
    int shiftr=0;
    int shift =0;
    int strgl=0;
    int strgr=0;
    int strg=0;
    int capsl=0;
    int alt=0;
    int altgr=0;
    int windows=0;
    int kontext=0;
    int keybscan=0;
    
    int modscode;
    volatile int _kbscode_ ;
    
    
    void* thread1Go(void *)
    {
        int _TASKS_ACTIVE_=0;
        struct input_event ev[64];
        int fd, rd, value, size = sizeof (struct input_event);
    
        if ((fd = open ("/dev/input/event0", O_RDONLY)) == -1){
            printf ("Fehler mit Tastatur");
        }else{
            _TASKS_ACTIVE_=1;
        }
    
    
        struct input_event event;
        while (_TASKS_ACTIVE_) {
                 
            if ((rd = read (fd, ev, size * 64)) < size)
              printf ("Fehler mit Tastatur");
           
            if (ev[1].type != EV_KEY) continue;
            if (ev[1].value==0){         //Taste losgelassen
                    switch (ev[1].code) {
                        case 42: shiftl=0; break;
                        case 54: shiftr=0; break;
                        case 29: strgl=0; break;
                        case 97: strgr=0; break;
                        case 56: alt=0; break;
                        case 125: windows=0; break;
                        case 100: altgr=0; break;
                        case 127: kontext=0; break;
                    }
            }else{
                if (ev[1].value==1){            //==1 für nur einen Druck ohne Wiederholung. >=1 für Erkennung von gedrückt gehaltener Taste
                     modscode = 0;
                     switch (ev[1].code) {
                        case 42: shiftl=1;  break;
                        case 54: shiftr=1;   break;
                        case 29: strgl=1;   break;
                        case 97: strgr=1;  break;
                        case 56: alt=1;  break;
                        case 125: windows=1;   break;
                        case 100: altgr=1; modscode+=(2048+4096); break;
                        case 127: kontext=1; break;
                        
                        
    // Ab hier 'normale Tasten'
                       
                        //case 1: beenden=0; _TASKS_ACTIVE_=0; break; //ESC
                        default: keybscan=ev[1].code;// Scancode ablegen
                        
                        if(shiftl || shiftr ) modscode+=1024;   
                        if(strgl  || strgr  ) modscode+=2048;  
                        if(alt)   modscode+=4096;  
                        if(altgr) modscode+=(2048+4096);  
                                        
                        
                        _kbscode_= keybscan + modscode;
                        printf("SHIFTL: %2d, SHIFTR: %2d, STRGL: %2d, STRGR: %2d; ",shiftl,shiftr,strgl,strgr);
                        printf("Typ: %2d; Wert: %2d; Code: %2d scancode=%6d \n",ev[1].type,ev[1].value,ev[1].code, _kbscode_ );
                        break;
                    }
                }
            }
        }
        beenden=0;
        pthread_exit((void *) 0);
    }
    
    int main()
    {
        pthread_t thread1;
        struct  sched_param  param;
       
    
        if(pthread_create(&thread1, NULL, thread1Go, NULL) != 0)
        {
          fprintf(stderr, "Fehler bei Tastatur......\n");
          exit(0);
        }     
       
        param.sched_priority = 20;
        pthread_setschedparam(thread1, SCHED_RR, &param);
       
        beenden=1;
       
        while (beenden > 0)
            {     sleep(1);
                zeit++;
                if (zeit==30)
                {
                    zeit=0;
                    printf("Wieder 30 Sekunden um.\n");
                }
        }
        usleep(50);
        printf("***********Ende************\n");
        return 0;
    }
    was hältst du davon?



    ps, Tipp für dich:
    Ich habe mir sagen lassen, pthread verlinkt man besser per -pthread statt mit -lpthread.

    You should really use -pthread rather than -lpthread as as well as including the library it also sets any other options (which usually on linux means setting -D_REENTRANT as well). So yes, if you use -lpthread then you need -D_REENTRANT otherwise things could go wrong.

    Fragen an dich:
    1) was verlinkt eigentlich -L/usr/local/lib ?
    2) was ist "kontext" und "windows" ?
    Geändert von HaWe (06.04.2016 um 15:11 Uhr)

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 01.11.2017, 12:53
  2. Neue Atmega "A" und "PA" Typen
    Von AVR168 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 07.05.2012, 16:47
  3. Antworten: 2
    Letzter Beitrag: 15.06.2011, 21:18
  4. "Lichtverfolgung" in "TV-Remote" einbaue
    Von fabqu im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 04.01.2011, 10:14
  5. "Soft-Reset?" und "Finger-Interrupt?"
    Von trapperjohn im Forum Asuro
    Antworten: 8
    Letzter Beitrag: 10.06.2008, 23:02

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress