Librairie RunLoop: faciliter la parallélisation (Loops,Timers,Interruptions,etc)

Je vous présente une nouvelle librairie Arduino C++ dispo sur mon github…
https://github.com/MarScaper/runloop

Ce couteau suisse est destiné à me faciliter la tâche pour le traitement parallèle sur Arduino dans le cadre d'un projet d'astronomie.

Voici la liste des possibilités offertes par la librairie en l'état:

  • Objets de boucle d'exécution (RunLoopObject) avec hiérarchie, état suspendu, etc.
  • Timers logiciels.
  • Timers matériels: Timer0, Timer1, Timer2, Timer3, Timer4, Timer5 (3,4,5 seulement avec Arduino Mega).
  • Timers logiciels et matériels interchangeables.
  • Interruptions matérielles.
  • Approche 100% C++ avec héritage ou paradigme de délégation pour les retours asynchrones des timers et des interruptions.
  • Possibilité de compatibilité C avec retour par fonction callback améliorée (passage d'un paramètre).

Un aperçu de l'ensemble avec le diagramme de classes:

Mon envie de coder cette librairie est venue du fait que je ne trouvais pas de tout en un C++. A cela s'ajoutait que concernant les timers ou les interruptions, j'en étais toujours réduit à des verrues C (méthodes statiques en plein milieu d'une classe) pour récupérer les évènements faute de pouvoir appeler directement des méthodes d'une instance. C'est maintenant chose possible soit par surcharge soit par délégation. Quelques projets d'exemple sont déjà disponibles avec la librairie.

Un exemple de code minimaliste version retour par callback…

#include <RunLoop.h>

RunLoopTimer *timer1 = NULL;

void setup() 
{
  // Start serial
  Serial.begin(9600);

  // Timer will fire every second. 
  timer1 = new RunLoopHardwareTimer0();
  timer1->attachInterrupt(fire);
  timer1->setDelay(1000);
}

// Unlike other timer libraries, attachInterrupt(...) takes 
// a function with a timer object as parameter. As a result,
// we can use the same function for several timers and we
// can play with the sender to retrieve data.
void fire(RunLoopTimer *sender)
{
  if( sender == timer1 )
  {
    Serial.println("Timer 1 fired...");
  }
}

void loop() 
{
}

Pour finir, en guise d'illustration, une vidéo montrant la librairie à l'oeuvre dans mon projet d'astronomie (Buzzer, led, télécommande infra rouge, lcd et GPS fonctionnant de concert):

https://www.youtube.com/watch?v=p8aKuSLS8uE

Si le concept plait, j'essaierai de développer un peu plus.

Cordialement,
Sébastien.

Bonsoir
ça semble "intéressant" 8)
Je vais regarder

Mais je t'en prie Artouste. :wink:

Et voici un article détaillé en Français sur mon site…
http://em10-usd-arduino-takahashi.eliotis.com/runloop/index.html

bonjour,
si tu viens par ici, on a un club astro :slight_smile:
27 juillet nuit des étoiles pour nous
club des domes à mesquer

Ca fait un peu loin de chez moi. Je suis sur Gap dans les Alpes. :wink:

marscaper:
Ca fait un peu loin de chez moi. Je suis sur Gap dans les Alpes. :wink:

on ne peut être parfait, héhéhéhé
beau boulot en tous cas