Cours:TPgpioControleur
Révision datée du 2 octobre 2023 à 09:11 par Bjacquot (discussion | contributions) (→Classe Bouton avec filtrage des rebonds)
Un programme se résume souvent à modifier l'état de sorties en fonction de l'état d'entrées.
Si on souhaite avoir le même comportement entre plusieurs groupes d'entrées et plusieurs groupes de sorties, il est intéressant de créer un classe contrôleur qui permettra de faire le lien entre entrées et sorties.
Sommaire
Cahier des charges
Une classe Controleur
devra :
- observer l'appui sur un bouton poussoir
- permettre de configurer un nombre d'appui souhaité
- tous les nbAppuis appuis, une led devra changer d'état
- posséder 2 slots permettant de
- arrêter le fonctionnement du controleur (led éteinte, ne pas tenir compte des appuis)
- mettre en route le fonctionnement du controleur (reprise du fonctionnement normal)
Faire un diagramme des classes que vous utiliserez
Faire un diagramme d'objets que vous utiliserez
Programmez !
Vous utiliserez :
- 2 boutons poussoirs
- 2 leds
- 4 boutons sur l'interface graphique
- 2 instances de
Controleur
Chaque Controleur
devra :
- utiliser
- 1 bp
- 1 led
- être connecté sur l'interface graphique à :
Remarques :
- il est judicieux de vérifier les fonctionnalités au fur et à mesure
- ne pas hésiter à utiliser des "qDebug()"
- on peut commencer par faire une classe
Controleur
dans le comportement n'est pas souhaité/complet et modifier au fur et à mesure
|
Classe Bouton avec filtrage des rebonds
bouton.h #ifndef BOUTON_H
#define BOUTON_H
#include <QObject>
#include <QFileSystemWatcher>
#include "gpio.h"
#include <QTimer>
using namespace exploringRPi;
class Bouton : public QObject
{
Q_OBJECT
public:
explicit Bouton(int nbBroche,GPIO_EDGE typeFront);
private:
GPIO broche;
QFileSystemWatcher fileScanner;
bool bloque=false;
QTimer ticToc;
signals:
void change();
public slots:
void evenementBroche();
void finBloque();
};
#endif // BOUTON_H
|
bouton.cpp #include "bouton.h"
Bouton::Bouton(int nbBroche, GPIO_EDGE typeFront) : QObject(), broche(nbBroche)
{
broche.setDirection(INPUT);
broche.setEdgeType(typeFront);
fileScanner.addPath(QString("/sys/class/gpio/gpio%1/value").arg(nbBroche));
connect(&fileScanner,SIGNAL(fileChanged(QString)),this,SLOT(evenementBroche()));
ticToc.setInterval(500);
ticToc.setSingleShot(true);
connect(&ticToc,&QTimer::timeout,
this,&Bouton::finBloque);
}
void Bouton::evenementBroche()
{
if (bloque==false)
{
bloque=true;
ticToc.start();
emit change();
}
}
void Bouton::finBloque()
{
bloque=false;
}
|