Class: DeviceInput::Event
- Inherits:
-
Object
- Object
- DeviceInput::Event
- Defined in:
- lib/device_input.rb,
lib/device_input/labels.rb
Defined Under Namespace
Classes: Data
Constant Summary collapse
- DEFINITION =
{ :tv_sec => 'long', # 64 bits on 64-bit platforms :tv_usec => 'long', # 32 bits on 32-bit platforms :type => 'uint16_t', :code => 'uint16_t', :value => 'int32_t', }
- PACK_MAP =
{ 'long' => 'l!', # platform-dependent 'uint16_t' => 'S', 'int32_t' => 'l', }
- PACK =
DEFINITION.values.map { |v| PACK_MAP.fetch(v) }.join
- NULL_DATA =
Data.new(0, 0, 0, 0, 0)
- NULL_MSG =
self.encode(NULL_DATA)
- BYTE_LENGTH =
NULL_MSG.length
- EV_SYN =
www.kernel.org/doc/Documentation/input/event-codes.txt linux.git/tree/include/uapi/linux/input-event-codes.h
0x00- EV_KEY =
0x01- EV_REL =
0x02- EV_ABS =
0x03- EV_MSC =
0x04- EV_SW =
0x05- EV_LED =
0x11- EV_SND =
0x12- EV_REP =
0x14- EV_FF =
0x15- EV_PWR =
0x16- EV_FF_STATUS =
0x17- EV_MAX =
0x1f- EV_CNT =
EV_MAX + 1
- TYPES =
{ EV_SYN => ['EV_SYN', 'Sync'], EV_KEY => ['EV_KEY', 'Key'], EV_REL => ['EV_REL', 'Relative'], EV_ABS => ['EV_ABS', 'Absolute'], EV_MSC => ['EV_MSC', 'Misc'], EV_SW => ['EV_SW', 'ToggleSwitch'], EV_LED => ['EV_LED', 'LED'], EV_SND => ['EV_SND', 'Sound'], EV_REP => ['EV_REP', 'Repeat'], EV_FF => ['EV_FF', 'ForceFeedback'], EV_PWR => ['EV_PWR', 'Power'], EV_FF_STATUS => ['EV_FF_STATUS', 'ForceFeedbackStatus'], }
- CODES =
{ EV_SYN => { 0 => ['SYN_REPORT', 'Report'], 1 => ['SYN_CONFIG', 'Config'], 2 => ['SYN_MT_REPORT', 'Multitouch'], 3 => ['SYN_DROPPED', 'Desync'], }, EV_KEY => { 0 => ['Reserved'], 1 => ['Esc'], 2 => ['1'], 3 => ['2'], 4 => ['3'], 5 => ['4'], 6 => ['5'], 7 => ['6'], 8 => ['7'], 9 => ['8'], 10 => ['9'], 11 => ['0'], 12 => ['Minus'], 13 => ['Equal'], 14 => ['Backspace'], 15 => ['Tab'], 16 => ['Q'], 17 => ['W'], 18 => ['E'], 19 => ['R'], 20 => ['T'], 21 => ['Y'], 22 => ['U'], 23 => ['I'], 24 => ['O'], 25 => ['P'], 26 => ['LeftBrace'], 27 => ['RightBrace'], 28 => ['Enter'], 29 => ['LeftControl'], 30 => ['A'], 31 => ['S'], 32 => ['D'], 33 => ['F'], 34 => ['G'], 35 => ['H'], 36 => ['J'], 37 => ['K'], 38 => ['L'], 39 => ['Semicolon'], 40 => ['Apostrophe'], 41 => ['Grave'], 42 => ['LeftShift'], 43 => ['BackSlash'], 44 => ['Z'], 45 => ['X'], 46 => ['C'], 47 => ['V'], 48 => ['B'], 49 => ['N'], 50 => ['M'], 51 => ['Comma'], 52 => ['Dot'], 53 => ['Slash'], 54 => ['RightShift'], 55 => ['KPAsterisk'], 56 => ['LeftAlt'], 57 => ['Space'], 58 => ['CapsLock'], 59 => ['F1'], 60 => ['F2'], 61 => ['F3'], 62 => ['F4'], 63 => ['F5'], 64 => ['F6'], 65 => ['F7'], 66 => ['F8'], 67 => ['F9'], 68 => ['F10'], 69 => ['NumLock'], 70 => ['ScrollLock'], 71 => ['KP7'], 72 => ['KP8'], 73 => ['KP9'], 74 => ['KPMinus'], 75 => ['KP4'], 76 => ['KP5'], 77 => ['KP6'], 78 => ['KPPlus'], 79 => ['KP1'], 80 => ['KP2'], 81 => ['KP3'], 82 => ['KP0'], 83 => ['KPDot'], 85 => ['Zenkaku/Hankaku'], 86 => ['102nd'], 87 => ['F11'], 88 => ['F12'], 89 => ['RO'], 90 => ['Katakana'], 91 => ['HIRAGANA'], 92 => ['Henkan'], 93 => ['Katakana/Hiragana'], 94 => ['Muhenkan'], 95 => ['KPJpComma'], 96 => ['KPEnter'], 97 => ['RightCtrl'], 98 => ['KPSlash'], 99 => ['SysRq'], 100 => ['RightAlt'], 101 => ['LineFeed'], 102 => ['Home'], 103 => ['Up'], 104 => ['PageUp'], 105 => ['Left'], 106 => ['Right'], 107 => ['End'], 108 => ['Down'], 109 => ['PageDown'], 110 => ['Insert'], 111 => ['Delete'], 112 => ['Macro'], 113 => ['Mute'], 114 => ['VolumeDown'], 115 => ['VolumeUp'], 116 => ['Power'], 117 => ['KPEqual'], 118 => ['KPPlusMinus'], 119 => ['Pause'], 121 => ['KPComma'], 122 => ['Hanguel'], 123 => ['Hanja'], 124 => ['Yen'], 125 => ['LeftMeta'], 126 => ['RightMeta'], 127 => ['Compose'], 128 => ['Stop'], 129 => ['Again'], 130 => ['Props'], 131 => ['Undo'], 132 => ['Front'], 133 => ['Copy'], 134 => ['Open'], 135 => ['Paste'], 136 => ['Find'], 137 => ['Cut'], 138 => ['Help'], 139 => ['Menu'], 140 => ['Calc'], 141 => ['Setup'], 142 => ['Sleep'], 143 => ['WakeUp'], 144 => ['File'], 145 => ['SendFile'], 146 => ['DeleteFile'], 147 => ['X-fer'], 148 => ['Prog1'], 149 => ['Prog2'], 150 => ['WWW'], 151 => ['MSDOS'], 152 => ['Coffee'], 153 => ['Direction'], 154 => ['CycleWindows'], 155 => ['Mail'], 156 => ['Bookmarks'], 157 => ['Computer'], 158 => ['Back'], 159 => ['Forward'], 160 => ['CloseCD'], 161 => ['EjectCD'], 162 => ['EjectCloseCD'], 163 => ['NextSong'], 164 => ['PlayPause'], 165 => ['PreviousSong'], 166 => ['StopCD'], 167 => ['Record'], 168 => ['Rewind'], 169 => ['Phone'], 170 => ['ISOKey'], 171 => ['Config'], 172 => ['HomePage'], 173 => ['Refresh'], 174 => ['Exit'], 175 => ['Move'], 176 => ['Edit'], 177 => ['ScrollUp'], 178 => ['ScrollDown'], 179 => ['KPLeftParenthesis'], 180 => ['KPRightParenthesis'], 183 => ['F13'], 184 => ['F14'], 185 => ['F15'], 186 => ['F16'], 187 => ['F17'], 188 => ['F18'], 189 => ['F19'], 190 => ['F20'], 191 => ['F21'], 192 => ['F22'], 193 => ['F23'], 194 => ['F24'], 200 => ['PlayCD'], 201 => ['PauseCD'], 202 => ['Prog3'], 203 => ['Prog4'], 205 => ['Suspend'], 206 => ['Close'], 207 => ['Play'], 208 => ['Fast Forward'], 209 => ['Bass Boost'], 210 => ['Print'], 211 => ['HP'], 212 => ['Camera'], 213 => ['Sound'], 214 => ['Question'], 215 => ['Email'], 216 => ['Chat'], 217 => ['Search'], 218 => ['Connect'], 219 => ['Finance'], 220 => ['Sport'], 221 => ['Shop'], 222 => ['Alternate Erase'], 223 => ['Cancel'], 224 => ['Brightness down'], 225 => ['Brightness up'], 226 => ['Media'], 240 => ['Unknown'], 256 => ['Btn0'], 257 => ['Btn1'], 258 => ['Btn2'], 259 => ['Btn3'], 260 => ['Btn4'], 261 => ['Btn5'], 262 => ['Btn6'], 263 => ['Btn7'], 264 => ['Btn8'], 265 => ['Btn9'], 272 => ['LeftBtn'], 273 => ['RightBtn'], 274 => ['MiddleBtn'], 275 => ['SideBtn'], 276 => ['ExtraBtn'], 277 => ['ForwardBtn'], 278 => ['BackBtn'], 279 => ['TaskBtn'], 288 => ['Trigger'], 289 => ['ThumbBtn'], 290 => ['ThumbBtn2'], 291 => ['TopBtn'], 292 => ['TopBtn2'], 293 => ['PinkieBtn'], 294 => ['BaseBtn'], 295 => ['BaseBtn2'], 296 => ['BaseBtn3'], 297 => ['BaseBtn4'], 298 => ['BaseBtn5'], 299 => ['BaseBtn6'], 303 => ['BtnDead'], 304 => ['BtnA'], 305 => ['BtnB'], 306 => ['BtnC'], 307 => ['BtnX'], 308 => ['BtnY'], 309 => ['BtnZ'], 310 => ['BtnTL'], 311 => ['BtnTR'], 312 => ['BtnTL2'], 313 => ['BtnTR2'], 314 => ['BtnSelect'], 315 => ['BtnStart'], 316 => ['BtnMode'], 317 => ['BtnThumbL'], 318 => ['BtnThumbR'], 320 => ['ToolPen'], 321 => ['ToolRubber'], 322 => ['ToolBrush'], 323 => ['ToolPencil'], 324 => ['ToolAirbrush'], 325 => ['ToolFinger'], 326 => ['ToolMouse'], 327 => ['ToolLens'], 330 => ['Touch'], 331 => ['Stylus'], 332 => ['Stylus2'], 333 => ['Tool Doubletap'], 334 => ['Tool Tripletap'], 336 => ['WheelBtn'], 337 => ['Gear up'], 352 => ['Ok'], 353 => ['Select'], 354 => ['Goto'], 355 => ['Clear'], 356 => ['Power2'], 357 => ['Option'], 358 => ['Info'], 359 => ['Time'], 360 => ['Vendor'], 361 => ['Archive'], 362 => ['Program'], 363 => ['Channel'], 364 => ['Favorites'], 365 => ['EPG'], 366 => ['PVR'], 367 => ['MHP'], 368 => ['Language'], 369 => ['Title'], 370 => ['Subtitle'], 371 => ['Angle'], 372 => ['Zoom'], 373 => ['Mode'], 374 => ['Keyboard'], 375 => ['Screen'], 376 => ['PC'], 377 => ['TV'], 378 => ['TV2'], 379 => ['VCR'], 380 => ['VCR2'], 381 => ['Sat'], 382 => ['Sat2'], 383 => ['CD'], 384 => ['Tape'], 385 => ['Radio'], 386 => ['Tuner'], 387 => ['Player'], 388 => ['Text'], 389 => ['DVD'], 390 => ['Aux'], 391 => ['MP3'], 392 => ['Audio'], 393 => ['Video'], 394 => ['Directory'], 395 => ['List'], 396 => ['Memo'], 397 => ['Calendar'], 398 => ['Red'], 399 => ['Green'], 400 => ['Yellow'], 401 => ['Blue'], 402 => ['ChannelUp'], 403 => ['ChannelDown'], 404 => ['First'], 405 => ['Last'], 406 => ['AB'], 407 => ['Next'], 408 => ['Restart'], 409 => ['Slow'], 410 => ['Shuffle'], 411 => ['Break'], 412 => ['Previous'], 413 => ['Digits'], 414 => ['TEEN'], 415 => ['TWEN'], 448 => ['Delete EOL'], 449 => ['Delete EOS'], 450 => ['Insert line'], 451 => ['Delete line'], }, EV_REL => { 0 => ['X'], 1 => ['Y'], 2 => ['Z'], 6 => ['HWheel'], 7 => ['Dial'], 8 => ['Wheel'], 9 => ['Misc'], }, EV_ABS => { 0 => ['X'], 1 => ['Y'], 2 => ['Z'], 3 => ['Rx'], 4 => ['Ry'], 5 => ['Rz'], 6 => ['Throttle'], 7 => ['Rudder'], 8 => ['Wheel'], 9 => ['Gas'], 10 => ['Brake'], 16 => ['Hat0X'], 17 => ['Hat0Y'], 18 => ['Hat1X'], 19 => ['Hat1Y'], 20 => ['Hat2X'], 21 => ['Hat2Y'], 22 => ['Hat3X'], 23 => ['Hat 3Y'], 24 => ['Pressure'], 25 => ['Distance'], 26 => ['XTilt'], 27 => ['YTilt'], 28 => ['Tool Width'], 32 => ['Volume'], 40 => ['Misc'], }, EV_MSC => { 0 => ['Serial'], 1 => ['Pulseled'], 2 => ['Gesture'], 3 => ['RawData'], 4 => ['ScanCode'], }, EV_LED => { 0 => ['NumLock'], 1 => ['CapsLock'], 2 => ['ScrollLock'], 3 => ['Compose'], 4 => ['Kana'], 5 => ['Sleep'], 6 => ['Suspend'], 7 => ['Mute'], 8 => ['Misc'], }, EV_SND => { 0 => ['Click'], 1 => ['Bell'], 2 => ['Tone'], }, EV_REP => { 0 => ['Delay'], 1 => ['Period'], }, }
Instance Attribute Summary collapse
-
#code ⇒ Object
readonly
Returns the value of attribute code.
-
#data ⇒ Object
readonly
Returns the value of attribute data.
-
#time ⇒ Object
readonly
Returns the value of attribute time.
-
#type ⇒ Object
readonly
Returns the value of attribute type.
Class Method Summary collapse
-
.code_labels(type_val, code_val) ⇒ Object
return an array of equivalent labels, prettier toward the end.
-
.decode(binstr) ⇒ Object
convert string to Event::Data.
-
.encode(data) ⇒ Object
convert Event::Data to a string.
-
.type_labels(type_val) ⇒ Object
return an array of equivalent labels, prettier toward the end.
Instance Method Summary collapse
-
#hex ⇒ Object
display fields in hex.
-
#initialize(data) ⇒ Event
constructor
A new instance of Event.
-
#pretty ⇒ Object
show timestamp and use the last of the labels.
-
#raw ⇒ Object
don’t use any labels.
- #to_s ⇒ Object
- #value ⇒ Object
Constructor Details
#initialize(data) ⇒ Event
Returns a new instance of Event.
52 53 54 55 56 57 58 |
# File 'lib/device_input.rb', line 52 def initialize(data) @data = data # sorry for the name. it's a Data. data everywhere @time = Time.at(data.tv_sec, data.tv_usec) # take the raw label, closest to the metal @type = Event.type_labels(data.type).first @code = Event.code_labels(data.type, data.code).first end |
Instance Attribute Details
#code ⇒ Object (readonly)
Returns the value of attribute code.
50 51 52 |
# File 'lib/device_input.rb', line 50 def code @code end |
#data ⇒ Object (readonly)
Returns the value of attribute data.
50 51 52 |
# File 'lib/device_input.rb', line 50 def data @data end |
#time ⇒ Object (readonly)
Returns the value of attribute time.
50 51 52 |
# File 'lib/device_input.rb', line 50 def time @time end |
#type ⇒ Object (readonly)
Returns the value of attribute type.
50 51 52 |
# File 'lib/device_input.rb', line 50 def type @type end |
Class Method Details
.code_labels(type_val, code_val) ⇒ Object
return an array of equivalent labels, prettier toward the end
42 43 44 |
# File 'lib/device_input.rb', line 42 def self.code_labels(type_val, code_val) CODES.dig(type_val, code_val) || ["UNK-#{type_val}-#{code_val}"] end |
.decode(binstr) ⇒ Object
convert string to Event::Data
32 33 34 |
# File 'lib/device_input.rb', line 32 def self.decode(binstr) Data.new(*binstr.unpack(PACK)) end |
.encode(data) ⇒ Object
convert Event::Data to a string
27 28 29 |
# File 'lib/device_input.rb', line 27 def self.encode(data) data.values.pack(PACK) end |
.type_labels(type_val) ⇒ Object
return an array of equivalent labels, prettier toward the end
37 38 39 |
# File 'lib/device_input.rb', line 37 def self.type_labels(type_val) TYPES[type_val] || ["UNK-#{type_val}"] end |
Instance Method Details
#hex ⇒ Object
display fields in hex
83 84 85 86 87 88 89 90 |
# File 'lib/device_input.rb', line 83 def hex DEFINITION.inject('') { |memo, (field, type)| int = @data.send(field) width = RbConfig::SIZEOF.fetch(type) # memo + ("%#0.#{width * 2}x" % int) + " " memo + ("%0.#{width * 2}x" % int) + " " } end |
#pretty ⇒ Object
show timestamp and use the last of the labels
69 70 71 72 73 74 75 |
# File 'lib/device_input.rb', line 69 def pretty [@time.strftime("%Y-%m-%d %H:%M:%S.%L"), [Event.type_labels(@data.type).last, Event.code_labels(@data.type, @data.code).last, @data.value].join(':'), ].join(" ") end |
#raw ⇒ Object
don’t use any labels
78 79 80 |
# File 'lib/device_input.rb', line 78 def raw [@data.type, @data.code, @data.value].join(':') end |
#to_s ⇒ Object
64 65 66 |
# File 'lib/device_input.rb', line 64 def to_s [@type, @code, @data.value].join(':') end |
#value ⇒ Object
60 61 62 |
# File 'lib/device_input.rb', line 60 def value @data.value end |