Add diving map (garmin)

This commit is contained in:
punchdeerflyscorpion
2025-12-03 16:11:48 +01:00
parent 363540843d
commit a15d3b7740
4 changed files with 68 additions and 6 deletions
@@ -11,6 +11,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint
import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitFile
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitRecord
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages.FitSession
import nodomain.freeyourgadget.gadgetbridge.util.gpx.GpxParseException
import nodomain.freeyourgadget.gadgetbridge.util.gpx.GpxParser
import org.slf4j.LoggerFactory
@@ -69,9 +70,15 @@ class MapsTrackViewModel : ViewModel() {
trackFile.name.endsWith(".fit") -> {
val fitFile = FitFile.parseIncoming(trackFile)
return fitFile.records
.filterIsInstance<FitRecord>()
.map { it.toActivityPoint() }
val activityPoints = fitFile.records
.filterIsInstance<FitRecord>()
.map { it.toActivityPoint() }
for (activityPoint in activityPoints) {
if (activityPoint.location != null) {
return activityPoints
}
}
return fitFile.records.filterIsInstance<FitSession>()[0].toActivityPoints()
}
else -> {
@@ -54,6 +54,7 @@ public class GarminWorkoutParser implements ActivitySummaryParser {
private final List<FitTimeInZone> timesInZone = new ArrayList<>();
private final List<ActivityPoint> activityPoints = new ArrayList<>();
private List<ActivityPoint> sessionActivityPoints;
private FitSession session = null;
private FitSport sport = null;
private FitUserProfile userProfile = null;
@@ -154,6 +155,7 @@ public class GarminWorkoutParser implements ActivitySummaryParser {
} else {
// We only support 1 session
session = (FitSession) record;
sessionActivityPoints = (session.toActivityPoints());
}
} else if (record instanceof FitPhysiologicalMetrics) {
LOG.debug("Physiological Metrics: {}", record);
@@ -681,7 +683,8 @@ public class GarminWorkoutParser implements ActivitySummaryParser {
summaryData.add(
INTERNAL_HAS_GPS,
String.valueOf(activityPoints.stream().anyMatch(p -> p.getLocation() != null))
String.valueOf(activityPoints.stream().anyMatch(p -> p.getLocation() != null) ||
sessionActivityPoints.stream().anyMatch(p -> p.getLocation() != null))
);
summary.setSummaryData(summaryData.toString());
@@ -18,6 +18,12 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint;
import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition;
@@ -1952,4 +1958,32 @@ public class FitSession extends RecordData {
return (FitSession) super.build();
}
}
// manual changes below
public List<ActivityPoint> toActivityPoints() {
final List<ActivityPoint> activityPoints = new ArrayList<ActivityPoint>();
final ActivityPoint startActivityPoint = new ActivityPoint();
startActivityPoint.setTime(new Date(getComputedTimestamp() * 1000L));
if (getStartLatitude() != null && getStartLongitude() != null) {
startActivityPoint.setLocation(new GPSCoordinate(
getStartLongitude(),
getStartLatitude(),
GPSCoordinate.UNKNOWN_ALTITUDE
));
activityPoints.add(startActivityPoint);
}
final ActivityPoint endActivityPoint = new ActivityPoint();
endActivityPoint.setTime(new Date(getComputedTimestamp() * 1000L));
if (getEndLatitude() != null && getEndLongitude() != null) {
endActivityPoint.setLocation(new GPSCoordinate(
getEndLongitude(),
getEndLatitude(),
GPSCoordinate.UNKNOWN_ALTITUDE
));
activityPoints.add(endActivityPoint);
}
return activityPoints;
}
}
@@ -178,6 +178,22 @@ public final class MapsManager {
isMapLoaded = false;
}
private BoundingBox minimalBoundingBox(double minLat, double minLon, double maxLat, double maxLon) {
final LatLong center = new LatLong(minLat + (maxLat - minLat) / 2, minLon + (maxLon - minLon) / 2);
final double minLatDistance = LatLongUtils.latitudeDistance(1000);
final double minLonDistance = LatLongUtils.longitudeDistance(1000, center.latitude);
if ((maxLat - minLat) < minLatDistance) {
maxLat = center.latitude + minLatDistance/2;
minLat = center.latitude - minLatDistance/2;
}
if ((maxLon - minLon) < minLonDistance) {
maxLon = center.longitude + minLonDistance/2;
minLon = center.longitude - minLonDistance/2;
}
return new BoundingBox(minLat, minLon, maxLat, maxLon);
}
public void setTrack(final List<? extends GPSCoordinate> trackPoints) {
final Accumulator latitudeAccumulator = new Accumulator();
final Accumulator longitudeAccumulator = new Accumulator();
@@ -189,6 +205,7 @@ public final class MapsManager {
final double minLat = latitudeAccumulator.getMin();
final double maxLon = longitudeAccumulator.getMax();
final double minLon = longitudeAccumulator.getMin();
final LatLong center = new LatLong(minLat + (maxLat - minLat) / 2, minLon + (maxLon - minLon) / 2);
final List<LatLong> points = trackPoints.stream()
.map(p -> new LatLong(p.getLatitude(), p.getLongitude()))
@@ -206,10 +223,11 @@ public final class MapsManager {
}
polyline.setPoints(points);
mapView.setCenter(new LatLong(minLat + (maxLat - minLat) / 2, minLon + (maxLon - minLon) / 2));
mapView.setCenter(center);
final byte zoom = LatLongUtils.zoomForBounds(
new Dimension(mapView.getWidth(), mapView.getHeight()),
new BoundingBox(minLat, minLon, maxLat, maxLon),
minimalBoundingBox(minLat, minLon, maxLat, maxLon),
mapView.getModel().displayModel.getTileSize()
);
mapView.setZoomLevel(zoom);