refactor gesture handling to use timers and callbacks instead of loops
This commit is contained in:
@@ -50,7 +50,6 @@ class ChannelClient:
|
||||
self._ptt_enabled = True
|
||||
self._ptt_active = False
|
||||
self.whisplay_interface = None
|
||||
self._gesture_thread = None
|
||||
|
||||
self._init_whisplay()
|
||||
|
||||
@@ -125,6 +124,12 @@ class ChannelClient:
|
||||
self.whisplay_interface.board.on_focus_revoked(self._on_focus_revoked)
|
||||
self._load_fonts()
|
||||
self._setup_whisplay_audio()
|
||||
self.whisplay_interface.on_press(self._on_press)
|
||||
self.whisplay_interface.on_release(self._on_release)
|
||||
self.whisplay_interface.on_long_press(self._on_long_press)
|
||||
self.whisplay_interface.on_long_release(self._on_long_release)
|
||||
self.whisplay_interface.on_double_press(self._on_double_press)
|
||||
self.whisplay_interface.on_double_release(self._on_double_release)
|
||||
|
||||
def _find_wm8960_card(self):
|
||||
try:
|
||||
@@ -286,52 +291,66 @@ class ChannelClient:
|
||||
fb = self._render(title, lines, accent=accent)
|
||||
self.whisplay_interface.board.draw_image(0, 0, self.whisplay_interface.board.LCD_WIDTH, self.whisplay_interface.board.LCD_HEIGHT, fb)
|
||||
|
||||
def _gesture_loop(self):
|
||||
while self.should_run:
|
||||
self.whisplay_interface.update_gestures()
|
||||
def _on_press(self):
|
||||
if self.state == self.STATE_IN_CALL:
|
||||
if self._ptt_enabled and not self._ptt_active:
|
||||
self._ptt_active = True
|
||||
self._hw_set_mic_muted(False)
|
||||
if self.whisplay_interface.board:
|
||||
self.whisplay_interface.board.set_rgb(255, 0, 0)
|
||||
|
||||
# Double-press (highest priority)
|
||||
if self.whisplay_interface.was_double_pressed and self.state == self.STATE_IN_CALL:
|
||||
self.telephone.hangup()
|
||||
time.sleep(0.02)
|
||||
continue
|
||||
def _on_double_press(self):
|
||||
if self.state == self.STATE_READY:
|
||||
self._on_press()
|
||||
|
||||
# STATE_READY: release actions
|
||||
if self.state == self.STATE_READY and self.whisplay_interface.was_pressed:
|
||||
if self.whisplay_interface.was_long_pressed and self.channels:
|
||||
self.whisplay_interface.board.set_rgb(255, 180, 0)
|
||||
self.call_channel(self.selected_index)
|
||||
elif self.channels:
|
||||
self.selected_index = (self.selected_index + 1) % len(self.channels)
|
||||
self._show_channels()
|
||||
def _on_long_press(self):
|
||||
pass
|
||||
|
||||
# STATE_IN_CALL: hold-to-talk + release actions
|
||||
if self.state == self.STATE_IN_CALL:
|
||||
if self.whisplay_interface.is_pressed and self._ptt_enabled and not self._ptt_active:
|
||||
self._ptt_active = True
|
||||
self._hw_set_mic_muted(False)
|
||||
if self.whisplay_interface.board:
|
||||
self.whisplay_interface.board.set_rgb(255, 255, 0)
|
||||
def _on_release(self):
|
||||
if self.state == self.STATE_READY:
|
||||
if self.channels:
|
||||
self.selected_index = (self.selected_index + 1) % len(self.channels)
|
||||
self._show_channels()
|
||||
|
||||
if self.whisplay_interface.was_pressed:
|
||||
if self._ptt_enabled:
|
||||
if not self.whisplay_interface.was_long_pressed:
|
||||
self._ptt_active = False
|
||||
self._ptt_enabled = False
|
||||
if self.whisplay_interface.board:
|
||||
self._show_in_call()
|
||||
else:
|
||||
self._ptt_active = False
|
||||
self._hw_set_mic_muted(True)
|
||||
if self.whisplay_interface.board:
|
||||
self.whisplay_interface.board.set_rgb(0, 255, 80)
|
||||
elif not self.whisplay_interface.was_long_pressed:
|
||||
self._ptt_enabled = True
|
||||
self._hw_set_mic_muted(True)
|
||||
if self.whisplay_interface.board:
|
||||
self._show_in_call()
|
||||
elif self.state == self.STATE_IN_CALL:
|
||||
if self._ptt_enabled:
|
||||
self._ptt_enabled = False
|
||||
self._ptt_active = False
|
||||
if self.whisplay_interface.board:
|
||||
self.whisplay_interface.board.set_rgb(255, 0, 0)
|
||||
|
||||
time.sleep(0.02)
|
||||
else:
|
||||
self._ptt_enabled = True
|
||||
self._ptt_active = False
|
||||
self._hw_set_mic_muted(True)
|
||||
if self.whisplay_interface.board:
|
||||
self.whisplay_interface.board.set_rgb(0, 0, 0)
|
||||
|
||||
if self.whisplay_interface.board:
|
||||
self._show_in_call()
|
||||
|
||||
def _on_double_release(self):
|
||||
if self.state == self.STATE_IN_CALL:
|
||||
self.telephone.hangup()
|
||||
self.selected_index = (self.selected_index + 1) % len(self.channels)
|
||||
self._show_channels()
|
||||
|
||||
def _on_long_release(self):
|
||||
if self.state == self.STATE_IN_CALL and self._ptt_enabled:
|
||||
self._ptt_active = False
|
||||
self._hw_set_mic_muted(True)
|
||||
if self.whisplay_interface.board:
|
||||
self.whisplay_interface.board.set_rgb(0, 0, 0)
|
||||
elif self.state == self.STATE_READY:
|
||||
if self.channels:
|
||||
if self._ptt_enabled:
|
||||
self.whisplay_interface.board.set_rgb(0, 0, 0)
|
||||
else:
|
||||
self.whisplay_interface.board.set_rgb(255, 0, 0)
|
||||
self.call_channel(self.selected_index)
|
||||
|
||||
else:
|
||||
self._on_release()
|
||||
|
||||
def _on_exit_request(self, payload=None):
|
||||
self.cleanup()
|
||||
@@ -572,8 +591,6 @@ class ChannelClient:
|
||||
self.selected_index = 0
|
||||
self.whisplay_interface.board.set_rgb(0, 80, 255)
|
||||
self._show_channels()
|
||||
self._gesture_thread = threading.Thread(target=self._gesture_loop, daemon=True)
|
||||
self._gesture_thread.start()
|
||||
while self.should_run:
|
||||
if self.state == self.STATE_CALLING:
|
||||
self._show_status("Calling...", f"Channel {self.selected_index + 1}",
|
||||
@@ -586,8 +603,6 @@ class ChannelClient:
|
||||
if self.telephone and self.state == self.STATE_IN_CALL:
|
||||
self.telephone.hangup()
|
||||
self.should_run = False
|
||||
if self._gesture_thread:
|
||||
self._gesture_thread.join(timeout=1)
|
||||
if self.whisplay_interface.board:
|
||||
self.whisplay_interface.board.cleanup()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user