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
|