Menü mit switch-case oder Tabelle

Gast #1449931
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
Gast #1449965
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.
1
////////////////////////////////////////
2
// Monitor Dialogs - Connectors
3

4
static const HEADER_ITEM DlgMonitorConnectHdr = { ITEM_HEADER, DLG_MONITOR_CONNECT_HEADER, DLG_MONITOR_ENVIR, DLG_MONITOR_TRANSM, &DlgMonitorConnect };
5
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 };
6
static const STATIC_ITEM DlgMonitorConnect_01 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_BOTTOM|DT_LEFT|DT_SINGLELINE, 122, 0, 127, 11, TXT_VOLT };
7
static const STATIC_ITEM DlgMonitorConnect_10 = { ITEM_STATIC|DATA_BITMAP, 0, 12, 119, 63, (uint16_t)&Connectors_120x52bmp };
8

9
////////////////////////////////////////
10
// Monitor Dialogs - Transmitter Signals
11

12
static const HEADER_ITEM DlgMonitorTransmHdr = { ITEM_HEADER, DLG_MONITOR_TRANSM_HEADER, DLG_MONITOR_CONNECT, DLG_MONITOR_SERVO, NULL };
13
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 };
14
static const STATIC_ITEM DlgMonitorTransm_01 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_BOTTOM|DT_LEFT|DT_SINGLELINE, 122, 0, 127, 11, TXT_VOLT };
15
static const STATIC_ITEM DlgMonitorTransm_10 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 14, 79, 23, DLG_MONITOR_TRANSM_TAIL };
16
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 };
17
static const STATIC_ITEM DlgMonitorTransm_20 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 24, 79, 33, DLG_MONITOR_TRANSM_AILERON };
18
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 };
19
static const STATIC_ITEM DlgMonitorTransm_30 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 34, 79, 43, DLG_MONITOR_TRANSM_ELEVATOR };
20
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 };
21
static const STATIC_ITEM DlgMonitorTransm_40 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 44, 79, 53, DLG_MONITOR_TRANSM_COLL };
22
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 };
23
static const STATIC_ITEM DlgMonitorTransm_50 = { ITEM_STATIC|DATA_TEXT|FONT_10|DT_RIGHT|DT_SINGLELINE, 0, 54, 79, 63, DLG_MONITOR_TRANSM_FC };
24
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 };
Gast #1450924
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.