adatft

package module
v1.2.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 8, 2024 License: MIT Imports: 16 Imported by: 16

README

AdaTFT

Mit Go verschiedene TFT-Displays von AdaFruit via RaspberryPi ansteuern. Mit diesem dieses Package können sowohl der Display als auch die Touch-Funktion (nur resitiv) angesteuert werden.

Aktuell werden unterstützt:

  • 2.8'' 320x240 (Display: ILI9341, Touch: STMPE610)
  • 3.5'' 480x320 (Display: HX8357, Touch: STMPE610)

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

Constants

This section is empty.

Variables

View Source
var (
	SPISpeedHz physic.Frequency = 45_000_000
	//SPISpeedHz physic.Frequency = 65_000_000
	Width, Height int
)
View Source
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

func (dsp *Display) Bounds() image.Rectangle

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.

func (*Display) Close

func (dsp *Display) Close()

Schliesst die Verbindung zum ILI9341.

func (*Display) Draw

func (dsp *Display) Draw(img image.Image) error

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

func (dsp *Display) DrawSync(img image.Image) error

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!

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

type ILIImage struct {
	Pix    []uint8
	Stride int
	Rect   image.Rectangle
}

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 NewILIImage(r image.Rectangle) *ILIImage

func (*ILIImage) At added in v1.0.2

func (p *ILIImage) At(x, y int) color.Color

func (*ILIImage) Bounds added in v1.0.2

func (p *ILIImage) Bounds() image.Rectangle

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

func (p *ILIImage) ColorModel() color.Model

ColorModel, Bounds und At werden vom Interface image.Image gefordert.

func (*ILIImage) Opaque added in v1.1.0

func (p *ILIImage) Opaque() bool

func (*ILIImage) PixOffset added in v1.0.2

func (p *ILIImage) PixOffset(x, y int) int

Ermittelt den Offset des Pixels mit Koordinaten x und y in p.Pix.

func (*ILIImage) SubImage added in v1.0.2

func (p *ILIImage) SubImage(r image.Rectangle) image.Image

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

func (s *Stopwatch) Avg() time.Duration

Berechnet die durchschnittliche Messdauer (also den Quotienten von Total() / Num()).

func (*Stopwatch) Num added in v1.1.0

func (s *Stopwatch) Num() int

Retourniert die Anzahl Messungen.

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.

func (*Stopwatch) Stop added in v1.1.0

func (s *Stopwatch) Stop()

Stop beendet die Messung und aktualisiert die Variablen, welche die totale Messdauer als auch die Anzahl Messungen enthalten.

func (*Stopwatch) Total added in v1.1.0

func (s *Stopwatch) Total() time.Duration

Retourniert die totale Messdauer.

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) Close

func (tch *Touch) Close()

func (*Touch) WaitForEvent

func (tch *Touch) WaitForEvent() PenEvent

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.

func (TouchPos) Near

func (p1 TouchPos) Near(p2 TouchPos) bool

func (TouchPos) String

func (tp TouchPos) String() string

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

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL