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.go, ili9341-spi.go: enthalten alles, was für die direkte Ansteuerung des Display-Chips benötigt wird.
- display.go:
Interfaces: der SPI-Verbindung zum Display-Chip ILI9341 und der SPI-Verbindung zum Touchscreen-Chip STMPE610. Die Packages 'adatft/ili9341' und 'adatft/stmpe610' enthalten Typen und Methoden für den direkten Zugang zu diesen Hardware-Komponenten (low level API).
Darauf aufbauend enthält das Package die Typen 'Display' und 'Touch', welche ein "high level API" anbieten.
Index ¶
- Variables
- func Init()
- func PrintStat()
- type BufChanItem
- type ChannelDir
- 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(touchData TouchRawPos) (touchPos TouchPos, err error)
- func (d *DistortedPlane) WriteConfig()
- func (d *DistortedPlane) WriteConfigFile(fileName string)
- type ILIColor
- type ILIImage
- func (b *ILIImage) At(x, y int) color.Color
- func (b *ILIImage) Bounds() image.Rectangle
- func (b *ILIImage) Clear()
- func (b *ILIImage) ColorModel() color.Model
- func (b *ILIImage) Convert(src *image.RGBA)
- func (b *ILIImage) Diff(img *ILIImage) image.Rectangle
- func (b *ILIImage) PixOffset(x, y int) int
- func (b *ILIImage) Set(x, y int, c color.Color)
- func (b *ILIImage) SubImage(r image.Rectangle) image.Image
- type PenEvent
- type PenEventChannelType
- type PenEventHandlerType
- type PenEventType
- type RefPointType
- type RotationData
- type RotationType
- type Touch
- type TouchInterface
- type TouchPos
- type TouchRawPos
Constants ¶
This section is empty.
Variables ¶
var ( // ConvTime enthält die kumulierte Zeit, 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'. ConvTime time.Duration // NumConv enthält die Anzahl Aufrufe von 'Convert'. NumConv int // DispTime enthält die kumulierte Zeit, welche für das Senden der Bilder // zum Display verwendet wird. Misst im Wesentlichen die aktive Zeit // der Methode 'drawBuffer'. DispTime time.Duration // NumDisp enthält die Anzahl Aufrufe von 'drawBuffer'. NumDisp int // PaintTime kann von der Applikation verwendet werden, um die kumulierte // Zeit zu erfassen, die von der Applikation selber zum Zeichnen des // Bildschirms verwendet wird. PaintTime time.Duration // In NumPaint kann die Applikation festhalten, wie oft der Bildschirm- // inhalt (oder Teile davon) neu gezeichnet wird. NumPaint int )
var (
ILIModel color.Model = color.ModelFunc(iliModel)
)
var (
Width, Height int
)
Functions ¶
Types ¶
type BufChanItem ¶ added in v1.0.2
type BufChanItem struct {
// contains filtered or unexported fields
}
type ChannelDir ¶
type ChannelDir int
type DispInterface ¶ added in v1.0.2
type DispInterface interface { // Schliesst die Verbindung zum ILI-Chip und gibt alle Ressourcen in // Zusammenhang mit dieser Verbindung frei. Close() Init(initParams []any) // 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 möglich, verschiedene Libraries für die SPI-Anbindung des ILI-Chips zu verwenden. Dieses Interface beschreibt alle Methoden, welche von einer SPI-Anbindung implementiert werden müssen.
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) Draw ¶
Damit wird das Bild img auf dem Bildschirm dargestellt. Die Darstellung erfolgt asynchron, d.h. die Methode wartet nur, bis das Bild konvertiert wurde. Wichtig: img muss ein image.RGBA-Typ sein!
func (*Display) DrawSync ¶
Damit wird das Bild img auf dem Bildschirm dargestellt. Die Darstellung erfolgt synchron, d.h. die Methode wartet so lange, bis alle Bilddaten zum TFT gesendet wurden. Wichtig: img muss ein image.RGBA-Typ sein!
func (*Display) InitChannels ¶
func (dsp *Display) InitChannels()
Diese Routine baut die GO-Routinen fuer die parallelisierte Konvertierung und Anzeige auf und retourniert einen Channel, auf welchem die Pointer auf die RGBA-Images zur Anzeige gesendet werden.
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 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(touchData TouchRawPos) (touchPos TouchPos, err error)
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 ILIColor ¶ added in v1.0.2
type ILIColor struct {
R, G, B uint8
}
Dies ist die Implementation des 666-Farbtyps.
type ILIImage ¶ added in v1.0.2
func NewILIImage ¶ added in v1.0.2
Erzeugt einen neuen Buffer, der fuer die Anzeige von image.RGBA Bildern zwingend gebraucht wird.
func (*ILIImage) ColorModel ¶ added in v1.0.2
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. Vom SMTPE610 gibt es nur 3 Events: Press, Move und Release. Die anderen Events (wie Tap, DoubleTap, Enter oder Leave) sind virtuelle Events und werden im Package 'adagui' durch den Screen-Typ erzeugt.
const ( PenPress PenEventType = iota PenDrag 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 Touch ¶
type Touch struct { EventQ PenEventChannelType DistortedPlane // contains filtered or unexported fields }
Dieser Typ steht fuer das SPI Interface zum STMPE - dem Touchscreen.
func OpenTouch ¶
func OpenTouch() *Touch
-----------------------------------------------------------------------------
Funktionen
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 { // Schliesst die Verbindung zum Touchscreen-Controller und gibt alle // Ressourcen im Zusammenhang mit dieser Verbindung frei. Close() Init(initParams []any) // 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. // 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