Commit Graph
100 Commits
Author SHA1 Message Date
Thomas Kuehne db09823aca BangleJS: add optional device target filter for com.banglejs.uart.tx intent
Analog to IntentApiReceiver enhancement #6250

Adds an optional `device` extra containing the MAC address of the target gadget.
Missing `device` extra or a `null` value forward the intent payload to all initialised BangleJS.
The existing device preference filter (device_intents == true) remains unchanged.
2026-06-14 17:50:27 +00:00
Thomas Kuehne b2588c5761 Garmin: add more enumeration entries 2026-06-14 11:29:53 +00:00
Thomas Kuehne 2a7ccef529 BtLEAction: code review 2026-06-14 10:43:39 +00:00
Thomas Kuehne 1313392a84 add BundleUtils.addToBundle
- deduplicate code from BangleJSDeviceSupport and IntentApiReceiver
- add support for more standard types
- add BangleJS support for simple JSON arrays and JSON null values:
   - `"nullValue" : null`
   - `"booleanArray" : [true, false]`
   - `"doubleArray" : [1.2, -3.4]`
   - `"longArray" : [12, -34]`
   - `"StringArray" : ["12", "xyz"]`
2026-06-14 10:36:11 +00:00
Thomas Kuehne 16826a3091 fix: SampleProviderTest's use of addGBActivitySamples 2026-06-14 10:31:41 +00:00
Thomas Kuehne 5c3183d36c git: reduce exposure risk for local secret 2026-06-14 10:31:02 +00:00
Thomas Kuehne bb03a2d5eb fix typos in device independent comments 2026-06-12 14:23:06 +00:00
Thomas KuehneandJosé Rebelo 6ad6638605 fix device independent typos 2026-06-10 17:43:46 +02:00
Thomas Kuehne 25e322ea9a IntentApiReceiver: enhance device specification in Intents
- harmonise extra `address` to `device` - the old extra `address` logs a warning but is still supported
- support optional `device` extra for action nodomain.freeyourgadget.gadgetbridge.command.ACTIVITY_SYNC
- support optional `device` extra for action nodomain.freeyourgadget.gadgetbridge.command.DEBUG_SEND_NOTIFICATION
- support optional `device` extra for action nodomain.freeyourgadget.gadgetbridge.command.DEBUG_INCOMING_CALL
- support optional `device` extra for action nodomain.freeyourgadget.gadgetbridge.command.DEBUG_END_CALL
- support ComponentName extras for action nodomain.freeyourgadget.gadgetbridge.command.DEBUG_TEST_NEW_FUNCTION
- code review

See Freeyourgadget/website#247 for the documentation update.
2026-06-06 18:03:48 +00:00
Thomas Kuehne bc20a1a874 onTestNewFunction enhancements
EventHandler.onTestNewFunction
- add optional `options` Bundle parameter for receiving arguments

intent nodomain.freeyourgadget.gadgetbridge.command.DEBUG_TEST_NEW_FUNCTION
- add optional String extra `address` to specify the MAC address of the target device
- add optional Bundle extra `options` to pass arguments to EventHandler.onTestNewFunction
- construct a synthetic `options` bundle if the `options` extra is missing but there are `options_...` extras

Global setting `Settings / Developer options / Intent API / Allow Debug Command` must be enabled and the device(s) connected for the following examples.

Example to trigger onTestNewFunction for all currently connected devices:
`adb shell am broadcast -p nodomain.freeyourgadget.gadgetbridge -a "nodomain.freeyourgadget.gadgetbridge.command.DEBUG_TEST_NEW_FUNCTION"`

Example to trigger onTestNewFunction for a specific device:
`adb shell am broadcast -p nodomain.freeyourgadget.gadgetbridge -a "nodomain.freeyourgadget.gadgetbridge.command.DEBUG_TEST_NEW_FUNCTION" --es address "12:34:56:78:9A:BC" `

Example to trigger onTestNewFunction for a specific device with an option Bundle containing float x=4.2 and integer array y=[1,2,3] extras:
`adb.exe shell am broadcast -p nodomain.freeyourgadget.gadgetbridge -a "nodomain.freeyourgadget.gadgetbridge.command.DEBUG_TEST_NEW_FUNCTION" --es address "31:31:43:30:40:07" --ef options_x 4.2 --eia options_y 1,2,3`

Extras for some other types can also be specified via command line. See https://developer.android.com/tools/adb#IntentSpec for details.
2026-06-06 07:28:51 +00:00
Thomas Kuehne 2407519e61 SMAQ2OSS: move SMAQ2OSSSupport to standard package 2026-06-06 00:41:59 +00:00
Thomas Kuehne 75e25a0e90 fix: Physical Layer (PHY) mask on MIUI for gadgets other than Casio GBX100 2026-06-05 10:48:25 +00:00
Thomas Kuehne 7e6d96ae8c TransactionBuilder: rename wait/WaitAction to sleep/SleepAction
Object.wait(long) and TransactionBuilder.wait(int) have too similar signatures that may result in unintentionally calling the wrong method.
2026-06-05 03:47:59 +00:00
Thomas Kuehne 7c309e9a5d TransactionBuilder: code review 2026-06-05 02:07:36 +00:00
Thomas Kuehne 3cf7b7696c fix: Call requires API level 35 (current min is 23): java.util.List#getFirst 2026-06-03 19:22:34 +00:00
Thomas Kuehne 1b04588176 service: remove unnecessary imports 2026-06-02 11:08:30 +00:00
Thomas Kuehne 26bd60b766 util: remove unnecessary imports 2026-06-02 11:08:14 +00:00
Thomas Kuehne 85e15d7979 model: remove unnecessary imports 2026-06-02 11:07:54 +00:00
Thomas Kuehne ff0a4b5bd9 externalevents: remove unnecessary imports 2026-06-02 11:07:35 +00:00
Thomas Kuehne a1929b927b capabilities: remove unnecessary imports 2026-06-02 11:07:17 +00:00
Thomas Kuehne 60f5819355 adapter: remove unnecessary imports 2026-06-02 11:06:59 +00:00
Thomas Kuehne 58d1276f27 activities: remove unnecessary imports 2026-06-02 11:06:43 +00:00
Thomas Kuehne 62cae655dd ZipBackupCallback: add @Nullable / @NonNull annotations 2026-06-01 03:44:25 +00:00
Thomas Kuehne 737a25b2ea InstallHandler: add @Nullable / @NonNull annotations 2026-06-01 03:44:07 +00:00
Thomas Kuehne 438576b610 DeviceCardAction: add @Nullable / @NonNull annotations 2026-06-01 03:43:44 +00:00
Thomas Kuehne 057797c73f DBUpdateScript: add @Nullable / @NonNull annotations 2026-06-01 03:43:27 +00:00
Thomas Kuehne bd829ce33b DBHandler: add @Nullable / @NonNull annotations 2026-06-01 03:43:08 +00:00
Thomas Kuehne 081403d83c Yawell: use persistSamples and improve timestamp logging 2026-05-31 17:12:22 +00:00
Thomas Kuehne 9cda5525a9 GBDevice: code review 2026-05-31 15:44:31 +00:00
Thomas Kuehne 6be78e2b11 GBDevice: update caller to use multi-battery methods 2026-05-31 15:44:11 +00:00
Thomas Kuehne b0d4706d15 GloryFitSupport: fix @NonNullable change 2026-05-30 19:28:02 +00:00
Thomas Kuehne f073b360b6 GBDeviceService: code review 2026-05-30 06:19:29 +00:00
Thomas Kuehne 35d5774c2a Yawell: switch to automatically generated sample providers 2026-05-29 20:33:03 +00:00
Thomas Kuehne a3c7beaf10 Xiaomi: switch to automatically generated sample providers 2026-05-29 20:33:00 +00:00
Thomas Kuehne b1ba12923c Wena3: switch to automatically generated sample providers 2026-05-29 20:32:58 +00:00
Thomas Kuehne 2a9966e203 Ultrahuman: switch to automatically generated sample providers 2026-05-29 20:32:55 +00:00
Thomas Kuehne 577a1fe918 QHybrid: switch to automatically generated sample provider 2026-05-29 20:32:50 +00:00
Thomas Kuehne ae125f1763 Moyoung: switch to automatically generated sample providers 2026-05-29 20:32:48 +00:00
Thomas Kuehne 481477e5a8 MiScale: switch to automatically generated sample provider 2026-05-29 20:32:46 +00:00
Thomas Kuehne 08732d3013 Mijia Lywsd: switch to automatically generated sample provider 2026-05-29 20:32:44 +00:00
Thomas Kuehne 6f51e3a764 Huawei: switch to automatically generated sample providers 2026-05-29 20:32:42 +00:00
Thomas Kuehne 3bab9b8620 Huami: switch to automatically generated sample providers 2026-05-29 20:32:40 +00:00
Thomas Kuehne 129ecb0c8c Glory Fit: switch to automatically generated sample provider 2026-05-29 20:32:37 +00:00
Thomas Kuehne caad9b0af4 Garmin: switch to automatically generated sample providers 2026-05-29 20:32:35 +00:00
Thomas Kuehne 43c92e0317 Cycling Sensor: switch to automatically generated sample provider 2026-05-29 20:32:33 +00:00
Thomas Kuehne 54fa5f3b01 CMF Watch Pro: switch to automatically generated sample providers 2026-05-29 20:32:30 +00:00
Thomas Kuehne 55d3511105 Blood Pressure: switch to automatically generated sample provider 2026-05-29 20:32:24 +00:00
Thomas Kuehne 97281bcb38 MetricsSamples: add experimental UI visualisation paths
- (de-)activate via Settings / Developer Options / Experimental metrics UI
- UI currently uses this only for TrainingAcuteLoad, TrainingChronicLoad and RestingMetabolicRate
- Garmin devices are the only ones that actually record these values in the database
2026-05-29 19:28:32 +00:00
Thomas Kuehne 23cf885c13 MetricsSamples: database infrastructure
- fix: use milliseconds instead of seconds to align with most other samples
- DB upgrade copies existing data from GARMIN_RESTING_METABOLIC_RATE_SAMPLE, GENERIC_TRAINING_LOAD_ACUTE_SAMPLE and GENERIC_TRAINING_LOAD_CHRONIC_SAMPLE to GENERIC_METRIC_SAMPLE
- new data is saved to both the specific table as well as GENERIC_METRIC_SAMPLE
- add GenericMetricSampleProvider with service functions
- add GENERIC_MAXIMUM_OXYGEN_UPTAKE parsing for Garmin
2026-05-29 19:28:26 +00:00
Thomas Kuehne 3e9c10c0d7 persistence: replace calls to persistForDevice with persistSamples 2026-05-29 01:31:10 +00:00
Thomas Kuehne 1569e05acb Garmin: use harmonised persistSamples methods 2026-05-29 01:31:05 +00:00
Thomas Kuehne 57e493fa86 persistence: add SampleProvider support 2026-05-29 01:30:58 +00:00
Thomas Kuehne e7b86faf7a persistence: add AbstractTimeSample support 2026-05-29 01:20:59 +00:00
Thomas Kuehne 79b5abe85e persistence: add BatteryLevel support 2026-05-29 01:20:37 +00:00
Thomas Kuehne eac3c94a0b persistence: add BaseActivitySummary support 2026-05-29 01:20:14 +00:00
Thomas Kuehne 422047de19 DBHelper: improve JavaDoc 2026-05-29 01:18:34 +00:00
Thomas Kuehne 38e43a32b6 GB.toast: improve JavaDoc 2026-05-28 23:26:38 +00:00
Thomas Kuehne 2f2bb33ddf add missing @Override annotations 2026-05-25 17:24:58 +00:00
Thomas Kuehne dd2b864461 DeviceCoordinator: explicitly specify @Nullable for some returns 2026-05-25 16:01:16 +00:00
Thomas Kuehne 04c7f9e9e6 DeviceCoordinator: explicitly specify @NonNull for arguments 2026-05-25 16:00:49 +00:00
Thomas Kuehne f58130ba8d annotations: prefer androidx.annotation over org.jetbrains.annotations
The Androidx annotations are frequently used whereas Jetbrains annotations are infrequently used.
Where possible, use Androidx instead of Jetbrains annotations.
2026-05-24 18:17:04 +00:00
Thomas Kuehne 5cb0e6b70d Garmin: add more ANT+ gadget IDs 2026-05-24 13:31:49 +00:00
Thomas KuehneandJosé Rebelo 85543cb4c6 igpsport: Rebase to current master 2026-05-13 23:33:24 +02:00
Thomas KuehneandJosé Rebelo 2d36bda559 igpsport: Update for current master rebase 2026-05-13 23:33:24 +02:00
Thomas KuehneandJosé Rebelo 014b180a30 igsport: rebase device code to master ad34fec706 2026-05-13 23:33:24 +02:00
Thomas Kuehne 1b8bdbcf30 WorkoutValueFormatter: replace strings with unit constants declared in ActivitySummaryEntries 2026-05-08 10:35:51 +00:00
Thomas Kuehne 6fab1ef852 Garmin: add dedicated lap summary format for stop watch activities 2026-05-08 09:38:32 +00:00
Thomas Kuehne 0ccbda5e62 Garmin: add test for fallback sport with subsport=0 2026-05-08 09:38:15 +00:00
Thomas Kuehne 86268476bf Garmin: fix AVG_GROUND_CONTACT_TIME_BALANCE for session.getAvgStanceTimeBalance() == 0 2026-05-08 09:37:52 +00:00
Thomas Kuehne 2355e04bbd Garmin: INDOOR_TRACK is a pace activity 2026-05-08 09:37:33 +00:00
Thomas Kuehne bf7b2b2691 Garmin: fix scaling for FitSession's TotalDistance, TotalTimerTime and getStandTime 2026-05-08 09:37:17 +00:00
Thomas Kuehne 3781924351 Garmin: improve workout parsing
- add initial / final / min stamina handling for session summary
- add fractional cycle and cadence handling for session summary
- add fallback handling for diving summary
2026-05-08 09:36:57 +00:00
Thomas Kuehne ad1ac39c4d Garmin: fix null timestamp for FitEvent 2026-05-08 09:36:39 +00:00
Thomas Kuehne 553bfa2ab7 Garmin: add TRAINING_EFFECT_ANAEROBIC fallback handling 2026-05-08 09:36:22 +00:00
Thomas Kuehne fad0fb08d5 Garmin: add more ANT+ gadget IDs 2026-05-08 09:36:04 +00:00
Thomas Kuehne f586f0d52f Garmin: add more FIT messages and field definitions 2026-05-08 09:35:49 +00:00
Thomas Kuehne 7960835407 ActivityPoint: standardise on step length - remove stride handling 2026-05-08 09:35:10 +00:00
Thomas Kuehne e13a219efc Garmin: fix Step Length visualisation 2026-05-08 09:34:50 +00:00
Thomas Kuehne d45bcd4db3 Garmin: add basic Send Waypoint activity
- available in device specific settings for supported gadgets
- supports pasting common text formats (e.g. 27°59′18″N 86°55′31″E)
- supports geo: URIs (e.g. geo:27.988333,86.925278,8848)
2026-05-03 16:11:55 +00:00
Thomas Kuehne c51a0535c9 add EXTRA_OPTIONS support to FwAppInstallerActivity and FileInstallerActivity
If present, the extra of type Bundle is passed on to as `options` argument to DeviceCoordinator.findInstallHandler and EventHandler.onInstallApp.
2026-05-03 16:11:49 +00:00
Thomas Kuehne 72dcc1db2c Garmin: experimental settings for wake / sleep times (#4331)
Experiment to support setting typical wake / sleep times for devices without realtime settings.

Settings / Developer options / Experimental settings
-> enable

Device specific setting / Experimental settings
-> wake time
-> sleep time
-> send
2026-05-02 21:27:55 +00:00
Thomas Kuehne e5bd136385 Garmin: add BUNDLE_EXTRA_INSTALL_TASK_NAME and BUNDLE_EXTRA_INSTALL_BYTES for onInstallApp 2026-05-02 21:27:31 +00:00
Thomas Kuehne c6b13d07d3 Garmin: fix AntGadget.NameGadget for non-Garmin devices
For Garmin ANT devices the extended ANT device number and the filtered serial number result in the same name.
This link between ANT device number and serial number is not always true for non-Garmin devices.
2026-05-01 20:29:28 +00:00
Thomas Kuehne f1ecc71716 Garmin: re-use FitImporter to reduce memory pressure 2026-05-01 10:43:15 +00:00
Thomas Kuehne b8061337e2 Garmin: avoid reading the FIT file twice for auto GPX export 2026-05-01 10:43:10 +00:00
Thomas Kuehne c1d8eb58b9 Garmin: check if GPX export is enabled before generating the export ActivityTrack 2026-05-01 10:43:02 +00:00
Thomas Kuehne c926cadbb8 GPX: export track type 2026-04-30 18:24:01 +00:00
Thomas Kuehne 188d6a8ce9 Garmin: add more FIT messages and fields 2026-04-30 16:56:45 +00:00
Thomas Kuehne c021f615e2 Garmin: add more AntGadget IDs 2026-04-30 16:50:08 +00:00
Thomas Kuehne 76884c5820 Garmin: add more GarminSport codes 2026-04-30 16:49:46 +00:00
Thomas Kuehne 2f072424f6 BLE: add new Bluetooth standard mapping to BleNamesResolver 2026-04-30 16:49:24 +00:00
Thomas Kuehne 5bf6032e75 Garmin: fix laps with speed 0.0 for isPaceActivity=true
FIT file for testing:
https://github.com/ThomasKuehne/FIT-test-files/blob/main/Activity/2018/Activity_20180324_005_000_Swimming_Fr935_ae9c05519ca8c802f33a8ffd90b15915.fit

``
Error saving specific samplesjava.lang.IllegalArgumentException: Infinity is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method.
  at com.google.gson.Gson.checkValidFloatingPoint(Gson.java:508)
  at com.google.gson.Gson$1.write(Gson.java:470)
  at com.google.gson.Gson$1.write(Gson.java:453)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:100)
  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:64)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
  at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java:181)
  at com.google.gson.typeadapters.RuntimeTypeAdapterFactory$1.write(RuntimeTypeAdapterFactory.java:309)
  at com.google.gson.TypeAdapter$NullSafeTypeAdapter.write(TypeAdapter.java:304)
  at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
  at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:225)
  at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:161)
  at com.google.gson.Gson.toJson(Gson.java:943)
  at com.google.gson.Gson.toJson(Gson.java:898)
  at com.google.gson.Gson.toJson(Gson.java:847)
  at com.google.gson.Gson.toJson(Gson.java:824)
  at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toJson(ActivitySummaryData.java:189)
  at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toString(ActivitySummaryData.java:185)
  at nodomain.freeyourgadget.gadgetbridge.devices.garmin.GarminWorkoutParser.updateSummary(GarminWorkoutParser.java:1080)
  at nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitImporter.persistWorkout(FitImporter.java:687)
``
2026-04-29 18:22:53 +00:00
Thomas Kuehne d999213277 Garmin: fix test failures due to updated NativeFITMessage 2026-04-28 20:05:49 +00:00
Thomas Kuehne 5dbd72f82a Garmin: fix .FIT file summary creation when calculation results in infinity
Example pace calculation when speed is exactly 0.0 m/s.

``
Error saving specific samplesjava.lang.IllegalArgumentException: Infinity is not a valid double value as per JSON specification. To override this behavior, use GsonBuilder.serializeSpecialFloatingPointValues() method.
	at com.google.gson.Gson.checkValidFloatingPoint(Gson.java:508)
	at com.google.gson.Gson$1.write(Gson.java:470)
	at com.google.gson.Gson$1.write(Gson.java:453)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:100)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:64)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:251)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:491)
	at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java:181)
	at com.google.gson.typeadapters.RuntimeTypeAdapterFactory$1.write(RuntimeTypeAdapterFactory.java:309)
	at com.google.gson.TypeAdapter$NullSafeTypeAdapter.write(TypeAdapter.java:304)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:225)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:161)
	at com.google.gson.Gson.toJson(Gson.java:943)
	at com.google.gson.Gson.toJson(Gson.java:898)
	at com.google.gson.Gson.toJson(Gson.java:847)
	at com.google.gson.Gson.toJson(Gson.java:824)
	at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toJson(ActivitySummaryData.java:195)
	at nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryData.toString(ActivitySummaryData.java:191)
	at nodomain.freeyourgadget.gadgetbridge.devices.garmin.GarminWorkoutParser.updateSummary(GarminWorkoutParser.java:1079)
``
2026-04-26 09:43:51 +00:00
Thomas Kuehne b7bdea78b0 Garmin: fix .FIT file decoding for STRAVA generated files
example files for testing:
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2020/Activity_20201211_002_Cycling_Strava_f0e4ebdad26738b169400fb35fb4b31e.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2022/Activity_20221014_002_Cycling_Strava_456175fbfb40fb170c3aff7ba8769290.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230123_002_Cycling_Strava_316afc56c074e3027f91d51c8c491ba5.fit
2026-04-26 09:43:46 +00:00
Thomas Kuehne bf5fde297d Garmin: fix .FIT file decoding for COROS generated files
example files for testing:
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2021/Activity_20210630_001_Running_COROS-PACE-2_9677fe59cdc4684a89189dad1c288bb4.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2021/Activity_20210830_001_Running_COROS-APEX-46mm_11bb1b1e1c61bfed8bdd8ff0623391c5.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230626_043_Windsurfing_COROS-VERTIX_ff49a5a499ee66c4229038c547e32c8e.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230630_043_Windsurfing_COROS-VERTIX-2_d41760a0235a9b8037273b7651c4f532.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20230821_043_Windsurfing_COROS-APEX-Pro_6d750dd6c2190bc6a0d89c441e708656.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2023/Activity_20231117_001_Running_COROS-PACE-3_badb78c49b7aef7b5e112f28da83604c.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2024/Activity_20240107_017_Hiking_COROS-APEX-2-Pro_0a7a9b95b09df66ffa48ea97bb27209d.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20251119_002_008_Cycling_Mountain_COROS-DURA_4e04b1f1bad2e57127e9a2affd4cd7d0.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20250722_001_Running_COROS-PACE-Pro_13d6d1e2a93a1ed855a068145ae80110.fit
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2025/Activity_20250801_001_003_Running_Trail_COROS-Wearables_99901ef8f988756d25ac3afbbb1222eb.fit
2026-04-26 09:43:39 +00:00
Thomas Kuehne b8e1337b49 Garmin: fix Failed to get string resource by name for numeric device ID
FIT file for testing:
https://github.com/ThomasKuehne/FIT-test-files/tree/main/Activity/2026/Activity_20260118_002_009_Cycling_Downhill_EdgeMtb_1da0225a17673383029e744960ba3a56.fit
2026-04-26 09:25:34 +00:00
Thomas Kuehne 16b29bd09d 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
2026-04-26 07:58:35 +00:00
Thomas Kuehne e01599a9e3 Garmin: enhance activity summaries
- add fallback sources for HR_AVG, TOTAL_ASCENT, TOTAL_DESCENT, AVG_POWER, BODY_ENERGY_AT_START and BODY_ENERGY_AT_END
- fallback to lap average speed if the lap enhanced average speed isn't available
- ensure that paces/speeds are only rounded by WorkoutValueFormatter and not also by GarminWorkoutParser
- add diving lap summary for apnea
- add scuba tank summary
- fix diving summary gaps when CNS, N2 load or O2 toxicity values are 0
2026-04-25 00:16:16 +00:00
Thomas Kuehne 0372f855c9 Garmin: code cleanup in FitImporter / GarminWorkoutParser 2026-04-24 20:54:30 +00:00