abstract gesture handling to it's own module

This commit is contained in:
Gabby Pelton
2026-05-30 12:38:16 -05:00
parent 183c055f83
commit 5d4e7aa313
3 changed files with 184 additions and 60 deletions
+38 -55
View File
@@ -35,8 +35,7 @@ if _WHISPLAY_AVAILABLE:
except ImportError:
pass
LONG_PRESS_THRESHOLD = 1.0
DOUBLE_PRESS_THRESHOLD = 0.4
class Terminal:
@@ -70,14 +69,11 @@ class ChannelClient:
# ── Whisplay HAT init ──
self.board = None
self.selected_index = 0
self._press_time = 0.0
self._wm8960_device = None
self._ptt_enabled = True
self._ptt_active = False
self._last_release_time = 0.0
self._double_pressed = False
self._press_count = 0
self._triple_pressed = False
self.gestures = None
if use_whisplay and _WHISPLAY_AVAILABLE and _HAS_PIL:
try:
self._init_whisplay()
@@ -156,8 +152,10 @@ class ChannelClient:
use_daemon_default_log=True,
)
self.board.set_backlight(70)
self.board.on_button_press(self._on_button_press)
self.board.on_button_release(self._on_button_release)
from whisplay_interface import WhisplayInterface
self.gestures = WhisplayInterface(self.board)
self.gestures.on_press(self._on_button_press)
self.gestures.on_release(self._on_button_release)
if hasattr(self.board, "on_exit_request"):
self.board.on_exit_request(self._on_exit_request)
if hasattr(self.board, "on_focus_revoked"):
@@ -312,11 +310,11 @@ class ChannelClient:
if ch:
lines.append(ch["hash"][:16] + "..")
if self._ptt_enabled:
lines += ["", "PTT: hold to talk", "Release to mute"]
footer = "Dbl: toggle Trip: leave"
lines += ["", "PTT: hold to talk", "Short: always-on"]
footer = "Dbl: leave"
else:
lines += ["", "Mic always-on", "Press to hang up"]
footer = "Dbl: toggle Trip: leave"
lines += ["", "Always-on (unmuted)"]
footer = "Short: PTT Dbl: leave"
fb = self._render("In Call", lines, accent=(60, 220, 120), footer=footer)
self.board.draw_image(0, 0, self.board.LCD_WIDTH, self.board.LCD_HEIGHT, fb)
@@ -328,33 +326,10 @@ class ChannelClient:
self.board.draw_image(0, 0, self.board.LCD_WIDTH, self.board.LCD_HEIGHT, fb)
def _on_button_press(self):
self._press_time = time.time()
if self.state == self.STATE_IN_CALL:
gap = time.time() - self._last_release_time
if gap < DOUBLE_PRESS_THRESHOLD:
self._press_count += 1
else:
self._press_count = 1
if self._press_count >= 3:
self._press_count = 0
self._triple_pressed = True
self._double_pressed = False
self._ptt_active = False
if self.gestures.is_double_pressed:
self.telephone.hangup()
return
if self._press_count == 2:
self._double_pressed = True
self._ptt_enabled = not self._ptt_enabled
if self._ptt_enabled:
self.telephone.mute_transmit()
else:
self.telephone.unmute_transmit()
if self.board:
self._show_in_call()
return
if self._ptt_enabled:
self._ptt_active = True
self.telephone.unmute_transmit()
@@ -362,27 +337,33 @@ class ChannelClient:
self.board.set_rgb(255, 255, 0)
def _on_button_release(self):
self._last_release_time = time.time()
if self._triple_pressed:
self._triple_pressed = False
if self.gestures.was_double_pressed:
self.gestures.acknowledge_double_press()
return
if self.state == self.STATE_IN_CALL:
if self._double_pressed:
self._double_pressed = False
return
elapsed = self.gestures.press_duration
if self._ptt_enabled:
self._ptt_active = False
self.telephone.mute_transmit()
if self.board:
self.board.set_rgb(0, 255, 80)
return
if elapsed < self.gestures.long_press_threshold:
self._ptt_active = False
self._ptt_enabled = False
if self.board:
self._show_in_call()
else:
self._ptt_active = False
self.telephone.mute_transmit()
if self.board:
self.board.set_rgb(0, 255, 80)
else:
self.telephone.hangup()
return
if elapsed < self.gestures.long_press_threshold:
self._ptt_enabled = True
self.telephone.mute_transmit()
if self.board:
self._show_in_call()
return
if self.state != self.STATE_READY:
return
elapsed = time.time() - self._press_time
if elapsed >= LONG_PRESS_THRESHOLD:
elapsed = self.gestures.press_duration
if elapsed >= self.gestures.long_press_threshold:
if self.channels:
self.board.set_rgb(255, 180, 0)
self.call_channel(self.selected_index)
@@ -390,6 +371,7 @@ class ChannelClient:
if self.channels:
self.selected_index = (self.selected_index + 1) % len(self.channels)
self._show_channels()
self.gestures.acknowledge_press()
def _on_exit_request(self, payload=None):
self.cleanup()
@@ -525,9 +507,8 @@ class ChannelClient:
was_calling = self.state == self.STATE_CALLING
self.state = self.STATE_READY
self._ptt_active = False
self._double_pressed = False
self._triple_pressed = False
self._press_count = 0
if self.gestures:
self.gestures.acknowledge_double_press()
if was_in_call:
print(f"\nCall ended")
elif was_calling:
@@ -698,6 +679,8 @@ class ChannelClient:
if self.telephone and self.state == self.STATE_IN_CALL:
self.telephone.hangup()
self.should_run = False
if self.gestures:
self.gestures.stop()
if self.board:
self.board.cleanup()