]> www.average.org Git - loctrkd.git/blobdiff - gps303/zmsg.py
Broadcast location, gps and approximated
[loctrkd.git] / gps303 / zmsg.py
index 56392007f1ff74ecd61cf59b8a95b1b9c2c06c48..80cf0003cbb97eee3baf55684a9085cb010d2c3f 100644 (file)
@@ -1,9 +1,10 @@
 """ Zeromq messages """
 
+from datetime import datetime, timezone
 import ipaddress as ip
 from struct import pack, unpack
 
-__all__ = "Bcast", "Resp"
+__all__ = "Bcast", "LocEvt", "Resp"
 
 
 def pack_peer(peeraddr):
@@ -119,3 +120,31 @@ class Resp(_Zmsg):
     def decode(self, buffer):
         self.imei = buffer[:16].decode()
         self.packet = buffer[16:]
+
+
+class LocEvt(_Zmsg):
+    """Zmq message with original or approximated location from lookaside"""
+
+    KWARGS = (
+        ("imei", "0000000000000000"),
+        ("devtime", datetime(1970, 1, 1, tzinfo=timezone.utc)),
+        ("lat", 0.0),
+        ("lon", 0.0),
+        ("is_gps", True),
+    )
+
+    @property
+    def packed(self):
+        return self.imei.encode() + pack(
+            "!dddB",
+            self.devtime.replace(tzinfo=timezone.utc).timestamp(),
+            self.lat,
+            self.lon,
+            int(self.is_gps),
+        )
+
+    def decode(self, buffer):
+        self.imei = buffer[:16].decode()
+        when, self.lat, self.lon, is_gps = unpack("!dddB", buffer[16:])
+        self.devtime = datetime.fromtimestamp(when).astimezone(tz=timezone.utc)
+        self.is_gps = bool(is_gps)