hidg0 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/hidg0.rb +101 -18
  4. data.tar.gz.sig +0 -0
  5. metadata +23 -3
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b651f72166ab438924461c6d94223f905aaec495ff3c569457e230732b2020e
4
- data.tar.gz: 473b8489d54e75fb8b4277f22c9eaf53364cac54ddcf164e52a6717a3778b59b
3
+ metadata.gz: 3968ff02b8a99ba1837e6e7598f0b1d99c3c738ada9be7c53a0d037f479fea15
4
+ data.tar.gz: '08f7b7a6d7b17537fa0db2ddc0d89c13c096a057fc0d97107613e89686b4f878'
5
5
  SHA512:
6
- metadata.gz: 508231d3058738ef02bda6949e4df4b20e5e1be0f53f12a286d5b47aaf7084f981f072aed961ac2950ea96e0bc2ca46a11520112015a9571c5b37a9bc866937f
7
- data.tar.gz: fcb03997fdb852c3985e29183efed53de4e933978ae88f2b5aa119232cdc937ef807014347aec795a361812b887689c7f84d17cb0722910a8ab1e9e7c2a2119a
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
- if KEYS[key.to_sym].is_a? Integer then
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
- keypress x[1..-2]
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.1.1
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-13 00:00:00.000000000 Z
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