Tastatur eingaben aus einem TTY einlesen

  • Hallo
    Brauch bitte hilfe von einem der vielen C Profis hier.
    Ich möchte in einem C Programm auf bestimmte Tastatur eingaben reagieren. Habe dazu ein Beispiel gefunden und es angepasst, dass es auf /dev/TTY9 horcht.


    wenn ich normale Tasten drücke, die einen Byte senden, funktioniert es auch.
    Aber wie kann ich Feststellen ob ein ESC oder F Key ... gedrückt wurde.
    Die Sondertasten fangen ja alle mit einer Esc Sequenz an.
    In der Funktion read(fd, &c, 1) muss ich ja wissen wie viele byte ich lesen will.
    Ich kann also nie wissen ob es sich um ein Esc oder ein Sondertaste handelt.
    read(fd, &c, 1) bleibt auch so lange stehen bis es die angegebene länge gelesen hat also kann ich nach einem ESC nicht nochmal read starten weil sonst bleibt das Programm stehen wenn es nur ein ESC war.
    Gibt es bessere Funktionen um das zu bewekstelligen?

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

  • Erstmal würde ich nicht mit dem read() auf Zeichen warten sondern mit select(). Beim select() gibst du einen kleinen Timeout an.
    Wenn der select() call zurückkommt, dann weißt du, dass du entweder ein Zeichen lesen kannst, oder einen Timeout hast. Wenn du ein Zeichen lesen kannst und du stellst nach dem Lesen fest, es ist ein Escape, dann merkst du dir das und loopst wieder. Kommt als nächstes der Timeout, dann war es die Escape-Taste und du schickst sie weiter. Kommt kein Timeout ist es eine Escape-Sequenz und du holst dir das nächste Zeichen.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Vielen dank Für die antwort werde ich Testen. Was währe denn ein sinnvoller Timeout?

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

  • Vielen dank Für die antwort werde ich Testen. Was währe denn ein sinnvoller Timeout?


    Keine Ahnung, wirst du austesten müssen. Nimmst du ihn zu kurz, dann loopt er unnötig oft. Nimmst du ihn zu lang, dann wird die Weitergabe der Escape-Taste zu stark verzögert, oder sogar ein Druck auf die Escape-Taste mit einem weiteren folgenden Tastendruck für eine Escape-Sequenz gehalten.


    Vielleicht 250ms als Startwert.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • Jetzt brach ich doch nochmal Hilfe.
    Habe den Code jetzt so geändert dass erst wenn select() größer 0 zurück gibt read() ausgeführt wird.
    Hatte dann das Problem, dass select() immer 0 (Timeout) zurück gibt. habs auch mit fd=0 (stdin) versucht.
    Habe dann mal das Example kompeliert und auch das hat nicht Funktioniert.


    stdin ist doch die aktuelle Console in der das Programm läuft? wenn ich also eine Taste drücke müsste größer 0 zurück gegeben werden.
    Woran könnte das liegen?

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

  • Du mußt den Raw-Modus aktivieren:



    CU
    Oliver

  • Danke Ufo
    Hatte gerade selbst bemerkt dass ich bei Sdtin ja enter zum bestätigen drücken muss da ich das Terminal ja nicht im Raw Modus ist.
    Und ich auch vor jedem select Aufruf die Parameter neu setzen sollte das sich die nach Timeout immer ändern

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

  • Hallo
    Jetzt stehe ich schon wieder vor einem Problem und brauch eure hilfe.
    Beim start des Programms will ich einen Key , auf den reagiert werden soll, über die startparameter in ein Char[] schreiben.
    Also ich gebe 1B5B41 beim start ein, und würde es gerne so:
    char[0] = 0x1B
    char[1] = 0x5B
    char[2] = 0x41
    in einer schleife übernehmen.
    Weiß aber nicht wie ich das anstellen muss.


    mfg Thomas

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

  • Würds mal mit scanf() oder sscanf() veruschen:


    Da ist ein Beispiel dabei, zwar ein wenig anders, aber ich denke, damit kommst zu zum Ziel.


    http://stackoverflow.com/quest…put-and-storing-it-in-hex


    P.S. Google war ein Freund ;) Passt zu deinem Usernamen.

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

    Einmal editiert, zuletzt von TheChief ()


  • Danke hat wunderbar geklappt.
    Wusste beim Googlen nicht so recht wonach ich eigentlich suchen muss.
    Scanf hatte ich immer mit Tastatur eingaben verbunden.


    Thomas

    VDR:
    Hardware: Thermaltake DH102, Zotac ION ITX-F-E, 2Gig Ram, TechnoTrend
    dual DVB-S2 6400, TechnoTrend Connect CT-3650,


    Software: EasyVDR 1.0

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!