Documentation ¶
Overview ¶
Mit diesem Package kann das 2.8” TFT-Display mit Touchscreen von Adafruit via Go angesprochen werden.
Das Package besteht im Wesentlichen aus 2 Teilen
- Einer Sammlung von Typen und Funktionen für das Ansteuern des Bildschirms.
- Und einem Teil für die Ansteuerung des Touchscreens.
Jeder Teil ist dabei in eine hardwarenahe Implementation und ein etwas abstraketeres API unterteilt. Konkret:
ili9341/ili9341.go: enthält alles, was für die Ansteuerung dieses konkreten Chips via SPI notwendig ist.
hx8357/hx8357.go: analoge Sammlung für den leistungsfähigeren Chip.
stmpe610/stmpe610.go: "low level API" für die Ansteuerung des Touchscreens über diesen Chip via SPI.
display.go: enthält den Typ 'Display', der ein "high level API" anbietet.
touch.go: enthält den Typ 'Touch', der ein "high level API" anbietet.
Index ¶
- Variables
- func PrintStat()
- type DispInterface
- type Display
- type DistortedPlane
- func (d *DistortedPlane) ReadConfig()
- func (d *DistortedPlane) ReadConfigFile(fileName string)
- func (d *DistortedPlane) SetRefPoint(id RefPointType, rawPos TouchRawPos, pos TouchPos)
- func (d *DistortedPlane) SetRefPoints(rawPosList []TouchRawPos, posList []TouchPos)
- func (d *DistortedPlane) Transform(rawPos TouchRawPos) (pos TouchPos, err error)
- func (d *DistortedPlane) WriteConfig()
- func (d *DistortedPlane) WriteConfigFile(fileName string)
- type ILIImage
- type PenEvent
- type PenEventChannelType
- type PenEventHandlerType
- type PenEventType
- type RefPointType
- type RotationData
- type RotationType
- type Stopwatch
- type Touch
- type TouchInterface
- type TouchPos
- type TouchRawPos
Constants ¶
This section is empty.
Variables ¶
var ( SPISpeedHz physic.Frequency = 45_000_000 //SPISpeedHz physic.Frequency = 65_000_000 Width, Height int )
var ( // Mit ConvWatch wird die Zeit gemessen, welche für das Konvertieren der // Bilder vom RGBA-Format in das 565-/666-Format verwendet wird. // Misst im Wesentlichen die aktive Zeit der Methode 'Convert'. ConvWatch = NewStopwatch() // Mit DispWatch wird die Zeit gemessen, welche für das Senden der Bilder // zum Display verwendet wird. Misst im Wesentlichen die aktive Zeit // der Methode 'sendImage'. DispWatch = NewStopwatch() // PaintWatch und AnimWatch koennen von der Applikation zum Messen der // Zeiten fuer das Zeichnen, resp. Animieren des Bildschirminhalts // verwendet werden. Das Package macht von diesen Zeitmessern keinen // Gebrauch. PaintWatch = NewStopwatch() AnimWatch = NewStopwatch() )
Functions ¶
func PrintStat ¶
func PrintStat()
Gibt eine Reihe von Messdaten aus, mit denen die Performance der Umgebung eingeschaetzt werden kann. Drei Bereiche werden gemessen:
- Die applikatorische Zeit (NumPaint, PaintTime).
- Die Zeit, welche fuer die Konvertierung der Bilder ins ILI-spezifische Format benoetigt wird (NumConf, ConvTime).
- Die Zeit, welche fuer die Darstellung der Bilder auf dem TFT benoetigt wird (NumDisp, DispTime).
Als Daumenregel gilt: wenn die applikatorische Zeit pro Frame (PaintTime / NumPaint) groesser ist als die Zeit, welche fuer die Darstellung benoetigt wird (DispTime / NumDisp), dann besteht Bedarf nach Optimierung.
Types ¶
type DispInterface ¶ added in v1.0.2
type DispInterface interface { // Damit die Initialisierung so flexibel wie moeglich bleibt, wird der // Init-Methode ein Slice von beliebigen Parametern uebergeben. Wie die // Werte interpretiert werden, ist Interface-spezifisch. Init(initParams []any) // Schliesst die Verbindung zum ILI-Chip und gibt alle Ressourcen in // Zusammenhang mit dieser Verbindung frei. Close() // Sendet einen Befehl (Command) zum Chip. Das ist in der Regel ein // 8 Bit Wert. Cmd(cmd uint8) // Sendet 8 Bit als Daten zum Chip. In den meisten Fällen ist dies ein // Argument eines Befehls, der vorgängig via Cmd gesendet wird. Data8(val uint8) // Analog Data8, jedoch mit 32 Bit Daten. Data32(val uint32) // Der gesamte Slice buf wird gesendet. DataArray(buf []byte) }
Es ist vorstellbar, den TFT-Display ueber andere Schnittstellen als SPI anzusteuern und andere Chips fuer die Ansteuerung als den ILI9341 zu verwenden. Dieses Interface beschreibt alle Methoden, welche von einer Display-Ansteuerung implementiert werden muessen. Da bisher nur der ILI9341 via SPI angesteuert wurde, ist es sehr wahrscheinlich, dass dieses Interface noch stark angepasst werden muss.
type Display ¶
type Display struct {
// contains filtered or unexported fields
}
Dies ist der Datentyp, welche für die Verbindung zum ILI9341 via SPI steht. Im Wesentlichen handelt es sich dabei um den Filedescriptor auf das Device-File und um die Channels zu den Go-Routinen, welche die Konvertierung eines image.RGBA Bildes in ein ILI9341-konformes Format vornehmen und die Daten via SPI-Bus an den ILI9341 sendet.
func OpenDisplay ¶
func OpenDisplay(rot RotationType) *Display
OpenDisplay initialisiert die Hardware, damit ein Zeichnen auf dem TFT erst möglich wird. Als einziger Parameter muss die gewünschte Rotation des Bildschirms angegeben werden. Ebenso werden Channels und Go-Routines erstellt, die für das asynchrone Anzeigen notwendig sind.
func (*Display) Bounds ¶
Die Methode Bounds kann verwendet werden, um die Breite und Hoehe des Displays zu ermitteln. Das Resultat ist ein image.Rectangle Wert, d.h. es wird kein geom.Rectangle Wert zurueckgegeben, da dieser float64-Werte enthaelt.
type DistortedPlane ¶
type DistortedPlane struct { RawPosList [NumRefPoints]TouchRawPos PosList [NumRefPoints]TouchPos // contains filtered or unexported fields }
Der Touchscreen hat ein eigenes Koordinatensystem, welches mit den Pixel- Koordinaten des Bildschirms erst einmal nichts gemeinsam hat (eigener Ursprung, eigene Skalierung, etc.). Ausserdem kann das Touchscreen- Koordinatensystem gegenüber dem Bildschirm-Koord.system verzerrt sein, d.h. die jeweiligen Koordinaten-Achsen müssen nicht parallel zueinander sein.
Für die Konvertierung der Touchscreen-Koordinaten in Bildschirm-Koordinaten wird der Datentyp DistortedPlane verwendet.
func (*DistortedPlane) ReadConfig ¶
func (d *DistortedPlane) ReadConfig()
Liest die Konfiguration aus dem Default-File.
func (*DistortedPlane) ReadConfigFile ¶
func (d *DistortedPlane) ReadConfigFile(fileName string)
Liest die Konfiguration aus dem angegebenen File. Der Pfad kann absolut oder relativ angegeben werden. Als Dateiformat wird JSON verwendet.
func (*DistortedPlane) SetRefPoint ¶
func (d *DistortedPlane) SetRefPoint(id RefPointType, rawPos TouchRawPos, pos TouchPos)
func (*DistortedPlane) SetRefPoints ¶
func (d *DistortedPlane) SetRefPoints(rawPosList []TouchRawPos, posList []TouchPos)
func (*DistortedPlane) Transform ¶
func (d *DistortedPlane) Transform(rawPos TouchRawPos) (pos TouchPos, err error)
Transformiert die Touchscreen-Koordinaten in rawPos zu Bildschirm- Koordinaten.
func (*DistortedPlane) WriteConfig ¶
func (d *DistortedPlane) WriteConfig()
Schreibt die aktuelle Konfiguration in das Default-File.
func (*DistortedPlane) WriteConfigFile ¶
func (d *DistortedPlane) WriteConfigFile(fileName string)
Schreibt die aktuelle Konfiguration in das angegebene File. Der Pfad kann absolut oder relativ angegeben werden. Als Dateiformat wird JSON verwendet.
type ILIImage ¶ added in v1.0.2
Diese Datenstruktur stellt ein Bild dar, welches auf dem TFT direkt dargestellt werden kann und implementiert alle Interfaces, welche Go fuer Bild-Typen kennt.
func NewILIImage ¶ added in v1.0.2
func (*ILIImage) Clear ¶ added in v1.0.2
func (p *ILIImage) Clear()
Loescht das Bild hinter p, resp. setzt alle Bytes auf 0x00.
func (*ILIImage) ColorModel ¶ added in v1.0.2
ColorModel, Bounds und At werden vom Interface image.Image gefordert.
type PenEvent ¶
type PenEvent struct { Type PenEventType TouchRawPos TouchPos Time time.Time FifoSize uint8 }
Jedes Ereignis des Touchscreens wird durch eine Variable des Typs 'Event' repraesentiert.
type PenEventChannelType ¶
type PenEventChannelType chan PenEvent
type PenEventHandlerType ¶
type PenEventHandlerType func(event PenEvent)
Dies ist der Funktionstyp für den PenEvent-Handler - also jene Funktion, welche beim Eintreffen eines Interrupts vom STMPE610 aufgerufen werden soll.
type PenEventType ¶
type PenEventType uint8
Dies sind alle Pen- oder Touch-Events, auf welche man sich abonnieren kann. Aktuell sind dies 3 Events: Press, Drag und Release, wobei die Reihenfolge der Events immer die folgende ist:
Press -> Drag -> Drag -> ... -> Release
const ( // PenPress wird erzeugt, wenn der Touch-Screen gedrueckt wird. PenPress PenEventType = iota // PenDrag wird erzeugt, wenn sich die Position des Drucks auf dem // Touchscreen veraendert. PenDrag // PenRelease wird erzeugt, wenn der Druck auf dem Touch-Screen nicht // mehr gemessen werden kann. PenRelease )
func (PenEventType) String ¶
func (pet PenEventType) String() string
type RefPointType ¶
type RefPointType uint8
const ( RefTopLeft RefPointType = iota RefTopRight RefBottomRight RefBottomLeft NumRefPoints )
func (RefPointType) String ¶
func (pt RefPointType) String() string
type RotationData ¶
type RotationData struct {
// contains filtered or unexported fields
}
In RotationData sind nun alle von der Rotation abhängigen Einstellungen abgelegt. Es ist ein interner Datentyp, der wohl verwendet, aber nicht verändert werden kann.
type RotationType ¶
type RotationType int
Rotationsmöglichkeiten des Displays. Es gibt (logischerweise) 4 Möglichkeiten das Display zu rotieren. Dies hat Auswirkungen auf die Initialisierung des Displays, auf die globalen Variablen Width und Height und auf die Konfigurationsdateien, in welchen die Daten für die Transformation von Touch-Koordinaten auf Display-Koordianten abgelegt sind, etc.
const ( Rotate000 RotationType = iota Rotate090 Rotate180 Rotate270 )
func (*RotationType) Set ¶
func (rot *RotationType) Set(s string) error
func (RotationType) String ¶
func (rot RotationType) String() string
type Stopwatch ¶ added in v1.1.0
type Stopwatch struct {
// contains filtered or unexported fields
}
Dieser Typ dient der Zeitmessung.
func NewStopwatch ¶ added in v1.1.0
func NewStopwatch() *Stopwatch
func (*Stopwatch) Avg ¶ added in v1.1.0
Berechnet die durchschnittliche Messdauer (also den Quotienten von Total() / Num()).
func (*Stopwatch) Reset ¶ added in v1.1.0
func (s *Stopwatch) Reset()
Setzt die gemessene Dauer auf 0 und die Anzahl Messungen ebenfalls.
func (*Stopwatch) Start ¶ added in v1.1.0
func (s *Stopwatch) Start()
Mit Start wird eine neue Messung begonnen.
type Touch ¶
type Touch struct { EventQ PenEventChannelType DistortedPlane // contains filtered or unexported fields }
Dieser Typ steht fuer das SPI Interface zum STMPE - dem Touchscreen.
func (*Touch) WaitForEvent ¶
Diese Funktion wird von 'aussen' aufgerufen und gibt das nächste Pen-Event zurück. Es ist eine Alternative zum Lesen aus der öffentlichen Event-Queue.
type TouchInterface ¶ added in v1.0.2
type TouchInterface interface { // Damit die Initialisierung so flexibel wie moeglich bleibt, wird der // Init-Methode ein Slice von beliebigen Parametern uebergeben. Wie die // Werte interpretiert werden, ist Interface-spezifisch. Init(initParams []any) // Schliesst die Verbindung zum Touchscreen-Controller und gibt alle // Ressourcen im Zusammenhang mit dieser Verbindung frei. Close() // Mit den folgenden vier Methoden können die Register des Controller // ausgelesen oder beschrieben werden. Es stehen Methoden für 8-Bit oder // 16-Bit Register zur Verfügung. ReadReg8(addr uint8) uint8 WriteReg8(addr uint8, value uint8) ReadReg16(addr uint8) uint16 WriteReg16(addr uint8, value uint16) // Mit ReadData kann die aktuelle Position auf dem Touchscreen ermittelt // werden. Diese Methode sollte nur dann aufgerufen werden, wenn auch // Positionsdaten vorhanden sind. ReadData() (x, y uint16) // Damit wird die Funktion cbFunc als Handler für alle Interrupts im // Zusammenhang mit dem Touchscreen hinterlegt. Der Funktion wird beim // Aufruf der Paramter cbData uebergeben. SetCallback(cbFunc func(any), cbData any) }
Wie für den Display, so gibt es auch für den Touchscreen-Controller verschiedene Ausführungen. Dieses Interface beschreibt alle Methoden, welche von einer Touchscreen-Anbindung implementiert werden müssen.
type TouchPos ¶
type TouchPos struct {
X, Y float64
}
Während in diesem Typ die kalibrierten Postitionsdaten abgelegt werden.
type TouchRawPos ¶ added in v1.0.2
type TouchRawPos struct {
RawX, RawY uint16
}
Dieser Typ enthält die rohen, unkalibrierten Display-Daten
func (TouchRawPos) String ¶ added in v1.0.2
func (td TouchRawPos) String() string