Uzyskaj kod klucza z niestandardowej klawiatury

12

Próbuję przekształcić Minitel w komputer z Raspberry Pi.

To jest minitel:

wprowadź opis zdjęcia tutaj

Przylutowałem więc matrycę klawiatury minitel do płytki z klawiaturą USB: wprowadź opis zdjęcia tutaj

Wszystko działa dobrze, otrzymuję niektóre klawisze z mojej niestandardowej klawiatury. Muszę tylko odpowiednio mapować klucze.

Więc próbuję stworzyć program, który poprosi mnie o naciśnięcie ai złapanie odpowiedniego kodu, a następnie za pomocą wszystkich klawiszy mojej niestandardowej klawiatury, aby ostatecznie utworzyć plik xmodmap.

Jedynym problemem, jaki mam, jest to, że nie mogę zrozumieć, w jaki sposób mogę uzyskać ten kod dostępu (i tylko to!). Próbowałem, xevale wyświetla się za dużo danych, aby je odfiltrować.

Wiem, że mógłbym ręcznie śledzić wszystkie kody, ale przekształcę 10 miniteli, więc wolałbym szybszy sposób!

xavier.seignard
źródło
Czy możesz zrzucić ROM (y) z posiadanych Minitel (ów) dla projektu MESS? Ten sprzęt jest obecnie niedopuszczony i ma z pewnością znaczenie historyczne.
sendmoreinfo
dlaczego nie, ale nie mam pojęcia, jak to zrobić!
xavier.seignard

Odpowiedzi:

6

Zakładam, że próbujesz to zrobić w powłoce lub w podobny sposób (w przeciwnym razie wystarczy użyć bibliotek X bezpośrednio). Jeśli tak, może okazać się xinput --test «device-name»łatwiejsze do przeanalizowania.

Niestety tak naprawdę nie jest przyjazny dla skryptów powłoki. Ale możesz sprawić, że będzie działać stdbuf. Działa, dopóki go nie zabijesz, ale skrypt powłoki może go potokować read.

Możesz więc zrobić coś takiego:

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

Musisz użyć poprawnej nazwy klawiatury zamiast „AT Translated Set 2 keyboard”. Możesz to znaleźć za pomocą 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)]

Niestety musisz użyć określonego urządzenia - nie możesz użyć klawiatury podstawowej.

(Ponadto musisz znaleźć sposób na zabicie xinput w powyższym przypadku lub po prostu zadowalaj się naciśnięciem klawisza Control-C po wprowadzeniu wszystkich kluczy. Prawdopodobnie będziesz chciał wypisać więcej kluczy niż qwerty. )

derobert
źródło
dzięki derobert! idealnie pasuje do moich potrzeb! Użyłem idklawiatury zamiast jej nazwy, ponieważ miałem konflikty z 2 takimi samymi nazwami. Więc xinput test 18gdzie 18 to identyfikator mojej klawiatury.
xavier.seignard
gdybym mógł zrobić to samo z poleceniem, które nie działa długo (tj. zatrzymuje się po pierwszym naciśnięciu klawisza i zwraca kod klucza), byłoby to swego rodzaju snem :)
xavier.seignard
@ xavier.seignard Próbowałem i nie mogłem znaleźć narzędzia, które to robi. Ale byłoby dość łatwo wziąć źródło xinput i sprawić, aby działało w ten sposób ... sprawdź test.c, wygląda na to, że odpowiednia funkcja jest print_events. Może xorg wziąłby łatkę, aby dodać flagę, aby zatrzymać po n wydarzeniach?
derobert
@ xavier.seignard Właśnie natknąłem się na jakiś sposób, aby to zrobić ... xinput --query-statedaje bieżący stan i natychmiast wychodzi. Możesz go zapętlić.
derobert