1 """ Example that produces gpx from events in evstore """
4 # python -m loctrkd.mkgpx <IMEI>
5 # Generated gpx is emitted to stdout
7 from configparser import ConfigParser
8 from datetime import datetime, timezone
9 from getopt import getopt
10 from importlib import import_module
11 from logging import getLogger
12 from sqlite3 import connect
14 from typing import Any, cast, List, Tuple
18 log = getLogger("loctrkd/mkgpx")
23 def proto_handled(proto: str) -> bool:
27 def parse_message(packet: bytes, is_incoming: bool = True) -> Any:
31 pmods: List[ProtoModule] = []
35 conf: ConfigParser, opts: List[Tuple[str, str]], args: List[str]
39 cast(ProtoModule, import_module("." + modnm, __package__))
40 for modnm in conf.get("collector", "protocols").split(",")
42 db = connect(conf.get("storage", "dbfn"))
45 """select tstamp, is_incoming, proto, packet from events
46 where imei = ? and is_incoming = true
49 (args[0], "BS:UD", "BS:UD2"),
52 """<?xml version="1.0"?>
55 xmlns="http://www.topografix.com/GPX/1/1">
56 <name>Location Data</name>
58 <name>Location Data</name>
63 for tstamp, is_incoming, proto, packet in c:
65 if pmod.proto_handled(proto):
66 msg = pmod.parse_message(packet, is_incoming=is_incoming)
67 lat, lon = msg.latitude, msg.longitude
69 datetime.fromtimestamp(tstamp)
70 .astimezone(tz=timezone.utc)
73 isotime = isotime[: isotime.rfind(".")] + "Z"
74 trkpt = """ <trkpt lat="{}" lon="{}">
82 datetime.fromtimestamp(tstamp)
83 .astimezone(tz=timezone.utc)
94 if __name__.endswith("__main__"):
95 opts, args = getopt(argv[1:], "o:c:d")
96 main(common.init(log, opts=opts), opts, args)