Created
September 13, 2017 01:10
-
-
Save movitto/a2f62966cd8f83c5d2acfa31879b2442 to your computer and use it in GitHub Desktop.
/dev/input/event keyboard parser
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/ruby | |
# Read keyboard presses / release / holds on Linux | |
# Released under the MIT License | |
# Use binary_struct to process blobs | |
require_relative 'binary_struct' | |
##################!!!!###################### | |
#!!!!CHANGE ME TO YOUR KEYBOARD DEVICE!!!!!# | |
############################################ | |
# Device to READ | |
DEVICE = '/dev/input/event3' | |
# Keymappings, more can be found at | |
# https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h | |
KEYS = { | |
1 => "ESC", | |
2 => "1", | |
3 => "2", | |
4 => "3", | |
5 => "4", | |
6 => "5", | |
7 => "6", | |
8 => "7", | |
9 => "8", | |
10 => "9", | |
11 => "0", | |
16 => "Q", | |
17 => "W", | |
18 => "E", | |
19 => "R", | |
20 => "T", | |
21 => "Y", | |
22 => "U", | |
23 => "I", | |
24 => "O", | |
25 => "P", | |
30 => "A", | |
31 => "S", | |
32 => "D", | |
33 => "F", | |
34 => "G", | |
35 => "H", | |
36 => "J", | |
37 => "K", | |
38 => "L", | |
44 => "Z", | |
45 => "X", | |
46 => "C", | |
47 => "V", | |
48 => "B", | |
49 => "N", | |
50 => "M" | |
} | |
# Define struct input_event | |
# https://www.kernel.org/doc/Documentation/input/input.txt | |
# | |
# Note!!!: make sure the byte lengths here are aligned with your system architecture: | |
# https://apidock.com/ruby/String/unpack | |
InputEvent = BinaryStruct.new(['Q', :sec, | |
'Q', :usec, | |
'S', :type, | |
'S', :code, | |
'l', :value]) | |
dev = File.open(DEVICE, 'rb') | |
# Read input events from stream, decode, and output to stdout | |
while bin = dev.read(InputEvent.size) | |
evnt = InputEvent.decode(bin) | |
if evnt[:type] == 1 | |
key = evnt[:code] | |
if KEYS.key?(key) | |
key = KEYS[key] | |
action = case evnt[:value] | |
when 0 then | |
"released" | |
when 1 then | |
"pressed" | |
when 2 then | |
"held" | |
else | |
"?" | |
end | |
puts "Key: #{key} #{action}" | |
end | |
end | |
end | |
# fin! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
That's nice, I am doing something similar in PHP and it is quite difficult to parse the input.