63 lines
1.5 KiB
Python
63 lines
1.5 KiB
Python
from datetime import datetime
|
|
from aprslib.packets.base import APRSPacket
|
|
from aprslib.util import latitude_to_ddm, longitude_to_ddm, comment_altitude
|
|
|
|
|
|
class PositionReport(APRSPacket):
|
|
format = 'uncompressed'
|
|
|
|
_latitude = 0
|
|
@property
|
|
def latitude(self):
|
|
return self._latitude
|
|
|
|
@latitude.setter
|
|
def latitude(self, val):
|
|
if -90 <= val <= 90:
|
|
self._latitude = val
|
|
else:
|
|
raise ValueError("Latitude outside of -90 to 90 degree range")
|
|
|
|
_longitude = 0
|
|
@property
|
|
def longitude(self):
|
|
return self._longitude
|
|
|
|
@longitude.setter
|
|
def longitude(self, val):
|
|
if -180 <= val <= 180:
|
|
self._longitude = val
|
|
else:
|
|
raise ValueError("Longitude outside of -180 to 180 degree range")
|
|
|
|
symbol_table = '/'
|
|
symbol = 'l'
|
|
altitude = None
|
|
timestamp = None
|
|
comment = ''
|
|
|
|
def _serialize_body(self):
|
|
|
|
if self.timestamp is None:
|
|
timestamp = ''
|
|
elif isinstance(self.timestamp, str):
|
|
timestamp = self.timestamp
|
|
else:
|
|
timestamp = datetime.utcfromtimestamp(self.timestamp).strftime("%d%H%M") + 'z'
|
|
|
|
body = [
|
|
'/' if self.timestamp else '!', # packet type
|
|
timestamp,
|
|
latitude_to_ddm(self.latitude),
|
|
self.symbol_table,
|
|
longitude_to_ddm(self.longitude),
|
|
self.symbol,
|
|
comment_altitude(self.altitude) if self.altitude is not None else '',
|
|
self.comment,
|
|
]
|
|
|
|
return "".join(body)
|
|
|
|
|
|
|