- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 33

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    wenn ich jetzt kompiliere, zeigt er mit im LXTerminal an
    (F7) ^[[18~

    (F1) ^[OP
    (shift+F1) ^[01;2P

    dazwischen:
    wieder 30 Sekunden um.

    damit kann ich jetzt nicht so schrecklich viel anfangen...
    (wie gesagt, von geany aus kompiliert, ohne Startparameter)

    - - - Aktualisiert - - -

    ich brauche eigentlich auch nur eine einfache Funktion
    int getkeybscancode()

    die mir eine nackte Zahl zurückliefert, den rest kann ich selber machen, wenn es für die Tastenkombis keine Tabellen gibt!

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Hallo,

    es geht auch mit g++ und ohne Parameter.
    Dafür musste ich die Vorgehensweise ändern.

    Folgendes Beispiel sollte auch für Dich anpassbar sein. Der Scancode wird in der Variable keybscan abgelegt. Danach kannst Du eine Sub aufrufen oder die Variable in Deiner Mainloop pollen.
    Code:
    // Compile with: g++ -o /var/scripte/tastaturtest1 /var/scripte/tastaturtest1.c  -L/usr/local/lib -lpthread
    // /var/scripte/tastaturtest1
    // 05.04.2016 - peterfido
    
    #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;
    
    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_) {
    /*         _lastbeat_ = _heartbeat_;
             _heartbeat_ = recvbuf[TERM];   
             if(abs(_heartbeat_ - _lastbeat_) ==0)
                  { if(_missedbeats_ <998) _missedbeats_++; }
             else _missedbeats_ = 0;
             _REMOTE_OK_ = _missedbeats_ < 100;
             delay(50);        
    */             
            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
                    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; 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
                        printf("SHIFTL: %d, SHIFTR: %d, STRGL: %d, STRGR: %d; ",shiftl,shiftr,strgl,strgr);
                        printf("Typ: %d; Wert: %d; Code: %d\n",ev[1].type,ev[1].value,ev[1].code);
                        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;
    }
    Das Threading habe ich soweit von Dir übernommen. Einige Variablen fehlten mir, deren Deklaration muss dann in Deinem Programm wieder raus. Die Heartbeat-Geschichte habe ich einfach komplett auskommentiert. Die brauchst eigentlich nur wieder einkommentieren.
    Geändert von peterfido (05.04.2016 um 22:09 Uhr)
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    HaWe
    Gast
    super nett von dir, vielen Dank für deine Mühe!
    War gestern schon zu Bette um die Zeit und bin jetzt auf Arbeit, werde es aber schnellstmöglichst testen, sowie ich wieder zuhause bin!

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Hallo,

    reiner Eigennutz. Diese Änderungen werde ich dann auch in meine Projekte bei der nächsten Überarbeitung mit übernehmen. Man kann so prima IR-Fernbedienungen nutzen, welche eine Tastatur / Maus emulieren. Für den Mauspart muss man dann noch ein weiteres Device auslesen. Probleme tauchen erst auf, wenn man keine Tastatur oder mehrere Tastaturen / Mäuse angeschlossen hat, was allerdings bei mir nicht vorkommt.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  5. #5
    HaWe
    Gast
    so 'n Zufall, genau dafür nutze ichs eigentlich auch, prinzipiell zumindest
    ich habe dazu einfach eine Wireless Tastatur am Pi, entweder in normal groß im Testmodus (LogiLink) oder mini (Rii) wenn mobil unterwegs.
    Zugegebenermaßen momentan aber beide USB-Dongles gleichzeitig eingestöpselt.... mal gucken, ich zieh die kleine dann erstmal raus....
    Eine analoge Joystick-Konsole mit Arduino per BT ist dann aber das Standardwerkzeug zur Fernsteuerung.

Ä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
  •  

12V Akku bauen