chore: applied all feedback

close: N25B-298
This commit is contained in:
Pim Hutting
2025-11-22 11:45:32 +01:00
parent 051f904576
commit c53307530b
12 changed files with 53 additions and 212 deletions

View File

@@ -5,23 +5,14 @@ class AgentSettings(object):
"""
Agent port configuration.
:param actuating_receiver_port: Port for receiving actuation commands.
:type actuating_receiver_port: int
:param main_receiver_port: Port for receiving main messages.
:type main_receiver_port: int
:param video_sender_port: Port used for sending video frames.
:type video_sender_port: int
:param audio_sender_port: Port used for sending audio data.
:type audio_sender_port: int
:ivar actuating_receiver_port: Port for receiving actuation commands.
:type actuating_receiver_port: int
:vartype actuating_receiver_port: int
:ivar main_receiver_port: Port for receiving main messages.
:type main_receiver_port: int
:vartype main_receiver_port: int
:ivar video_sender_port: Port used for sending video frames.
:type video_sender_port: int
:vartype video_sender_port: int
:ivar audio_sender_port: Port used for sending audio data.
:type audio_sender_port: int
:vartype audio_sender_port: int
"""
def __init__(
self,
@@ -40,31 +31,18 @@ class VideoConfig(object):
"""
Video configuration constants.
:param camera_index: Index of the camera to use.
:type camera_index: int
:param resolution: Video resolution mode.
:type resolution: int
:param color_space: Color space identifier.
:type color_space: int
:param fps: Frames per second of the video stream.
:type fps: int
:param stream_name: Name of the video stream.
:type stream_name: str
:param image_buffer: Internal buffer size for video frames.
:type image_buffer: int
:ivar camera_index: Index of the camera used.
:type camera_index: int
:vartype camera_index: int
:ivar resolution: Video resolution mode.
:type resolution: int
:vartype resolution: int
:ivar color_space: Color space identifier.
:type color_space: int
:vartype color_space: int
:ivar fps: Frames per second of the video stream.
:type fps: int
:vartype fps: int
:ivar stream_name: Name of the video stream.
:type stream_name: str
:vartype stream_name: str
:ivar image_buffer: Internal buffer size for video frames.
:type image_buffer: int
:vartype image_buffer: int
"""
def __init__(
self,
@@ -87,19 +65,12 @@ class AudioConfig(object):
"""
Audio configuration constants.
:param sample_rate: Audio sampling rate in Hz.
:type sample_rate: int
:param chunk_size: Size of audio chunks to capture/process.
:type chunk_size: int
:param channels: Number of audio channels.
:type channels: int
:ivar sample_rate: Audio sampling rate in Hz.
:type sample_rate: int
:vartype sample_rate: int
:ivar chunk_size: Size of audio chunks to capture/process.
:type chunk_size: int
:vartype chunk_size: int
:ivar channels: Number of audio channels.
:type channels: int
:vartype channels: int
"""
def __init__(self, sample_rate=16000, chunk_size=512, channels=1):
self.sample_rate = sample_rate
@@ -111,15 +82,10 @@ class MainConfig(object):
"""
Main system configuration.
:param poll_timeout_ms: Timeout for polling events, in milliseconds.
:type poll_timeout_ms: int
:param max_handler_time_ms: Maximum allowed handler time, in milliseconds.
:type max_handler_time_ms: int
:ivar poll_timeout_ms: Timeout for polling events, in milliseconds.
:type poll_timeout_ms: int
:vartype poll_timeout_ms: int
:ivar max_handler_time_ms: Maximum allowed handler time, in milliseconds.
:type max_handler_time_ms: int
:vartype max_handler_time_ms: int
"""
def __init__(self, poll_timeout_ms=100, max_handler_time_ms=50):
self.poll_timeout_ms = poll_timeout_ms
@@ -130,23 +96,14 @@ class Settings(object):
"""
Global settings container.
:param agent_settings: Agent settings instance or None for defaults.
:type agent_settings: AgentSettings | None
:param video_config: VideoConfig instance or None for defaults.
:type video_config: VideoConfig | None
:param audio_config: AudioConfig instance or None for defaults.
:type audio_config: AudioConfig | None
:param main_config: MainConfig instance or None for defaults.
:type main_config: MainConfig | None
:ivar agent_settings: Agent-related port configuration.
:type agent_settings: AgentSettings
:vartype agent_settings: AgentSettings
:ivar video_config: Video stream configuration.
:type video_config: VideoConfig
:vartype video_config: VideoConfig
:ivar audio_config: Audio stream configuration.
:type audio_config: AudioConfig
:vartype audio_config: AudioConfig
:ivar main_config: Main system-level configuration.
:type main_config: MainConfig
:vartype main_config: MainConfig
"""
def __init__(self, agent_settings=None, video_config=None, audio_config=None, main_config=None):
self.agent_settings = agent_settings or AgentSettings()

View File

@@ -20,7 +20,7 @@ class ActuationReceiver(ReceiverBase):
:type port: int
:ivar _tts_service: The text-to-speech service object from the Qi session.
:vartype _tts_service: ssl.SSLSession | None
:vartype _tts_service: qi.Session | None
"""
def __init__(self, zmq_context, port=settings.agent_settings.actuating_receiver_port):

View File

@@ -24,13 +24,13 @@ class AudioSender(SocketBase):
:type port: int
:ivar thread: Thread used for sending audio.
:type thread: threading.Thread | None
:vartype thread: threading.Thread | None
:ivar audio: PyAudio instance.
:type audio: pyaudio.PyAudio | None
:vartype audio: pyaudio.PyAudio | None
:ivar microphone: Selected microphone information.
:type microphone: dict | None
:vartype microphone: dict | None
"""
def __init__(self, zmq_context, port=settings.agent_settings.audio_sender_port):
super(AudioSender, self).__init__(str("audio")) # Convert future's unicode_literal to str
@@ -51,7 +51,6 @@ class AudioSender(SocketBase):
Will not start if no microphone is available.
"""
if not self.microphone:
logger.info("Not listening: no microphone available.")
return

View File

@@ -7,17 +7,20 @@ class SocketBase(object):
"""
Base class for endpoints associated with a ZeroMQ socket.
:ivar identifier: The identifier of the endpoint.
:param identifier: The identifier of the endpoint.
:type identifier: str
:ivar identifier: The identifier of the endpoint.
:vartype identifier: str
:ivar port: The port used by the socket, set by `create_socket`.
:type port: int | None
:vartype port: int | None
:ivar socket: The ZeroMQ socket object, set by `create_socket`.
:type socket: zmq.Socket | None
:vartype socket: zmq.Socket | None
:ivar bound: Whether the socket is bound or connected, set by `create_socket`.
:type bound: bool | None
:vartype bound: bool | None
"""
__metaclass__ = ABCMeta
@@ -43,8 +46,7 @@ class SocketBase(object):
:param port: The port to use.
:type port: int
:param options: A list of options to be set on the socket. The list contains tuples where the first element contains the option
and the second the value, for example (zmq.CONFLATE, 1).
:param options: A list of tuples where the first element contains the option and the second the value.
:type options: list[tuple[int, int]]
:param bind: Whether to bind the socket or connect to it.
@@ -73,7 +75,7 @@ class SocketBase(object):
Description of the endpoint. Used for negotiation.
:return: A dictionary with the following keys: id, port, bind. See API specification at:
https://utrechtuniversity.youtrack.cloud/articles/N25B-A-14/RI-CB-Communication#negotiation
https://utrechtuniversity.youtrack.cloud/articles/N25B-A-14/RI-CB-Communication#negotiation
:rtype: dict
"""
return {

View File

@@ -24,7 +24,7 @@ class VideoSender(SocketBase):
"""
Prepares arguments for retrieving video images from Pepper and starts video loop on a separate thread.
Will not start of no qi session is available.
Will not start if no qi session is available.
"""
if not state.qi_session:
logging.info("No Qi session available. Not starting video loop.")

View File

@@ -14,16 +14,16 @@ class State(object):
detect this via the `exit_event` property being set.
:ivar is_initialized: Flag indicating whether the state setup (exit handlers, QI session) has completed.
:type is_initialized: bool
:vartype is_initialized: bool
:ivar exit_event: A thread event used to signal all threads that the program is shutting down.
:type exit_event: threading.Event | None
:vartype exit_event: threading.Event | None
:ivar sockets: A list of ZeroMQ socket wrappers (`SocketBase`) that need to be closed during deinitialization.
:type sockets: List[SocketBase]
:vartype sockets: List[SocketBase]
:ivar qi_session: The QI session object used for interaction with the robot/platform services.
:type qi_session: None | ssl.SSLSession
:vartype qi_session: None | qi.Session
"""
def __init__(self):
self.is_initialized = False

View File

@@ -7,13 +7,22 @@ class TimeBlock(object):
limit, or if no limit is given, the callback will be called with the time that the block took.
:param callback: The callback function that is called when the block of code is over,
unless the code block did not exceed the time limit.
unless the code block did not exceed the time limit.
:type callback: Callable[[float], None]
:param limit_ms: The number of milliseconds the block of code is allowed to take. If it
exceeds this time, or if it's None, the callback function will be called with the time the
block took.
exceeds this time, or if it's None, the callback function will be called with the time the
block took.
:type limit_ms: int | None
:ivar limit_ms: The number of milliseconds the block of code is allowed to take.
:vartype limit_ms: float | None
:ivar callback: The callback function that is called when the block of code is over.
:vartype callback: Callable[[float], None]
ivar start: The start time of the block, set when entering the context.
:vartype start: float | None
"""
def __init__(self, callback, limit_ms=None):
self.limit_ms = float(limit_ms) if limit_ms is not None else None