mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Add diving map (garmin)
This commit is contained in:
+10
-3
@@ -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 -> {
|
||||
|
||||
+4
-1
@@ -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());
|
||||
|
||||
+34
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user