|
|
MenuDesignerMenüsystem für monochrome GLCDs
[Bearbeiten] IdeeDie Idee war es, ein möglichst einfaches Menüsystem für kleinere LCDs zu haben, welches sich leicht erstellen lässt und dennoch die wichtigsten Elemente moderner Deskop GUIs zu bieten. Außerdem sollte der Flashverbrauch niedrig gehalten werden und nicht zwangsweise mit komplexeren Menüs immer größer werden. [Bearbeiten] Features
[Bearbeiten] Einschränkungen
Die Limits sind sicher hoch genug, dass es für fast alle Anwendungsfälle reichen müsste. [Bearbeiten] FunktionsweiseDie Funktionen für die Grafikausgabe und dem Zugriff auf die Menüstruktur muss selbst geschrieben werden. Dies ermöglicht eine Anpassung an eigene Displays und beliebige Speicher. Bei der Grafikausgabe, wird vor jedem Neuzeichnen einmal menu_screen_clear aufgerufen. Die Funktion ist deswegen nicht als einzelne menu_screen_set Aufrufe integriert, weil es oftmals einfach schnellere Methoden zum Löschen eines Bildschirms gibt, als jeden Pixel einzeln zu setzen. Die menu_screen_set Funktion setzt beim Neuzeichnen alle Pixel, wobei bei übereinander liegenden Objekten der gleiche Pixel mehrfach gesetzt werden kann. Generell sollte nur das niederwertigste Bit beachtet werden und der Inhalt der höherwertigen irrelevant sein. Außerdem muss darauf geachtet werden, dass bei dem Funktionsaufruf die Bildschirmgröße noch nicht beachtet wird. Zum Schluss eines Neuzeichnens, wird einmalig menu_screen_flush() aufgerufen. Dann sollte der zuvor durch menu_screen_set gesetzte Inhalt wirklich auf das LCD geschrieben werden. Zwar kann auch stattdessen menu_screen_set direkt jeden Pixel auf dem LCD setzten, dann wird jedoch eventuell der Bildaufbau sichtbar und beim mehrfachen setzen des gleichen Pixels kann dies unnötig lange dauern. menu_byte_get muss dem Interpreter die Daten der Menüstruktur liefern. Die Implementierung kann aus einem simplen Arrayzugriff oder aber aus einer komplexen Leseroutine für externe EEPROMs oder MMC bestehen. Generell sollte jedoch Speicher mit langer Latenz vermieden werden. Ist die Menüstruktur fehlerhaft, kann es zu Leseversuchen außerhalb der Größe der Menüstruktur kommen, ansonsten sollte dies nicht vorkommen. menu_action wird immer dann aufgerufen, wenn ein Objekt mit einer Aktion belegt wurde. Das Ändern der Auswahl in einer Liste wird ebenfalls automatisch eine eigene Aktion zugewiesen. Als Parameter wird eine eindeutige 16Bit Nummer übergeben. Im MenüDesigner wird einer Aktion ein Name gegeben. Alle Namen werden automatisch durchnummeriert und eine Header Datei generiert, welche die Zuordnung Nummer - Aktion Name ermöglicht. Als Rückgabe kann angegeben werde ob die Aktion ein Neuzeichnen des Bildschirms erfordert. Dies ist sinnvoll wenn kein Bildschirmwechsel erfolgt, aber sich auf dem aktuellem etwas geändert hat, z. B. ein anderer Text gesetzt wurde. Indexnummern für Dynamische Texte und Grafiken, die Eigenschaften von Radiogroups und Checkboxen werden auf eine ähnliche Weise automatisch generiert und sind dann unter dem eingestellten Namen in den Arrays auffindbar. Dynamische Texte müssen generell wie in C Nullterminiert (\0) sein und haben keine Längenbeschränkung. Der Inhalt einer Liste ist ein langer Text, wobei \n eine neue Zeile markiert. Grafiken werden gelesen, bis der letzte Pixel der fest eingestellten Größe gesetzt ist. menu_redraw sollte immer dann aufgerufen werden, wenn sich dynamische Texte/Grafiken geändert haben und einmal zu Beginn des Programms. menu_keypress ist die generelle Eingabemöglichkeit des Menüs. Je nach eingestellten Key werden die entsprechenden Aktionen ausgeführt. Beispielsweise „Fokus aufs nächste Objekt setzen“. Der Parameter darf einen Wert von 1 bis 255 haben. [Bearbeiten] WeiterentwicklungFalls es Interesse an weiteren Features gibt, bin ich - je nach Funktion - gerne bereit diese zu Implementieren. Schreibt am besten ins Forum. Bisherige Ideen, deren Aufwand ich als nicht all zu hoch einschätze:
[Bearbeiten] Download |