Tasten in C unter Linux

#7931635
Lesenswert?

Um ab und zu Programme, die irgendwann auf einem Controller laufen sollen, teste ich Algorithmen und Programmabläufe gerne zuvor auf dem Linux-PC aus.

Hier benötige ich dann Funktionen, mit denen ich zum Einen festellen kann, ob eine Taste gedrückt wurde und wenn ja, welche.

Vor geraumer Zeit habe ich mich hier in die Tiefen von termios.h begeben und mich da schlau gemacht (von dem ich wieder vieles vergessen habe).

Auch wenn mein Code (im Anhang) funktioniert, war ich nie zu 100% zufrieden, denn er hat einen Schönheitsfehler in der Anwendung.

Bisweilen, aber nicht immer gibt er mir an der aktuellen Cursorposition die Escape-Sequezen für bspw. die Cursortasten oder die Funktionstasten aus:

1
^[[A   ^[[B   etc.

Meine < readkey > Funktion liefert mir neben den Ascii-Codes der Tasten auch die erweiterten Codes für eben oben genannte Cursor und Funktionstasten.

1
  #define keyleft         0x00005b44
2
  #define keyright        0x00005b43
3
  #define keyup           0x00005b41
4
  #define keydown         0x00005b42
5
  #define pageup          0x005b357e
6
  #define pagedown        0x005b367e
7
  #define keypos1         0x00005b48
8
  #define keyend          0x00005b46
9

10
  #define keyf1           0x00004f50
11
  #define keyf2           0x00004f51
12
  #define keyf3           0x00004f52
13
  #define keyf4           0x00004f53
14
  #define keyf5           0x5b31357e
15
  #define keyf6           0x5b31377e
16
  #define keyf7           0x5b31387e
17
  #define keyf8           0x5b31397e
18
  #define keyf9           0x5b32307e
19
  #define keyf10          0x5b32317e

Leider zerstört mir das Ausgeben der Escapesequenzen meinen Bildschirmaufbau. Bisher habe ich mir damit beholfen, dass ich in meinen Programmen einen Bereich schwarze Textfarbe auf schwarzem Hintergrund definiere auf den ich nach jeder Bildschirmausgabe verzweige.

Irgendein Puffer in dem wohl die erweiterten Tasten abgelegt werden muß wohl gelöscht werden, aber ich weiß nicht wo und wie ich das bewerkstellige.

Vllt. kennt einer der Linux- Systemprogrammierercracks wie das geht ?

Angehängte Dateien:
#7931647
Lesenswert?

Walter T. schrieb:

Probier mal SDL2 aus.

SDL ist mir für manche Dinge, die nur "quick and dirty" ausprobiert werden soll zu "komplex" und erfordert einen Overhead.

Zudem habe ich einige Quellen (noch aus den 80er und 90er Jahre), die ich immer noch verwenden möchte oder wieder aufarbeiten will (momentan ist es ein altes Computerspiel aus 1992 von mir, dass ich im Ziel auf einem Mikrocontroller laufen lassen mag).

Um da nicht zu viel umschreiben zu müssen, ist SDL für mich von daher für diesen Einsatzzweck keine Option (im vorliegenden Fall hatte ich zuerst das Programm von TurboPascal nach C portieren müssen .... sieht nicht so schön aus der Code, aber funktioniert)

#7931669
Lesenswert?

Chris S. schrieb:

Hier eine Implementierung von kbhit

_kbhit funktioniert ähnlich meinem keypressed. Außerdem muß für _kbhit in deiner Implementierung noch ein #include <sys/ioctl.h> und zudem muß es (heute) heißen: struct term termios; (anstelle von nur term termios)

Aber mein Problem, dass die ESC-Sequenz der Taste noch auf dem Bildschirm mit ausgegeben wird ist auch mit _kbhit nicht behoben

#7931733
Lesenswert?

Chris S. schrieb:

Ok, ich würde dir raten eine conio.h Implementierung in c von GitHub für Linux runterzuladen. Dort gibt es die Funktion getch() und getche(). Die Funktion getch() stellt sicher dass kein ECHO und kein ICANON flag verwendet wird.

Ich hatte mir früher einmal Implementierungen von conio für Linux angesehen gehabt und war damals nicht zufrieden gewesen, was der Grund war, mir eigene Funktionen zu schreiben. War ich gerade eben aber wieder nachsehen und habe festgestellt, dass es hier nur etwas mehr Auswahl als vor 10 Jahren gibt. Grundsätzlich ging es mir darum, auch "ähnliche" Funktionen wie aus TurboPascal und Turbo C zu haben. conio werde ich nicht weiter verfolgen weil:

G. K. schrieb:

Echo abschalten?

https://c-for-dummies.com/blog/?p=4001 https://man7.org/tlpi/code/online/dist/tty/no_echo.c.html

Super herzlichen und vielen Dank an zumsel. Die Links waren für mich sehr zielführend und ich konnte das Tastenecho abschalten. Herrlich !

Im Anhang ist die erste Verwendung hiervon zu sehen und das ist das, was ich dann in einem Mikrocontroller zur Anwendung bringen möchte.

Das Original hatte ich in 1992 in TurboPascal geschrieben. Dass der C-Code bisweilen etwas "unschön" aussieht ist genau diesem Umstand geschuldet, dass es 1:1 aus dem Original umgesetzt wurde. Hier gab es zuerst ein Textmode-Spiel, bevor es dann zu MCGA-Grafik (320*200 Pixel / 256 Farben) umgesetzt wurde. Lange ist es her! Heute gibt es in dieser Form einige ähnliche Spiele, aber damals war das neu. Eine Art Mischung aus Tetris und Klax.

Nachdem das nun auch wieder unter Linux läuft hat es für mich wieder den alten Charme hervorgebracht und ich habe (wie früher) zu viel Zeit jetzt verdaddelt.

Wer es ausprobieren möchte: Im Ordner einfach "make" eingeben, danach kann das Spiel mit ./3ac gestartet werden.


Von oben fallen farbige Klötzchen herunter, die farbig sortiert übereinander gestappelt werden müssen. Sind 3 Klötzchen einer Farbe übereinander (Three A Color), verschwinden diese und der Score wird erhöht.

Der Fänger in der Mitte kann mit den Cursortasten bewegt werden und kann ein einzelnes Klötzchen fangen und es dann in der X-Position verschieben. Ein Druck auf die Leertaste lässt das Klötzchen fallen.

Rechts und links ist der Mülleimer in dem Klötzchen weggeworfen können (hier baut sich bei 3 übereinander gleichen Farben jedoch der Aufbau nicht ab). Erreicht ein aufgestappelter Klötzchenturm die Höhe der Mauer links und rechts, ist das Spiel beendet. Ebenso ist das Spiel beendet, wenn ein Klötzchen (versehentlich) auf die Mauer abgelegt wird :-)

Die Taste "p" pausiert das Spiel.

Wer es ausprobieren mag:

Viel Spaß

Angehängte Dateien:
#7947321
Lesenswert?

In Werkstatt Projekt /c findest Du zu Tastenabfragen unter Linux c viele Anregungen.

Siehe Testprogramm 'infosys'/Screenshots: https://www.projektc.at/programs/c_bsp/infosys/index.html

Praktische Abfragen: z.B. getTaste() mit Erkennung von Interrupts usw.

Der Implementierung findet man in icon.a / gettaste.c

Die von Projekt c/ angebotenen Input/Output Funktionen können aber müssen nicht verwendet werden!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren