adatft

package module
v1.0.2 Latest Latest
Warning

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

Go to latest
Published: Jan 7, 2024 License: MIT Imports: 15 Imported by: 16

README

AdaTFT

Mit Go das TFT-Display (2.8'' 320x240) von AdaFruit auf einem RaspberriPi ansteuern.

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

Constants

This section is empty.

Variables

View Source
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
)
View Source
var (
	ILIModel color.Model = color.ModelFunc(iliModel)
)
View Source
var (
	Width, Height int
)

Functions

func Init

func Init()

Damit wird die 'periph.io'-Umgebung initialisiert. Diese Funktion muss immer als erstes aufgerufen werden, noch bevor irgendwelche Devices geoeffnet werden.

func PrintStat

func PrintStat()

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

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

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!

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.

func (ILIColor) RGBA added in v1.0.2

func (c ILIColor) RGBA() (r, g, b, a uint32)

type ILIImage added in v1.0.2

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

func NewILIImage added in v1.0.2

func NewILIImage(r image.Rectangle) *ILIImage

Erzeugt einen neuen Buffer, der fuer die Anzeige von image.RGBA Bildern zwingend gebraucht wird.

func (*ILIImage) At added in v1.0.2

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

func (*ILIImage) Bounds added in v1.0.2

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

func (*ILIImage) Clear added in v1.0.2

func (b *ILIImage) Clear()

func (*ILIImage) ColorModel added in v1.0.2

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

func (*ILIImage) Convert added in v1.0.2

func (b *ILIImage) Convert(src *image.RGBA)

func (*ILIImage) Diff added in v1.0.2

func (b *ILIImage) Diff(img *ILIImage) image.Rectangle

func (*ILIImage) PixOffset added in v1.0.2

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

func (*ILIImage) Set added in v1.0.2

func (b *ILIImage) Set(x, y int, c color.Color)

func (*ILIImage) SubImage added in v1.0.2

func (b *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. 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) 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 {
	// 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.

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