AnalogSensePy 1.0.2__tar.gz → 1.0.4__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AnalogSensePy
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Requires-Python: >=3.10
5
5
  License-File: LICENSE
6
6
  Requires-Dist: hidapi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AnalogSensePy
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Requires-Python: >=3.10
5
5
  License-File: LICENSE
6
6
  Requires-Dist: hidapi
@@ -35,14 +35,35 @@ from analogsense import AnalogSense
35
35
 
36
36
  as_ = AnalogSense()
37
37
  devices = as_.get_devices()
38
- dev = devices[0]
38
+
39
+ if not devices:
40
+ print("no supported analog keyboards found.")
41
+ exit()
42
+
43
+ if len(devices) == 1:
44
+ dev = devices[0]
45
+ else:
46
+ for i, d in enumerate(devices):
47
+ print(f" [{i}] {d.product_name}")
48
+ dev = devices[int(input("select device index: "))]
39
49
 
40
50
  def on_keys(active_keys):
41
51
  for k in active_keys:
42
- print(as_.scancode_to_string(k["scancode"]), f"{k['value']:.2f}")
52
+ # converting the scancode to a nice readable string
53
+ name = as_.scancode_to_string(k["scancode"])
54
+
55
+ # some providers can return the digital state of the key
56
+ # (what the system perceives the key as pressed or not)
57
+ # other providers that do not support this will return None
58
+ if k["digital"] is not None:
59
+ digital = " [down]" if k["digital"] else " [up]"
60
+ else:
61
+ digital = ""
62
+
63
+ print(f"{name:20s} {k['value']:.4f}{digital}")
43
64
 
44
65
  dev.start_listening(on_keys)
45
- input("enter to stop...\n")
66
+ input("press keys... enter to stop.\n")
46
67
  dev.stop_listening()
47
68
  ```
48
69
 
@@ -38,7 +38,7 @@ class AsProvider:
38
38
  pass
39
39
 
40
40
  def _buffer_to_active_keys(self):
41
- return [{"scancode": sc, "value": v} for sc, v in self._buffer.items()]
41
+ return [{"scancode": sc, "value": v, "digital": None} for sc, v in self._buffer.items()]
42
42
 
43
43
  def start_listening(self, handler: Handler):
44
44
  raise NotImplementedError
@@ -88,10 +88,10 @@ class AsProviderWootingV1(AsProvider):
88
88
  if i >= len(data): break
89
89
  value = data[i]
90
90
  i += 1
91
- active_keys.append({"scancode": scancode, "value": value / 255})
91
+ active_keys.append({"scancode": scancode, "value": value / 255, "digital": None})
92
92
  current_scancodes.add(scancode)
93
93
  for released in self._prev_scancodes - current_scancodes:
94
- active_keys.append({"scancode": released, "value": 0.0})
94
+ active_keys.append({"scancode": released, "value": 0.0, "digital": None})
95
95
  self._prev_scancodes = current_scancodes
96
96
  handler(active_keys)
97
97
 
@@ -115,6 +115,7 @@ class AsProviderWootingV2(AsProvider):
115
115
  keycode = data[i + 1]
116
116
  packed = data[i + 2]
117
117
  value_hi = data[i + 3]
118
+ digital = packed & 0x1
118
119
  key_ns = (packed >> 2) & 0xF
119
120
  value_lo = (packed >> 6) & 0x3
120
121
  scancode = (key_ns << 8) | keycode
@@ -122,10 +123,10 @@ class AsProviderWootingV2(AsProvider):
122
123
  i += 4
123
124
  if scancode == 0: break
124
125
  if value == 0: continue
125
- active_keys.append({"scancode": scancode, "value": value / 1023})
126
+ active_keys.append({"scancode": scancode, "value": value / 1023, "digital": digital})
126
127
  current_scancodes.add(scancode)
127
128
  for released in self._prev_scancodes - current_scancodes:
128
- active_keys.append({"scancode": released, "value": 0.0})
129
+ active_keys.append({"scancode": released, "value": 0.0, "digital": 0})
129
130
  self._prev_scancodes = current_scancodes
130
131
  handler(active_keys)
131
132
 
@@ -153,10 +154,10 @@ class AsProviderRazerHuntsman(AsProvider):
153
154
  value = data[i]; i += 1
154
155
  hid_sc = _razer_to_hid(scancode)
155
156
  if hid_sc:
156
- active_keys.append({"scancode": hid_sc, "value": value / 255})
157
+ active_keys.append({"scancode": hid_sc, "value": value / 255, "digital": None})
157
158
  current_scancodes.add(hid_sc)
158
159
  for released in self._prev_scancodes - current_scancodes:
159
- active_keys.append({"scancode": released, "value": 0.0})
160
+ active_keys.append({"scancode": released, "value": 0.0, "digital": None})
160
161
  self._prev_scancodes = current_scancodes
161
162
  handler(active_keys)
162
163
 
@@ -186,10 +187,10 @@ class AsProviderRazerHuntsmanV3(AsProvider):
186
187
  _unused = data[i]; i += 1
187
188
  hid_sc = _razer_to_hid(scancode)
188
189
  if hid_sc:
189
- active_keys.append({"scancode": hid_sc, "value": value / 255})
190
+ active_keys.append({"scancode": hid_sc, "value": value / 255, "digital": None})
190
191
  current_scancodes.add(hid_sc)
191
192
  for released in self._prev_scancodes - current_scancodes:
192
- active_keys.append({"scancode": released, "value": 0.0})
193
+ active_keys.append({"scancode": released, "value": 0.0, "digital": None})
193
194
  self._prev_scancodes = current_scancodes
194
195
  handler(active_keys)
195
196
 
@@ -252,7 +253,7 @@ class AsProviderDrunkdeer(AsProvider):
252
253
  value = data[i]
253
254
  if value != 0:
254
255
  sc = drunkdeer_index_to_hid_scancode(n * (64 - 5) + (i - 4))
255
- self._active_keys.append({"scancode": sc, "value": value / 40})
256
+ self._active_keys.append({"scancode": sc, "value": value / 40, "digital": None})
256
257
  if n == 2:
257
258
  handler(list(self._active_keys))
258
259
  self._active_keys = []
@@ -4,6 +4,6 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "AnalogSensePy"
7
- version = "1.0.2"
7
+ version = "1.0.4"
8
8
  requires-python = ">=3.10"
9
9
  dependencies = ["hidapi"]
File without changes
File without changes