Cours:QtEvdevConsole

De troyesGEII
Aller à : navigation, rechercher

On donne la classe suivante qui permet de capturer les événements sur le périphérique "/dev/input/event1"

Libre à vous de la modifier pour l'adapter à vos besoins et modifier le constructeur de la classe pour pouvoir spécifier le périphérique.

consolereader.h

#ifndef CONSOLEREADER_H
#define CONSOLEREADER_H

#include <QObject>
#include <QSocketNotifier>

struct ExampleInput {
        unsigned int   dummy1;
        unsigned int   dummy2;
        unsigned short type;
        unsigned short code;
        unsigned int   value;
    };

class ConsoleReader : public QObject
{
    Q_OBJECT
public:
    explicit ConsoleReader(QObject *parent = 0);
signals:
    void getEvent(unsigned short code);
public slots:
    void text();
private:
    QSocketNotifier * notifier;
    int  kbdFd;
};

#endif // CONSOLEREADER_H

consolereader.cpp

#include "consolereader.h"
#include <QTextStream>
#include <QDebug>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> //Provides STDIN_FILENO

ConsoleReader::ConsoleReader(QObject *parent) :
    QObject(parent)
{
    kbdFd = ::open("/dev/input/event1", O_RDONLY, 0);
    if (kbdFd >= 0) {
        notifier = new QSocketNotifier(kbdFd, QSocketNotifier::Read, this);
        connect(notifier, SIGNAL(activated(int)), this, SLOT(text()));
    }
    else
    {
        qDebug()<<"marche pas, pas le bon périphérique ?? ";
    }
}

void ConsoleReader::text()
{
    ExampleInput event;
    int n = read(kbdFd, &event, sizeof(ExampleInput));
    if (n != 16)
    {
        qDebug() << "erreur ???" << n;
        return;
    }
    else
    {
       if ((event.type==1)&&(event.value==0))
       {
          qDebug() << "code evdev =" << event.code;
          emit getEvent(event.code);
       }
    }
}