From 16b29bd09d13e08284c05f36a54cd95abd8fa8fc Mon Sep 17 00:00:00 2001 From: Thomas Kuehne Date: Sun, 26 Apr 2026 07:55:03 +0000 Subject: [PATCH] Garmin: fix .FIT file decoding for older Garmin devices example files for testing: https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2016/Activity_20161021_005_000_Swimming_Fr230_77e3563673fbc2b19a60a78b6f5f6f49.fit https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2018/Activity_20180113_000_015_Elliptical_Fenix3Hr_51b4891a23b94b634b93c666e1417fea.fit https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2024/Activity_20240708_015_014_Rowing_Indoor-Rowing_Fr735xt_e358d81585941c7ac1dc747987d711bc.fit https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20250128_011_000_Walking_Fr55_872d00f0d3b2a4251c86255dad477d93.fit --- .../devices/garmin/fit/RecordData.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java index bc9c3735d7..f823f456bc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/RecordData.java @@ -174,7 +174,16 @@ public class RecordData { } public T getFieldByNumber(int number, final Class clazz) { - return safeCast(getFieldByNumber(number), clazz); + Object object = getFieldByNumber(number); + if (object == null) + return null; + + // when CIQ fields are used value arrays instead of single values are sometimes recorded + if (!clazz.isArray() && object.getClass().isArray() && 0 < Array.getLength(object)) { + object = Array.get(object, 0); + } + + return safeCast(object, clazz); } public T[] getArrayFieldByNumber(int number, final Class clazz) { @@ -215,6 +224,18 @@ public class RecordData { return clazz.cast(object); } + if(object instanceof Number number){ + // some older Garmin devices encoded e.g. + // [distance] and [enhanced_speed] as float instead of double + // [cadence] as float instead of integer + if(clazz.equals(Double.class)){ + return clazz.cast(number.doubleValue()); + } + if(clazz.equals(Integer.class)){ + return clazz.cast(number.intValue()); + } + } + LOG.error( "Unable to cast {} ({}) to {}, returning null - this is likely a bug. Record: {}", object,