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 :
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.
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(); } } } }
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.
Partager