3.5.2 Touchscreen

Der Touch Screen der Pocket Viewer besteht aus einer dünnen Glasschicht, die bei Druck leicht nachgibt und diesen Druck an Sensoren meldet.
Diese Sensoren liefern die Koordinaten zurück, an dem der Druck erkannt wurde.
Diese Koordinaten können einerseits durch einen Interrupt abgefragt werden (wie im Befehl PollEvent gezeigt) oder durch die Funktion LibTchWait(), die wartet, bis ein Druck auf das Display erfolgt ist.

In beiden fällen stehen in der übergebenen Variable tsts in den Members tsts.x und tsts.y die Koordinaten des Druckpunkts.
Zusätzlich enthält die Variable tsts auch ein Member tsts.obj, in dem abgelegt wird, welcher vordefinierte Bereich des Touch-Screens getroffen wurde.
Diese vordefinierten Bereiche, Touch Tables, werden als Variable deklariert und auf den Touch Stack gebracht.
Der Touch Stack regelt, wie sich Bereiche verhalten sollen, die sich durch die Definition überlappen.
Jedes Programm sollte für sich den Touch Stack erst mal löschen und neu aufbauen. Bei einem Druck auf den Bildschirm werden dann alle definierten Areas überprüft, welcher Bereich für diesen Druck gültig ist. Wenn es zu Überlappungen kommt (also zwei Bereiche auf die Koordinaten passen), dann wird der Bereich genommen, der auf dem Stack oben liegt (also als letztes definiert wurde).
Die Icons am unteren Rand des Bildschirm reagieren ebenfalls auf den Touch und können so abgefragt werden. Um diese Bereiche aber nicht jedesmal neu definieren zu müssen, sind sie schon fest hinterlegt.

Zur Definition eines solchen Stacks gehören folgende Befehle:

LibTchStackClr();		/* Stack leeren */
LibTchStackPush(NULL);		/* NULL auf den Stack bringen um 
				anzuzeigen, dass hier die Bereiche zu Ende sind */
LibTchStackPush(TchHardIcon);	/* Die Icons am unteren Bildschirmrand */
Anschließend kann über den Befehl

LibTchStackPush(TchShow)
der selbstdefinierte Touchbereich dem System bekannt gemacht werden.
Dazu muss die Variable
TchShow
natürlich zuerst definiert werden.
Dazu dient folgender Code:

TCHTBL TchShow[]=
{
  75,2,100,12,
  ACT_MAKE,
  OBJ_IC_NEXT,
  0x0000,

  18,2,40,12,
  ACT_MAKE,
  OBJ_IC_NEW,
  0x0000,

  0,0,0,0,
  ACT_NONE,
  OBJ_END,
  0x0000
};
In diesem Beispiel sind zwei Bereiche definiert worden, die bei Druck den Wert OBJ_IC_NEXT bzw. OBJ_IC_NEW in der Variablen tsts.obj ablegen.
Diese bedien Werte müssen natürlich auch per

#define OBJ_IC_NEXT 0x8010
#define OBJ_IC_NEW  0x8011
definiert worden sein.
Als Wertebereich für tsts.obj gilt folgende Vorschrift:
0x0000Ende einer Touch Table
0x0001-0x7FFFWird vom PVOS benutzt
0x8000-0xFFFFKann von AddIns benutzt werden
Die Bereiche sind hier den Koordinaten 75,2 bis 100,12 und 18,2 bis 40,12 zugeordnet.
Der letzte Wert in der obigen Liste markiert nur das Ende der Tabelle.
Eine Besonderheit ist noch die Angabe
ACT_MAKE

Hier können mehrere Werte auftauchen, die bestimmen, wie sich dieser Bereich bei einem Druck verhalten soll.
Wenn man einen Bereich definiert, der als Parameter ACT_500MSEC besitzt, dann wird der Befehl LibTchWait() nach 500 ms wieder verlassen.
Dadurch wird es möglich, zeitgesteuerte Befehle abzusetzen.
Wenn man den Wert ACT_REPEAT aufnimmt, so wird der Befehl sooft in tsts.obj geschrieben, bis der Druck auf den Touchscreen aufhört. Ist der Wert ACT_REPEAT nicht enthalten, so wird der Befehl nur einmal in tsts.obj geschrieben. In tsts.act steht der sogenannte Action Code, der für den Bereich definiert ist.

ACT_MAKEDer Bereich wurde berührt
ACT_MOVEDer Stift wurde innerhalb des Bereichs bewegt
ACT_MOVE_OUTDer Stift wurde aus dem Bereich heraus bewegt
ACT_MOVE_INDer Stift wurde in den Bereich hinein bewegt
ACT_DOWNDie Berührung hält noch an
ACT_DOWN_INDie Berührung erfolgt immer noch innerhalb eines Bereichs
ACT_BREAKDie Berührung wurde beendet
ACT_BREAK_INDie Berührung wurde innerhalb eines Bereichs beendet
ACT_REPEATDie Zeit des Repeat-Intervalls ist abgelaufen während der Berührung
ACT_NONEFalscher Bereich
ACT_500MSEC500ms sind vergangen
ACT_ALMBenutzer Alarm wurde ausgelöst

Der Befehl PollEvent() füllt den Wert tsts.obj nicht

Für Ergänzungen wenden Sie sich bitte an: Jürgen Wagner