/*
Beispiel für
https://forum.arduino.cc/t/tft-input-placeholder/1107597
2023-04-26
ec2021
Routinen zur Cursordarstellung (Unterstrich) auf einem TFT-Display
Die Routinen wurden so angepasst, dass sie sowohl mit Systemschrift wie auch Proportional-
schriften aus der ADAFruit-Bibliothek funktionieren. Sie können mit verschiedenen Textgrößen
wie auch unterschiedlicher Display-Rotation verwendet werden.
Die Adresse des Displaytreibers wird im Konstruktor der Klasse TFTCursor
übergeben. Damit die Klassenfunktionen korrekt erstellt werden, muss der Typ
beim Compilieren bekannt sein.
Bekannte Einschränkungen:
Der Text ***muss*** in eine Zeile passen, sonst erscheint der Cursor
an einer falschen Stelle.
Die Klasse basiert auf Adafruit-Funktionen, die in Adafruit_GFX.h enthalten sind. Bei
Verwendung anderer TFT-Treiber muss die Klasse voraussichtlich angepasst werden.
Für den Anwender verfügbare Funktionen:
--------------------------------------------------------------------------------------------
CursorType<Adafruit_ILI9341> myCursor(tft);
--------------------------------------------------------------------------------------------
Dem Konstruktor der Klasse CursorType muss in den spitzen Klammern der Datentyp des TFT
übergeben werden, da die Klasse CursorType anhand eines Templates erstellt wird.
Der instantiierten Klasse (hier: myCursor) wird dazu die Adresse des tft-Objekts übergeben,
um auf Grafikfunktionen und Textausgaben des Treibers zugreifen zu können.
--------------------------------------------------------------------------------------------
void setCursorColor(uint16_t col);
--------------------------------------------------------------------------------------------
Setzen der Cursor-Farbe (kann also von der verwendeten Textfarbe abweichen!)
--------------------------------------------------------------------------------------------
void setbkColor(uint16_t col);
--------------------------------------------------------------------------------------------
Setzen der Hintergrund-Farbe, mit der zuvor geschriebener Text gelöscht wird.
Das "Übermalen" des Textes mit einem Rechteck in Hintergrundfarbe ist bei
Verwendung von Proportionalschrift die sicherste Methode, um Artefakte zu
vermeiden.
--------------------------------------------------------------------------------------------
void print(String aTxt,int atX, int atY, uint16_t col);
--------------------------------------------------------------------------------------------
Gibt den Text an der Stelle atX, atY in der Farbe col aus.
Mit diesem Aufruf werden automatisch alle Parameter gesetzt bzw. ermittelt,
die für das "Unterstreichen" mit dem Cursor erforderlich sind.
Bei erneutem Aufruf von print() wird der vorherigen Text auf dem TFT-Schirm gelöscht.
Dabei wird die Hintergrundfarbe angewandt, Defaultwert ist Schwarz. Weicht die
verwendete Hintergrund davon ab, kann dies mit setBkColor() angepasst werden.
--------------------------------------------------------------------------------------------
void setBlinkTime(unsigned long bTime);
--------------------------------------------------------------------------------------------
Setzen der Blinkzeit in [ms], Default-Wert ist 300 ms
--------------------------------------------------------------------------------------------
void Blink(int Stelle);
--------------------------------------------------------------------------------------------
Diese Funktion läßt den Cursor in einem Takt von 300 ms (default) blinken
Die Blinkgeschwindigkeit kann mit setBlinkTime(); geändert werden.
WICHTIG. Diese Funktion benutzt die millis()-Funktion; sie muss also
in der loop() regelmäßig aufgerufen werden; blockierende Funktionen
behindern das Blinken!
--------------------------------------------------------------------------------------------
void ClearBlink();
--------------------------------------------------------------------------------------------
Um sicherzugehen, dass nach einem Wechsel der Print-Position keine "Reste" zurückbleiben,
empfiehlt es sich, vor einem erneuten Print zuerst ClearBlink() aufzurufen.
*/
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSans24pt7b.h>
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); // tft muss der Klasse CursorType
// im Konstruktor übergeben werden!
// Der Typ des Displaytreibers muss
// ebenfalls bei Instanziierung angeführt
// sein, damit die Klasse für genau diesen
// Treiber compiliert werden kann.
#include "TFTCursor.h"
#define LEFT 10
#define TOP 100
CursorType<Adafruit_ILI9341> myCursor(tft); // Konstruktor der Klasse CursorType
// hier mit Datentyp Adafruit_ILI9341 und
// dem Treiberobjekt tft
int Pos = 1;
unsigned long lastChange = 0;
constexpr int NoOfStrings = 3;
int StrNo = 0;
String txt[NoOfStrings] = {"00:00", "aBcDe", "01:2a3@4"};
void setup() {
Serial.begin(115200);
Serial.println("Start ...");
tft.begin();
tft.setRotation(3);
tft.setFont(&FreeSans24pt7b);
tft.setTextSize(1);
myCursor.setCursorColor(ILI9341_YELLOW);
myCursor.setBlinkTime(300);
myCursor.print(txt[0], LEFT, TOP, ILI9341_RED);
}
void ChangeText() {
Pos = 1;
StrNo++;
if (StrNo >= NoOfStrings) StrNo = 0;
switch (StrNo) {
case 0 :
tft.fillScreen(ILI9341_BLACK);
myCursor.setBkColor(ILI9341_BLACK);
myCursor.setCursorColor(ILI9341_YELLOW);
myCursor.print(txt[StrNo], LEFT + 80, TOP, ILI9341_RED);
break;
case 1 :
tft.fillScreen(ILI9341_RED);
myCursor.setBkColor(ILI9341_RED);
myCursor.setCursorColor(ILI9341_BLUE);
myCursor.print(txt[StrNo], LEFT + 40, TOP + 30, ILI9341_GREEN);
break;
case 2 :
tft.fillScreen(ILI9341_YELLOW);
myCursor.setBkColor(ILI9341_YELLOW);
myCursor.setCursorColor(ILI9341_BLACK);
myCursor.print(txt[StrNo], LEFT, TOP - 20, ILI9341_BLUE);
break;
default : myCursor.print(txt[StrNo], LEFT, TOP, ILI9341_YELLOW);
}
}
void loop() {
myCursor.Blink(Pos);
if (millis() - lastChange > 1400) {
myCursor.ClearBlink();
lastChange = millis();
Pos++;
if (Pos > txt[StrNo].length()) ChangeText();
}
}