chore: adjust message/command structure and write unit tests

ref: N25B-205
This commit is contained in:
Björn Otgaar
2025-10-23 12:54:53 +02:00
parent 530fc42c50
commit 1f8d769762
7 changed files with 90 additions and 12 deletions

View File

@@ -6,7 +6,7 @@ import zmq
from control_backend.core.config import settings
from control_backend.core.zmq_context import context
from control_backend.schemas.message import Message
from control_backend.schemas.ri_message import SpeechCommand
logger = logging.getLogger(__name__)
@@ -33,9 +33,8 @@ class RICommandAgent(Agent):
# Try to get body
try:
message_json = json.loads(body.decode("utf-8"))
message = Message.model_validate(message_json)
logger.info("Received message \"%s\"", message.message)
message = SpeechCommand.model_validate(message_json)
# Send to the robot.
await self.agent.pubsocket.send_json(message)
except Exception as e:

View File

@@ -44,8 +44,7 @@ class RICommunicationAgent(Agent):
logger.info("No ping retrieved in 3 seconds, killing myself.")
self.kill()
# message = Message.model_validate(message)
logger.info("Received message \"%s\"", message)
logger.debug("Received message \"%s\"", message)
if "endpoint" not in message:
logger.error("No received endpoint in message, excepted ping endpoint.")
return

View File

@@ -0,0 +1,23 @@
from fastapi import APIRouter, Request
import logging
from zmq import Socket
from control_backend.schemas.message import Message
logger = logging.getLogger(__name__)
router = APIRouter()
@router.post("/message", status_code=202)
async def receive_message(message: Message, request: Request):
logger.info("Received message: %s", message.message)
topic = b"message"
body = message.model_dump_json().encode("utf-8")
pub_socket: Socket = request.app.state.internal_comm_socket
pub_socket.send_multipart([topic, body])
return {"status": "Message received"}

View File

@@ -0,0 +1,20 @@
from enum import Enum
from typing import Any, Literal
from pydantic import BaseModel, Field, ValidationError
class RIEndpoint(str, Enum):
SPEECH = "actuate/speech"
PING = "ping"
NEGOTIATE_PORTS = "negotiate/ports"
class RIMessage(BaseModel):
endpoint: RIEndpoint
data: Any
class SpeechCommand(RIMessage):
endpoint: RIEndpoint = RIEndpoint(RIEndpoint.SPEECH)
data: str