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.