รับรหัสของคีย์จากแป้นพิมพ์แบบกำหนดเอง


12

ฉันพยายามแปลง Minitel เป็นคอมพิวเตอร์ด้วย Raspberry Pi

นี่คือมินิเทล:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นฉันจึงบัดกรีเมทริกซ์ของแป้นพิมพ์มินิเทลไปยัง pcb คีย์บอร์ด usb เช่นนี้ ป้อนคำอธิบายรูปภาพที่นี่

ทุกอย่างใช้งานได้ฉันได้รับคีย์จากแป้นพิมพ์ที่กำหนดเอง ฉันแค่ต้องทำการแมปกุญแจใหม่อีกครั้งอย่างเหมาะสม

ดังนั้นฉันจึงพยายามสร้างโปรแกรมที่จะขอให้ฉันกดaและดักรหัสคีย์ที่เกี่ยวข้องจากนั้นใช้คีย์ทั้งหมดของคีย์บอร์ดที่กำหนดเองเพื่อสร้างไฟล์ xmodmap

ปัญหาเดียวที่ฉันมีคือฉันไม่สามารถหาวิธีที่ฉันจะได้รับ keycode นั้น (และเพียงแค่นั้น!) ฉันพยายามxevแต่มีข้อมูลมากเกินไปที่จะแสดงผลเพื่อกรองออก

ฉันรู้ว่าฉันสามารถติดตามรหัสทั้งหมดด้วยมือ แต่ฉันจะเปลี่ยน 10 Minitels ดังนั้นฉันต้องการวิธีที่เร็วกว่า!


คุณสามารถถ่ายโอน ROM จากมินิเทลสำหรับโครงการ MESS ได้หรือไม่? ปัจจุบันฮาร์ดแวร์ดังกล่าวยังไม่ถูกอัดและมีความสำคัญทางประวัติศาสตร์
sendmoreinfo

ทำไมไม่เป็นเช่นนั้น แต่ฉันไม่รู้ว่าจะทำยังไง!
xavier.seignard

คำตอบ:


6

ฉันคิดว่าคุณกำลังพยายามทำสิ่งนี้ในเชลล์หรือสิ่งที่คล้ายกัน (อย่างอื่นคุณแค่ใช้ไลบรารี X โดยตรง) ถ้าเป็นเช่นนั้นคุณอาจxinput --test «device-name»แยกวิเคราะห์ได้ง่ายกว่ามาก

น่าเสียดายที่มันไม่เป็นมิตรกับการเขียนสคริปต์เชลล์ stdbufแต่คุณสามารถทำให้มันทำงานร่วมกับ มันทำงานจนกว่าคุณจะฆ่ามัน แต่เชลล์สคริปต์ของคุณสามารถไปป์มันreadได้

ดังนั้นคุณสามารถทำสิ่งนี้:

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 Set Set 2 keyboard" คุณสามารถค้นหาได้ด้วย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)]

น่าเสียดายที่คุณต้องใช้อุปกรณ์เฉพาะ - คุณไม่สามารถใช้คีย์บอร์ดหลัก

(นอกจากนี้คุณจะต้องหาวิธีฆ่า xinput ด้านบนหรือเพียงแค่พอใจกับการกด Control-C เมื่อคุณป้อนคีย์ทั้งหมดและคุณอาจต้องการแสดงรายการคีย์มากกว่า qwerty )


ขอบคุณ Derobert! ที่เหมาะกับความต้องการของฉันอย่างสมบูรณ์แบบ! ฉันใช้idแป้นพิมพ์แทนชื่อเพราะฉันขัดแย้งกับ 2 ชื่อเดียวกัน ดังนั้นxinput test 18ที่ 18 คือรหัสของแป้นพิมพ์ของฉัน
xavier.seignard

ถ้าฉันสามารถทำเช่นเดียวกันกับคำสั่งที่ไม่ได้ทำงานนาน (เช่นหยุดหลังจากกดปุ่มแรกและส่งกลับรหัสคีย์) มันจะเป็นชนิดของความฝัน :)
xavier.seignard

@ xavier.seignard ฉันพยายามและไม่พบโปรแกรมอรรถประโยชน์ที่ทำเช่นนั้น แต่มันจะค่อนข้างง่ายที่จะใช้แหล่ง XInput และทำให้การทำงานว่าวิธีการตรวจสอบ ... ดูเหมือนว่าฟังก์ชั่นที่เกี่ยวข้องคือtest.c print_eventsxorg อาจจะใช้โปรแกรมปะแก้เพื่อเพิ่มการตั้งค่าสถานะเพื่อหยุดหลังจากเหตุการณ์nหรือไม่
Derobert

@ xavier.seignard ฉันเพิ่งวิ่งข้ามวิธีที่จะทำเช่นนั้น ... xinput --query-stateให้สถานะปัจจุบันและออกทันที คุณสามารถยุ่งมัน
Derobert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.