Menü auf einem Zwei-Zeilen-Display



  • Hallo,

    ich benötige für ein Zwei-Zeilen-Display, welches ich mit einem Atmega32 ansteuere, ein kleines Menü.
    Es werden immer zwei Zeilen (logisch) angezeigt, wobei die obere immer selektiert ist. Navigieren kann man mit hoch/runter und ok/zurück (es gibt einen Controller, von dem die Eingaben stammen).

    Mein erster Entwurf ging von einer Struktur

    submenu
    

    aus, die
    ein Array von strings, die Anzahl von Einträgen und den aktuellen Eintrag
    enthält.
    Dazu gibt es noch eine Struktur

    menu
    

    , die Submenus, das aktuelle Level und die Anzahl an submenus enthält.
    In Code also:

    typedef struct
    {
        const char** entries;
        unsigned int counter;
        unsigned int size;
    } submenu;
    
    typedef struct
    {
        submenu** subs;
        unsigned int level;
        unsigned int size;
    } menu;
    

    Dazu Funktionen wie unter anderem:

    void printMenu(const menu* m);
    
    void down(menu* m);
    void stepIn(menu* m);
    

    Das hat so weit auch funktioniert, allerdings habe ich dabei nicht bedacht, dass verschiedene Einträge verschiedene Submenus aufrufen könnten.

    Ein neuerer Entwurf war dann eine Art verlinkte Liste, das also submenus wieder submenus als member enthalten. Dazu speichert jedes submenu seinen eigenen namen, in etwa also so:

    typedef struct submenu
    {
        const char* title;
        submenu* sub;
    } submenu;
    

    Den Zähler würde ich dann in einer Hauptstruktur speichern und dem jeweiligen Submenu anpassen.

    Folgendes Problem: mit dem Menü soll ja auch was ausgewählt werden, das heißt, wenn man zwischendrin 'ok' drückt, dann geht man eine Ebene tiefer.
    Wenn aber "ganz unten" im Menü 'ok' gedrückt wird, muss ja auch was passieren, oder man müsste irgendwelche Indizes zurückgeben, die signalisieren, was ausgewählt wurde.
    Oder aber man löst das mit Callbacks, so dass jedes submenu seine Aktionen bei den Tastenevents kennt. Dann fällt mir aber keine saubere Lösung ein, da ansonsten die submenus auch ihre parents kenn müssten etc.

    Hat jemand einen Vorschlag, wie man das besser machen könnte, oder sollte ich bei dem Entwurf ersteinmal bleiben und diesen verfeinern?

    Anmerkung:
    Es geht mir nicht darum, dass mir hier jemand meine Aufgaben abnimmt, das ist auch keine Hausaufgabe oder ähnliches, ich möchte nur gerne, dass erfahrenere als ich Leute mich beim Design beraten.

    Schöne Grüße



  • Hi

    Hyde++ schrieb:

    oder man müsste irgendwelche Indizes zurückgeben, die signalisieren, was ausgewählt wurde.
    Oder aber man löst das mit Callbacks, so dass jedes submenu seine Aktionen bei den Tastenevents kennt. Dann fällt mir aber keine saubere Lösung ein, da ansonsten die submenus auch ihre parents kenn müssten etc.

    Die Callback-Variante ist doch okay, dann brauchst du die Indizes nicht auszuwerten.
    Jeder Submenüeintrag könnte ja den Index des Elternmenüs speichern, oder du
    verlinkst die Submenüs doppelt mit Listenkopf im Elternmenü.
    Die Indexvariante mit Strukturzeigerarrays ist vermutlich die einfachere Lösung.


Anmelden zum Antworten