easyRun : un couteau suisse pour faire plusieurs choses à la fois

Bonjour

Voici une bibliothèque qui facilite l'organisation et le déclenchement des diverses fonctions d'un programme dans le temps.

A la base, easyRun est un petit ordonnanceur, enrichi de nombreuses classes qui permettent de se simplifier la vie :

  • des tâches de fond, tâches périodiques où tâches asynchrones
  • des machines à états
  • des leds, une tonne de classes boutons
  • divers outils pour monitorer le système

Pour déclencher au bon moment les appels aux diverses fonctions du programme, votre fonction loop() doit contenir l'appel à la fonction easyRun();

Attention : même si on s'en approche, il ne s'agit pas d'un vrai système multi-tâches.
Les diverses fonctions du programme ne s'exécutent pas en parallèle, mais les unes après les autres, sans s'interrompre mutuellement.
Il est donc essentiel de structurer son code de manière à NE JAMAIS UTILISER LA FONCTION DELAY ni autre boucle bloquante.
Les classes easyRun sont là pour vous y aider.

Les possibilités offertes par cette bibliothèque sont très vastes.
Je ne vais pas les exposer ici dans des tartines de texte que personne ne lira.
Au lieu de cela, j'ai doté la bibliothèque d'une foule d'exemples destinés à les illustrer.

Je vous invite donc à tester un par un ces exemples, ce sera plus concret.

Page GitHub easyRun
Téléchargement direct

Bonjour

Je suis un poil surpris de voir que cette lib n'a pas trouvé preneur, et me dis que certains d'entre vous sont peut-être passés à côté des bénéfices que vous pourriez en tirer.
C'est autant destiné aux débutants, en simplifiant la gestion de base autour de millis, qu'aux développeurs plus expérimentés qui pourront facilement y ajouter des tonnes d'extensions selon leurs propres besoins.

Je l'utilise depuis un an comme "framework" pour 100% de mes dev, et avec le recul cela me fait vraiment gagner du temps, principalement en assemblage de fonctionnalités parallèles mises au point séparément.
Sa publication ici a été poussée par mes scrupules à garder ça uniquement pour ma pomme. :grinning:

Bref n'hésitez pas : dans le doute, branchez une carte sur votre PC, installez et testez la bestiole, fournie avec plein d'exemples qui sont justement là pour illustrer les diverses possibilités.

SVP, ne répondez pas à ce topic pour exposer des opinions générales sur "comment faire plusieurs choses à la fois" sans avoir au préalable testé easyRun.
Toute remarque / suggestion après test est la bienvenue.
Je pourrai aussi vous aider à débrouiller toute difficulté d'utilisation.
a+

J'essaye de comprendre les exemples, un par un. Au second, je suis déjà largué...

void counter()
{
  count++;
}
task t1(counter);

Je ne vois aucune référence à t1 dans le code, quand / comment le compteur est-il incrémenté ?

Mince je pensais la chose plus accessible :slight_smile:

Je remets l'exemple ici pour avoir tout sous les yeux

#include "easyRun.h"

/* Periodic task demo
A periodic task is an object linked to a void function(), with time condition
1) define your function, for example printOut() below
2) declare a periodicTask object linked to your function, for example t2 below
easyRun() will call your function each nnn milliseconds
see periodicTask.h and callbacks.h for complete list of properties and methods 
*/

unsigned long count = 0;

void counter()
{
  count++;
}
task t1(counter);

void printOut()
{
  Serial.print("millis()=");
  Serial.print(millis());
  Serial.print(", count=");
  Serial.println(count);
}
periodicTask t2(printOut, 1000); //To be executed each 1000 ms

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  easyRun();
}

Tous les objets easyRun ont pour point commun d'être actualisés à chaque exécution de la fonction easyRun(), c'est-à-dire à chaque loop() dans cet exemple.

task est la classe la plus simple, qui permet de définir une tâche de fond.
Donc là, l'objet t1 appelle la fonction counter() à chaque loop().
C'est-à-dire que la variable count contient le nombre de loop() effectuées, et cette variable est affichée dans le moniteur série une fois par seconde grâce à l'autre objet easyRun de cet exemple.

Evidemment ici, l'utilisation d'une classe task a assez peu d'intérêt, dans la mesure où il était plus simple de glisser un count++ directement dans la fonction loop().
C'est juste pour rester dans l'esprit du moniteur easyRun.

Cela prend plus de sens dans les cas où on modifie la fonction associée à la tâche de fond

t1.callback.set(nom_fonction); //pour associer une autre fonction à t1
t1.callback.unset();           //pour désactiver t1

Ou encore lorsque la tâche de fond est elle-même enfouie dans un fichier à part, simplement importé par include.

Et pour lever un peu le capot : toutes les classes easyRun sont dérivées d'une unique classe mère runable.

Chaque classe fille possède une méthode .run() dans laquelle on met ce qu'on veut.

Par exemple la classe task contient un pointeur vers une fonction, et sa méthode .run() appelle cette fonction si le pointeur n'est pas null.

Et la classe mère runable :

  • intègre la gestion statique d'une liste chaînée de tous les objets dérivés.
  • possède une méthode .runAll() qui parcourt tous les éléments de la liste et déclenche la méthode .run() pour chacun d'eux.

La fonction easyRun() que l'on voit dans le loop(), est juste un alias vers la fonction runable::runAll()

Mais il n'est pas du tout nécessaire de maîtriser ces notions de classe et d'héritage pour utiliser la collection d'objets easyRun prédéfinis dans la lib.

adoptée..merci

bricoleau:
Bonjour

Je suis un poil surpris de voir que cette lib n'a pas trouvé preneur

bonjour
Manque de visibilité/publicité ?
Je ne souviens pas avoir vu/lu le post original :wink:

C'est vrai que j'ai été un peu flemmard sur le coup.

Le biniou est tellement riche en possibilités que je ne me voyais pas passer des heures à tout décrire, pour aboutir à une tartine assommante que personne ne lirait.
J'avais (peut-être à tort?) misé sur le fait que les personnes que le sujet pouvait intéresser le repéreraient.

Mais bon pas grave, je ne cherche pas la publicité. Si ça peut rendre service à quelques personnes motivées cela me convient.

Bonjour

Le biniou est tellement riche en possibilités que je ne me voyais pas passer des heures à tout décrire, pour aboutir à une tartine assommante que personne ne lirait

.... à part les personnes qui , comme moi, aiment encore aborder les choses nouvelles par les 'tartines' et pas par quelques exemples :wink: