www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Menü mit switch-case oder Tabelle


Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute
Ich hab mich durch die ganzen Themen über Menüprogrammierung auf uC 
gelesen. Mir wurde allerdings nicht so ersichtlich worin die Vor- und 
Nachteile einer Menüprogrammierung über sitch-case bzw. Tabelle mit 
Zeiger auf Funktionen (vgl. AVR Butterfly) liegen.
Ich werde die Menüprogrammierung mit Tastereingabe und LCD-Ausgabe für 
mein nächstes Projekt brauchen.

Gruß Sam

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Tabellen spart man sich viel Arbeit weil das Anlegen von Menübildern 
schnell von der Hand geht. Arbeit macht nur die grundsätzliche 
Definition von Bildelementen.

Im Beilspiel sieht man die Tabelle für zwei Menübilder. Da der Compiler 
die Daten stur hintereinander anordnet sind es einfach nur unabhängige 
Datenzeilen ohne Array. Also wie ein Array in dem jedes Element eine 
andere Struktur beinhaltet.

Die erste Zeile kennzeichnet den Menübild Kopf. Hier ist der Pointer zur 
Callback Funktion für alle Elemente dieses Menübildes und die Nummer von 
vorherigem und nachfolgendem Menübild.

Die anderen Zeilen sind die vordefinierten Bildelemente. Der Zugriff auf 
die RAM Daten erfolgt weitestgehend ohne Callbackfunktion. Einfach nur 
über die Adresse der Daten und Tabellenangabe um was es sich für Daten 
handelt.
////////////////////////////////////////
// Monitor Dialogs - Connectors

static const HEADER_ITEM DlgMonitorConnectHdr = { ITEM_HEADER, DLG_MONITOR_CONNECT_HEADER, DLG_MONITOR_ENVIR, DLG_MONITOR_TRANSM, &DlgMonitorConnect };
static const DYNAMIC_ITEM DlgMonitorConnect_00 = { ITEM_DYNAMIC|DATA_FLOAT1|FONT_10|DT_BOTTOM|DT_RIGHT|DT_SINGLELINE, 104, 0, 121, 11, &Data.m_fVoltage, 1 };
static const STATIC_ITEM DlgMonitorConnect_01 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_BOTTOM|DT_LEFT|DT_SINGLELINE, 122, 0, 127, 11, TXT_VOLT };
static const STATIC_ITEM DlgMonitorConnect_10 = { ITEM_STATIC|DATA_BITMAP, 0, 12, 119, 63, (uint16_t)&Connectors_120x52bmp };

////////////////////////////////////////
// Monitor Dialogs - Transmitter Signals

static const HEADER_ITEM DlgMonitorTransmHdr = { ITEM_HEADER, DLG_MONITOR_TRANSM_HEADER, DLG_MONITOR_CONNECT, DLG_MONITOR_SERVO, NULL };
static const DYNAMIC_ITEM DlgMonitorTransm_00 = { ITEM_DYNAMIC|DATA_FLOAT1|FONT_10|DT_BOTTOM|DT_RIGHT|DT_SINGLELINE, 104, 0, 121, 11, &Data.m_fVoltage, 1 };
static const STATIC_ITEM DlgMonitorTransm_01 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_BOTTOM|DT_LEFT|DT_SINGLELINE, 122, 0, 127, 11, TXT_VOLT };
static const STATIC_ITEM DlgMonitorTransm_10 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 14, 79, 23, DLG_MONITOR_TRANSM_TAIL };
static const DYNAMIC_ITEM DlgMonitorTransm_11 = { ITEM_DYNAMIC|DATA_FLOAT2|FONT_10|DT_RIGHT|DT_SINGLELINE, 80, 14, 115, 23, &Data.m_ServoInArray[IDX_I_TAIL].m_fServoPos, 100.0 };
static const STATIC_ITEM DlgMonitorTransm_20 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 24, 79, 33, DLG_MONITOR_TRANSM_AILERON };
static const DYNAMIC_ITEM DlgMonitorTransm_21 = { ITEM_DYNAMIC|DATA_FLOAT2|FONT_10|DT_RIGHT|DT_SINGLELINE, 80, 24, 115, 33, &Data.m_ServoInArray[IDX_I_AILERON].m_fServoPos, 100.0 };
static const STATIC_ITEM DlgMonitorTransm_30 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 34, 79, 43, DLG_MONITOR_TRANSM_ELEVATOR };
static const DYNAMIC_ITEM DlgMonitorTransm_31 = { ITEM_DYNAMIC|DATA_FLOAT2|FONT_10|DT_RIGHT|DT_SINGLELINE, 80, 34, 115, 43, &Data.m_ServoInArray[IDX_I_ELEVATOR].m_fServoPos, 100.0 };
static const STATIC_ITEM DlgMonitorTransm_40 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 44, 79, 53, DLG_MONITOR_TRANSM_COLL };
static const DYNAMIC_ITEM DlgMonitorTransm_41 = { ITEM_DYNAMIC|DATA_FLOAT2|FONT_10|DT_RIGHT|DT_SINGLELINE, 80, 44, 115, 53, &Data.m_ServoInArray[IDX_I_COLL].m_fServoPos, 100.0 };
static const STATIC_ITEM DlgMonitorTransm_50 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 54, 79, 63, DLG_MONITOR_TRANSM_FC };
static const DYNAMIC_ITEM DlgMonitorTransm_51 = { ITEM_DYNAMIC|DATA_FLOAT2|FONT_10|DT_RIGHT|DT_SINGLELINE, 80, 54, 115, 63, &Data.m_ServoInArray[IDX_I_FC].m_fServoPos, 100.0 };

Autor: Ricardo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gast

Wirklich schön lesbar ist dieser struct aber nicht...

Autor: Sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich wollte ich eine Tabelle mit {aktuelles Menü, nachfolgendes 
Menü, vorhergehendes Menü, Zeiger auf Funktion}, angelegt als 
struct-Feld. Was ich ein bischen unangenehm finde ist das Anlegen der 
Feldnummer = aktuelles Menü. Wenn ich dies mit nem enum  mache muss ich 
bei Erweiterung/Änderung immer aufpassen, dass die Erweiterung/Änderung 
im struct-Feld auch mit der Erweiterung/Änderung im enum zusammenpasst. 
Vielleicht weiss ja jemand wie ich das besser machen kann.

gruß Sam

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.