From aee42ec1be2a85c1eec05917d7dcbd52e4bdcab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sat, 4 May 2024 21:04:57 +0100 Subject: [PATCH] Garmin: Fallback to session for workout type --- .../devices/garmin/fit/FitImporter.java | 65 ++++++++++--------- .../devices/garmin/fit/GlobalFITMessage.java | 2 + .../garmin/fit/messages/FitSession.java | 10 +++ 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java index 77ede40e4..68ebf5fec 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/FitImporter.java @@ -226,10 +226,6 @@ public class FitImporter { LOG.error("Got workout from {}, but no session", fileId); return; } - if (sport == null) { - LOG.error("Got workout from {}, but no sport", fileId); - return; - } LOG.debug("Persisting workout for {}", fileId); @@ -238,32 +234,14 @@ public class FitImporter { final ActivitySummaryData summaryData = new ActivitySummaryData(); - // TODO map all sports - if (sport.getSport() != null) { - switch (sport.getSport()) { - case 2: - summary.setActivityKind(ActivityKind.TYPE_CYCLING); - break; - case 4: // fitness_equipment - case 10: // training - if (sport.getSubSport() != null) { - switch (sport.getSubSport()) { - case 15: - summary.setActivityKind(ActivityKind.TYPE_ELLIPTICAL_TRAINER); - break; - default: - LOG.warn("Unknown sub sport {}", sport.getSubSport()); - summaryData.add("Fit Sub Sport", sport.getSubSport(), ""); - } - break; - } - default: - LOG.warn("Unknown sport {}", sport.getSport()); - summaryData.add("Fit Sport", sport.getSport(), ""); - } + final int activityKind; + if (sport != null) { + summary.setName(sport.getName()); + activityKind = getActivityKind(sport.getSport(), sport.getSubSport()); + } else { + activityKind = getActivityKind(session.getSport(), session.getSubSport()); } - - summary.setName(sport.getName()); + summary.setActivityKind(activityKind); if (session.getStartTime() == null) { LOG.error("No session start time for {}", fileId); return; @@ -322,6 +300,35 @@ public class FitImporter { } } + private int getActivityKind(final Integer sport, final Integer subsport) { + // TODO map all sports + if (sport != null) { + switch (sport) { + case 2: + return ActivityKind.TYPE_CYCLING; + case 4: // fitness_equipment + case 10: // training + if (subsport != null) { + switch (subsport) { + case 15: + return ActivityKind.TYPE_ELLIPTICAL_TRAINER; + case 20: + return ActivityKind.TYPE_STRENGTH_TRAINING; + default: + LOG.warn("Unknown sub sport {} for {}", subsport, sport); + } + break; + } + case 11: + return ActivityKind.TYPE_WALKING; + default: + LOG.warn("Unknown sport {}", sport); + } + } + + return ActivityKind.TYPE_UNKNOWN; + } + private void reset() { activitySamplesPerTimestamp.clear(); stressSamples.clear(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java index d604ecc6a..631e2441e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/GlobalFITMessage.java @@ -93,6 +93,8 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time"), new FieldDefinitionPrimitive(3, BaseType.SINT32, "start_latitude"), new FieldDefinitionPrimitive(4, BaseType.SINT32, "start_longitude"), + new FieldDefinitionPrimitive(5, BaseType.ENUM, "sport"), + new FieldDefinitionPrimitive(6, BaseType.ENUM, "sub_sport"), new FieldDefinitionPrimitive(7, BaseType.UINT32, "total_elapsed_time"), // with pauses new FieldDefinitionPrimitive(8, BaseType.UINT32, "total_timer_time"), // no pauses new FieldDefinitionPrimitive(9, BaseType.UINT32, "total_distance"), diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java index 592e8d554..c52c90d04 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSession.java @@ -45,6 +45,16 @@ public class FitSession extends RecordData { return (Long) getFieldByNumber(4); } + @Nullable + public Integer getSport() { + return (Integer) getFieldByNumber(5); + } + + @Nullable + public Integer getSubSport() { + return (Integer) getFieldByNumber(6); + } + @Nullable public Long getTotalElapsedTime() { return (Long) getFieldByNumber(7);