Dienstag, 22. Dezember 2015

Projekt Electronic Dice: Die Software


Software für ein Mikrocontroller (Embedded System) zu schreiben unterscheidet sich in vielen Teilen stark von der Softwareentwicklung für Desktop, Server oder Mobile Devices.

Wie also schreibt man die Software für den elektronischen Würfel, den Electronic Dice? Was muss man beachten?

Der Arduino ist ein Single-threaded, Single-Process System. Es gibt also kein Betriebssystem, dass einem Parallelität ermöglicht. Der ATMega besitzt zwar Interrupts, diese werden aber bereits von vielen Arduino Bibliotheken verwendet. Deshalb wird der Electronic Dice keine Interrupts verwenden.

Die Software des Electronic Dice basiert auf einer Event-basierten Software-Architektur. Das heisst, der Programmcode reagiert auf auftretende Ereignisse und führt nur die gerade notwendigen Befehle aus. Danach gibt der die Programmkontrolle wieder an den Event-Loop (bei mir heisst dieser Scheduler) ab. Die Dice-Software orientiert sich also an der Idee des kooperativen Multitaskings (siehe Wikipedia: https://de.wikipedia.org/wiki/Multitasking#Kooperatives_Multitasking).

Das tönt alles komplizierter als es ist. Hier die Codesnippets die zeigen, wie der Scheduler funktioniert:

Der Mainloop des Arduino:
void loop() {
  Scheduler::getInstance()->run_once();
  delay(5);
}
Und der entsprechende Code des Schedulers:
void Scheduler::run_once() {
  for(int i = 0; i < MAX_EVENTS; i++) {   
    if (ev_list[i] != 0) {
      ev_list[i]->update();
    }
  }
}
Der Scheduler führt also eine Liste von Eventhandlern (ev_list), die er über die Methode update() aktualisiert. Ist ein Ereignis eingetreten, so führt der Eventhandler die entsprechende Aktion aus. Der Scheduler und die Eventhandler implementieren das bekannte Observer-Pattern (siehe Wikipedia: https://en.wikipedia.org/wiki/Observer_pattern).

Das ganze Eventhandling kann man als grosses Switch-Statement implementieren - oder man verwendet das State-Pattern um eine einfach State-Event-Machine zu implementieren (siehe Wikipedia: https://en.wikipedia.org/wiki/State_pattern). Welche States und Events gibt es beim Electronic Dice? Dazu habe ich ein kleines State-Diagramm entworfen.
  Wie das Ganze zusammengesetzt aussieht, zeigt das nachfolgende Klassendiagramm.
Und das komplette Bild er Dice-Software ist dann wie folgt. die Software besteht aus der Eigenentwicklung Dice sowie den beiden verwendeten Libraries CapSense für den Touch-Sensor und WS2801 zur Ansteuerung der RGB-Leds.


Also eigentlich alles ganz einfach ;-)