Bagaimana membedakan input dari keyboard yang berbeda?

14

Saya ingin menulis aplikasi dengan Python yang dapat Anda gunakan dengan keyboard default dan yang dirancang khusus untuk aplikasi tersebut. Saya akan mendesainnya hanya dengan menggunakan keyboard numerik kecil dengan stiker untuk memberikan aksi pada tombol yang berbeda. Kedua keyboard akan dipasang oleh USB.

Namun, ketika tombol-tombol ini ditekan, hanya sinyal reguler mereka (angka, operator dan masuk), akan dikirim ke Python dan itu tidak akan dapat membedakan antara sinyal dari keyboard utama dan keyboard khusus.

Karena Python memiliki (sejauh yang saya bisa temukan) tidak ada metode untuk membuat pembedaan ini, saya ingin melakukannya pada OS itu sendiri. Saya akan memprogramnya untuk Raspberry Pi, jadi Linux.

Jadi, pertanyaan utama: Bagaimana saya bisa memetakan kembali tombol-tombol keyboard tertentu ke kode kunci lainnya. Saya berpikir tentang menggunakan tombol-F yang tidak akan saya gunakan untuk tujuan lain; atau hanya beberapa karakter yang tidak ada pada keyboard apa pun (seandainya ada seperti itu).

Apakah ini mungkin di Linux / Unix? Dan jika demikian, bagaimana saya bisa melakukannya?

Steven Roose
sumber
Bagaimana keyboard akan dipasang? Anda mungkin ingin membaca langsung dari perangkat. Itu cara yang paling jelas bagi saya, meskipun saya kira ada cara yang lebih baik.
TNW
Saya menambahkan bahwa mereka akan terhubung dengan USB. Bagaimana saya bisa membaca langsung dari perangkat menggunakan Python?
Steven Roose
Sepertinya jawaban yang tidak diterima jauh lebih sederhana daripada jawaban yang diterima.
Nikana Reklawyks

Jawaban:

12

Jika Anda menggunakan Linux, cara terbaik untuk membedakan antara perangkat input adalah menggunakan Linux Event Interface . Setelah input perangkat keras khusus perangkat diterjemahkan, itu dikonversi ke struktur acara khusus Linux menengah dan tersedia dengan membaca satu atau lebih perangkat karakter di bawah /dev/input/. Omong-omong, ini sepenuhnya independen dari bahasa pemrograman yang Anda gunakan.

Setiap perangkat perangkat keras mendapatkan perangkatnya sendiri /dev/input/eventX, dan ada juga agregat (mis. /dev/input/miceYang mewakili gerakan semua tikus dalam sistem). Sistem Anda mungkin juga memiliki /dev/input/by-pathdan /dev/input/by-id.

Ada yang ioctldisebut EVIOCGNAMEyang mengembalikan nama perangkat sebagai string yang dapat dibaca secara manusia, atau Anda dapat menggunakan sesuatu seperti /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

Anda membuka perangkat, dan setiap kali suatu peristiwa datang dari perangkat keras input, Anda akan mendapatkan paket data. Jika Anda dapat membaca C, Anda dapat mempelajari file /usr/include/linux/input.hyang menunjukkan dengan tepat cara kerjanya. Jika tidak, Anda dapat membaca pertanyaan ini yang menyediakan semua informasi yang Anda butuhkan.

Hal yang baik tentang antarmuka acara adalah Anda hanya mencari tahu perangkat apa yang Anda butuhkan, dan Anda dapat membaca input dari perangkat input saja , mengabaikan semua yang lain. Anda juga akan mendapatkan notifikasi tentang kunci, tombol, dan kontrol yang biasanya tidak Anda lakukan hanya dengan membaca aliran karakter 'matang' dari terminal: bahkan tombol mati seperti Shift, dll.

Yang buruk adalah bahwa antarmuka acara tidak mengembalikan karakter 'matang', itu hanya menggunakan kode numerik untuk kunci (kode yang sesuai dengan setiap kunci ditemukan dalam file header yang disebutkan di atas - tetapi juga dalam sumber Python event.py . Jika perangkat input Anda memiliki tombol / tombol yang tidak biasa, Anda mungkin perlu sedikit bereksperimen sampai Anda mendapatkan angka yang benar.

Alexios
sumber
2

Pendekatan alternatif (jika "papan ketik" Anda tidak memiliki banyak tombol - banyak perangkat berpura-pura menjadi papan ketik) adalah menerapkan papan tombol ke setiap papan ketik secara khusus dan memastikan bahwa tombol-tombol itu dibedakan.

Ini diuraikan di sini: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Poin utama adalah setxkbmapargumen perangkat.

Jika Anda menggunakan pendekatan input mentah, lsinput akan menemukan perangkat mentah Anda untuk Anda.

Att Righ
sumber