forked from platypush/platypush
169 lines
3.8 KiB
Python
169 lines
3.8 KiB
Python
from marshmallow import EXCLUDE, fields, pre_load
|
|
from marshmallow.schema import Schema
|
|
|
|
from platypush.schemas import DateTime
|
|
|
|
|
|
class GpsDeviceSchema(Schema):
|
|
"""
|
|
Schema for a GPS device.
|
|
"""
|
|
|
|
# pylint: disable=too-few-public-methods
|
|
class Meta: # type: ignore
|
|
"""
|
|
Exclude unknown fields from the deserialized output.
|
|
"""
|
|
|
|
unknown = EXCLUDE
|
|
|
|
path = fields.String(
|
|
required=True,
|
|
metadata={
|
|
"description": "Device path",
|
|
"example": "/dev/ttyUSB0",
|
|
},
|
|
)
|
|
|
|
activated = DateTime(
|
|
metadata={
|
|
"description": "Device activation status",
|
|
"example": True,
|
|
},
|
|
)
|
|
|
|
native = fields.Boolean(
|
|
metadata={
|
|
"description": "Device native status",
|
|
"example": False,
|
|
},
|
|
)
|
|
|
|
baudrate = fields.Integer(
|
|
data_key="bps",
|
|
metadata={
|
|
"description": "Device baudrate",
|
|
"example": 9600,
|
|
},
|
|
)
|
|
|
|
parity = fields.String(
|
|
metadata={
|
|
"description": "Device parity",
|
|
"example": "N",
|
|
},
|
|
)
|
|
|
|
stopbits = fields.Integer(
|
|
metadata={
|
|
"description": "Device stopbits",
|
|
"example": 1,
|
|
},
|
|
)
|
|
|
|
cycle = fields.Integer(
|
|
metadata={
|
|
"description": "Device cycle",
|
|
"example": 1,
|
|
},
|
|
)
|
|
|
|
driver = fields.String(
|
|
metadata={
|
|
"description": "Device driver",
|
|
"example": "NMEA",
|
|
},
|
|
)
|
|
|
|
subtype = fields.String(
|
|
metadata={
|
|
"description": "Device subtype",
|
|
"example": "AXN_2.31_3339_13101700,5632,PA6H,1.0",
|
|
},
|
|
)
|
|
|
|
mode = fields.String(
|
|
validate=lambda mode: mode in ["NO_FIX", "TWO_D", "THREE_D"],
|
|
metadata={
|
|
"description": "Device mode, one of NO_FIX, TWO_D, THREE_D",
|
|
"example": "3D",
|
|
},
|
|
)
|
|
|
|
@pre_load
|
|
def pre_load(self, data, **_):
|
|
from platypush.plugins.gps import DeviceMode
|
|
|
|
if data and data.get("mode"):
|
|
data["mode"] = DeviceMode(data["mode"]).value
|
|
return data
|
|
|
|
|
|
class GpsStatusSchema(Schema):
|
|
"""
|
|
Schema for the GPS status.
|
|
"""
|
|
|
|
latitude = fields.Float(
|
|
metadata={
|
|
"description": "Latitude",
|
|
"example": 45.4642,
|
|
},
|
|
)
|
|
|
|
longitude = fields.Float(
|
|
metadata={
|
|
"description": "Longitude",
|
|
"example": 9.1900,
|
|
},
|
|
)
|
|
|
|
altitude = fields.Float(
|
|
metadata={
|
|
"description": "Altitude (in meters)",
|
|
"example": 100,
|
|
},
|
|
)
|
|
|
|
speed = fields.Float(
|
|
metadata={
|
|
"description": "Measured speed, if available (in km/h)",
|
|
"example": 10,
|
|
},
|
|
)
|
|
|
|
satellites_used = fields.Integer(
|
|
metadata={
|
|
"description": "Number of satellites used for the fix",
|
|
"example": 4,
|
|
},
|
|
)
|
|
|
|
timestamp = DateTime(
|
|
metadata={
|
|
"description": "Timestamp of the last GPS update",
|
|
"example": "2021-08-01T00:00:00",
|
|
},
|
|
)
|
|
|
|
devices = fields.Dict(
|
|
keys=fields.String(),
|
|
values=fields.Nested(GpsDeviceSchema),
|
|
metadata={
|
|
"description": "Available GPS devices",
|
|
"example": {
|
|
"/dev/ttyUSB0": {
|
|
"path": "/dev/ttyUSB0",
|
|
"activated": "2021-08-01T00:00:00",
|
|
"native": False,
|
|
"baudrate": 9600,
|
|
"parity": "N",
|
|
"stopbits": 1,
|
|
"cycle": 1,
|
|
"driver": "NMEA",
|
|
"subtype": "AXN_2.31_3339_13101700,5632,PA6H,1.0",
|
|
"mode": "3D",
|
|
}
|
|
},
|
|
},
|
|
)
|