Forum: Mikrocontroller und Digitale Elektronik LCD Menu pointer Auf Funktion


von asuronewcommer (Gast)


Lesenswert?

Hallo zusammen!
Ich habe den ASURO-Roboter mit einem ATMEGA2560 und einem 4x20 LCD 
display erweitert.

Die Grundfunktionen (Vorwärtsfahren, Linie folgen,...) funktionieren 
alle einwandfrei.

Nun bin ich an einem Menu, in welchem man das Programm anwählen kann.

Den Menubaum habe ich einmal gemacht und die Navigation funktioniert. 
Jedoch will ich jetzt, dass unter den einzelnen Menupunkten eine 
Funktion (zB folge Line) ausgeführt wird.
Soweit ich mich in das Thema eingelesen habe, muss es mit einem 
Funktionspointer geschen, jedoch dort happert es ein bisschen. (Das 
ganze ist noch relativ primitiv aber soll zu Verständingung dienen.)



Hier die Code-Schnipsel




struct FSM_TAG { char * menutext; int up, right, left, down, south, 
north;};

struct FSM_TAG watchmenu[20] = {
{"ASURO", 2,  1,  0,  14,  0,  0},
{"Version 2.0",  1,  1,  0,  1,  1,   1, },
{"Follow Line",  5,  3,  2,  0,  2,  2},
{"Press Up\nfor Start",  3,  3,  2,  3,  3,4},
{"Follow Line\n running",  4,  4,  4,  4,  3,4},
{"Make Square",  8,  6,  5,  2,  5,  5},
{"Press Up \nfor Start",  6,  6,  5,  6,  6,7},
{"MakeSquare is running",  7,  7,  7,  7,  6,7},
{"Go Distance",  11,  9,  8,  5,  8,  8},
{"Press Up for Start",9,  9,  8,  9,  9,  10},
{"GoDist\nis running",  10,  10,  10,  10,  9,10},
............
};


Meine Frage ist nun: wie kann ich den Code erweitern, dass meine 
Funktionen (folloLine(), goDist()) beim Anwählen des jeweiligen Menus 
ausgeführt werden?
Zb Untermenupunkt "Follow Line" soll die Funktion followLine(intspeed); 
ausgefürt werden. Oder "goDist" soll die Funktion goDist(int speed, int 
length) ausgeführt werden.

grüsse
stibe

von Michael A. (micha54)


Lesenswert?

Hallo,

ich habe so was ähnliches programmiert, dabei habe ich alle Funktionen 
so normalisiert, daß sie alle z.b. zwei Referenzen auf unsigned integers 
als Parameter bekommen.

struct {
....
int (*execfunction)(unsigned int *, unsigned int *);
unsigned int * param1;
unsigned int * param2;
....
}

Funktionen mit keinem oder nur 1 Parameter bekommen halt einfach 0 in 
der Tabelle, fehlt die Funktion, so wird auch der Funktionspointer 0.

Bei mir ist es z.B. so:

1) eine Funktion show_Menu bekommt einen Pointer auf ein Untermenü (im 
Code, d.h. typecast erforderlich) sowie 0 als 2. Parameter und springt 
dann in ein neues Menü. Der Rückgabewert ist dann der letzte Tastencode, 
mit dem ich 1 Ebene (Back) oder bis zum Anfang (Top) springen kann.

2) eine Funktion e2p_Write bekommt einen Zeiger auf eine Variable im 
eeprom sowie einen weiteren auf die aktuelle Zahl in der Eingabe 
(umgewandelt als unsigned int). Der Rückgabewert ist dann 0 oder 
irgendein Fehlercode.

Usw....halfs ein wenig ?

Gruss,

Michael

von asuronewcommer (Gast)


Lesenswert?

Vielen Dank!


Der Ansatz mit allgemein 2 Übergabeparameter werde ich einmal 
ausprobieren.

Kannst du nicht einmal dein Projekt posten, damit das Ganze einmal zu 
sehen ist?

Danke&Gruss

Stibe

von Sepp (Gast)


Lesenswert?


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.