Forum: Mikrocontroller und Digitale Elektronik VT100 /Ansi Terminal, feste Kopf- und Fußzeile


von Tim (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Könnte gehen:
http://ascii-table.com/ansi-escape-sequences-vt-100.php

"Set top and bottom lines of a window"

von Tim (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Ich nehme an, du hast gar kein VT100-Terminal

von c-hater (Gast)


Lesenswert?

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?!

von S. R. (svenska)


Lesenswert?

> 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).

von Tim (Gast)


Lesenswert?

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

von Tim (Gast)


Lesenswert?

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.

von Tim (Gast)


Lesenswert?

Das Problem mit den Cursor- und F-Tasten habe ich behoben durch den 
Regex:

input+=data.replace(/[^\x20-\x7E]*/g, '');

von Tim (Gast)


Lesenswert?

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.

von Marian (phiarc) Benutzerseite


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Tim (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Leo C. (rapid)


Lesenswert?

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"

von Uwe K. (ukhl)


Lesenswert?

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
Noch kein Account? Hier anmelden.