Source code for dotbot.models
# SPDX-FileCopyrightText: 2022-present Inria
# SPDX-FileCopyrightText: 2022-present Alexandre Abadie <alexandre.abadie@inria.fr>
# SPDX-FileCopyrightText: 2023-present Filip Maksimovic <filip.maksimovic@inria.fr>
# SPDX-FileCopyrightText: 2024-present Diego Badillo <diego.badillo@sansano.usm.cl>
#
# SPDX-License-Identifier: BSD-3-Clause
"""Pydantic models used by the controller and server application."""
# pylint: disable=too-few-public-methods,no-name-in-module
from enum import IntEnum
from typing import Any, List, Literal, Optional, Union
from pydantic import BaseModel
from dotbot.protocol import ApplicationType, ControlModeType
MAX_POSITION_HISTORY_SIZE = 1000
[docs]
class DotBotAddressModel(BaseModel):
"""Simple model to hold a DotBot address."""
address: str
[docs]
class MqttPinCodeModel(BaseModel):
"""Pin code used to derive crypto keys for MQTT."""
pin: int
[docs]
class DotBotMoveRawCommandModel(BaseModel):
"""Model class that defines a move raw command."""
left_x: int
left_y: int
right_x: int
right_y: int
[docs]
class DotBotRgbLedCommandModel(BaseModel):
"""Model class that defines an RGB LED command."""
red: int
green: int
blue: int
[docs]
class DotBotXGOActionCommandModel(BaseModel):
"""Model class that defines an XGO action command."""
action: int
[docs]
class DotBotLH2Position(BaseModel):
"""Position of a DotBot."""
x: float
y: float
z: float
[docs]
class DotBotControlModeModel(BaseModel):
"""Mode of a DotBot."""
mode: ControlModeType
[docs]
class DotBotGPSPosition(BaseModel):
"""GPS position of a DotBot, usually running a SailBot application."""
latitude: float
longitude: float
[docs]
class DotBotWaypoints(BaseModel):
"""Waypoints model."""
threshold: int
waypoints: List[Union[DotBotLH2Position, DotBotGPSPosition]]
[docs]
class DotBotStatus(IntEnum):
"""Status of a DotBot."""
ACTIVE: int = 0
INACTIVE: int = 1
LOST: int = 2
[docs]
class DotBotQueryModel(BaseModel):
"""Model class used to filter DotBots."""
max_positions: int = MAX_POSITION_HISTORY_SIZE
application: Optional[ApplicationType] = None
mode: Optional[ControlModeType] = None
status: Optional[DotBotStatus] = None
swarm: Optional[str] = None
[docs]
class DotBotNotificationCommand(IntEnum):
"""Notification command of a DotBot."""
NONE: int = 0
RELOAD: int = 1
UPDATE: int = 2
PIN_CODE_UPDATE: int = 3
[docs]
class DotBotNotificationUpdate(BaseModel):
"""Update notification model."""
address: str
direction: Optional[int]
wind_angle: Optional[int]
rudder_angle: Optional[int]
sail_angle: Optional[int]
lh2_position: Optional[DotBotLH2Position] = None
gps_position: Optional[DotBotGPSPosition] = None
battery: Optional[float] = None
[docs]
class DotBotNotificationModel(BaseModel):
"""Model class used to send controller notifications."""
cmd: DotBotNotificationCommand
data: Optional[DotBotNotificationUpdate] = None
pin_code: Optional[int] = None
[docs]
class DotBotRequestType(IntEnum):
"""Request received from MQTT client."""
DOTBOTS: int = 0
[docs]
class DotBotRequestModel(BaseModel):
"""Model class used to handle controller request."""
request: DotBotRequestType
reply: str
[docs]
class DotBotReplyModel(BaseModel):
"""Model class used to handle controller replies."""
request: DotBotRequestType
data: Any
[docs]
class DotBotModel(BaseModel):
"""Model class that defines a DotBot."""
address: str
application: ApplicationType = ApplicationType.DotBot
swarm: str = "0000"
status: DotBotStatus = DotBotStatus.ACTIVE
mode: ControlModeType = ControlModeType.MANUAL
last_seen: float
direction: Optional[int] = None
wind_angle: Optional[int] = None
rudder_angle: Optional[int] = None
sail_angle: Optional[int] = None
move_raw: Optional[DotBotMoveRawCommandModel] = None
rgb_led: Optional[DotBotRgbLedCommandModel] = None
lh2_position: Optional[DotBotLH2Position] = None
gps_position: Optional[DotBotGPSPosition] = None
waypoints: List[Union[DotBotLH2Position, DotBotGPSPosition]] = []
waypoints_threshold: int = 40
position_history: List[Union[DotBotLH2Position, DotBotGPSPosition]] = []
calibrated: bool = False
battery: float = 0.0 # Voltage in Volts
[docs]
class WSBase(BaseModel):
cmd: str
address: str
application: ApplicationType
[docs]
class WSRgbLed(WSBase):
cmd: Literal["rgb_led"]
data: DotBotRgbLedCommandModel
[docs]
class WSMoveRaw(WSBase):
cmd: Literal["move_raw"]
data: DotBotMoveRawCommandModel
[docs]
class WSWaypoints(WSBase):
cmd: Literal["waypoints"]
data: DotBotWaypoints
WSMessage = Union[
WSRgbLed,
WSMoveRaw,
WSWaypoints,
]