Ottieni il codice chiave di un tasto, da una tastiera personalizzata


12

Sto cercando di trasformare un Minitel in un computer con un Raspberry Pi.

Questo è un minitel:

inserisci qui la descrizione dell'immagine

Quindi ho saldato la matrice della tastiera minitel a un pcb tastiera USB, in questo modo: inserisci qui la descrizione dell'immagine

Tutto funziona bene, ricevo alcuni tasti dalla mia tastiera personalizzata. Devo solo rimappare le chiavi in ​​modo appropriato.

Quindi sto cercando di creare un programma che mi chieda di premere ae intercettare il codice chiave corrispondente, e quindi con tutti i tasti della mia tastiera personalizzata, per produrre infine un file xmodmap.

L'unico problema che ho è che non riesco a capire come posso ottenere quel codice chiave (e solo quello!). Ho provato xevma ci sono troppi dati visualizzati per filtrarli.

So che potrei tracciare manualmente tutti i codici chiave, ma trasformerò 10 Minitel, quindi preferirei un modo più veloce!


Potresti scaricare le ROM dai Minitel che hai, per il progetto MESS? Tale hardware è attualmente non scaricato ed è certamente di importanza storica.
sendmoreinfo,

perché no, ma non ho idea di come farlo!
xavier.seignard,

Risposte:


6

Suppongo che stai cercando di farlo in shell o simili (altrimenti, useresti direttamente le librerie X). In tal caso, potresti trovare xinput --test «device-name»molto più facile analizzare.

Sfortunatamente, non è davvero amichevole per gli script di shell. Ma puoi farlo funzionare con stdbuf. Funziona fino a quando non lo uccidi, ma lo script della shell potrebbe reindirizzarlo read.

Quindi, puoi fare qualcosa del genere:

stty -echo
stdbuf -oL xinput test 'AT Translated Set 2 keyboard' \
    | perl -nE 'BEGIN {$| = 1} m/^key press\s+(\d+)/ and say $1' \
    | for key in q w e r t y; do
         echo -n "Please press $key: "
         read -r keycode
         echo "key $key = $keycode"
    done
stty echo

Dovrai utilizzare il nome della tastiera corretto al posto di "Tastiera con set di traduzione 2". Puoi trovarlo con xinput list:

anthony@Zia:~$ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=8    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]

Sfortunatamente, devi usare un dispositivo specifico, non puoi usare la tastiera principale.

(Inoltre, dovrai trovare un modo per uccidere xinput in quanto sopra, o semplicemente accontentarti di premere Control-C quando hai inserito tutti i tasti. E probabilmente vorrai elencare più chiavi di qwerty. )


grazie derobert! che si adatta perfettamente alle mie esigenze! Ho usato la idtastiera invece del suo nome, perché avevo conflitti con 2 stessi nomi. Quindi, xinput test 18dove 18 è l'id della mia tastiera.
xavier.seignard,

se potessi fare lo stesso con un comando che non funziona da molto tempo (cioè si ferma dopo aver premuto il primo tasto e restituisce il codice chiave) sarebbe una specie di sogno :)
xavier.seignard

@ xavier.seignard Ho provato e non sono riuscito a trovare un'utilità che lo faccia. Ma sarebbe abbastanza facile prendere la sorgente xinput e farla funzionare in quel modo ... controlla test.c, sembra che sia la funzione rilevante print_events. Forse xorg prenderebbe una patch per aggiungere un flag per fermarsi dopo n eventi?
derobert,

@ xavier.seignard Mi sono appena imbattuto in un modo per farlo ... xinput --query-statedà lo stato corrente ed esce immediatamente. Potresti occupartene.
derobert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.