From b136cab3b94d48e3664f154a0697d26e1f392c12 Mon Sep 17 00:00:00 2001 From: miro Date: Fri, 12 Jul 2024 14:08:50 +0100 Subject: [PATCH] fix/event_removal ``` jul 12 14:53:26 LenovoSatellite hivemind-voice-sat[9425]: 2024-07-12 14:53:26.777 - HiveMind-voice-sat - ovos_dinkum_listener.service:_record_end_signal:650 - DEBUG - Record end jul 12 14:53:26 LenovoSatellite hivemind-voice-sat[9425]: 2024-07-12 14:53:26.778 - HiveMind-voice-sat - hivemind_bus_client.client:on_mycroft:341 - DEBUG - registering mycroft event: recognizer_loop:speech.recognition.unknown jul 12 14:53:26 LenovoSatellite hivemind-voice-sat[9425]: 2024-07-12 14:53:26.779 - HiveMind-voice-sat - hivemind_bus_client.client:on_mycroft:341 - DEBUG - registering mycroft event: speak jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: 2024-07-12 14:53:34.780 - HiveMind-voice-sat - ovos_bus_client.client.client:_remove_normal:341 - DEBUG - Not able to find 'speak' jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: 2024-07-12 14:53:34.780 - HiveMind-voice-sat - ovos_dinkum_listener.service:run:334 - ERROR - voice_loop failed jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: Traceback (most recent call last): jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_dinkum_listener/service.py", line 330, in run jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self.voice_loop.run() jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_dinkum_listener/voice_loop/voice_loop.py", line 269, in run jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self._after_cmd(chunk) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_dinkum_listener/voice_loop/voice_loop.py", line 798, in _after_cmd jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self.record_end_callback() jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_dinkum_listener/service.py", line 659, in _record_end_signal jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self.bus.emit(Message("recognizer_loop:record_end")) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/hivemind_bus_client/client.py", line 308, in emit jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self.internal_bus.emit(message.payload) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_utils/fakebus.py", line 50, in emit jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self.ee.emit(message.msg_type, message) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/pyee/_base.py", line 115, in emit jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: handled = self._call_handlers(event, args, kwargs) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/pyee/_base.py", line 98, in _call_handlers jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self._emit_run(f, args, kwargs) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/pyee/_base.py", line 83, in _emit_run jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: f(*args, **kwargs) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_audio/utils.py", line 46, in func_wrapper jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: return func(self, message) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: ^^^^^^^^^^^^^^^^^^^ jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_audio/audio.py", line 345, in _restore_volume_after_record jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: speak_msg_detected = self.bus.wait_for_message('speak', jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/hivemind_bus_client/client.py", line 370, in wait_for_message jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: return HiveMessageWaiter(self, message_type).wait(timeout) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/hivemind_bus_client/client.py", line 58, in wait jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self.bus.remove(self.msg_type, self._handler) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_bus_client/client/client.py", line 330, in remove jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self._remove_normal(event_name, func) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/ovos_bus_client/client/client.py", line 342, in _remove_normal jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self.emitter.remove_listener(event_name, func) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/pyee/_base.py", line 155, in remove_listener jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self._remove_listener(event, f) jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: File "/home/ovos/.venvs/ovos/lib/python3.11/site-packages/pyee/_base.py", line 150, in _remove_listener jul 12 14:53:34 LenovoSatellite hivemind-voice-sat[9425]: self._events[event].pop(f) ``` --- hivemind_bus_client/client.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/hivemind_bus_client/client.py b/hivemind_bus_client/client.py index cafcd1c..3429a74 100644 --- a/hivemind_bus_client/client.py +++ b/hivemind_bus_client/client.py @@ -2,7 +2,7 @@ import json import ssl from threading import Event -from typing import Union, Optional +from typing import Union, Optional, Callable from ovos_bus_client import Message as MycroftMessage, MessageBusClient as OVOSBusClient from ovos_bus_client.session import Session @@ -32,13 +32,14 @@ class HiveMessageWaiter: message_type: message type to wait for """ - def __init__(self, bus, message_type: Union[HiveMessageType, str]): + def __init__(self, bus: 'HiveMessageBusClient', + message_type: Union[HiveMessageType, str]): self.bus = bus self.msg_type = message_type self.received_msg = None # Setup response handler self.response_event = Event() - self.bus.on(message_type, self._handler) + self.bus.on(self.msg_type, self._handler) def _handler(self, message): """Receive response data.""" @@ -60,9 +61,12 @@ def wait(self, timeout=3.0): class HivePayloadWaiter(HiveMessageWaiter): - def __init__(self, payload_type: Union[HiveMessageType, str], + def __init__(self, bus: 'HiveMessageBusClient', + payload_type: Union[HiveMessageType, str], + message_type: Union[HiveMessageType, str] = HiveMessageType.BUS, *args, **kwargs): - super(HivePayloadWaiter, self).__init__(*args, **kwargs) + super(HivePayloadWaiter, self).__init__(bus=bus, message_type=message_type, + *args, **kwargs) self.payload_type = payload_type def _handler(self, message): @@ -355,6 +359,12 @@ def on(self, event_name, func): LOG.debug(f"registering handler: {event_name}") self.emitter.on(event_name, func) + def remove(self, event_name: str, func: Callable): + if event_name not in list(HiveMessageType): + self.internal_bus.remove(event_name, func) + else: # hivemind message + self.emitter.remove_listener(event_name, func) + # utility def wait_for_message(self, message_type: Union[HiveMessageType, str], timeout=3.0): """Wait for a message of a specific type. @@ -404,10 +414,11 @@ def wait_for_response(self, message: Union[MycroftMessage, HiveMessage], Returns: The received message or None if the response timed out """ - if isinstance(message, MycroftMessage): - message = HiveMessage(msg_type=HiveMessageType.BUS, payload=message) message_type = reply_type or message.msg_type - waiter = HiveMessageWaiter(self, message_type) # Setup response handler + if isinstance(message, MycroftMessage): + waiter = HivePayloadWaiter(bus=self, payload_type=message_type) + else: + waiter = HiveMessageWaiter(bus=self, message_type=message_type) # Setup response handler # Send message and wait for it's response self.emit(message) return waiter.wait(timeout)