hidg0 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/hidg0.rb +101 -18
- data.tar.gz.sig +0 -0
- metadata +23 -3
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3968ff02b8a99ba1837e6e7598f0b1d99c3c738ada9be7c53a0d037f479fea15
|
4
|
+
data.tar.gz: '08f7b7a6d7b17537fa0db2ddc0d89c13c096a057fc0d97107613e89686b4f878'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afe1e6b432ad45aa38f13069f8c274798c2b569bc938194f185b5cdf9f72165b7c44056cdb97be30cc542f264310ced174248ada2358f254ac1566df3b9fabdc
|
7
|
+
data.tar.gz: b66d2525c14325a7784c3414c89a32408b821c0ebc409d00490b0df9e5c10f66d54977a629706426402db3b9f75475ed8e6ac0bf2f5c428c3e63bf40cc8ea556
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/hidg0.rb
CHANGED
@@ -8,9 +8,58 @@
|
|
8
8
|
|
9
9
|
# The following USB HID keyboard IDs were obtained from https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2#file-usb_hid_keys-h-L36-L76
|
10
10
|
|
11
|
+
require 'c32'
|
11
12
|
|
12
13
|
NULL_CHAR = 0.chr
|
13
14
|
|
15
|
+
=begin
|
16
|
+
|
17
|
+
# Reference notes
|
18
|
+
|
19
|
+
## Datum representation
|
20
|
+
|
21
|
+
Keyboard sends the data to PC in 8 bytes
|
22
|
+
|
23
|
+
|
24
|
+
1 byte: modifier keys (Control, Shift, Alt, etc.), where each bit corresponds to a key
|
25
|
+
1 byte: unused/reserved for OEM
|
26
|
+
6 bytes: pressed key codes
|
27
|
+
|
28
|
+
coped from: https://www.rmedgar.com/blog/using-rpi-zero-as-keyboard-send-reports
|
29
|
+
|
30
|
+
## Modifier keys
|
31
|
+
|
32
|
+
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8
|
33
|
+
here:
|
34
|
+
BYTE1 --
|
35
|
+
|--bit0: Left Control if push down is 1
|
36
|
+
|--bit1: Left Shift if push down is 1
|
37
|
+
|--bit2: Left Alt if push down is 1
|
38
|
+
|--bit3: Left GUI if push down is 1
|
39
|
+
|--bit4: Right Control if push down is 1
|
40
|
+
|--bit5: Right Shift if push down is 1
|
41
|
+
|--bit6: Right Alt if push down is 1
|
42
|
+
|--bit7: Right GUI if push down is 1
|
43
|
+
|
44
|
+
BYTE3 to BYTE8 is the key.
|
45
|
+
|
46
|
+
copied from: https://forum.micropython.org/viewtopic.php?t=2021
|
47
|
+
=end
|
48
|
+
|
49
|
+
# represented in BYTE1
|
50
|
+
|
51
|
+
h = %i(right_gui rightalt rightshift rightctrl left_gui left_alt leftshift leftctrl).\
|
52
|
+
reverse.map.with_index {|x,i| [x, (2 ** i)]}.to_h
|
53
|
+
MODIFIERS = h.merge({shift: h[:leftshift], alt: h[:left_alt],
|
54
|
+
ctrl: h[:leftctrl], control: h[:leftctrl]})
|
55
|
+
|
56
|
+
=begin
|
57
|
+
byte1 byte2 byte3 bytes4...bytes8
|
58
|
+
e.g. 'right shift' + a #=> 0x32.chr + 0.chr + 0x04.chr + (0.chr*5)
|
59
|
+
|
60
|
+
=end
|
61
|
+
|
62
|
+
# represented in BYTE3 to BYTE8
|
14
63
|
KEYS = {
|
15
64
|
none: 0, # No key pressed
|
16
65
|
err_ovf: 1, # Keyboard Error Roll Over - used for all slots if too many keys are pressed ("Phantom key")
|
@@ -235,30 +284,19 @@ KEYS = {
|
|
235
284
|
left_arrow: :kp4,
|
236
285
|
right_arrow: :kp6,
|
237
286
|
up_arrow: :kp8,
|
238
|
-
page_up: :kp9
|
287
|
+
page_up: :kp9
|
239
288
|
}
|
240
289
|
|
241
290
|
class HidG0
|
291
|
+
using ColouredText
|
242
292
|
|
243
|
-
def initialize(dev='/dev/hidg0')
|
244
|
-
@dev = dev
|
293
|
+
def initialize(dev='/dev/hidg0', debug: false)
|
294
|
+
@dev, @debug = dev, debug
|
245
295
|
end
|
246
296
|
|
247
297
|
def keypress(key)
|
248
298
|
|
249
|
-
|
250
|
-
|
251
|
-
write_report(NULL_CHAR*2 + KEYS[key.to_sym].chr + NULL_CHAR*5)
|
252
|
-
|
253
|
-
else
|
254
|
-
|
255
|
-
write_report(32.chr + NULL_CHAR + KEYS[KEYS[key.to_sym]].chr + \
|
256
|
-
NULL_CHAR*5)
|
257
|
-
|
258
|
-
end
|
259
|
-
|
260
|
-
# Release keys
|
261
|
-
write_report(NULL_CHAR*8)
|
299
|
+
keydown(key); release_keys()
|
262
300
|
|
263
301
|
end
|
264
302
|
|
@@ -266,16 +304,61 @@ class HidG0
|
|
266
304
|
|
267
305
|
s.gsub(/ /,'{space}').scan(/\{[^\}]+\}|./).each do |x|
|
268
306
|
|
269
|
-
if x.length == 1 and x.downcase == x then
|
307
|
+
if x.length == 1 and x.downcase == x and x[0] != '{' then
|
308
|
+
|
270
309
|
keypress x
|
310
|
+
|
271
311
|
else
|
272
|
-
|
312
|
+
|
313
|
+
keys = x[1..-2].split('+')
|
314
|
+
puts ('keys: ' +keys.inspect).debug if @debug
|
315
|
+
|
316
|
+
if keys.length > 1 then
|
317
|
+
|
318
|
+
# e.g. keys #=> ['ctrl', 's']
|
319
|
+
|
320
|
+
key = KEYS[keys.pop.to_sym]
|
321
|
+
modifier = keys.map {|x| MODIFIERS[x.to_sym]}.inject(:+)
|
322
|
+
|
323
|
+
if @debug then
|
324
|
+
puts ('key: ' + key.inspect).debug
|
325
|
+
puts ('modifier: ' + modifier.inspect).debug
|
326
|
+
end
|
327
|
+
|
328
|
+
write_report(modifier.chr + NULL_CHAR + key.chr + NULL_CHAR*5)
|
329
|
+
release_keys()
|
330
|
+
|
331
|
+
else
|
332
|
+
keypress keys.first
|
333
|
+
end
|
334
|
+
|
273
335
|
end
|
274
336
|
end
|
275
337
|
|
276
338
|
end
|
277
339
|
|
278
340
|
private
|
341
|
+
|
342
|
+
def keydown(key)
|
343
|
+
|
344
|
+
puts 'keydown | key: ' + key.inspect if @debug
|
345
|
+
|
346
|
+
if KEYS[key.to_sym].is_a? Integer then
|
347
|
+
|
348
|
+
write_report(NULL_CHAR*2 + KEYS[key.to_sym].chr + NULL_CHAR*5)
|
349
|
+
|
350
|
+
else
|
351
|
+
|
352
|
+
write_report(32.chr + NULL_CHAR + KEYS[KEYS[key.to_sym]].chr + \
|
353
|
+
NULL_CHAR*5)
|
354
|
+
|
355
|
+
end
|
356
|
+
|
357
|
+
end
|
358
|
+
|
359
|
+
def release_keys()
|
360
|
+
write_report(NULL_CHAR*8)
|
361
|
+
end
|
279
362
|
|
280
363
|
def write_report(report)
|
281
364
|
open(@dev, 'wb+') {|f| f.write report }
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hidg0
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -35,8 +35,28 @@ cert_chain:
|
|
35
35
|
PwTg5+TqjQvWRfpf4tDWra3/fS6sXSuA4aoh28J3YpuAS2upGYuCk61X4iEDYerh
|
36
36
|
INwakAqcXQ4/4DC0SoRunSvJ
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2019-03-
|
39
|
-
dependencies:
|
38
|
+
date: 2019-03-14 00:00:00.000000000 Z
|
39
|
+
dependencies:
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: c32
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0.1'
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.1.2
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0.1'
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.1.2
|
40
60
|
description:
|
41
61
|
email: james@jamesrobertson.eu
|
42
62
|
executables: []
|
metadata.gz.sig
CHANGED
Binary file
|