Forum: Mikrocontroller und Digitale Elektronik Menüpunktauswahl


von Hannes Albert (Gast)


Lesenswert?

Hallo,
ich möchte gerne aus einigen Menüpunkten einen Auswählen, und zwar so, 
dass man mit den Cursor (links, rechts, obern, unten) einen Menüpunkt 
auswählt und mit Enter bestätigt.
Vielleicht mit den Escape- Esquenzen. Ich hba schon ziemlich viel 
darüber gelesen aber ich hab sowas nicht gefunden.
Hat da jemand eine Ahnung?
vielen Dank für Eure Antworten.

lg
Hannes

von Marco (Gast)


Lesenswert?

Was hast du denn gelesen, wenn du es nicht gefunden hast???

Wie soll das ganze denn überhaupt aufgebaut werden? Ein PC-Programm? Mit 
nem µC?
Soll es auf nem LCD zu sehen sein?
Oder die Punkte auf einer Platte geschrieben und davor leuchten LEDs bei 
der Auswahl?

Wenn µC, was für einer sollte es sein?

Und überhaput...

von Hannes Albert (Gast)


Lesenswert?

ich möchte einfach ein Menue miu dem µC auf den Hyperterminal schreiben 
und dann einen Menüpunkt auswählen. Der jeweils angewählte Menüpunkt 
soll grau hinterlegt sein.
Wenn ich ENTER drücke, soll dieser Strin über das HT an den µC gesendet 
werden.

1. ist mir das graue hinterlegen der Menüpunkte unklar und zweitens, wie 
kann ich dem Hyperterminal sagen, dass der String erst nach dem drücken 
der ENTER- Taste über die serielle Schnittstelle geschickt werden soll.
Das Hyperterminal schickt ja die eingegenenen Daten sofort an die 
serielle Schnittstelle.
Vielen Dank für Eure Bemühungen.

lg
Hannes

von TheMason (Gast)


Lesenswert?

also per hyperterminal selbst geht das nicht.
hyperterminal ist NUR ein terminalprogramm welches RS232 Daten anzeigt 
(und dabei per ESC-Sequenzen bestimmte Features wie 
Cursor-Position,Farbe,Schriftattribute und andere nette Features zur 
verfügung stellt).
Das Menü selbst (Funktionalität und Ausgabe), sowie die Reaktion 
(Steuerung) auf die Cursor-tasten (die Hyperterminal dann selbst als 
ESC-Sequenz sendet) müssen im uC implementiert sein. Das 
Terminalprogramm fungiert dann letztendlich als "großes farbiges 
Text-Display" (wenn man es so formulieren will).
Allerdings gibt es bei den Terminals unterschiedliche Modi (wovon der 
VT100-Modus wahrscheinlich der gängiste Modus ist, lässt sich 
einstellen).
Die einzelnen Modi unterscheiden sich dann durch Funktionalität und 
ESC-Sequenzen.
Das was du bräuchtest wäre eine Script-Sprache mit der du ein solches 
Terminal selber bauen kannst (weil ein normales Terminal ja keine 
Menü-Punkte kennt ..), oder eben eine Hochsprache wie Delphi/C++ mit der 
du sowas realisieren kannst.

Gruß
Rene

von Thomas B. (yahp) Benutzerseite


Lesenswert?

Dazu braucht er keine Scriptsprache und es muss auch mit einem normalen 
Terminal gehen. Schliesslich können das diverse Switches und Router mit 
serieller Schnittstelle auch und Mailboxsysteme (früher in den 
Tiernetzen ;-) konnten das schon.

Einfachste vorstellbare Version ist, dass der µC ständig eine neue Seite 
schickt. Nach jedem Tastendruck wird also das Menü im µC neu generiert 
und rüberschickt. Das bedeutet halt, dass man jedesmal ein paar tausend 
Byte übertragen muss. Da sollte nicht gerade mit 1200 Baud gearbeitet 
werden ;-)

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Einfachste vorstellbare Version ist, dass der µC ständig eine neue Seite
>schickt
Das wird auch die einzige Möglichkeit sein, sofern HT nicht sowas 
ähnlihces wie HTML unterstützt.

von TheMason (Gast)


Lesenswert?

schon richtig, aber ich hab es so verstanden das das hyperterminal das 
menü SELBST erledigen soll, und das kann hyperterminal (oder ein 
x-beliebiges anderes terminal) eben nicht, weil nicht dafür gedacht.
die switche und router die per terminal konfiguriert werden können 
müssen dann solch ein menü selbst "machen" (wie du schon richtig 
meintest selbst den inhalt aufbereiten, an ht senden und auf eingaben 
reagieren).
hab mich mit script-sprache vielleicht etwas blöd ausgedrückt. hätte 
sagen sollen : "wenn ein terminal von sich aus vordefinierte menütexte 
darstellen soll und auf cursor-eingaben reagieren soll, muß man ein 
solches terminal selbst schreiben, egal ob in delphi/c++ oder 
irgendeiner anderen hochsprache (script-sprachen mit eingeschlossen). 
nur wäre es dann eben kein richtiges terminal mehr, da ein terminal NUR 
rs232 daten darstellt und dabei einige features bietet (farbige 
darstellung, cursor-funktionen usw ...)"

aber abgesehen davon, man muß nicht jedesmal die komplette seite senden, 
es reichen einige wenige befehle wenn man sich die ESC-Sequenzen von 
VT100 genauer anguckt (zeilen teilweise löschen, cursor-positionieren). 
hab vor ein paar jahren mal sowas mit nem 8051 gemacht. auch eine 
menüsteuerung mittels VT100 (aber ohne farbe). je nachdem wie man die 
daten organisiert und das menü aufbaut kommt man mit recht wenig traffic 
aus (1200 baud ist wahrlich etwas wenig, aber ab 9600 wirds gut 
bedienbar, wenns nur um die auswahl von menüpunkten geht)

von Hannes Albert (Gast)


Lesenswert?

Thomas, kannst du das noch genauer schreiben, wie du das meinst. Wie 
soll ich das hinterlegen eines Menüpunktes machen bzw wie ist das 
aufgebaut - das Menü. Brauch ich das was spezielles bzw. wie realisier 
ich das.
Vielen Dank.

lg
Hannes

von Karl heinz B. (kbucheg)


Lesenswert?

Stell dir HT als deine Ausgabefläche vor.
Sie wie ein LCD. Mehr ist das nicht!

Du kannst den Cursor rumjagen und kannst Schriftattribute
umstellen.
Dazu muss aber der µC auch die entsprechenden Kommandos
schicken. Diese Kommandos sind diese ominösen Escape-Sequenzen.

Sagen wir mal, du möchtest folgendes Menü aufbauen

1) Edit
2) Copy
3) Paste

(Ich verwende im folgenden die VT100-Sequenzen)
Dazu teilst du dem HT mit dass es erst mal den Bildschirm
löschen soll. Du schickst ihm also die Sequenz für 'Clear-Screen'
(Für printf musst du natürlich deine UART Übertragungsfunktion
einsetzen)

  printf( "/x1b[2J" );

Jetzt ist der Bildschirm leer und der Cursor steht links oben.
Du möchtest, dass dein Menü in Zeile 2 beginnt. Also schickst du
den Cursor dort hin. Aus der VT100 Doku ergibt sich dass die
Escape Sequenz "Cursor Home" genau das macht, wenn man Zeilen
und Spaltennummern angibt:

  printf( "\x1b[2;1H" );

Jetzt müsste der Cursor also am Anfang der 2. Zeile stehen. Ich bin
jetzt nicht mehr sicher, ob hier bei 0 oder bei 1 zu zählen begonnen
wird. Kann man aber ausprobieren.

Danach gibst du deine Menüpunkte aus:

  printf( "1) Edit\n" );
  printf( "2) Copy\n" );
  printf( "3) Paste\n" );

Nach diesem Ausgaben steht der Cursor in der 5. Zeile ganz links.
Willst du also den 1. Menüpunkt hervorheben, so muss der
Cursor erst mal 4 Zeilen nach oben gehen, oder was dazu gleich-
bedeutend ist: er muss wieder an den Anfang der 2. Zeile.
Die Escape Sequenz dazu kennst du schon: "Cursor Home"
Also schicken wir den Cursor wieder dort hin:

  printf( "\x1b[2;1H" );

Der Cursor steht jetzt wieder am Anfang der Zeile in der "1) Edit" 
steht.
Das möchtest du hervorheben. Also stellst du die Schrift um, sodass sich
schwarze Schrift auf hellem Hintergrund ergibt. Ein kurzes Suchen in
der VT-100 Doku ergibt, dass die Sequenz "Set Attribute Mode" dafür
benutzt werden kann. Wir benutzen 'reverse'. Also schicken wir

  printf( "\x1b[7m" );

Alles was jetzt ausgegeben wird, wird also invertiert dargestellt.
Dazu geben wir den Text "1) Edit" nachmal aus, der dann folgerichtig
mit heller Schrift auf dunklem Grund ausgegeben wird.

Jetzt warten wir auf eine Benutzereingabe.  Nehmen wir mal an die
wurde gemacht und der Benutzer hat 'cursor down gedrückt' und dein
µC hat das auch richtig erkannt. Die Absicht des Benutzers ist
klar, er möchte den 1. Menüpunkt deaktivieren und den 2. Menüpunkt
aktivieren.

Was muss daher geschehen?
Der 1. Menüpunkt muss wieder auf normale Schrift umgeschaltet werden
und dafür muss der 2. Menüpunkt invertiert dargestellt werden.
Um den 1. Menüpunkt normal darzustellen schicken wir
den Cursor an den Anfang dieser Zeile:

  printf( "\x1b[2;1H";

schalten die Schrift wieder auf normal

  printf( "\x1b[0m";

und geben den Text aus

  printf( "1) Edit" );

danach gehts an den Anfang der nächsten Zeile

  printf( "\x1b[3;1H" );

schalten dort invertiert ein

  printf( "\x1b7m" );

und geben den Text aus der invertiert dargestellt werden soll

  printf( "2) Copy" );

Wenn jetzt alles glatt gegangen ist, dann ist der 1. Menüpunkt
wieder normal und dafür wurde der 2. Menüpunkt hervorgehoben.

Und so gehts weiter. Du wartest auf eine Benutzereingabe und
reagierst entsprechend. Das kann heissen, dass du den Cursor durch
die Gegend jagst und Texte durch überschreiben (mglw. mit anderen
Textattributen) erneuerst. Hat der Benutzer 'Return' gedrückt, dann
wirst du den momentan aktiven Menüpunkt übernehmen und irgendeine
Aktion auslösen und als Folge davon zb. den Bildschirm löschen oder
ein anderes Menü aufbauen.
Das Prinzip ist aber immer dasselbe: Dein µC jagt im Hyperterminal
den Cursor durch die Gegend und macht gezielte Ausgaben, sodass sich
für deinen Benutzer ein Menü ergibt.

von Hannes Albert (Gast)


Lesenswert?

Hallo TheMason,

Könntest du mir da Tipps geben wie ich das mache. Scheint ja ein 
bisschen schwieriger zu sein. Oder kannst du mir dein Programm irgendwie 
zukommen lassen. Ich steh momentan voll an.
Vielen Dank.

lg
Hannes

von TheMason (Gast)


Lesenswert?

also das programm selbst habe ich nicht mehr da (ist mir bei einem 
hdd-crash zerbröselt ...)
aber ich kann dir folgende vorgehensweise empfehlen (änlich dem von karl 
heinz im posting oben drüber) :

baue dir funktionen die folgendes machen
- bildchirm löschen (1 esc sequenz)
- zeile ab cursor-position löschen (1 esc sequenz)
- zeile bis cursor-position löschen (1 esc sequenz)
- farbe setzen (1-2 esc sequenzen)
- cursor-positionieren (1-2 esc sequenzen)
- text ausgeben

ablauf

- initialisierung/update
1. lösche den bildschirm
2. setze 1. cursorposition
3. gebe farbe aus (schwarz wenn nicht selektiert, grau wenn selektiert)
4. gebe text aus
5. wiederhole für anzahl der menüpunkte die schritte 2-4

- empfang von daten per uart (nach möglichkeit int. gesteuert)
1. speichere dir alles in einem buffer

- hauptporgramm-verarbeitung
1. lese zeichen aus dem buffer
2. = esc ? , dann lese noch ein zeichen aus dem buffer
3. wenn es eine cursor taste ist setze variable die dir den selektierten 
menüpunkt (als zahl) hält
4. mache ein update (abschnitt initialisierung)
5. war das erste gelesene zeichen ein enter, springe in die 
entsprechende funktion

das ist jetzt nur ein grober ablauf, wie man ein solches menü 
realisieren kann.
ich vermute mal du machst das ganze in c. da hat man dann noch einiges 
an möglichkeiten (vor allem wenn du die datenstrukturen (stichwort : 
texte, funktionen die aufgerufen werden) richtig aufsetzt) den code 
klein schnell universell und vor allem flexibel zu gestalten.

von Karl heinz B. (kbucheg)


Lesenswert?

> aber abgesehen davon, man muß nicht jedesmal die komplette seite senden,

Er sagte ja auch, daß das die einfachste vorstellbare Möglichkeit
ist. Und da gebe ich ihm schon recht. Gerade einen Neuling bringt
das an den Rande des Wahnsinns, wenn der Cursor wieder mal nicht
dort ist, wo ihn das Programm annimmt :-)

von TheMason (Gast)


Lesenswert?

ok ...

ist vielleicht ein bissl viel auf einmal wenn man noch nicht viel damit 
gemacht hat. für den ersten test wäre es sicherlich einfacher alles neu 
zu senden.
aber dann sollte man sich auch schnell an die optimierung machen (dann 
erkennt man welches potzential in der vt100 darstellung liegt) und man 
kann freudig größere menüs darstellen ohne das das ganze zeitraubend 
wird, und die eigentliche steuerung/darstellung kaum mehr rechenzeit 
frisst ...

von Karl heinz B. (kbucheg)


Lesenswert?

full ack

Am Besten ist sowieso mal ein bischen spielen.
Was weis ich: Die aktuelle Uhrzeit an immer
der gleichen Stelle ausgeben. Dann vielleicht
nur die Minuten invertiert ausgeben. Dann das
Ganze in Grosschrift.
Irgendsowas in der Richtung. Dann hat man den
Dreh schnell raus und kann sich seinem eigentlichen
Problem widmen.

Und ganz wichtig: Hilfsfunktionen basteln!
Aber das hast du ja schon angesprochen. Ich
seh nur immer wieder, wie gerade Neulinge an
der von ihnen selbst geschaffenen Komplexität
ersticken. Funktionen für Cursor positioniern,
Schirm löschen, etc. sind schnell gemacht und
mindern das Problem etwas.

von TheMason (Gast)


Lesenswert?

ebent ...

geht nix über strukturiertheit und das problem in möglichst viele kleine 
teilprobleme zurecht-crunchen und dann die teilprobleme schnell und 
sauber implementieren.
aber das ist gerade für anfänger mehr eine geduldsfrage (man will ja was 
sehen :-))
kenne das problem ja auch ... mal eben schnell was machen damit man was 
sieht, dann sieht man was mehr, dann noch mehr und dann sieht man gar 
nix mehr weil der code so wuselig wird und man selber nicht mehr 
durchblickt und am schluß muß man den weg eh neu gehen :-)))
aber so lernt man ... :-)

von Hannes Albert (Gast)


Lesenswert?

Danke für deine ausführliche Erklärung, Hilft mir sehr,
Mein Problem ist noch, dass ich auf einem µC arbeite, der alles zyklisch 
wiederholt,
ich kann also nicht das Menü ausgeben und dann darauf warten, dass etwas 
über die serielle schnittstelle hereinkommt, ich muss etwas 
hinausschreiben, dann mit einem trigger ausschalten, dann warten, bis 
was reinkommt, dann wieder einschalten und dann das machen.
Es ist a bissl komüpliziert, aber es wird schon gehen.
Vielen Dank nochmals.

lg
Hannes

von TheMason (Gast)


Lesenswert?

Was ist soll das denn für ein uC sein ?!?

von Hannes Albert (Gast)


Lesenswert?

es is eine SPS

lg
Hannes

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.