Özel yapım bir klavyeden bir anahtarın kodunu alın


12

Bir Minitel'i Raspberry Pi ile bir bilgisayara dönüştürmeye çalışıyorum.

Bu bir minitel:

resim açıklamasını buraya girin

Bu yüzden minitel klavyenin matrisini bir usb klavye pcb'ye lehimledim, şöyle: resim açıklamasını buraya girin

Her şey yolunda gidiyor, özel klavyemden bazı tuşlar alıyorum. Sadece anahtarları uygun şekilde yeniden eşleştirmem gerekiyor.

Bu yüzden ailgili tuş koduna basmam ve bindirmemi isteyecek bir program oluşturmaya çalışıyorum ve daha sonra özel klavyemin tüm tuşları ile son olarak bir xmodmap dosyası üretiyorum.

Sahip olduğum tek sorun, bu anahtar kodunu nasıl alabilirim (ve sadece bu!). Denedim xevama filtrelemek için çok fazla veri görüntüleniyor.

Tüm anahtar kodlarını elle izleyebileceğimi biliyorum, ama 10 Miniteli dönüştüreceğim, bu yüzden daha hızlı bir şekilde tercih ederim!


MESS projesi için ROM'ları Minitel (ler) den atabilir misiniz? Bu donanım şu anda bozulmamış ve kesinlikle tarihsel öneme sahip.
sendmoreinfo

neden olmasın, ama bunu nasıl yapacağım hakkında hiçbir fikrim yok!
xavier.seignard

Yanıtlar:


6

Bunu kabuk veya benzeri bir şekilde yapmaya çalıştığınızı varsayıyorum (aksi takdirde doğrudan X kütüphanelerini kullanırsınız). Eğer öyleyse, xinput --test «device-name»ayrıştırmak çok daha kolay olabilir .

Ne yazık ki, gerçekten kabuk komut dosyası dostu değil. Ama onunla çalışmasını sağlayabilirsiniz stdbuf. Öldürene kadar çalışır, ama kabuk betiğiniz onu harekete geçirebilir read.

Yani, böyle bir şey yapabilirsiniz:

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

"AT Translated Set 2 klavye" yerine doğru klavye adını kullanmanız gerekecektir. Şununla bulabilirsiniz 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)]

Maalesef belirli bir cihaz kullanmanız gerekiyor; ana klavyeyi kullanamazsınız.

(Ayrıca, yukarıdaki xinput'u öldürmenin bir yolunu bulmanız veya tüm anahtarları girdiğinizde Control-C'ye basmanız için kendinizi memnun etmeniz gerekir. Ve muhtemelen qwerty'den daha fazla anahtar listelemek isteyeceksiniz. )


teşekkürler derobert! bu benim ihtiyacımla mükemmel uyuyor! idKlavyeyi adı yerine kullandım , çünkü 2 aynı adla çakıştım. Yani xinput test 1818 benim klavyenin kimliği olduğu.
xavier.seignard

uzun süre çalışmayan bir komutla aynı şeyi yapabilirsem (yani ilk tuşa basıldıktan sonra durur ve anahtar kodunu döndürür) bir tür rüya olurdu :)
xavier.seignard

@ xavier.seignard Denedim ve bunu yapan bir yardımcı program bulamadım. Ancak xinput kaynağını alıp bu şekilde çalışmasını sağlamak oldukça kolay olurdu ... kontrol edin test.c, ilgili işlev gibi görünüyor print_events. Belki xorg n olaydan sonra durdurmak için bir bayrak eklemek için bir yama alır ?
derobert

@ xavier.seignard Bunu yapmanın bir yolunu buldum ... xinput --query-statemevcut durumu verir ve hemen çıkar. Meşgul olabilirsiniz.
derobert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.