Die Klasse Keyboard stellt die Abstraktion der Tastatur dar. Sie sorgt
für die korrekte Initialisierung und vor allem für die
Unterbrechungsbehandlung.
Außerdem ermöglicht die Klasse Keyboard die Tastaturabfrage
durch die Anwendung.
öffentliche Methoden
void plugin ()
Mit dieser Methode wird die Tastatur initialisiert und
"angestöpselt". Dazu
muss sich das Keyboard Objekt bei der Plugboxplugbox
anmelden und dem PIC Objekt
pic mitteilen, dass Unterbrechungen der
Tastatur fortan dem Prozessor gemeldet werden sollen.
bool prologue ()
Mit dieser Methode wird auf die Unterbrechungen durch die
Tastatur reagiert. Da bei jedem Tastendruck mehrere
Unterbrechungen ausgelöst werden, ist nicht in jedem Fall
mit einem verwertbaren ASCII Code zu rechnen. Nur wenn die
Methode key_hit der Basisklasse Keyboard_Controller einen gültigen
Key liefert, konnte ein vollständiger
Scancode ermittelt werden. Für "normale" Tasten existiert
dann auch ein ASCII Code ungleich Null.
Sofern ein gültiger Tastencode ermittelt werden konnte,
soll dieser in einer privaten Variablen der Klasse gespeichert
werden.
Falls Ctrl-Alt-Delete gedrückt wurde, soll ein Reboot
ausgelöst werden. Bei anderen gültigen Tastaturcodes
soll die Behandlung im Epilog fortgesetzt werden.
void epilogue ()
In dieser Methode soll das Auftreten des Tastendrucks einem eventuell
wartenden Prozess signalisiert werden. Dazu wird ein
Semaphor verwendet, dessen Zähler angibt, wieviele
Tastaturcodes im Keyboard Puffer zur Abholung
bereitstehen. Wenn ein Puffereintrag überschrieben werden
muss, ohne dass der alte Wert von einem
Anwendungsprozess abgefragt wurde, darf der Semaphor also
nicht hochgezählt werden.
Key getkey ()
Diese Methode liefert die zuletzt gedrückte Taste (als
Objekt der Klasse Key)
zurück. Wenn gerade keine Taste gedrückt wurde, wird
der aufrufende Anwendungsprozess solange blockiert. Dies
wird durch die Verwendung eines Semaphors erreicht.
Sobald der Tastencode abgeholt worden ist, sollte geeignet
vermerkt werden, dass der verwendete Puffer nun für
den nächsten Tastencode zur Verfügung steht.
Implementierungshinweis
Die Größe des Tastaturpuffers bestimmt, wie oft der
Benutzer "blind" Tasten drücken kann. Für unsere Zwecke
genügt schon ein einelementiger Tastaturpuffer.