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


von Sam (Gast)


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

von Gast (Gast)


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 };

von Ricardo (Gast)


Lesenswert?

@Gast

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

von Sam (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.