platform_status.py 3.62 KB
"""
    schema: platform-specific decoded status message (DRAFT)
"""
from . import message_header_schema, platform_schema, api
from flask_restx import fields

# TODO: Discuss nomenclature > platform or vehicle?

gps_schema = api.model(
    "GPS",
    {
        "gps_source": fields.Float(  # TODO: TBD with partners
            required=False,
            description="Source of gps position. E.g. Beacon",
            example="internal",
        ),
        "latitude_type": fields.String(
            required=False,
            description="",
            example="",
        ),
        "longitude_type": fields.String(
            required=False,
            description="",
            example="",
        ),
        "latitude": fields.Float(
            required=False,
            description="Latitude in <insert units>",
            example="",
        ),
        "longitude": fields.Float(
            required=False,
            description="Longitude in <insert units>",
            example="",
        ),
        "depth": fields.Float(
            required=False,
            description="",
            example="",
        ),
        "gps_fix_seconds_ago": fields.Float(
            required=False,
            description="",
            example="",
        ),
    },
)

platform_status_message_schema = api.model(
    "PlatformStatusMessage",
    {
        "message": fields.Nested(
            message_header_schema,
            required=True,
            description="Message header",
        ),
        "platform": fields.Nested(platform_schema),
        "time": fields.String(
            required=True,
            description="Timestamp of message",
            example="2022-11-16T00:00:00Z",
        ),
        "version": fields.Integer(
            required=False,
            description="",  # we can track the version of the AE plan?
            example="",
        ),
        "platform_state": fields.String(
            # TODO: Define dictionary with potential STATES of each platform
            required=True,
            description="Current state executed by platform. E.g. "
            + "STOP, IDLE, ABORT.",
            example="IDLE",
        ),
        "mission_track_number": fields.Integer(
            required=False,
            description=(
                "Track number - stage in mission (e.g. "
                + "4 --> Waypoint 3 to Waypoint 4)"
            ),
            example=4,
        ),
        "range_to_go": fields.Float(
            required=False,
            description="Estimated distance to reach next waypoint",
            example=124.3,
        ),
        "c2_health_status": fields.String(
            required=False,
            description="Health status extracted by respective platform's C2 "
            + "if any diagnosis available checks on sensors",
            example="Warning",
        ),
        "gps_data": fields.Nested(gps_schema),
        "battery_voltage": fields.Float(
            required=True,
            description="Volts",
            example=23.0,
        ),
        "battery_current": fields.Float(
            required=False,
            description="Amps",
            example=1.2,
        ),
        "battery_current_per_hour": fields.Float(
            required=False,
            description="Amp-Hours",
            example=1.2,
        ),
        "battery_wattage": fields.Float(
            required=False,
            description="Watts",
            example=23.0,
        ),
        "battery_wattage_per_hour": fields.Float(
            required=False,
            description="Watt-Hours",
            example=23.0,
        ),
    },
)

# TBD: Do we append beacon positions with platform positions?