web-dev-qa-db-ja.com

ESCシーケンスを使用して端末領域をスクロール可能にする方法

USART/USBポートを使用してユーザー制御インターフェースを実装するstm32f1制御デバイスがあります。標準の端末ソフトウェア(PuTTY/minicom)を使用すると、ユーザーはデバイスシェルに簡単なコマンドを入力できます。

問題がある。着信情報パケットが多い場合は、シェルプロンプトに出力されるため、新しいコマンドの入力が困難になります。

ターミナル画面を2つの領域に分割する予定です。1行のプロンプトと着信パケット用のスクロール可能な領域です。

次のエスケープシーケンスを使用しようとしました。

162 72 r * DECSTBM - Set top and bottom margins (scroll region on VT100)
        [4;20r = Set top margin at line 4 and bottom at line 20

しかし、それでも私の問題を解決するのに役立つ正しい方法で説明されている良いチュートリアルを見つけることができません。

5
Ruslan Popov

ソースコードを読むことは役に立ちますが、提案された例は複雑です。 1つのOPのような最も有用なプログラムは、termcapまたはcursesインターフェイスを介したエスケープシーケンスの使用について質問しています。呪いでそれをすることははるかに簡単でしょう。 termcapで必要な手順は次のとおりです。

  • 端末の説明を取得します(カーソル移動、スクロール領域、消去行、インデックスを含む)
  • ターミナルを「cbreak」(semi-raw)モードに初期化して、プロンプトonを1行に維持できるようにします。
  • プロンプトがあるべき行にカーソルを移動します
  • 行を消去します
  • プロンプトを書く
  • 入力コマンドを取得します

一方(パケットへの参照により、OPは入力の読み取りと同時にパケットを表示したいように見えます)

  • カーソルをスクロール領域の一番下の行に移動します
  • スクロール領域を設定する
  • パッケージの行を書き込みます(改行で終わるか、indexエスケープシーケンスを使用します)
  • スクロール領域をデフォルト(全画面)にリセットします
  • カーソルをコマンドラインに戻し、コマンドを読み続けます

ベストプラクティスでは、スクロール領域の外側でカーソルアドレス指定を使用しようとしないため、プログラムが画面の2つのセクションを切り替えるたびに、スクロール領域の設定/リセットが多くなります。

参考文献:

2
Thomas Dickey

(下部にプロンプ​​トが必要で、ウィンドウの高さが25行であると仮定します。)

基本は次のとおりです。ユーザーからコマンドが受け入れられたらスクロール領域を設定するようにデバイスのシェルを構成し(printf "\033[1,24r"に相当)-完了したらリセットします--printf "\033[r"

1
sendmoreinfo