Hi. Wie kann man mit VT100 Ansi Codes eine feste Kopf- und Fußzeile erzeugen? Also eine Zeile, die das Terminal nicht "Rausscrollt"? Ich bin so weit, dass ich Farben und Cursor Bewegungen hin bekomme und unten eine "Eingabezeile" habe. Aber die scrollt immer mit nach oben, wenn Daten kommen. Grüße und einen guten Start ins neue Jahr.
Könnte gehen: http://ascii-table.com/ansi-escape-sequences-vt-100.php "Set top and bottom lines of a window"
Hi. Also leider funktioniert das nicht. Die Kopf- und Fußzeile wird trotzdem weg gescrollt. Außerdem habe ich folgendes Problem: Cursortasten, F-Tasten usw werden vom Controller mit Zeichenfolgen wie [A oder [[24~ als Echo zurückgegeben.
Tim schrieb: > Also leider funktioniert das nicht. Die Kopf- und Fußzeile wird trotzdem > weg gescrollt. Dann hast du wohl einfach kein VT100-Terminal. Oder du hast die Escape-Sequenz nicht korrekt codiert. Quelltext?!
> Cursortasten, F-Tasten usw werden vom Controller mit Zeichenfolgen wie > [A oder [[24~ als Echo zurückgegeben. Ein echtes VT100 hat keine F-Tasten (es gibt aber PF1 bis PF4).
Hi. Natürlich habe ich kein "echtes" VT100 Terminal als Hardware-Gerät. Sondern ich hab einen PC. Es wird lediglich das VT100 / Ansi Protokoll benutzt. Es klappt auch schon, damit z.B. Zeichen auf der Konsole einzufärben usw. Ich versuche, ein Command Line Interface zu programmieren, welches dann über die Konsole erreichbar ist Es handelt sich um JavaScript Code. Er soll mit node.js auf einem Raspi ausgeführt werden, und das komplette User Interface stellen und zwar per per Konsole, telnet und HTTP Angefangen habe ich mit dem Konsole CLI. Nächster Step wäre Telnet, sobald es grundlegend funktioniert. Hier mal der Code für das CLI, aber noch stark unfertig, es sind noch keine Befehle und entsprechende Ausgaben eingebaut, sondern bis jetzt nur der Eingabepromt. // Programm für CLI - Ein-und Ausgabe var os = require('os'); var os_platform = os.platform(); var os_arch = os.arch(); var os_release = os.release(); var input=''; reset_konsole(); print('Welcome!'); input_promt(); // Print Funktion, Steuerzeichen automatisch einfuegen function print(text,color,style,option) { out=text; process.stdout.write('\r\033[2K'+out+'\r\n'); //process.stdout.write(out+'\r\n'); } // printr Print Rohdaten Funktion function printr(text) { out=text; process.stdout.write(out); } //Konsole resetten function reset_konsole() { process.stdin.setRawMode( true ); process.stdout.setEncoding('utf8'); process.stdin.setEncoding('utf8'); process.stdout.write('\033c'); process.stdout.write('\033[2J'); process.stdout.write('\033[1;24r'); process.stdout.write('\033[f'); var input=''; } //Eingabepromt function input_promt() { process.stdout.write('\r\n\033[2K\033[97m'); process.stdout.write('\033[1mCOMMAND > \033[0m'); process.stdout.write('\033[97m'+input+'\033[39m'); } //Eingabe verarbeiten process.stdin.on('data',function (chunk) { console_input(chunk)}); function console_input(data) { if (data.charCodeAt(0)==13) { input+=data.replace(/[^\x20-\x7E]*/g, ''); if (input!='') { process.stdout.write('\r\033[2K'+input+'\r\n'); input=''; input_promt(); } } else { input+=data; process.stdout.write('\033[97m'+data+'\033[39m'); } } //todo: SWITCH CASE Block mit Befehlen und Ausgaben function tick() { //process.stdout.write('test\n'); print(test); input_promt(); setTimeout(tick,1000); }
Eine feste Kopfzeile mit ein paar Infos und den Eingabepromt als feste Zeile ganz unten hätte ich gerne gehabt. Leider gelang es mir nicht, die beiden Zeilen zu "fixieren", sie werden dann mit weg gescrollt, wenn Text ausgegeben wird. Einzigste Möglichkeit die ich fand: Beides löschen, dann Text ausgeben und beide Zeilen wieder neu schreiben. Ich hab es dann aber erst mal bei der Variante mit dem einfachen Eingabepromt gelassen.
Das Problem mit den Cursor- und F-Tasten habe ich behoben durch den Regex: input+=data.replace(/[^\x20-\x7E]*/g, '');
Hmm schade, hat doch nicht geklappt. es sorgte nur dafür, dass die Sondertasten im Klartext rüber kommen. Ich hab aber noch bisschen erweitert mit zusätzlicher Längenprüfung: if (data.length == 1) { input+=data.replace(/[^\x20-\x7E]*/g, '');} Bei den Sondertasten steht in data nämlich mehr als 1 zeichen drin, und zwar der komplette Funktionstasten-Code.
c-hater schrieb: > Tim schrieb: > >> Also leider funktioniert das nicht. Die Kopf- und Fußzeile wird trotzdem >> weg gescrollt. > > Dann hast du wohl einfach kein VT100-Terminal. Oder du hast die > Escape-Sequenz nicht korrekt codiert. Ich habe mich gerade mal gefragt, ob gängige Emulatoren das denn unterstützen. $ printf '\e[2;25r\e[S' $ test erstezeile $ [viele male enter] $ test erstezeile bleibt stehen in allen Emulatoren, die ich gerade probiert habe. Ich tippe mal auf falschen Umgang mit der Escapesequenz.
Tim schrieb: > Leider gelang es mir nicht, die beiden Zeilen zu "fixieren", sie werden > dann mit weg gescrollt, wenn Text ausgegeben wird. Das ist auch ein falscher Umgang mit VT100. Wenn man eine Bildschirmmaske verwendet, wird Text nicht durchgeschrollt, sondern der Cursor wird positioniert und der Text an die addressierte Stelle geschrieben. Dann stellt sich die Frage nach fixierten Zeilen garnicht, auf diese Weise sind praktisch alle Zeilen fixiert. Eine Maske eben. Georg
Also laut meiner Liste gibt es Codes für Farben, die auch funktionieren: Set Display Attributes Set Attribute Mode <ESC>[{attr1};...;{attrn}m Sets multiple display attribute settings. The following lists standard attributes: 0 Reset all attributes 1 Bright 2 Dim 4 Underscore 5 Blink 7 Reverse 8 Hidden Foreground Colours 30 Black 31 Red 32 Green 33 Yellow 34 Blue 35 Magenta 36 Cyan 37 White Background Colours 40 Black 41 Red 42 Green 43 Yellow 44 Blue 45 Magenta 46 Cyan 47 White Wie gesagt, ich nutze auch kein "echtes" VT100 Terminal sondern einen PC. Hat jemand eine Idee, wie man das Scrollen von Text auf dem Bildschirm komplett ausschalten kann? So dass bei Erreichen von Zeile 25 der Bildschirm nicht nach oben weg scrollt.
Ich kenne aus Modem Zeiten die Unterscheidung zwischen VT100 Emulator und VT100 mit Ansi-Farben. Das scheint eine Erweiterung zu VT100 zu sein. Ich kann mir durchaus vorstellen, dass dein VT100 Emulator die alle Features vollständig implementiert hat. Das war damals zu Modem Zeiten schon ein ständiges Ärgernis - besonders bei Windows Programmen.
Das Zauberwort heißt "scrolling region". http://vt100.net/docs/vt100-ug/chapter3.html#DECSTBM Außerdem wäre MCURSES vielleicht was für Dich: Beitrag "MCURSES - Mini Curses Bibliothek für Mikrocontroller"
Auch ich komme noch aus der Modem Zeit um habe lange Zeit eine Mailbox (BBS) betrieben. Wenn das Terminal den festen Scroll-Bereich nicht unterstützt, dann muss man sich was einfallen lassen um diesen Eindruck zu erzeugen. Scrollen ist für ein Terminal eine Herausforderung, weil sich ein sehr großer Bereich des Bildschirmspeichers ändert. Die langsame Übertragung der Daten kommen erschwerend hinzu. So braucht der komplette Aufbau eines 80x25 Zeichen-Displays bei 9600 Baud ca. 2 Sekunden. Daraus ergibt sich die Grundregel der Sparsamkeit der übertragenen Zeichen. Ist das Terminal zu "dumm", muss man die "Intelligenz" in das Programm verlagern. Ein Vorschlag ist das Löschen der Kopf- und Fußzeile bevor die Zeichen übertragen werden. Danach positioniert man den Cursor an die Stelle, wo der Text erweitert werden soll und sendet den Text. Der Text scrollt dann ohne Kopf und Fuß nach oben. Nach Abschluss der Textübertragung schreibt man die Kopf und Fußzeile komplett neu. Kopf- und Fußzeile ist in ca. 160 Millisekunden wieder aufgebaut (bei 9600 Baud). Dieses Verfahren kann durchaus zu einem brauchbaren Ergebnis führen und die Zeichenübertragung bleibt gering.
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.