In den folgenden Sektionen wird das Backend unseres Praktikums vorgestellt.

Kontrollflussdiagramm

Zur besseren Einordnung haben wir hier noch einmal das Kontrollflussdiagramm angeführt: Kontrollflussdiagramm

Moveserver

Der Moveserver ist ein Pythonskript, das beim Einschalten des Raspberry gestartet wird. Zuerst einmal stellt er sicher, dass die Servos zu Beginn in eine bekannte Stellung, die wir als die Standardposition bezeichnen, gebracht werden, da ein Auslesen der Position aus den Servos nicht möglich ist. Weiterhin füllt er die vom WSGI-Skript erhaltenen Requests in die Queue und startet den Worker (s.u.). Zusätzlich führt er die Suspend-Funktionalität als Subprozess aus und verwaltet deren Zeit-Variable.

Queue & Worker

Die eingehenden Requests werden in einer Queue (FIFO) der Länge 5 zwischengespeichert, d.h. die zuerst eingehenden Requests werden zuerst vom Worker abgearbeitet. Ist die Queue voll, wird der älteste Befehle verworfen. Diese Form der Priorisierung hat sich als funktional erwiesen: Auch in einer Testsituation, in der ein Testskript massiv viele Requests sendete, konnte ein Mensch die Steuerung, wenngleich nur mit intensivem Einsatz, beeinflussen.

Der Worker holt sich Befehle aus der Queue, sichert sich das Zugriffsrecht auf die Servos, bewegt die Servos entsprechend der Befehle (move()) und gibt die Servos wieder frei. Hier folgt die vom Worker aufgerufene Funktion move():

 1def move(curr4, curr17, direction, step=3):
 2  # Abfangen ungültiger Eingaben
 3  if not direction in ("left","right","up","down","defaultpos"):
 4    print "You should use left, right, up or down.\n";
 5    return;
 6  # tmp: position to move
 7  # nr:  Number of the GPIO-pin. 4 = vertical move, 17 = horizontal move.
 8  # step: Schrittweite
 9  tmp = None;
10  nr = None;
11  step = 10*step;
12  if direction == "left":
13    print "move %s" % direction;
14  # Festlegen welcher Servo bewegt wird
15    nr = 4;
16  # Überprüfen ob der maximale Ausrichtungswinkel nicht überschritten wird
17  # Die Zahl gibt dabei die Signallänge, mit der die Servos angesprochen
18  # werden, in Mikrosekunden an
19  # Wir lassen eine Signallänge von 1000 bis 2000 zu; die lässt etwa eine
20  # Drehung um 90 Grad in beide Richtungen von der Mittelstellung (1500) zu
21    if curr4 + step <= 2000:
22      curr4 += step;
23    else:
24      curr4 = 2000;
25    tmp = curr4;
26  # [...] hier folgen dann die entsprechenden Abfragen für Rechts, Oben und Unten sowie Defaultpos
27  # Fehlermeldung bei falscher Eingabe
28  else:
29    print "false usage of move()";
30  # Drehen des entsprechenden Servo (nr) zum angegebenen Ausrichtungswinkel (tmp)
31  go_servo(nr, tmp);
32  # Rückgabe der neuen Positionen der Servos
33  return curr4, curr17

Der komplette Quelltext des moveservers findet sich in den Dateien moveserver.py, server.py und move.py.