offline track

This commit is contained in:
2026-06-19 11:09:20 +03:00
parent 4891933879
commit 8812cf9b40
23 changed files with 924 additions and 57 deletions
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -8,7 +8,7 @@ DATABASE_PATH = os.environ.get(
HOST = os.environ.get("LORATESTER_HOST", "0.0.0.0")
PORT = int(os.environ.get("LORATESTER_PORT", "7634"))
TELEMETRY_LIMIT = int(os.environ.get("LORATESTER_TELEMETRY_LIMIT", "5000"))
TRACK_POINTS_LIMIT = int(os.environ.get("LORATESTER_TRACK_POINTS_LIMIT", "10000"))
TRACK_POINTS_LIMIT = int(os.environ.get("LORATESTER_TRACK_POINTS_LIMIT", "500000"))
ELEVATION_OPENTOPO_URL = os.environ.get(
"LORATESTER_ELEVATION_OPENTOPO_URL",
"http://grigowashere.ru:5300/v1/srtm30",
+73
View File
@@ -353,6 +353,79 @@ def finish_track(track_id: int) -> dict[str, Any]:
return {"ok": True, "track_id": track_id, "ended_at": ts, "point_count": count}
def sync_track(
device_id: str,
points: list[dict[str, Any]],
track_id: Optional[int] = None,
started_at: Optional[float] = None,
finish: bool = False,
label: Optional[str] = None,
) -> dict[str, Any]:
"""Upload buffered points after offline recording; optionally create track and finish."""
if not is_valid_device_id(device_id):
raise ValueError(f"invalid device_id '{device_id}'")
points = points or []
if track_id is not None:
with _db() as conn:
track = conn.execute(
"SELECT id, device_id, ended_at FROM tracks WHERE id = ?",
(track_id,),
).fetchone()
if not track:
raise ValueError(f"track {track_id} not found")
if track["device_id"] != device_id:
raise ValueError("device_id does not match track owner")
if track["ended_at"] is not None:
raise ValueError(f"track {track_id} already finished")
else:
if not points and not finish:
raise ValueError("points required when creating a new track")
ts = float(started_at) if started_at is not None else time.time()
with _db() as conn:
cur = conn.execute(
"""
INSERT INTO tracks (device_id, started_at, label)
VALUES (?, ?, ?)
""",
(device_id, ts, label),
)
track_id = int(cur.lastrowid)
added = 0
batch_size = 100
for i in range(0, len(points), batch_size):
chunk = points[i : i + batch_size]
if not chunk:
continue
result = add_track_points(track_id, chunk)
added += int(result.get("added") or 0)
finished = False
ended_at = None
point_count = added
if finish:
fin = finish_track(track_id)
finished = True
ended_at = fin.get("ended_at")
point_count = int(fin.get("point_count") or 0)
else:
with _db() as conn:
point_count = conn.execute(
"SELECT COUNT(*) FROM track_points WHERE track_id = ?",
(track_id,),
).fetchone()[0]
return {
"ok": True,
"track_id": track_id,
"added": added,
"point_count": point_count,
"finished": finished,
"ended_at": ended_at,
}
def list_tracks(device_id: Optional[str] = None, limit: int = 50) -> list[dict[str, Any]]:
limit = min(max(1, limit), 200)
with _db() as conn: