scanEvent()
Lance le moteur de recherche d'événements
Cette fonction doit être exécutée le plus souvent possible pour capturer les événements venant du touchpad et des différentes horloges. En principe elle est seule dans la fonction loop. Si on y met autre chose dans loop, par exemple un gestionnaire supplémentaire, il faut qu'il ne soit pas bloquant, en particulier l'usage de delay() est à éviter. C'est pour cela qu'il y a une classe d'horloges.
Exemple d'utilisation
void loop() {scanEvent();} // Permet l'utilisation des boutons et des horloges
Référence
void scanEvent(void);
Paramètre passé
Aucun
Valeur retournée
Aucune
Voir aussi
- Clock; Métronome (actions régulières)
- Timer; Temporisateur (une action une seule fois)
- PushZone; Bouton poussoir)
- CheckZone; Bouton bistable (va vient)
- RadioZone; Bouton radio (un seul bouton actif parmi plusieurs)
Notes
Cette fonction scrute le touchpad, et si il est appuyé, cherche un contrôle qui peut le traiter. Ensuite il met à jour toutes les horloges.
Exemple
PecheuxGraph_ILI9341_8bits.zip\PecheuxGraph_ILI9341_8bits\examples\Documentation\Exemple-710-scanEvent\Exemple-710-scanEvent.ino (dans votre fichier téléchargé):
// Pour la seule fois, il ne faut pas d'afficheur!
// Un timer est mis en place et change l'état de la led 13 chaque seconde
// c'est scanEvent() qui met à jour le timer
#
$menu = ":PG";
include <PecheuxGraph_ILI9341_8bits.h>
void changeLed(void) // Appelée toutes les secondes par le timer, elle dessine une droite
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // Lit la valeur et renvoi l'opposé
}
Clock horloge(10); // Création d'une horloge
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
horloge.onTimeFunction = &changeLed; // Mise en place de la fonction appelée
}
void loop()
{
scanEvent(); // C'est le moteur des événements (temporels et touchpad)
}
Résultat:

Côté technique
La gestion d'événements temporels pourrait fonctionner sans l'afficheur et sans l'initialisation setGraphMode(). ScanEvent() croit que l'on n'appuie pas sur le touchpad, et passe donc à la gestion temporelle.
La gestion des événements s'occupe de deux choses différentes l'une après l'autre, assez semblables dans le principe, mais suffisamment différentes pour
être dissociées:
- la gestion des contrôles (boutons)
- la gestion des horloges (minuterie et temporisateurs)
Gestion des contrôles
La gestion des contrôles passe par deux méthodes non documentées car elles sont utilisées en fonctionnement interne, et un utilisateur non averti ne doit pas les modifier. Un utilisateur averti, ira voir comment elle fonctionnent dans le source. scanEvent() génère un événement en appelant onClic() d'un contrôle si on vient d'appuyer sur ce contrôle, un événement en appelant la méthode onClac() d'un contrôle si on vient de le relâcher. Grâce à onClic() et onClac(), les contrôles vont se sélectionner, se désélectionner, appeler les méthodes internes onSelect() et onUnselect() qui par défaut ne font rien (laissées pour l'utilisateur) ainsi que les fonctions externes si elles ont été définies en utilisant *onClicFunction et *onClacFunction.
scanEvent() mémorise l'état du touchpad de son dernier appel. Il mémorise aussi si un contrôle a
été sélectionné et si oui le quel. Quand on appelle scanEvent():
- si un contrôle avait été sélectionné lors de son dernier passage et que le stylet est toujours dessus, il
ne fait rien
- si le stylet est sorti de ce contrôle (en glissant sur le côté ou en se soulevant), un événement
onClac est généré.
Puis, quel que soit le résultat, il va, si le touchpad est appuyé mais qu'aucun contrôle sélectionné n'a
été mémorisé, il va rechercher le dernier contrôle qui correspond. Si il le trouve, il va le mémoriser
pour le prochain tour, et générer un événement onClic().
Pour ne pas perdre les informations sur le touchpad qu'il faut voir le plus rapidement, on doit bien souvent le mettre seul dans la boucle loop(). Mais il n'est pas interdit d'y avoir aussi autre chose à faire.
Les contrôles sont insérés dans une liste chaînée par le début au moment de leur création par le constructeur. Comme scanEvent() va lire cette liste pour trouver un contrôle, c'est le dernier entré qui sera vu le premier.
Gestion des horloges
La gestion des horloges passe par une méthode non documentée car elle est utilisée en fonctionnement interne, et un utilisateur non averti ne doit pas la modifier. Un utilisateur averti, ira voir comment elle fonctionne dans le source. scanEvent() génère un événement en appelant onCloc() d'une horloge si elle a fini son comptage. Grâce à onCloc(), les horloges vont se mettre à jour, se désélectionner (timer). Puis scanEvent() appelle la méthode interne onTime() qui par défaut ne fait rien (laissée pour l'utilisateur) ainsi que la fonction externe si elle a été définie en utilisant *onTimeFunction.
scanEvent() ne mémorise pas les états des horloges contrairement à ce qui est fait pour les contrôles, et elle scanne toutes les horloges. Ainsi si deux horloges ont fini leur comptage en même temps, elle n'oubliera pas de s'occuper des deux.
Pour ne pas avoir des temps trop différents de ceux voulus, il faut scruter les horloges le plus rapidement possible et c'est pour cela qu'on doit bien souvent le mettre seul dans la boucle loop(). Mais il n'est pas interdit d'y avoir aussi autre chose à faire.
Les horloges sont insérés dans une liste chaînée par le début au moment de leur création par le constructeur. L'ordre d'insertion n'a pas une grande importance car scanEvent() va scruter toutes les horloges.