Commit Graph
15142 Commits
Author SHA1 Message Date
José Rebelo 069277747c CMF Buds 2a: Add low latency mode 2026-05-02 19:09:11 +01:00
Dominik RiebelingandJosé Rebelo 24d1a40e39 CMF Buds: Fix ANC modes list update
- Fix the wrong flag being checked for some modes
- Remove unnecessary outer check that prevented the list update in some
  cases
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo aae925febb CMF Buds: Use better icons for device specific settings 2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo b4bbd0c492 CMF Buds: Request firmware version on initializing 2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo f23ec9e51f CMF Buds: Handle In-Ear detection change
When the In-Ear detection state changes on the device (via a 2nd
connected phone) handle the change indicated by the buds and update the
value accordingly.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo c6125e351e CMF Buds: Handle ANC mode change on buds
When the buds change their audio / ANC mode (via buds touch, or a 2nd
connected phone) they send the current state using a different command.
Handle that so the state is updated properly.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo 0cb14eb30d CMF Buds: Fix reading ANC status on newer buds
Newer buds send 6 bytes for ANC status instead of 3. Since the relevant
information is in the first 3 bytes and identical allow extra trailing
bytes when parsing.

Confirmed on the Buds 2 Plus. Likely also applies to Ear(a) (see #3994),
possibly other models as well.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo aaf5b3011f CMF Buds: Support more ANC modes
Some Buds support additional ANC modes "medium" and "adaptive".
Add them to the available modes.

- Buds 2 Plus
- Ear(a) (see #3994)

Likely also applies to other models.
2026-05-02 19:50:44 +02:00
Dominik RiebelingandJosé Rebelo 5ba0f6bf71 CMF: Initial support for Buds 2 Plus 2026-05-02 19:50:44 +02: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
José Rebelo 2b0f95ad76 Fix connection to device on gpx upload 2026-05-01 16:16:19 +01:00
José Rebelo 666252de1a Huawei Watch Ultimate 2: Initial support 2026-05-01 15:43:08 +01:00
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