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
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 }; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.