RadioZone

Définition Utilisation Exemple Côté technique
 

3 Boutons RadioZone Voir RadioZone: Exemple-940-RadioZone.ino
Pour se détendre, une série de RadioZone Voir RadioZone: Exemple-941-Maison-RadioZone-Volet.ino
Pour se détendre, deux séries de RadioZone Voir RadioZone: Exemple-942-Maison-RadioZone_Volets.ino

 


 

Premier exemple: 3 boutons, 6 fonctions externes

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-940-RadioZone\Exemple-940-RadioZone.ino (dans votre fichier téléchargé):

// Mise em place de 3 boutons de type RadioZone (bouton radio, pas de dessin
// dans le bouton). Quand on appuie sur un bouton, un disque blanc montre son
// activité

// Version 1:
// - Les boutons ont une définition statique
// - Utilise onSelectFunction pour exécuter l'action à faire
// - Une action différente pour chaque bouton

#include <PecheuxGraph.h> // Appel de la bibliothèque 


// Déclaration statique des instances, doit se faire en dehors du setup
// Dans ce cas les boutons sont accessibles partout
RadioZone boutonHaut(200,40,240,80); // Bouton en haut
RadioZone boutonCentre(200,100,240,140); // Bouton au centre
RadioZone boutonBas(200,160,240,200); // Bouton en bas


// Déclaration de fonctions qui redessinent les boutons
// Ces fonctions ne doivent pas avoir de paramètres et ne doit rien retourner
// Les noms peuvent être quelconques
// On peut avoir 6 fonction comme c'est le cas ici
// On peut aussi n'avoir qu'une fonction qui fait tout, deux fonctions,l'une
// pour dessiner, l'autre pour effacer, ou 3 fonctions, une par bouton.
// Pour savoir ce qu'il faut faire, si il y a moins de 6 fonctions, on peut
// utiliser:
// - isSelect() pour savoir si il faut dessiner ou effacer
// - getTouchY() pour savoit quel bouton vient d'être activé
// - on peut aussi tout redessiner sans chercher
// Pour effacer les cercle, on peut utiliser:
// - un fillCircle() comme cela a étéfait dans d'autres programmes de démo
// - un fillRect() qui va plus vite comme ici
void onSelectActionHaut() { fillCircle(100,60,20,WHITE); }
void onUnselectActionHaut() { fillRect(80,40,120,80,BLACK); }
void onSelectActionCentre() { fillCircle(100,120,20,WHITE); }
void onUnselectActionCentre() { fillRect(80,100,120,140,BLACK); }
void onSelectActionBas() { fillCircle(100,180,20,WHITE); }
void onUnselectActionBas() { fillRect(80,160,120,200,BLACK); }


void setup()
{
  setGraphMode(PAYSAGE); // Initialisation de la carte
  rect(200,40,240,80,GREEN); // Carré du haut
  rect(200,100,240,140,GREEN); // Carré au centre de l'écran
  rect(200,160,240,200,GREEN); // Carré du bas
  text(F("Appuyez sur un carré"));
  
  boutonHaut.onSelectFunction=&onSelectActionHaut; // Fonction appelée si on active le bouton du haut de l'écran
  boutonHaut.onUnselectFunction=&onUnselectActionHaut; // Fonction appelée le bouton du haut de l'écran est désactivé
  boutonCentre.onSelectFunction=&onSelectActionCentre; // Fonction appelée si on active le bouton au milieu de l'écran
  boutonCentre.onUnselectFunction=&onUnselectActionCentre; // Fonction appelée si le bouton au milieu de l'écran est désactivé
  boutonBas.onSelectFunction=&onSelectActionBas; // Fonction appelée si on active le bouton en bas de l'écran
  boutonBas.onUnselectFunction=&onUnselectActionBas; // Fonction appelée si le bouton en bas de l'écran est désactivé
}


void loop() 
{
  scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop
}

Deuxième exemple: 3 boutons RadioZone

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-941-Maison-RadioZone-Volet\Exemple-941-Maison-RadioZone-Volet.ino (dans votre fichier téléchargé):

// L'intérieur d'une maison est dessinée. Trois boutons de type Radio
// permettent d'ouvrir ou de fermer les volets roulants

#include <PecheuxGraph.h>

// Equivalece des constantes
const byte MONTE = 0;
const byte STOP = 2;
const byte DESCEND = 1;

// Définition des contrôles, doit se faire avant setup
Clock horloge(100); // Le volet se déplace toutes les 100ms
RadioZone boutonMonte(184, 115, 210, 127, MONTE); // Définit une zone cliquable, notre bouton monte
RadioZone boutonStop(184, 129, 210, 141, STOP); // Définit une zone cliquable, notre bouton stop
RadioZone boutonDescend(184, 143, 210, 155, DESCEND); // Définit une zone cliquable, notre bouton descend

// Variables et constantes pour le volet roulant
const word BLEU_CIEL = 0x755E; // Couleur du ciel
const byte HAUT = 55; // Le haut de la fenêtre
const byte BAS = 155; // le bas de la fenêtre
byte position = HAUT - 1; // Position du volet (plus haut que HAUT, donc complètement rentré)


// Fonction appelée tous les 100 ms pour redessiner les volets
void onTimeVolets(void)
{
  switch (getRadioValeur()) // Gestion du mouvement
  {
    case MONTE:
      if (position >= HAUT) position--; // Monte le volet d'un pixel si il n'est pas en haut
      else // on vient d'arriver en haut
      {
        // Désactivation du bouton haut, choisir une des trois possibilités (une seule sans commentaires)
        // getRadioPointeur()->unselect(); // Désactive le bouton haut
        unselectRadio(); // Désactive tous les boutons
        //static_cast <RadioZone *> (premierControle())->select(); // Active le bouton stop, cela fonctionne car il a été défini en dernier
        fill(160, 30, BLACK); // On éteint la lampe
      }
      break;
    case DESCEND:
      if (position < BAS) position++; // Descend le volet d'un pixel si il n'est pas en haut
      else // on vient d'arriver en bas
      {
        // Désactivation du bouton bas, choisir une des trois possibilités (une seule sans commentaires)
        // getRadioPointeur()->unselect(); // Désactive le bouton bas
        unselectRadio(); // Désactive tous les boutons
        // static_cast <RadioZone *> (premierControle())->select(); // Active le bouton stop, cela fonctionne car il a été défini en dernier
        fill(160, 30, YELLOW); // On allume la lampe
      }
      // case STOP: // On ne fait pas bouger le volet, rien à faire.
  }
  // Dessin du volet
  if ((getRadioValeur() == MONTE) || (getRadioValeur() == DESCEND)) // Sinon cela clignotte aussi à l'arrêt
  {
    // Dessine toutes les lattes en marron
    fillRect(50, HAUT, 107, position, DARK_RED);
    fillRect(114, HAUT, 170, position, DARK_RED);
    // dessine une latte sur 16 en noir
    for (byte latte = 0; latte <= position - HAUT; latte += 16) // N° des lattes à dessiner
    { // Une latte sur 16 est noire
      hLine(50, 107, position - latte, BLACK); // Pour la vitre de gauche
      hLine(114, 170, position - latte); // Pour la vitre de droite
    }
    // Efface la latte en dessous (au cas ou on remonte le volet)
    if (position != BAS) // Seulement si on n'est pas tout en bas, sinon on dessinerait dans le cadre
    {
      hLine(50, 107, position + 1, BLEU_CIEL); // Pour la vitre de gauche
      hLine(114, 170, position + 1); // Pour la vitre de droite
    }
  }
}


void setup()
{
  horloge.onTimeFunction = &onTimeVolets; // Action à faire quand l'horloge donne son tip

  setGraphMode(PAYSAGE); // Initialisation
  setTextCursor(10, 200); // Consigne
  text(F(" Appuyez sur les boutons,\n      près de la porte"));

  maison(0, 3); // Avec 3 boutons à droite
  fillRect(50, 55, 107, 155, BLEU_CIEL); // Vitre de gauche, fond uni
  fillRect(114, 55, 170, 155); // Vitre de droite, fond uni
}


void loop()
{
  scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop
}

Troisième exemple: 6 boutons avec 2 groupes

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-942-Maison-RadioZone_Volets\Exemple-942-Maison-RadioZone_Volets.ino (dans votre fichier téléchargé):

// L'intérieur d'une maison est dessinée. Trois boutons de type Radio
// permettent de fermer le volet gauche, trois autres permetent de fermer le
// volet droit

#include <PecheuxGraph.h>

// Equivalece des constantes
const byte MONTE = 0;
const byte STOP = 2;
const byte DESCEND = 1;

// Définition des contrôles dynamiques, peut se faire avant ou après setup
// On peut panacher, cela n'a pas d'importance. Normalement, on ne le fait pas.
// Si c'est fait ici, c'est à titre d'exemple.

// Bouton de droite, groupe 0 (pas nécessaire de le préciser, c'est par défaut)
RadioZone *monteDroite = new RadioZone(184, 115, 210, 127, MONTE); // Définit une zone cliquable, notre bouton monte de droite
// Notez que monteDroite est un nom qui ne nous servira pas, mais on en a besoin pour la déclaration

// Boutons de gauche, groupe 1, il faut le dire
RadioZone *stopGauche = new RadioZone(7, 129, 35, 141, STOP, GROUPE_1); // Définit une zone cliquable, notre bouton stop de gauche
RadioZone *descendGauche = new RadioZone(7, 143, 35, 155, DESCEND, GROUPE_1); // Définit une zone cliquable, notre bouton descend de gauche

// On va garder l'horloge satique. Le panachage est complet.
Clock horloge(100); // Le volet se déplace toutes les 100ms



// Variables et constantes pour les volets roulants
const word BLEU_CIEL = 0x755E; // Couleur du ciel
const byte HAUT = 55; // Le haut de la fenêtre
const byte BAS = 155; // le bas de la fenêtre
byte positionDroite = HAUT - 1; // Position du volet droit (plus haut que HAUT, donc complètement rentré)
byte positionGauche = HAUT - 1; // Position du volet gauche (plus haut que HAUT, donc complètement rentré)

void onTimeVolets(void) // Fonction appelée tous les 100 ms pour redessiner les volets
{
  //------------ Volet de droite ----------------
  switch (getRadioValeur()) // Gestion du mouvement
  {
    case MONTE:
      if (positionDroite >= HAUT) positionDroite--; // Monte le volet d'un pixel si il n'est pas en haut
      else // on vient d'arriver en haut
      {
        // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires)
        // getRadioPointeur()->unselect(); // Désactive le bouton activé, c'est le bouton haut
        unselectRadio(); // Désactive tous les boutons
        if (positionGauche == HAUT - 1) // si l'autre volet est aussi en haut
          fill(160, 30, BLACK); // On éteint la lampe
      }
      break;
    case DESCEND:
      if (positionDroite < BAS) positionDroite++; // Descend le volet d'un pixel si il n'est pas en haut
      else // on vient d'arriver en bas
      {
        // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires)
        // getRadioPointeur()->unselect(); // Désactive le bouton activé
        unselectRadio(); // Désactive tous les boutons
        if (positionGauche == BAS) // si l'autre volet est aussi en bas
          fill(160, 30, YELLOW); // On allume la lampe
      }
  }
  // Dessin du volet
  if ((getRadioValeur() == MONTE) || (getRadioValeur() == DESCEND)) // Sinon cela clignotte aussi à l'arrêt
  {
    // Dessine toutes les lattes en marron
    fillRect(114, HAUT, 170, positionDroite, DARK_RED);
    // dessine une latte sur 16 en noir
    for (byte latte = 0; latte <= positionDroite - HAUT; latte += 16) hLine(114, 170, positionDroite - latte, BLACK); // Une latte sur 16 est noire
    // Efface la latte en dessous (au cas ou on remonte le volet)
    if (positionDroite != BAS) hLine(114, 170, positionDroite + 1, BLEU_CIEL); // Seulement si on n'est pas tout en bas, sinon on dessinerait dans le cadre
  }

  //------------ Volet de gauche ----------------
  switch (getRadioValeur(GROUPE_1)) // Gestion du mouvement
  {
    case MONTE:
	  if (positionGauche >= HAUT) positionGauche--; // Monte le volet d'un pixel si il n'est pas en haut
      else // on vient d'arriver en haut
      {
        // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires)
        // getRadioPointeur()->unselect(); // Désactive le bouton activé, c'est le bouton haut
        unselectRadio(GROUPE_1); // Désactive tous les boutons
        if (positionDroite == HAUT - 1) // si l'autre volet est aussi en haut
          fill(160, 30, BLACK); // On éteint la lampe
      }
      break;
    case DESCEND: 
	  if (positionGauche < BAS) positionGauche++; // Descend le volet d'un pixel si il n'est pas en haut
      else // on vient d'arriver en bas
      {
        // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires)
        // getRadioPointeur()->unselect(); // Désactive le bouton activé
        unselectRadio(GROUPE_1); // Désactive tous les boutons
        if (positionDroite == BAS) // si l'autre volet est aussi en bas
          fill(160, 30, YELLOW); // On allume la lampe
      }
  }
  // Dessin du volet
  if ((getRadioValeur(GROUPE_1) == MONTE) || (getRadioValeur(GROUPE_1) == DESCEND)) // Sinon cela clignotte aussi à l'arrêt
  {
    // Dessine toutes les lattes en marron
    fillRect(50, HAUT, 107, positionGauche, DARK_RED);
    // dessine une latte sur 16 en noir
    for (byte latte = 0; latte <= positionGauche - HAUT; latte += 16) hLine(50, 107, positionGauche - latte, BLACK); // Une latte sur 16 est noire
    // Efface la latte en dessous (au cas ou on remonte le volet)
    if (positionGauche != BAS) hLine(50, 107, positionGauche + 1, BLEU_CIEL); // Seulement si on n'est pas tout en bas, sinon on dessinerait dans le cadre
  }
}

void setup()
{
  setGraphMode(PAYSAGE); // Initialisation

  // Définition des contrôles dynamiques, après setup
  // Comme on n'a pas besoin de changer un comportement, on n'a pas besoin de garder une trace
  // de l'objet. On se moque de ce que retourne new

  // Boutons de droite, groupe 0 (pas nécessaire de le préciser, c'est par défaut)
  new RadioZone(184, 129, 210, 141, STOP); // Définit une zone cliquable, notre bouton stop de droite
  new RadioZone(184, 143, 210, 155, DESCEND); // Définit une zone cliquable, notre bouton descend de droite

  // Boutons de gauche, groupe 1, il faut le dire
  new RadioZone(7, 115, 35, 127, MONTE, GROUPE_1); // Définit une zone cliquable, notre bouton monte de gauche

  horloge.onTimeFunction = &onTimeVolets; // Action à faire quand l'horloge donne son tip

  // Consigne
  setTextCursor(10, 200);
  text(F("Appuyez sur les boutons,\n de chaque côté de la porte"));

  maison(3, 3); // avec 3 boutons de chaque côté
  fillRect(50, 55, 107, 155, BLEU_CIEL); // Vitre de gauche, ciel uni
  fillRect(114, 55, 170, 155); // Vitre de droite, ciel uni
}


void loop()
{
  scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop
}

 

Voir aussi:
- unselectRadio() Déselectionne tous les boutons radios d'un groupe
- getRadioValeur() Donne la valeur du contrôle actif du groupe
- getRadioPointeur() retourne l'adresse du contrôle actif
- scanEvent(); Moteur de la gestion des évènements
- PushZone; Bouton poussoir sans dessin
- CheckZone; Bouton bistable (va vient) sans dessin
- RadioCoche; Bouton radio (un seul bouton actif parmi plusieurs) case à cocher
- RadioCircle; Bouton radio (un seul bouton actif parmi plusieurs) rond