IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Utilisation de ioctl() pour lire les entrées clavier


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Utilisation de ioctl() pour lire les entrées clavier
    Bonjour,

    Je tente de programmer un appareil basé sur une architecture ARM sous linux. Cet appareil possède des boutons dont j'aimerais contrôler l'état en permanence afin d'attribuer diverses fonctions à l'appui sur l'un de ces boutons.
    De ce que j'ai pu trouver jusque là il semblerais qu'il faut utiliser la fonction ioctl() afin de lire les entrée clavier. Or je ne sait pas comment cette méthode fonctionne.
    Suite à quelques recherche sur le net voici le code que j'ai actuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #define test_bit(bit, array) (array[bit / 8] & (1 << (bit % 8)))
     
    void test(){
      uint8_t key_b[KEY_MAX/8 + 1];
        /* the events (up to 64 at once) */
        const char *keyboard = "/dev/input/keyboard0";
        int keybrdToCapture;
        int yalv;
        keybrdToCapture = open(keyboard, O_RDONLY);
     
        memset(key_b, 0, sizeof(key_b));
        ioctl(keybrdToCapture, EVIOCGKEY(sizeof(key_b)), key_b);
     
        Dialog* mess = new Dialog();
     
        mess->setMessage(QString::number(KEY_MAX,10));
        mess->show();
     
        for (yalv = 0; yalv < KEY_MAX; yalv++) {
     
            if (test_bit(yalv, key_b)) {
                Dialog* dial = new Dialog();
                dial->setMessage("On a vu l'appui");
                dial->show();
                /* the bit is set in the key state */
                printf("  Key 0x%0", yalv);
     
                switch ( yalv)
                    {
                    case 0x1c :
                        dial->setMessage("Enter");
                        dial->show();
                        break;
                    case 0x66 :
                        dial->setMessage("Home");
                        dial->show();
                        break;
                    case 0x3b :
                        dial->setMessage("F1");
                        dial->show();
                        break;
                    case 0x3c :
                        dial->setMessage("F2");
                        dial->show();
                        break;
                    default:
                        dial->setMessage("Unknow for now");
                        dial->show();
                    }
            }
        }
    }
    Dans ce code, de ce que j'en comprends, je viens lire l'état du "/dev/input/keyboard0" (cela correspond à mes boutons selon la doc de mon appareil). Une fois la lecture effectuée je viens parcourir chacune des touche afin de voir leur état puis si l'une d'entre-elle est à l'état 1 je rentre dans le Switch. Sauf que actuellement je ne suis encore jamais passé dans le switch, suite à plusieurs tentatives en debug.
    Je ne comprends pas bien le fonctionnement de ioctl() et je ne sais pas si c'est la bonne méthode à employer. Par la suite je souhaitais mettre cette fonction dans un thread afin d'avoir un contrôle des touches en permanence.
    Pouvez-vous m'expliquer comment fonctionne cette fonction ioctl (si je dois l'inclure dans un while(1) pour avoir un contrôle permanent). De plus si vous voyez quelques chose que j'ai mal fait dans ce bout de code n'hésitez pas à me le dire.
    Je suis relativement nouveau au C++ et totalement nouveau à la programmation sur des appareil linux.

    Merci d'avance pour votre temps et vos réponses.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    De ce que je trouve sur différents résultats, ioctl(keybrdToCapture, EVIOCGKEY(sizeof(key_b)), key_b); va lire l'état du clavier et écrire dans key_b le résultat.
    Je dirais qu'il y a une doc quelquepart pour t'indiquer quel touche correspond à quel index dans key_b, de la même manière que tu as défini la valeur de KEY_MAX; Il semblerait que key_b soit utilisé comme champ de bits, donc 1 bit = 1 touche.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse.
    Effectivement je pense également que 1 bit correspond à une touche j'ai bien un tableau me disant que telle touche est à telle adresse (ex : touche F1 = 0x003B) seulement je n'arrive pas à comprendre comment je suis censé faire pour que ce soit contrôlé en permanence sans que ça bloque le reste de mon programme. Jusqu'à maintenant à chaque fois que je le met dans un Thread et que je met ça dans une boucle de type while(1) le reste de mon programme n'est pas chargé. Je pense qu'il y a des subtilités que je ne connais pas... Etant débutant sur l'utilisation d'appareil linux j'aurais bien besoin des lumières de quelqu'un.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu as la macro test_bit pour vérifier qu'un bit est vrai ou non, ensuite pour le côté non bloquant : pourquoi voudrais-tu que ce soit bloquant ? C'est juste que cet appel de fonction est non bloquant, il te copie un snapshot du clavier dans le champ de bits. Donc aucun intérêt de l'avoir dans son propre thread imo.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Effectivement, mais justement quand je lance mes test j'ai mis l'appel à cette fonction dans le main et le reste de mon interface ne charge pas tant que cette fonction n'est pas terminé c'est pour ça que j'en ai conclu (peut-être à tord) que cette fonction est bloquante. Je n'arrive pas à rentrer dans ma condition if et si je boucle via un while(1) je bloque l'exécution du reste de mon programme. Même dans un thread c'est pour ça que je comprend pas vraiment le fonctionnement...

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    J'ai réussi à trouver mon problème. Le blocage venait de l'utilisation de mon Thread. Je faisais un join() qui a pour effet d'attendre la fin de l'éxecution de mon Thread avant de passer à la suite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lire une entrée clavier pour une variable StringBuffer ?
    Par Haktarus dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/06/2014, 15h19
  2. Utiliser AdvancedSearch sous VBA Excel pour lire les emails d'Outlook
    Par jean.cdc dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/02/2011, 15h29
  3. Utilisation MAPI pour lire les e-mails
    Par tenpigs dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/12/2009, 14h39
  4. fonction pour lire les fichier audio
    Par tarek007 dans le forum Multimédia
    Réponses: 1
    Dernier message: 11/05/2005, 16h28
  5. Réponses: 3
    Dernier message: 04/02/2004, 18h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo