fix: BUG-21 GPS-speed fallback in server route replay

This commit is contained in:
Mathieu Moran
2026-08-14 22:34:29 -04:00
parent 0fa6cc4988
commit 2fee2de357
3 changed files with 25 additions and 12 deletions
+14 -3
View File
@@ -617,9 +617,20 @@ def get_trip_route(device_id, trip_id):
lon = float(p[2])
speed = p[3] or 0
raw_odo = p[4]
speed_source = "obd" if speed > 0 else "gps"
# Mirror the Pi's route_points GPS-speed fallback: when OBD speed is
# missing (adapter dropout), derive speed from the previous point's
# movement so the replay doesn't flatline at 0 km/h while the car moves.
if speed <= 0 and prev is not None:
seconds = (p[0] - prev[2]).total_seconds()
if seconds > 0:
dist_km = hav(prev[0], prev[1], lat, lon)
seg_speed = dist_km / seconds * 3600
if seg_speed <= 220 and dist_km * 1000 >= 8:
speed = seg_speed
if prev is not None:
cumulative += hav(prev[0], prev[1], lat, lon)
prev = (lat, lon)
prev = (lat, lon, p[0])
if raw_odo is not None and float(raw_odo) > 0:
odometer = float(raw_odo)
else:
@@ -628,10 +639,10 @@ def get_trip_route(device_id, trip_id):
"datetime": p[0].isoformat(),
"latitude": lat,
"longitude": lon,
"speed": speed,
"speed": round(speed, 1),
# Mirror the Pi's route_points: OBD speed when we have it,
# otherwise the point is sourced from GPS.
"speed_source": "obd" if speed > 0 else "gps",
"speed_source": speed_source,
"odometer": round(odometer, 1),
})
return {