TouchMenuLib¶
Beschreibung¶
TouchMenuLib arbeitet als Schnittstelle, verwaltet das Menü und kommuniziert mit dem Nutzer.
Funktionen¶
TouchMenuLib (Display* disp) |
|
TouchMenuLib () |
|
void |
init (uint8_t rotation = 1) |
void |
add (uint8_t id, Screen* screen) |
void |
add (const uint8_t id, Screen* screen, const uint8_t sitebarID) |
void |
addSidebar (const uint8_t id, Screen* sidebar, uint16_t size, uint8_t site = 0) |
void |
loop () |
void |
draw () |
void |
back (const uint8_t i = 1) |
bool |
goTo (const uint8_t id, const bool toHistory = true) |
void |
|
void |
|
void |
setInputLeft () |
void |
setInputUp () |
void |
setInputDown () |
void |
setScreenSaver (const uint8_t screenID, unsigned long time, bool backOnInput = true) |
bool |
|
void |
|
getDisplay () |
|
uint8_t |
getScreenID () |
void |
Variablen und Konstanten¶
std::map<uint8_t, std::unique_ptr<Screen>> |
|
std::stack<uint8_t> |
|
std::map<uint8_t, std::unique_ptr<Screen>> |
|
std::map<uint8_t, uint8_t> |
|
uint8_t |
currentSidebar = UINT8_MAX |
bool |
deactivateSidebar = false |
bool |
isDisplayInit = false |
bool |
screensaverBackOnInput = false |
bool |
isScreensaverEnable = false |
unsigned long |
screensaverTime = 0 |
unsigned long |
screensaverTimer = 0 |
uint8_t |
screensaverID = UINT8_MAX |
unsigned long |
inputTimer = 0 |
bool |
updateAll = true |
bool |
disableSidebarAutomatic = false |
Funktionen Beschreibung¶
TouchMenuLib (Display* disp)¶
1TouchMenuLib::TouchMenuLib (Display* disp):
2 display(disp)
3 {}
Der Konstruktor wird bei der Erzeugung eines neuen Objekts der TouchMenuLib Klasse aufgerufen.
Er erhält einen Pointer disp auf ein Display Objekt als Parameter. Das Member display wird mit dem von disp übergebenen Wert initialisiert.
TouchMenuLib ()¶
1TouchMenuLib::TouchMenuLib ():
2 display(new DisplayTFTeSPI())
3 {}
Der Konstruktor ruft den TouchMenuLib Konstruktor auf, in dem er ein neues DisplayTFTeSPI Objekt erstellt.
~TouchMenuLib ()¶
1TouchMenuLib::~TouchMenuLib (){
2 delete display;
3}
Der Destruktor wird bei der Zerstörung eines TouchMenuLib Objektes aufgerufen. Er gibt den Speicher frei, welcher vom display belegt wurde.
void init (uint8_t rotation = 1)¶
1void TouchMenuLib::init(uint8_t rotation) {
2 display->init();
3 display->setRotation(rotation);
4 isDisplayInit = true;
5 LOGGER("Touch Menu is initialized")
6}
Diese Funktion ist verantwortlich für dir Initialisierung des Displays.
Zuerst wird die init Funktion des display aufgerufen, um die Initialisierung zu beginnen. Ebenso wird
setRotation aufgerufen, um die Bildschirmausrichtung (rotation) einzustellen.
Nach Abschluss der Initialisierung wird isDisplayInit auf true gesetzt. Dieser Flag ermöglicht es, den Status der Display-Initialisierung zu verfolgen.
void add (uint8_t id, Screen* screen)¶
1void TouchMenuLib::add (const uint8_t id, Screen* screen) {
2
3 if (!isDisplayInit) init();
4
5 if (!screen) {
6 LOGGER_ERROR("screen Pointer ist NULL")
7 return;
8 }
9
10 screen->setDisplay(display);
11
12 std::unique_ptr<Screen> uptr (screen);
13 screens[id] = std::move(uptr);
14
15 screen->setResolution(display->getWidth(), display->getHeight());
16
17 // der erste Screen, den man hinzufügt wird auch als Homescreen genutzt
18 if (screenHistory.empty()) {
19 screenHistory.push(id);
20 }
21}
Diese Funktion ermöglicht das Hinzufügen eines neuen Screens mit einer id zur eigenen Anwendung.
if (!isDisplayInit) init();
if (!screen) {
LOGGER_ERROR("screen Pointer ist NULL")
return;
}
Zuerst wird überprüft, ob das Display bereits initialisiert wurde (siehe init). Anschließend wird überprüft, ob der übergebene Screens Pointer gültig ist. Zeigt der Pointer auf keine Speicheradresse, kehrt die Funktion vorzeitig zurück.
screen->setDisplay(display);
Hier wird die Funktion setDisplay des übergebenen Screens aufgerufen, um das display Objekt diesem Screen zuzuweisen.
std::unique_ptr<Screen> uptr (screen);
screens[id] = std::move(uptr);
Zunächst wird ein Smart Pointer in der Form eines unique_ptr's erstellt, der auf den übergebenen Screen zeigt. Dieser „besitzt“ und managt den Screen und entsorgt diesen, wenn er out of scope geht.
Anschließend wird der unique_ptr in ein Array verschoben, welches alle vorhandenen Screens speichert. Die id dient hierbei als eine Art Schlüssel, um die Screens identifizieren zu können.
screen->setResolution(display->getWidth(), display->getHeight());
Es folgt ein Funktionsaufruf von setResolution, um die Auflösung des hinzugefügten Bildschirms an das Display anzupassen.
if (screenHistory.empty()) {
screenHistory.push(id);
}
Bei std::stack<uint8_t> screenHistory; handelt es sich um einen Stack, der die tatsächliche Reihenfolge der Screens bei der Benutzung speichert. Ist dieser Stack leer, wird der erste Screen, der hinzugefügt wird zum Homescreen.
Der Homescreen erhält das screenHistoryLeveL = 1.
void add (const uint8_t id, Screen* screen, const uint8_t sitebarID)¶
1void TouchMenuLib::add (const uint8_t id, Screen* screen, const uint8_t sitebarID) {
2 if (!screen) return;
3 // LOGGER("Füge neuen Schreen + Sitebar hinzu")
4 add (id, screen);
5 if (sitebars.count(sitebarID) == 0) {
6 LOGGER_ERROR_PATTERN("Sitebar id _ doesn't exists", sitebarID)
7 return;
8 }
9
10 Screen* sitebar = sitebars[sitebarID].get();
11
12 // calculate the size of the Screen
13 uint16_t w = (sitebar->getResolutionWidth() == display->getWidth()) ? display->getWidth() : display->getWidth() - sitebar->getResolutionWidth();
14 uint16_t h = (sitebar->getResolutionHeight() == display->getHeight()) ? display->getHeight() : display->getHeight() - sitebar->getResolutionHeight();
15 uint16_t x = (sitebar->getOffsetX() == 0 && w != display->getWidth()) ? sitebar->getResolutionWidth() : 0;
16 uint16_t y = (sitebar->getOffsetY() == 0 && h != display->getHeight()) ? sitebar->getResolutionHeight() : 0;
17
18 // LOGGER_PATTERN("Berechnete größen: x:_, y:_, w:_, h:_", x, y, w, h)
19
20 screens[id].get()->setResolution(w, h);
21 screens[id].get()->setOffsetPosition(x, y);
22
23 sitebarConnector[id] = sitebarID;
24}
Mit dieser Funktion lässt sich ein neuer Screens (screen) mit id und einer Sidebar hinuzfügen.
if (!screen) return;
Ist screen der nullptr, wird die Funktion abgebrochen, weil sich der screen nicht dem TouchMenuLib Objekt hinzufügen lässt.
add (id, screen);
Anschließend wird die add Funktion aufgerufen, um den Screen hinzuzufügen.
if (sitebars.count(sitebarID) == 0) {
LOGGER_ERROR_PATTERN("Sitebar id _ doesn't exists", sitebarID)
return;
}
Hier wird geprüft, ob die Sidebar ID existiert.
Screen* sitebar = sitebars[sitebarID].get();
Wenn sie existiert, wird ein Pointer auf diese sidebarID innerhalb von sitebars gepseichert.
uint16_t w = (sitebar->getResolutionWidth() == display->getWidth()) ? display->getWidth() : display->getWidth() - sitebar->getResolutionWidth();
uint16_t h = (sitebar->getResolutionHeight() == display->getHeight()) ? display->getHeight() : display->getHeight() - sitebar->getResolutionHeight();
uint16_t x = (sitebar->getOffsetX() == 0 && w != display->getWidth()) ? sitebar->getResolutionWidth() : 0;
uint16_t y = (sitebar->getOffsetY() == 0 && h != display->getHeight()) ? sitebar->getResolutionHeight() : 0;
Nun werden Breite (w), Höhe (h) des Screens sowie seine X-Koordinate (x) und Y-Koordinate(y) berechnet, sodass später nichts von der Sidebar bedeckt wird.
screens[id].get()->setResolution(w, h);
screens[id].get()->setOffsetPosition(x, y);
Nun wird die Auflösung und Position des Screens mit setResolution bzw. setResolution angepasst.
sitebarConnector[id] = sitebarID;
Zum Schluss wird sidebarID in sidebarConnector gespeichert.
void addSidebar (const uint8_t id, Screen* sidebar, uint16_t size, uint8_t site = 0)¶
1void TouchMenuLib::addSitebar (const uint8_t id, Screen* sitebar, uint16_t size, uint8_t site) {
2 // LOGGER("füge neue Sitebar hinzu")
3 if (!isDisplayInit) init();
4
5 if (!sitebar) {
6 LOGGER_ERROR("screen Pointer ist NULL")
7 return;
8 }
9
10 sitebar->setDisplay(display);
11
12 std::unique_ptr<Screen> uptr (sitebar);
13 sitebars[id] = std::move(uptr);
14
15 // LOGGER("berechne größen")
16
17 // Sitebar is up
18 if (site == 0 || site > 3) {
19 sitebar->setResolution(display->getWidth(), size);
20 sitebar->setOffsetPosition(0, 0);
21
22 // Sitebar is right
23 } else if (site == 1) {
24 sitebar->setResolution(size, display->getHeight());
25 sitebar->setOffsetPosition(display->getWidth()-size, 0);
26
27 // Sitebar is down
28 } else if (site == 2) {
29 sitebar->setResolution(size, display->getHeight());
30 sitebar->setOffsetPosition(0, display->getHeight()-size);
31
32 // Sitebar is left
33 } else if (site == 3) {
34 sitebar->setResolution(size, display->getHeight());
35 sitebar->setOffsetPosition(0, 0);
36 }
37}
Mit dieser Methode wird eine neue Sidebar einem vorhandenen Screen hinzugefügt.
if (!isDisplayInit) init();
Dafür wird sichergestellt, dass das Display initialisiert wurde bzw. wird (init).
if (!sitebar) {
LOGGER_ERROR("screen Pointer ist NULL")
return;
}
Außerdem wird geprüft, ob die angegebene Sidebar sidebar auch existiert und nicht der nullptr ist.
sitebar->setDisplay(display);
Nun wird die setDisplay Funktion auf der sidebar aufgerufen, um sie dem display hinzuzufügen.
std::unique_ptr<Screen> uptr (sitebar);
sitebars[id] = std::move(uptr);
Zunächst wird ein Smart Pointer in der Form eines unique_ptr's erstellt, der auf sidebar zeigt. Dieser „besitzt“ und managt die und entsorgt diesen, wenn er out of scope geht.
Anschließend wird der unique_ptr in ein Array verschoben, welches alle vorhandenen Sidebars speichert (sidebars).
Die id dient hierbei als eine Art Schlüssel, um die Sidebars identifizieren zu können.
if (site == 0 || site > 3) {
sitebar->setResolution(display->getWidth(), size);
sitebar->setOffsetPosition(0, 0);
// Sitebar is right
} else if (site == 1) {
sitebar->setResolution(size, display->getHeight());
sitebar->setOffsetPosition(display->getWidth()-size, 0);
// Sitebar is down
} else if (site == 2) {
sitebar->setResolution(size, display->getHeight());
sitebar->setOffsetPosition(0, display->getHeight()-size);
// Sitebar is left
} else if (site == 3) {
sitebar->setResolution(size, display->getHeight());
sitebar->setOffsetPosition(0, 0);
}
Nun wird bestimmt, an welcher Bildschirmseite die Sidebar erscheinen soll. Das lässt sich mit site festlegen.
Bei site = 0 und allen Werten >3 befindet sich diese auf der oberen Seite.
Für size = 1 auf der rechten, für size = 2 auf der unteren und für size = 3 auf der linken Seite.
void loop ()¶
1void TouchMenuLib::loop(){
2
3 if (updateAll) {
4 // if (currentSitebar == UINT8_MAX) LOGGER_PATTERN("zeichne Screen _ und keine Sitebar", screenHistory.top())
5 // else LOGGER_PATTERN("zeichne Screen _ und Sitebar _", screenHistory.top(), currentSitebar)
6 draw();
7 updateAll = false;
8 }
9
10 if (screens.size() == 0) {
11 // LOGGER_ERROR("No Screen found")
12 return;
13 }
14
15 // set touch coordinates
16 input.isTouched = display->getTouch(&input.touchX, &input.touchY);
17
18 // touch input counter
19 if (input.isTouched && inputTimer < millis()) {
20 input.updateTouchPoint = true;
21 // if (input.isTouched) display->circle(input.touchX, input.touchY, 4, 0, COLOR_BLACK, COLOR_BLACK);
22 inputTimer = millis() + TOUCH_INPUT_TIMER;
23 }
24
25 // reset Screensaver time on input
26 if (isScreensaverEnable && screensaverTimer != 0 && input.hasInput())
27 screensaverTimer = millis() + screensaverTime;
28
29 // too long inactivity, go to the screensaver screen
30 if (isScreensaverEnable && screensaverTimer > 0 && screensaverTimer < millis()) {
31 LOGGER("go to Screensaver Screen")
32 goTo(screensaverID);
33 screensaverTimer = 0;
34 return;
35 }
Diese Funktion dient dazu, den Zustand des Objektes zu aktualisieren.
if (updateAll) {
// if (currentSitebar == UINT8_MAX) LOGGER_PATTERN("zeichne Screen _ und keine Sitebar", screenHistory.top())
// else LOGGER_PATTERN("zeichne Screen _ und Sitebar _", screenHistory.top(), currentSitebar)
draw();
updateAll = false;
Zuerst wird geprüft, ob updateAll true ist. Wenn ja, wird draw aufgerufen und ausgeführt, um alle Screens neu zu zeichnen, ehe
updateAll auf false gesetzt wird
if (screens.size() == 0) {
// LOGGER_ERROR("No Screen found")
return;
}
Sollten keine Screens existieren, wird die Funktion abgebrochen.
input.isTouched = display->getTouch(&input.touchX, &input.touchY);
Nun wird in input.isTouched gespeichert, ob display berührt wird. Dafür werden input.touchX und input.touchY an die getTouch des display gegeben.
if (input.isTouched && inputTimer < millis()) {
input.updateTouchPoint = true;
// if (input.isTouched) display->circle(input.touchX, input.touchY, 4, 0, COLOR_BLACK, COLOR_BLACK);
inputTimer = millis() + TOUCH_INPUT_TIMER;
}
Wenn eine Berührung stattfindet und inputTimer geringer als die seit Start vergangenen Millisekunden
(siehe millis()) sind, wird input.updateTouchPoint auf
true gesetzt und dem inputTimer wird ein neuer Wert zugewiesen. TOUCH_INPUT_TIMER ist ein Macro, welches standardmäßig 300 beträgt.
Der input.updateTouchPoint wird also frühstens nach 300 Millisekunden wieder aktualisiert werden können, d.h. erst dann werden neue Eingaben registriert.
if (isScreensaverEnable && screensaverTimer != 0 && input.hasInput())
screensaverTimer = millis() + screensaverTime;
Mit diesem Codeblock wird der screensaverTimer nach einem gültigen Input resettet. Das ist für den nächsten Absatz relevant.
if (isScreensaverEnable && screensaverTimer > 0 && screensaverTimer < millis()) {
LOGGER("go to Screensaver Screen")
goTo(screensaverID);
screensaverTimer = 0;
return;
}
Denn hier wird nach einer zu langen Inaktivitätszeit der Bildschirmschoner aufgerufen, screensaverTimer wird auf 0 gesetzt und die Funktion wird beendet.
if (isScreensaverEnable && input.hasInput() && screensaverTimer == 0) {
LOGGER("reset Screensaver timer")
screensaverTimer = millis() + screensaverTime;
Sollte ein Input vorgenommen werden, während der Screensaver aktiv ist, so wird dieser wieder verlassen und der screensaverTimer startet erneut.
if (screensaverBackOnInput) {
back();
return;
}
}
Sollte screensaverBackOnInput aktiviert sein, so wird back aufgerufen und der letzte Screen vor Einsetzen des Bildschirmschoners wird wieder angezeigt.
screens[screenHistory.top()]->loop(input);
Es erfolgt ein rekursiver Aufruf dieser loop Funktion mit dem Screen, welcher an höchster Stelle des Stacks liegt (screenHistory.top).
Dadurch wird der aktuelle Screen aktualisiert.
if (input.back > 0) back(input.back);
Sollte input.back > 0 sein, rufen wir mit back den Screen mit der entsprechenden ID auf.
else if (input.update) {
LOGGER("Zeichne Screen neu")
screens[screenHistory.top()]->draw();
input.update = false;
}
Andernfalls wird überprüft, ob input.update true ist. Dann zeichnen wir die Änderungen und setzen input.update wieder auf false.
if (currentSitebar != UINT8_MAX) {
sitebars[currentSitebar]->loop(input);
if (input.back > 0) back(input.back);
else if (input.update) {
LOGGER("Zeichne Sitebar neu")
sitebars[currentSitebar]->draw();
}
}
Mit diesem Codeblock werden Sidebars neugezeichnet, sollten Änderungen vorliegen.
Sollte currentSitebar = UINT8_MAX, so wird die Bedingung zum zeichnen nicht erfüllt.
UINT8_MAX ist ein Platzhalter Wert, der in draw Sidebars zugewiesen wird, denen kein Screen zugewiesen werden kann.
Die restliche Vorgehensweise ähnelt dem vorherigen Abschnitt sehr und braucht daher keine weitere Erläuterung.
input.reset();
Zum Schluss wird input.reset aufgerufen. Alle Inputs und Änderungen wurden erfolgreich verarbeitet.
void draw()¶
1void TouchMenuLib::draw() {
2 // LOGGER("Zeichne Menu")
3 if (screenHistory.empty()) return;
4 screens[screenHistory.top()]->draw(); // draw current Screen
5
6 if (!disableSitebarAutomatic && sitebarConnector.count(screenHistory.top()) != 0)
7 currentSitebar = sitebarConnector[screenHistory.top()];
8
9 if (!disableSitebarAutomatic && sitebarConnector.count(screenHistory.top()) == 0)
10 currentSitebar = UINT8_MAX;
11
12 // if sitebar is available, draw this too
13 if (currentSitebar != UINT8_MAX)
14 sitebars[currentSitebar]->draw();
15}
Diese Funktion dient dazu, den aktuellen Screen (und wenn vorhanden auch Sidebars) auf dem Display anzuzeigen.
if (screenHistory.empty()) return;
Sollten (noch) keine Screens existieren (siehe ScreenHistoryLevel), wird die Funktion sofort verlassen.
screens[screenHistory.top()]->draw(); // draw current Screen
Andernfalls wird die draw Funktion des aktuell angezeigten Screens aufgerufen (dieser befindet sich an oberster Stelle des screenHistory Stacks).
if (!disableSitebarAutomatic && sitebarConnector.count(screenHistory.top()) != 0)
currentSitebar = sitebarConnector[screenHistory.top()];
Sollte disableSidebarAutomatic false sein und sollte es eine Sidebar für den aktuellen Screen geben,
so erhält currentSidebar die entsprechende ID.
if (!disableSitebarAutomatic && sitebarConnector.count(screenHistory.top()) == 0)
currentSitebar = UINT8_MAX;
Hat der aktuelle Screen jedoch keine Sidebar und disableSidebarAutomatic ist weiterhin false, so wird
currentSidebar UINT8_MAX zugewiesen, da es für diese Sidebar keinen basenden Screen und somit keine passende ID gibt.
Das ganze ist eine Art Platzhalter Wert.
if (currentSitebar != UINT8_MAX)
sitebars[currentSitebar]->draw();
}
Ist ref:currentSidebar<touchmenulibvcurrentsidebar> nicht UINT8_MAX, so wird sie mit currentSidebar draw gezeichnet.
void back(const uint8_t i = 1)¶
1void TouchMenuLib::back(const uint8_t i){
2 LOGGER("go back")
3 // TODO: gehe max. bis zum Homescreen (erstes Element im Stack zurück)
4 for(int j = i; j > 0 && screenHistory.size() > 1; j--) {
5 screenHistory.pop();
6 }
7 updateAll = true;
8}
Diese Funktion ermöglicht es, in der screenHistory i Schritte zurückzugehen, d.h. vorher bereits aufgerufene Screens erneut aufzurufen.
Während der for-Schleife wird jeweils das oberste Element des Stacks entfernt, sodass der vorherige Screen nun an der Spitze des Stacks liegt. Das
screenHistoryLevel wird um 1 verringert, da wir uns nach dem Entfernen des obersten Screens vom Stack eine Ebene tiefer befinden, als vorher.
Nach dem i-ten Schleifendurchlauf, wird updateAll auf true gesetzt.
bool goTo (const uint8_t id, const bool toHistory = true)¶
1bool TouchMenuLib::goTo(const uint8_t id, const bool toHistory){
2 LOGGER_PATTERN("goTo Screen _", id)
3 if (screens.count(id) == 0) return false;
4
5 if (!toHistory) screenHistory.pop();
6 screenHistory.push(id);
7 updateAll = true;
8 return true;
9}
Diese Funktion ermöglicht es, zu einem bestimmten Screen innerhalb der screenHistory zu navigieren.
if (screens.count(id) == 0) return false;
Wenn die übergebene ID in screens nicht gefunden werden kann, existiert kein Screen mit dieser ID und die Funktion gibt false zurück.
if (!toHistory) screenHistory.pop();
Wenn der übergebene bool toHistory auf false gesetzt ist, wird der aktuelle Screen aus der screenHistory entfernt. Des ist nützlich,
falls, man keinen neuen Screen auf dem screenHistory Stack speichern will.
screenHistory.push(id);
updateAll = true;
return true;
}
Wenn der toHistory jedoch auf true gesetzt ist, wird das screenHistoryLevel um 1 erhöht, die übergebene ID auf den Stack an oberster Stelle
gespeichert und anschließend wird updateAll
void setInputEnter()¶
1void TouchMenuLib::setInputEnter(){
2 input.enter = true;
3}
void setInputRight()¶
1void TouchMenuLib::setInputRight(){
2 input.right = true;
3}
void setInputLeft()¶
1void TouchMenuLib::setInputLeft(){
2 input.left = true;
3}
void setInputUp()¶
1void TouchMenuLib::setInputUp(){
2 input.up = true;
3}
void setInputDown()¶
1void TouchMenuLib::setInputDown(){
2 input.down = true;
3}
void setScreensaver(const uint8_t screenID, unsigned long time, bool backOnInput = true)¶
1void TouchMenuLib::setScreensaver(const uint8_t screenID, unsigned long time, bool backOnInput) {
2 isScreensaverEnable = true;
3 screensaverBackOnInput = backOnInput;
4 screensaverID = screenID;
5 screensaverTime = time;
6 screensaverTimer = millis() + 2*screensaverTime;
7}
Mit dieser Funktion lässt sich ein Bildschirmschoner erstellen, der nach einer bestimmten Zeit (time) einsetzt. Dabei ist screenID
die ID, mit der sich der Screensaver aufrufen lässt und mit backOnInput wird angegeben, ob nach Ende des Bildschirmschoners der zuletzt aufgerufene Screen wieder angezeigt werden soll.
bool enableScreenSaver ()¶
1bool TouchMenuLib::enableScreenSaver () {
2 if (screensaverID != UINT8_MAX) isScreensaverEnable = true;
3 return isScreensaverEnable;
4}
Diese Funktion setzt isScreensaverEnable auf true, wenn eine ScreensaverID gesetzt wurde.
void disableScreenSaver ()¶
1void TouchMenuLib::disableScreenSaver () {
2 isScreensaverEnable = false;
3}
Diese Funktion setzt isScreensaverEnable auf false und sorgt dafür, dass kein Bildschirmschoner mehr einsetzt.
Display& getDisplay()¶
1Display& TouchMenuLib::getDisplay(){
2 if (!isDisplayInit) init();
3 return *display;
4}
Diese Funktion gibt display zurück. Falls dieses noch nicht initialisiert war, wird es zuerst initialisiert.
uint8_t getScreenID()¶
1uint8_t TouchMenuLib::getScreenID() {
2 return screenHistory.top();
3}
Gibt die ID des aktuellen Screens zurück.
uint8_t getScreensNumber()¶
1uint8_t TouchMenuLib::getScreensNumber() {
2 return screens.size();
3}
Gibt die Anzahl an Screens in screens zurück.
Variablen und Konstanten Beschreibung¶
std::map<uint8_t, std::unique_ptr<Screen>> screens¶
Hierbei handelt es sich um eine Map, die Screens mit einer eindeutigen ID verknüpft.
std::stack<uint8_t> screenHistory;¶
In diesem Stack werden die IDs der Screens in ihrer Anzeigereihenfolge gespeichert. Der erste hier gespeicherte Screens, der Screen mit der ID 1, wird auch als Homescreen bezeichnet.
std::map<uint8_t, std::unique_ptr<Screen>> sitebars¶
Hierbei handelt es sich um eine Map, die Screens, die als Sidebar dienen, mit einer eindeutigen ID verknüpft.
std::map<uint8_t, uint8_t> sitebarConnector¶
Hier werden die IDs von Screens mit ihrer entsprechenden Sidebar gespeichert.
uint8_t currentSitebar = UINT8_MAX¶
Setzt die aktuelle Sidebar auf UINT8_MAX. Dies ist ein Platzhalterwert, der aussagt, dass die Sidebar keinem Screens zugewiesen ist.
bool deactivateSitebar = false¶
Mit deactivateSitebar = true lässt sich eine Sidebar deaktivieren. Ist standardmäßig auf deactivateSitebar = false, damit Sidebars (falls vorhanden) auch angezeigt werden.
Display* display¶
Ein Pointer auf ein Display Objekt.
bool isDisplayInit = false¶
Gibt an, ob das Display bereits initialisiert wurde. Standardmäßig ist dies nicht der Fall.
uint8_t screenHistoryLevel = 0¶
Gibt an, in welcher Ebene der screenHistory wir uns befinden. Standardmäßig befinden wir uns in der 0. Ebene, weil noch keine Screens existieren.
Inputs input;¶
Gibt Informationen zu den Eingaben des Benutzers an, wie z.B. bei Berührungen (siehe input )
bool screensaverBackOnInput = false¶
Gibt an, ob nach Ende des Bildschirmschoners (also wenn während der Bildschirmschoner aktiv ist ein Input durchgeführt wird),
der vor Einsetzen des Bildschirmschoners aktive Screen angezeigt werden soll (screensaverBackOnInput = true) oder ob der Homescreen angezeigt werden soll
(screensaverBackOnInput = false).
bool isScreensaverEnable = false¶
Gibt an, ob ein Bildschirmschoner nach einer gewissen Zeit einsetzen soll.
unsigned long screensaverTime = 0¶
Die Zeit in Millisekunden die vergehen muss, damit der Bildschirmschoner einsetzt.
unsigned long screensaverTimer = 0¶
Die Zeit in Millisekunden die bereits vergangen ist. Wird benötigt, um zu prüfen, wann screensaverTime erreicht wird.
uint8_t screensaverID = UINT8_MAX¶
Eine ID bzw. einzigartiger Schlüssel, um den Bildschirmschoner aufzurufen.
unsigned long inputTimer = 0¶
Gibt an, nach wie viele Millisekunden der letzte Input getätigt wurde. Das ist wichtig, um Eingaben besser und effizienter verarbeiten zu können.
bool disableSidebarAutomatic = false¶
Gibt an, ob eine Sidebar automatisch deaktivierbar sein soll (also ob diese ohne eigenes Wirken verschwinden soll). (Anmerkung: Derzeit ist keine Funktion implementiert, die dies könnte)
bool updateAll = true¶
Gibt an, ob Änderungen vorgenommen wurden. Wenn ja, wird in loop die draw Funktion aufgerufen, um all diese Änderungen zu zeichnen.