Skip to content

Commit 36dff73

Browse files
committed
add dynamic dev
1 parent 921f974 commit 36dff73

File tree

11 files changed

+172
-94
lines changed

11 files changed

+172
-94
lines changed

src/hhd/controller/physical/imu.py

Lines changed: 6 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -238,59 +238,6 @@ def prepare_dev(
238238
return DeviceInfo(dev, axis_arr, sensor_dir, target_freqs, min_freqs)
239239

240240

241-
def set_powersave(dev: DeviceInfo, state: bool, update_trigger: bool):
242-
freqs = dev.min_freqs if state else dev.freqs
243-
244-
write_sysfs(dev.sysfs, "buffer/enable", 0)
245-
for a, f in freqs.items():
246-
if (
247-
a
248-
and f
249-
and os.path.isfile(os.path.join(dev.sysfs, f"in_{a}_sampling_frequency"))
250-
):
251-
try:
252-
write_sysfs(dev.sysfs, f"in_{a}_sampling_frequency", f)
253-
logger.info(
254-
f"Set {'powersave' if state else 'normal'} frequency {f} for {a}"
255-
)
256-
except Exception as e:
257-
logger.error(
258-
f"Could not set {'powersave' if state else 'normal'} frequency for {a}:\n{e}"
259-
)
260-
261-
if not update_trigger:
262-
return
263-
264-
# Find trigger
265-
trig = None
266-
for fn in os.listdir("/sys/bus/iio/devices"):
267-
if not fn.startswith("trigger"):
268-
continue
269-
with open(os.path.join("/sys/bus/iio/devices", fn, "name"), "r") as f:
270-
if f.read().strip() == "hhd":
271-
trig = fn
272-
break
273-
274-
write_sysfs(dev.sysfs, "buffer/enable", 1)
275-
276-
if not trig:
277-
return
278-
279-
freq = next(iter([f for f in freqs if f]), None)
280-
if not freq:
281-
return
282-
283-
try:
284-
write_sysfs(os.path.dirname(trig), "sampling_frequency", freq)
285-
logger.info(
286-
f"Set {'powersave' if state else 'normal'} trigger frequency {freq}"
287-
)
288-
except Exception as e:
289-
logger.error(
290-
f"Could not set {'powersave' if state else 'normal'} trigger frequency:\n{e}"
291-
)
292-
293-
294241
def close_dev(dev: DeviceInfo):
295242
write_sysfs(dev.sysfs, "buffer/enable", 0)
296243

@@ -368,16 +315,18 @@ def close(self, exit: bool):
368315
return True
369316

370317
def consume(self, events: Sequence[Event]) -> None:
371-
if not self.dev:
372-
return
373-
374318
powersave = None
375319
for e in events:
376320
if e["type"] == "configuration" and e["code"] == "imu_powersave":
377321
powersave = bool(e["value"])
378322

379323
if powersave is not None:
380-
set_powersave(self.dev, powersave, self.update_trigger)
324+
logger.info("IMU powersave: %s", powersave)
325+
if powersave and self.dev:
326+
self.close(False)
327+
elif not powersave and not self.dev:
328+
self.open()
329+
381330

382331
def produce(self, fds: Sequence[int]) -> Sequence[Event]:
383332
if self.fd not in fds or not self.dev:

src/hhd/controller/virtual/sd/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ def consume(self, events: Sequence[Event]):
317317

318318
# To fix gyro to mouse in latest steam
319319
# only send updates when gyro sends a timestamp
320-
send = not self.sync_gyro
320+
send = not self.sync_gyro or not self.gyro_enabled
321321
curr = time.perf_counter()
322322

323323
new_rep = bytearray(self.report)
@@ -384,7 +384,7 @@ def consume(self, events: Sequence[Event]):
384384

385385
# If the IMU breaks, smoothly re-enable the controller
386386
failover = self.last_imu + MAX_IMU_SYNC_DELAY < curr
387-
if self.sync_gyro and failover and not self.imu_failed:
387+
if self.gyro_enabled and self.sync_gyro and failover and not self.imu_failed:
388388
self.imu_failed = True
389389
logger.error(
390390
f"IMU Did not send information for {MAX_IMU_SYNC_DELAY}s. Disabling Gyro Sync."

src/hhd/device/ayaneo/base.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,7 @@ def controller_loop(
565565
fds = []
566566
devs = []
567567
fd_to_dev = {}
568+
dynamic_devs = []
568569

569570
def prepare(m):
570571
devs.append(m)
@@ -573,14 +574,18 @@ def prepare(m):
573574
for f in fs:
574575
fd_to_dev[f] = m
575576

577+
def prepare_dynamic(m):
578+
dynamic_devs.append(m)
579+
m.open()
580+
576581
try:
577582
prepare(d_xinput)
578583
if motion and d_imu:
579584
start_imu = True
580585
if dconf.get("hrtimer", False):
581586
start_imu = d_timer.open()
582587
if start_imu:
583-
prepare(d_imu)
588+
prepare_dynamic(d_imu)
584589
prepare(d_kbd_1)
585590
if d_kbd_2:
586591
prepare(d_kbd_2)
@@ -602,14 +607,22 @@ def prepare(m):
602607
logger.info("Emulated controller launched, have fun!")
603608
while not should_exit.is_set() and not updated.is_set():
604609
start = time.perf_counter()
610+
# Add fds of dynamic devices
611+
to_select = fds.copy()
612+
fd_to_dev_all = fd_to_dev.copy()
613+
for d in dynamic_devs:
614+
if d.fd != -1:
615+
to_select.append(d.fd)
616+
fd_to_dev_all[d.fd] = d
617+
605618
# Add timeout to call consumers a minimum amount of times per second
606-
r, _, _ = select.select(fds, [], [], REPORT_DELAY_MAX)
619+
r, _, _ = select.select(to_select, [], [], REPORT_DELAY_MAX)
607620
evs = []
608621
to_run = set()
609622
for f in r:
610-
to_run.add(id(fd_to_dev[f]))
623+
to_run.add(id(fd_to_dev_all[f]))
611624

612-
for d in devs:
625+
for d in [*devs, *dynamic_devs]:
613626
if id(d) in to_run:
614627
evs.extend(d.produce(r))
615628

src/hhd/device/claw/base.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ def controller_loop(
525525
fds = []
526526
devs = []
527527
fd_to_dev = {}
528+
dynamic_devs = []
528529

529530
def prepare(m):
530531
devs.append(m)
@@ -533,6 +534,10 @@ def prepare(m):
533534
for f in fs:
534535
fd_to_dev[f] = m
535536

537+
def prepare_dynamic(m):
538+
dynamic_devs.append(m)
539+
m.open()
540+
536541
try:
537542
prepare(d_xinput)
538543
prepare(d_volume_btn)
@@ -548,14 +553,22 @@ def prepare(m):
548553
switch_to_dinput = None
549554
while not should_exit.is_set() and not updated.is_set():
550555
start = time.perf_counter()
556+
# Add fds of dynamic devices
557+
to_select = fds.copy()
558+
fd_to_dev_all = fd_to_dev.copy()
559+
for d in dynamic_devs:
560+
if d.fd != -1:
561+
to_select.append(d.fd)
562+
fd_to_dev_all[d.fd] = d
563+
551564
# Add timeout to call consumers a minimum amount of times per second
552-
r, _, _ = select.select(fds, [], [], REPORT_DELAY_MAX)
565+
r, _, _ = select.select(to_select, [], [], REPORT_DELAY_MAX)
553566
evs = []
554567
to_run = set()
555568
for f in r:
556-
to_run.add(id(fd_to_dev[f]))
569+
to_run.add(id(fd_to_dev_all[f]))
557570

558-
for d in devs:
571+
for d in [*devs, *dynamic_devs]:
559572
if id(d) in to_run:
560573
evs.extend(d.produce(r))
561574

src/hhd/device/generic/base.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ def controller_loop(
208208
fds = []
209209
devs = []
210210
fd_to_dev = {}
211+
dynamic_devs = []
211212

212213
def prepare(m):
213214
devs.append(m)
@@ -216,6 +217,10 @@ def prepare(m):
216217
for f in fs:
217218
fd_to_dev[f] = m
218219

220+
def prepare_dynamic(m):
221+
dynamic_devs.append(m)
222+
m.open()
223+
219224
try:
220225
if dtype == "tecno":
221226
d_kbd_2 = GenericGamepadHidraw(
@@ -241,7 +246,7 @@ def prepare(m):
241246
if dconf.get("hrtimer", False):
242247
start_imu = d_timer.open()
243248
if start_imu:
244-
prepare(d_imu)
249+
prepare_dynamic(d_imu)
245250

246251
if grab_at:
247252
prepare(d_volume_btn)
@@ -254,14 +259,22 @@ def prepare(m):
254259
logger.info("Emulated controller launched, have fun!")
255260
while not should_exit.is_set() and not updated.is_set():
256261
start = time.perf_counter()
262+
# Add fds of dynamic devices
263+
to_select = fds.copy()
264+
fd_to_dev_all = fd_to_dev.copy()
265+
for d in dynamic_devs:
266+
if d.fd != -1:
267+
to_select.append(d.fd)
268+
fd_to_dev_all[d.fd] = d
269+
257270
# Add timeout to call consumers a minimum amount of times per second
258-
r, _, _ = select.select(fds, [], [], REPORT_DELAY_MAX)
271+
r, _, _ = select.select(to_select, [], [], REPORT_DELAY_MAX)
259272
evs = []
260273
to_run = set()
261274
for f in r:
262-
to_run.add(id(fd_to_dev[f]))
275+
to_run.add(id(fd_to_dev_all[f]))
263276

264-
for d in devs:
277+
for d in [*devs, *dynamic_devs]:
265278
if id(d) in to_run:
266279
evs.extend(d.produce(r))
267280

src/hhd/device/gpd/win/base.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ def controller_loop(
327327
fds = []
328328
devs = []
329329
fd_to_dev = {}
330+
dynamic_devs = []
330331

331332
def prepare(m):
332333
devs.append(m)
@@ -335,6 +336,10 @@ def prepare(m):
335336
for f in fs:
336337
fd_to_dev[f] = m
337338

339+
def prepare_dynamic(m):
340+
dynamic_devs.append(m)
341+
m.open()
342+
338343
try:
339344
if l4r4_enabled:
340345
kbd_fds = d_kbd_1.open()
@@ -348,7 +353,7 @@ def prepare(m):
348353
if dconf.get("hrtimer", False):
349354
start_imu = d_timer.open()
350355
if start_imu:
351-
prepare(d_imu)
356+
prepare_dynamic(d_imu)
352357
except Exception as e:
353358
motion = False
354359
try:
@@ -369,16 +374,24 @@ def prepare(m):
369374
logger.info("Emulated controller launched, have fun!")
370375
while not should_exit.is_set() and not updated.is_set():
371376
start = time.perf_counter()
377+
# Add fds of dynamic devices
378+
to_select = fds.copy()
379+
fd_to_dev_all = fd_to_dev.copy()
380+
for d in dynamic_devs:
381+
if d.fd != -1:
382+
to_select.append(d.fd)
383+
fd_to_dev_all[d.fd] = d
384+
372385
# Add timeout to call consumers a minimum amount of times per second
373-
r, _, _ = select.select(fds, [], [], REPORT_DELAY_MAX)
386+
r, _, _ = select.select(to_select, [], [], REPORT_DELAY_MAX)
374387
evs = []
375388
to_run = set()
376389
for f in r:
377390
# skip kbd_1 to always run it
378391
if f not in kbd_fds:
379-
to_run.add(id(fd_to_dev[f]))
392+
to_run.add(id(fd_to_dev_all[f]))
380393

381-
for d in devs:
394+
for d in [*devs, *dynamic_devs]:
382395
if id(d) in to_run:
383396
evs.extend(d.produce(r))
384397
evs.extend(d_kbd_1.produce(r))

src/hhd/device/legion_go/slim/base.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ def controller_loop_xinput(
340340
fds = []
341341
devs = []
342342
fd_to_dev = {}
343+
dynamic_devs = []
343344

344345
def prepare(m):
345346
devs.append(m)
@@ -348,6 +349,10 @@ def prepare(m):
348349
for f in fs:
349350
fd_to_dev[f] = m
350351

352+
def prepare_dynamic(m):
353+
dynamic_devs.append(m)
354+
m.open()
355+
351356
try:
352357
prepare(d_xinput)
353358
prepare(d_shortcuts)
@@ -365,14 +370,22 @@ def prepare(m):
365370

366371
while not should_exit.is_set() and not updated.is_set():
367372
start = time.perf_counter()
373+
# Add fds of dynamic devices
374+
to_select = fds.copy()
375+
fd_to_dev_all = fd_to_dev.copy()
376+
for d in dynamic_devs:
377+
if d.fd != -1:
378+
to_select.append(d.fd)
379+
fd_to_dev_all[d.fd] = d
380+
368381
# Add timeout to call consumers a minimum amount of times per second
369-
r, _, _ = select.select(fds, [], [], REPORT_DELAY_MAX)
382+
r, _, _ = select.select(to_select, [], [], REPORT_DELAY_MAX)
370383
evs = []
371384
to_run = set()
372385
for f in r:
373-
to_run.add(id(fd_to_dev[f]))
386+
to_run.add(id(fd_to_dev_all[f]))
374387

375-
for d in devs:
388+
for d in [*devs, *dynamic_devs]:
376389
if id(d) in to_run:
377390
evs.extend(d.produce(r))
378391

src/hhd/device/legion_go/tablet/base.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ def controller_loop_xinput(
337337
fds = []
338338
devs = []
339339
fd_to_dev = {}
340+
dynamic_devs = []
340341

341342
def prepare(m):
342343
devs.append(m)
@@ -345,6 +346,10 @@ def prepare(m):
345346
for f in fs:
346347
fd_to_dev[f] = m
347348

349+
def prepare_dynamic(m):
350+
dynamic_devs.append(m)
351+
m.open()
352+
348353
try:
349354
prepare(d_xinput)
350355
prepare(d_shortcuts)
@@ -360,14 +365,22 @@ def prepare(m):
360365
logger.info("Emulated controller launched, have fun!")
361366
while not should_exit.is_set() and not updated.is_set():
362367
start = time.perf_counter()
368+
# Add fds of dynamic devices
369+
to_select = fds.copy()
370+
fd_to_dev_all = fd_to_dev.copy()
371+
for d in dynamic_devs:
372+
if d.fd != -1:
373+
to_select.append(d.fd)
374+
fd_to_dev_all[d.fd] = d
375+
363376
# Add timeout to call consumers a minimum amount of times per second
364-
r, _, _ = select.select(fds, [], [], REPORT_DELAY_MAX)
377+
r, _, _ = select.select(to_select, [], [], REPORT_DELAY_MAX)
365378
evs = []
366379
to_run = set()
367380
for f in r:
368-
to_run.add(id(fd_to_dev[f]))
381+
to_run.add(id(fd_to_dev_all[f]))
369382

370-
for d in devs:
383+
for d in [*devs, *dynamic_devs]:
371384
if id(d) in to_run:
372385
evs.extend(d.produce(r))
373386

0 commit comments

Comments
 (0)