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.