VT100 /Ansi Terminal, feste Kopf- und Fußzeile

Gast #4408542
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.
Gast #4408878
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.
Gast #4409184
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);
}
Gast #4409190
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.
Gast #4409210
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.
Persönliche Seite #4409212
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.
Gast #4409231
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
Gast #4409337
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.
Gast #4409392
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.
#4409572
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.