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.
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