Commit Graph
15130 Commits
Author SHA1 Message Date
José Rebelo 77773e29e0 Merge pull request 'Garmin: reduce overhead when importing FIT activities' (#6057)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6057
2026-05-01 14:42:17 +02:00
José Rebelo 84600dc4c2 Garmin: add more AntGadget ID for Cycplus C3 2026-05-01 13:14:02 +01: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
José Rebelo e41f5e1f18 Merge pull request 'GPX: export track type' (#6055)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6055
2026-04-30 23:07:03 +02: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
José Rebelo f0afd29d4a Merge pull request 'Garmin: fix test failures due to updated NativeFITMessage' (#6045)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6045
2026-04-29 13:54:48 +02:00
Roker2 103642692f Add mote TG clients support 2026-04-29 13:42:53 +02:00
Thomas Kuehne d999213277 Garmin: fix test failures due to updated NativeFITMessage 2026-04-28 20:05:49 +00:00
joserebelo d307859b69 Fix build 2026-04-27 00:35:11 +02:00
José Rebelo c1aee648a0 Fix build when git is not installed 2026-04-26 20:00:13 +01:00
José Rebelo 89b7a19ba0 Huawei Band 11: Add model and resolution for watchface install (#6037) 2026-04-26 14:51:52 +01:00
José Rebelo 5dcc6591d6 Merge pull request 'Fix .FIT file decoding' (#6038)
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/6038
2026-04-26 15:03:09 +02:00
liberodarkandJosé Rebelo 79763f0228 Add Huawei Watch GT Runner 2 2026-04-26 14:56:34 +02: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
José Rebelo 19660a69ab CMF Buds 2a: Initial support 2026-04-26 10:00:38 +01: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
José Rebelo 3623dde207 Garmin Forerunner 570: Initial support 2026-04-25 13:38:32 +01: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
Thomas Kuehne 748e388bdd Garmin: extend AntGadget support for dual ANT+ / Bluetooth devices 2026-04-24 20:54:19 +00:00
Thomas Kuehne 0e010c0ce0 Garmin: decode more FIT messages and fields 2026-04-24 20:53:53 +00:00
Thomas Kuehne f0c5748eaa Garmin: add more sport / subsport codes 2026-04-24 20:50:55 +00:00
Thomas Kuehne fc36a2e073 Garmin: fix UINT64Z BaseType from 0x8F (UINT64) to 0x90 2026-04-24 20:49:38 +00:00
José Rebelo b5563ee00d Garmin: Fix pace unit 2026-04-23 22:40:11 +01:00
José Rebelo e581eb34c4 Round large work values to kJ 2026-04-23 22:39:59 +01:00
José Rebelo 1b84dd1b54 Avoid crash when BLE Scan Service is enabled on zip restore 2026-04-23 22:29:03 +01:00
José Rebelo 7f2255c00f Xiaomi: Fix reminder crash on unknown repetition 2026-04-23 22:03:29 +01:00
José Rebelo 2380f98815 Adjust default sleep range to 18:00
This is a saner default than 12:00, which cuts off sleep sessions that
go past noon. We keep the previous noon-to-noon setting as an option, in
case that is a better option for some users.
2026-04-23 20:49:47 +01:00
Avery Sterk 40336b570f WeatherSpec: compute night correctly when sunrise and sunset are on different UTC dates 2026-04-20 09:01:20 -05:00
José Rebelo b95ad084d6 Sony WH-1000XM3: Disable unsupported preferences when Audio HD enabled 2026-04-19 16:24:38 +01:00
José Rebelo 9badec8e3a Sony: Read LDAC and NC/AMBIENT button value on connection 2026-04-19 16:24:36 +01:00
duhowandJosé Rebelo 0e85d47cc8 Sony: WH-1000XM3 add support for LDAC and NC/AMBIENT button switch (#5990)
Implements missing features from [WH-1000XM3](https://gadgetbridge.org/gadgets/headphones/sony/#device__sony_wh-1000xm3):

- Sound Quality Mode (SBC Codec / HD codecs)
    - Added as a switch (boolean) in UI
    - Note that LDAC option can appear in Andoid Bluetooth Device settings as well as unselected. Some Android devices (eg. Samsung) will also allow changing the BT Codec in Developer Settings, but if this is not enabled, the change won't apply.
- Function of NC/AMBIENT button
    - Allows using either Google Assistant or Alexa Assistant.
    - This model does not support "system assistant", used for other non-Google/Alexa assistants.

Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/5990
Co-authored-by: duhow <contacto@duhowpi.net>
Co-committed-by: duhow <contacto@duhowpi.net>
2026-04-19 17:17:16 +02:00
Thomas KuehneandJosé Rebelo 9b9e6dd34a Garmin: add more ANT+ IDs and fallback to formatted ANT ID before serial number 2026-04-19 14:19:52 +02:00
José Rebelo a948713fc4 InternetUtils: Honor content-type header 2026-04-19 09:55:08 +01:00
José Rebelo dd46ba54be Polar H10: Add configuration settings 2026-04-18 17:44:19 +01:00
José Rebelo b73077a566 Amazfit Bip S: Attempt to fix reboot on notification without title 2026-04-18 09:30:08 +01:00
José Rebelo d5a8fee6e6 Garmin: Add Polar H10 ANT+ IDs 2026-04-17 21:56:26 +01:00
Thomas Kuehne cd09de5ebb Garmin: use more human friendly names for ANT+ gear in activity summaries 2026-04-16 10:19:41 +00:00
José Rebelo 16fb9236cb Zepp OS: Truncate Card ID 2026-04-15 21:47:12 +01:00
José Rebelo 8a1cd4adfc Add FossWallet support 2026-04-15 21:46:59 +01:00