Meddelanden

Moduler kommunicerar med varandra genom meddelanden. Alla meddelandetyper definieras i filen lrpy/message.py.

Definiera ett nytt meddelande

Ett meddelande är en Pydantic BaseModel med ett type-fält som unikt identifierar meddelandet.

from typing import Literal
from pydantic import BaseModel

class SensorMessage(BaseModel):
    type: Literal['sensor'] = 'sensor'
    distance: float

type-fältet måste:

  • Vara en Literal med exakt ett värde (t.ex. Literal['sensor']).

  • Ha ett default-värde som matchar literalen (t.ex. = 'sensor').

  • Vara unikt — inga två meddelandetyper får ha samma type-sträng.

type-strängen används internt för att routa meddelandet till rätt lyssnare.

Registrera meddelandet

Efter att meddelandet definierats måste det läggas till i Message-unionen längst ned i message.py:

type Message = Annotated[
    TestMessage | TestMessage2 | SetSpeedMessage | SensorMessage,
    Field(discriminator="type")
]

Om meddelandet inte läggs till i unionen kommer det inte att kunna skickas eller tas emot.

Validering av fält

Pydantic validerar alla fält automatiskt. Field kan användas för att lägga till begränsningar:

from pydantic import BaseModel, Field
from typing import Literal

class SetSpeedMessage(BaseModel):
    type: Literal['set_speed'] = 'set_speed'
    left_speed: int = Field(ge=0, le=255)
    right_speed: int = Field(ge=0, le=255)

Här säkerställer ge=0, le=255 att värdena ligger inom intervallet 0–255. Om ett ogiltigt värde skickas ger Pydantic ett felmeddelande.

Skicka och ta emot

Se Modul för hur meddelanden skickas med self.emit_message() och tas emot med @on_message.