Événements#
Introduction#
Les événements permettent de démarrer une fonction de manière asynchrone. Lorsqu’un événement est diffusé, sa fonction de rappel est lancée dans une tâche (thread) dédiée, ce qui permet à votre code principal de continuer à s’exécuter simultanément.
Important : Un objet event stocke une fonction de rappel. Si vous enregistrez une autre fonction avec le même objet événement, elle remplace la fonction de rappel précédente.
Si vous souhaitez que plusieurs actions se produisent à partir d’un seul déclencheur, vous pouvez soit :
Appeler plusieurs fonctions auxiliaires à partir d’une seule fonction de rappel, ou
Utilisez plusieurs objets d’événement et diffusez-les tous.
Utilisez des threads séparés pour exécuter les tâches indépendamment.
Pour créer puis utiliser un événement, suivez ces étapes dans l’ordre :
Créez l’événement avec
event.Définir le rappel de l’événement en utilisant le nom de l’événement (ex :
myEvent(myCallback);).Broadcast an
event:broadcast— Déclenche l’exécution en parallèle de toutes les fonctions enregistrées dans un objet événement.broadcastAndWait— Déclenche toutes les fonctions enregistrées dans un objet événement et attend qu’elles se terminent avant de continuer.
Constructeurs de classes#
1 — Crée un objet
eventsans fonction de rappel.event();
2 — Crée un objet événement
eventavec une fonction de rappel.event( void (* callback)(void) );
3 — Crée un objet événement
eventà partir d’un autre événement avec une fonction de rappel.event( event v, void (* callback)(void) );
4 — Crée un objet
eventavec une fonction de rappel qui accepte un argument.event( void (* callback)(void *), void *arg );
5 — Crée un objet événement
eventà partir d’un autre événement avec une fonction de rappel qui accepte un argument.event( event v, void (* callback)(void *), void *arg );
Destructeur de classe#
Détruit l’objet de l’événement event et libère les ressources associées.
~event();
Paramètres#
Paramètre |
Taper |
Description |
|---|---|---|
|
|
Une fonction préalablement définie pour s’exécuter lorsque l’événement est diffusé. |
|
|
Un objet événement existant à copier. |
|
|
Une fonction qui accepte un argument de type pointeur void et qui s’exécute lorsque l’événement est diffusé. |
|
|
Un pointeur vers les données qui seront transmises à la fonction de rappel. |
Notes#
Un objet
eventstocke une fonction de rappel. Si vous enregistrez une autre fonction avec le même objet événement, elle remplace la fonction de rappel précédente.Si vous souhaitez que plusieurs actions se produisent à partir d’un seul déclencheur, vous pouvez soit :
Appeler plusieurs fonctions auxiliaires à partir d’une seule fonction de rappel, ou
Utilisez plusieurs objets d’événement et diffusez-les tous.
Utilisez des threads séparés pour exécuter les tâches indépendamment.
Exemple#
// Create a callback function
void onMyEvent() {
Brain.Screen.print("Callback function executed!");
}
int main() {
// Create an event called myEvent and set onMyEvent
// as the callback function.
event myEvent(onMyEvent);
}
Fonctions des membres#
La classe event comprend les fonctions membres suivantes :
operator— Définit une fonction de rappel pour l’événement.broadcast— Déclenche l’exécution en parallèle de la fonction de rappel de l’événement.broadcastAndWait— Déclenche la fonction de rappel de l’événement et attend la fin.
Avant d’appeler les fonctions membres de l’événement event , une instance de l’événement event doit être créée, comme indiqué ci-dessous :
/* This constructor is required when using VS Code.
Event configuration can be created with or without
a callback function as shown in the examples above. */
// Create an event without a callback
event myEvent;
// Or create an event with a callback
event myEvent(onMyEvent);
operator#
Définit une fonction de rappel pour l’événement à l’aide de l’opérateur d’appel de fonction.
Available Functionsvoid operator()( void (* callback)() );
Paramètre |
Taper |
Description |
|---|---|---|
|
|
Une fonction de rappel prédéfinie, appelée automatiquement lors de la diffusion de l’événement. Cette fonction doit respecter la signature de rappel requise. Consultez la section Fonctions de rappel pour plus d’informations. |
Cette fonction ne renvoie aucune valeur.
NotesDéfinir à nouveau une fonction de rappel remplace la fonction de rappel précédente.
La fonction de rappel ne doit avoir aucun paramètre et ne doit rien renvoyer.
void drawSquare() {
Brain.Screen.clearScreen();
Brain.Screen.drawRectangle(40, 40, 120, 120);
}
void drawCircle() {
Brain.Screen.clearScreen();
Brain.Screen.drawCircle(100, 100, 60);
}
int main() {
// Create the event drawEvent.
event drawEvent;
Brain.Screen.print("Drawing a square...");
// Set the event to drawSquare.
drawEvent(drawSquare);
wait(1, seconds);
// Trigger the event.
drawEvent.broadcast();
wait(1, seconds);
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
Brain.Screen.print("Drawing a circle...");
// Replace drawSquare with drawCircle.
drawEvent(drawCircle);
wait(1, seconds);
// Trigger the event a second time.
drawEvent.broadcast();
}
broadcast#
La diffusion broadcast lance le rappel de l’événement et se poursuit immédiatement.
void broadcast();
Cette fonction ne prend aucun paramètre.
Return ValuesCette fonction ne renvoie aucune valeur.
Examples// Create a callback function.
void onMyEvent() {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
Brain.Screen.print("Event fired!");
}
int main() {
Brain.Screen.print("Broadcasting in 2 seconds...");
// Create an event called myEvent and set onMyEvent
// as the callback function.
event myEvent(onMyEvent);
wait(2, seconds);
// Trigger the event.
myEvent.broadcast();
}
broadcastAndWait#
Démarre le rappel et attend qu’il se termine (ou qu’il expire).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Paramètre |
Taper |
Description |
|---|---|---|
|
|
Le nombre de millisecondes à attendre avant que le code ne recommence à s’exécuter (par défaut : 60 000). |
Cette fonction ne renvoie aucune valeur.
NotesUtilisez ceci uniquement avec des fonctions de rappel qui se terminent (pas de boucles infinies).
Il s’agit d’une fonction d’attente qui bloque l’exécution jusqu’à ce que le rappel soit terminé ou expire.
void startDriving() {
Drivetrain.drive(forward);
wait(2, seconds);
}
int main() {
Brain.Screen.print("Starting drive...");
event driveEvent(startDriving);
// Give the event time to be set.
wait(0.25, seconds);
// Run the event and wait until it finishes.
driveEvent.broadcastAndWait();
// Stop driving after 2 seconds.
Drivetrain.stop();
Brain.Screen.clearScreen();
Brain.Screen.print("Drive complete!");
}