Sonder Tasten der Tastatur abfragen



  • Hallo, wie kann ich die Pfeiltasten/ und bild auf und andere Tasten abfragen? und was wäre ein guter rückgabe wert?
    Debian Bulleyes gcc usb tastatur

    
        char UDRL;
    //char c kommt von getch() 
    char pfeil_tasten(char c) {
            if(c==27&&(c=getch()==91)){
                c=getch();
                if (c==65)    {   UDRL='U';     }
                if (c==66)    {   UDRL='D';     }
                if (c==67)    {    UDRL='R';    }
                if (c==68)    {     UDRL='L';     }
                if (c==72)    {   UDRL='1';     }
                if (c==70)    {   UDRL='0'; }
                if (c==53)  {
                    c=getch();
                    printf("Bild-UP"); 
                }
                 if (c==54)  {
                 c=getch();
               printf("Bild-Down");
                }
            } 
            return UDRL;
    }
    
    

    //c=getchar(); //hab ich aus einem openbook

    #include <termios.h>
    #include <unistd.h>
    #define INFOFRAME 30
    #define GNU_EXTENSION_SIZE 32
    /////////////////////Tasten Scann///////////////////////////////////////////////
    static struct termios new_io; static struct termios old_io; 
    int cbreak(int fd){if((tcgetattr(fd,&old_io))==-1)return -1;new_io=old_io;new_io.c_lflag=new_io.c_lflag&~(ECHO|ICANON);new_io.c_cc[VMIN]=1;new_io.c_cc[VTIME]=0;if((tcsetattr(fd,TCSAFLUSH,&new_io))==-1)return -1;return 1;} int getch(void){int c;if(cbreak(STDIN_FILENO)==-1){printf("FehlerbeiderFunktioncbreak...\n");exit(EXIT_FAILURE);}c=getchar();tcsetattr(STDIN_FILENO,TCSANOW,&old_io);return c;}
    
    

    ...
    UPDATE da thema zu ist:
    in Debian hab ich showkey es werden bei jedem tasten druck 4 code schreibweisen ausgegeben, auch ein tastatur setup tool nur für mein terminal ^^ ups
    ... 3 mal den code schicken 2 raspis 1 tastatur, ... es gibt ja auch material ungenauigkeiten

    PS , naja der verfasser des themas wusste nicht genau wie man als neuling hier ein thema einsteigt, ... danke und sorry



  • @Augustin die gaben unter DOS immer zwei Scancodes, die Pfeiltasten iirc?! nahm dann immer vier nebeneinanderliegende Buchstaben, immer erst kbhit() war wahr, dann ging es meist in switch-case mit ASCII-Abfrage, getch() leerte den Tastaturpuffer nicht, also nahm man getchar() eben. Bei Unix geht es über Message-Queue öfters, aber jetzt kann man wohl einräumen, daß auch durch die Tastatur bei asynchronen Interrupts der Rechner unter DOS crashen könnte, etwa während des Festplattenschreibens, war da so ein Struct mit cbreak() und getch()-Definitionen im zweiten Code-Auszug?! der IBM-PC hätte bei
    in al,60 konnte direkt die Scancodes abfragen im Real Mode, aber der Puffer war noch angefüllt, da mußte man dann die Zeichen extra zusätzlich abholen und das dann verwerfen?! Tastatureingaben müssen verschluckt werden können, weil sonst ein Hardware-Crash blühen könnte?! Auch in DOS?! Drucker, Disketten, DMA?! das Tastatur-Timing sei dagegen relativ schnurz?! Außen immer Peripherieeingaben bremsen, bevor es genaugenommen korrekt sicher geht?!
    meine noch was angedeutet gesehen zu haben: es gab einen NMI für doppelte IRQs und der DRAM- und Disketten auch -Refresh hing an einem Timer-Kanal?! hier hätte ein Spurious Interrupt einen Memory-Dump ermöglicht?! war nicht bekannt, es gab wohl einen NMI-Interrupt im ersten IBM-PC, der auf eine BIOS-Routine verzweigte, und was die tat?! hängte den PC auf?! kein Plan, andere Computer gaben direkt eine Fehlerausnahme zum Screen oder weitere Optionen?! deswegen hängte er sich mit der Zeit nach cli tatsächlich meist auf?!
    direkt die Scancodes lesen am Tastatur-Port, den es mit USB ja nun nicht mehr gibt, das Timing ist eh so gut wie immer vermasselt, der Speicherschutz und das Unix sind auch nicht so der Bringer?!
    Ach, es ist USB und Linux?! guck in der getch()-Überschreibung vieleicht irgendwie nach dem ersten Wert für Pfeiltasten oder Bildtasten (bei Pfeiltasten war es 0) und nach dem if mach in der getch()-Routine dann ein switch-Case für den nächsten der zwei Werte und return dann halt mit einem kompletten Integer mit beliebigem Code je nach nächstem so switch(getchar()) den vier Tasten da oder den zwei anderen mit der eventuell nächsten if-Abfrage?! löschen des Tastaturpuffers geht nur mit getchar() da laut Standard-Bibliothek-Festlegung?!
    also im selbstgeschriebenen getch()
    if ( (c=getchar())==0 ) /* die Klammern, da Zuweisung zu c nicht das Resultat vom Vergleich mit 0, der ginge dann da zu c danach, wäre die Klammer nicht?! */
    switch(getchar() )
    {
    case UP: return UP_code;
    case DOWN: return DOWN_code;
    case LEFT: return LEFT_code;
    case RIGHT: return RIGHT_code;
    }
    else if ( c==SCANCODE_EINS_FUER_BILDTASTEN)
    {
    case UP_BILD: return UP_BIILD_code;
    case DOWN_BILD: return DOWN_BILD_code;
    }

    und dann noch dieses Struct da anpassen halt, also das getch() halt umschreiben?!
    so grob gemeint so halt,
    fand nochmal bestätigt, daß diese Sondertasten wirklich zwei Scancodes liefern, ist bekannt, wenn das erste Byte nicht langte, kommt ein reserviertes oft als Präfix?!

    undefined reference to getch() kam immer, wußte gar nicht, daß die Routine in einem Standard-Header definiert wird, weiß nur, daß getch() den Tastatur-Puffer nicht leerte, zumindest hier auf Windows oder DOS?!



  • @Klagenderlamer blick was nicht, der RAM-Refresh-Interrupt kann auch von der alten Magnettrommel kommen, die dem Prozessor an der Adressleitung einfach den rotierenden Track etwa word-weise reinspeist?! der RAM war eher ein Puffer, und die Trommel dreht sich total schnell?! reicht schon für mehrere Megabyte je Sekunde und der Track wird auch selten gewechselt?! tschuldigung Off-Topic, der DRAM-Refresh kommt schneller wie ein DMA-Request, und der DMA-Request schaltet den Prozessor ab, weil der Zugriff zum RAM oder was blockiert sei?! die Trommeln, Disketten, Festplatten drehen unterschiedlich mit variabler Geschwindigkeit, außen kommen Interrupts nach Vorrang, wie berechnete man da das Timing, wollten den PC Alle mit allen möglichen Komponenten wie Steckkarten erweitern oder die Spezifikation ändern, hätte man das Timing je ernstgenommen?! Tastaturpuffer auch Nachrichtenwarteschlange, blick da nicht mehr durch, wie man das zusammenhängen sollte, mit Timing-Berechnungen-Freiheit?! Es sieht schon mit zwei Floppys beschissen aus, und auch DOS besitzt die Fähigkeit wohl zum Multitasking-Crash?! Die Guru-Meditation ist konfuszierend, wenn das mit den IRQ-Prioritäten da auch so Seriell/Festplatte...Festplatte/Seriell und dazwischen noch Kathodenstrahl und Sync von Audio-Covox-kein-Plan, Dingele mit Tonsynchronisationsmöglichkeit, oh jesses! echt Chaos Hardware-Timing, da baut man ein System und hängt kein zu schnelles Funkgerät an die Peripherie?! sonst war auch noch die Vermittlungsstelle mit den meisten Teilnehmern und was sonst noch dran hing so blöd wie ich jetzt?! schweift aus, oh Spurious Interrupt, soen Schrott?! kann immer crashen, passiert nur sehr selten?!
    Auch Emulatoren haben kein korrektes Gamepad-Timing mehr wegen dieser Asynchronität, als ob das der Schrott von der Folgeschadenschändung dann schon wäre?! tschuldigung ausschweifen, aber auch ich selber-T bin ein Sorgenkind?!


  • Mod

    @Klagenderlamer Kannst du bitte deine Drogentripps woanders austragen? Meinetwegen im Forum Jenseits der Programmierung, aber stör' nicht die Fachdiskussionen! Danke.



  • @SeppJ passt noch zum Fach: wenn man über den Tastaturport mit übermäßiger Geschwindigkeit Zeichen reinjagt, ist der PC immer abgestürzt, weil die IRQs zur falschen Zeit kamen? da muß außen eine Bremse rein, auch daß sich die Peripherie mit den IRQs abwechselt?! die fehlte. Und dann gab ein Computer noch einen Sinuston aus, das ist jetzt vielleicht zu, aber über Digitalsampleausgabe schwankte der Ton je nach Zentraltaktgeber des Computers, das heißt, der GameBoy lief bei schwacher Batterie langsamer, und hätte er einen Ton ausgegeben, wäre dessen Tonhöhe leicht runtergegangen. Zum synchronisieren? Und die andere Sache, bevor man sich RAM leisten konnte, hatte man quasi schon Swap-Space, nicht zugedrogt, nur, wie kann man da in einen kleinen Puffer oder so je RAM-Refresh-Zyklus dem Prozessor je nach den ganzen Adreßregistern quasi da mal über eine komplette Spur einer Festplatte bei allen Zugriffen dort wie bei Swap das RAM vorgaukeln, kommt ja nicht mit jedem RAM-Lese-Schreib-Zyklus, allgemein halt knobel?! Und das Gamepad-Timing der Spielkonsolenemulatoren, damit ist noch ein anderes Problem gemeint, etliche Programme laufen im Emulator wegen dem Timing nicht mehr so ab, wie sie es da meist in echt, aber da wohl auch nicht hundertprozentig richtig, getan hätten? Müllt man den Tastatureingang zu, Absturz?! Mit Funksender meine ich konkret die serielle Schnittstelle mit Modem zuerst, da könnte aber alles dranhängen, daher mal allgemein Funksender genannt, wie so ein USB-Teil, das asynchron einfach Daten reintriggert mit IRQs?! Die haben mit asynchronen Eingaben nie aufgepaßt, und da kommt wieder der Wahn, weshalb man zu der neumodischen Vermittlungsstelle bezug nimmt.
    Oui Telekom?! da der Wahn, ist nicht ganz Off-Topic neben dem Fach, Tastatureingaben und auch Mauseingaben sollte man sogar verschludern, weil sonst die Hardware irgendwann crasht?! Aber genau das ist ja mit Voice Over IP und so Vernetzungszeug total Timingrisiko, wie Telekom jetzt mit Neuen Machern?! Darf man hier nicht mal Sachverhalte delirierend abstreifen?!
    Ja, cbreak() war wegen dem Zeilenumbruch 0xa 0xd (Carriage Return und Line Feed, was zuerst je nach System?!), der Treiber baut die Scancodes zu ASCII-Zeichen und legt sie in den Tastaturpuffer, der könnte aber auch aus Messages bestehen, war bei DOS aber einfach im Interrupt-Handler ins RAM ein kleines Array?! und da noch ein switch() vergessen, war eh nur Pseudocodeanriß, wie will man das Zeug erklären, ob Amiga, ob PC, und mit Kathodenstrahl war auch noch HSync und VSync-Retrace-IRQ gemeint, der ging auch noch dazwischen. Wie will man da was allgemein erzählen oder kapieren, wenn es nicht eh zugedrogt wirkt?! ist halt allgemeines Thema mit immer anderer konkreter Hardware und auch Betriebssystem hier, zur Fachdiskussion gab es nur kbhit() und getchar(), nur eben manchmal zwei Zeichen je Tastendruck, da dann getch() zwischengewrappt, auch jetzt wegen Zeilenumbruch, so?!
    Die Verplanen so weit nach Vorne, und dann sei man wegen sowas unter Drogen?! und was lernt man sonst noch irgendwo?!



  • @Klagenderlamer nee, wieder mal vermacht da. getch() leert doch auch den Tastaturpuffer, und getchar() wartet ohne cbreak()-Umstellung auf Enter, aber was anderes war, was man hier noch kennt. getch() akzeptiert keine Eingaben von der Konsolen-Dateiumleitung. Also
    C:>programm.exe < eingaben.txt

    das geht nur mit getchar() oder scanf() oder so und nicht mit getch(), also ist getch() doch irgendwie von dem Terminal-Treiber losgebunden?! irgendwas so auch nicht ganz verpeilt?!



  • in Debian hab ich showkey es werden bei jedem tasten druck 4 code schreibweisen ausgegeben, auch ein tastatur setup tool nur für mein terminal ^^ ups
    ... 3 mal den code schicken 2 raspis 1 tastatur, ... es gibt ja auch material ungenauigkeiten

    PS , naja der verfasser des themas wusste nicht genau wie man als neuling hier ein thema einsteigt, ... danke und sorry



  • @Augustin http://www.github.com/sticknatrix/
    da ist das Zeug allgemein grundlegend soweit es noch schluderhaft ging. Nicht viertelstundenlang zentral hinschauen, gibt nur durabile blinden Fleck im Zentrum und Leseprobleme. getchar() ueberliest die Scancodes und löscht nur anscheinend die aus dem Puffer, die dann getch() noch weiter empfängt. Showkey liest welche Codes?! getch() hat Ó als ersten Code ausgegeben bei Pfeiltastendruck, vermasselt wohl, Enter wird von getchar auch überlesen?!



  • Ich weiß nicht, ob das noch aktuell ist.

    Wenn man unter UNIX/Linux sinnvoll das Terminal nutzen will, ist es meist besser direkt die curses bzw. die neuere ncurses Library zu nutzen. Im NCURSES-Programming-HOWTO ist ein simples Beispiel enthalten. Abschnitt 9.2 Beispiel 7. Das sollte das gut erklären wie man das besser umsetzen kann. Neben dem HOWTO solltest Du die man Pages für ncurses anschauen.


Anmelden zum Antworten