Cours:TPgpioControleur

De troyesGEII
Aller à : navigation, rechercher

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.

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)

Question.jpg Faire un diagramme des classes que vous utiliserez

Question.jpg 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 à :
    • 1 QPB pour arrêter le Controleur
    • 1 QPB pour mettre en route le Controleur


Question.jpg Réaliser le programme


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


Bluebg.png
Aidesmall.png
À propos de cette image

Passage de paramètres au constructeur



class Vehicule
{
  Vehicule(String name);
  String name;
}

class Garage
{
  Garage(String marqueVoiture);
  Vehicule voiture;
}
garage.cpp

Garage::Garage(String marqueVoiture)
       : voiture(marqueVoiture)
{
}

vehicule.cpp

Vehicule::Vehicule(String _marque)
{
  marque = _marque;
}

main.cpp :

Garage g1{"peugeot"};
Garage g2{"renault"};



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;
}