From 80aeaead1a3a09cef1a50a229192606d53965d10 Mon Sep 17 00:00:00 2001 From: Thomas Kuehne Date: Thu, 4 Sep 2025 00:00:00 +0200 Subject: [PATCH] garmin: extend FIT file parsing (#5339) This updates the parser to interpret more FIT information and display it in the FIT file viewer. Actually using the available information isn't part of this PR. --- .../service/devices/garmin/FileType.java | 5 + .../devices/garmin/fit/GlobalFITMessage.java | 786 +++++++++++++++++- .../FieldDefinitionGoalType.java | 6 + .../FieldDefinitionLanguage.java | 36 + .../FieldDefinitionMeasurementSystem.java | 1 + .../garmin/fit/messages/.gitattributes | 3 + .../garmin/fit/messages/FitActivity.java | 10 + .../garmin/fit/messages/FitBarometerData.java | 108 +++ .../garmin/fit/messages/FitBeatIntervals.java | 91 ++ .../garmin/fit/messages/FitBeatsInterval.java | 64 ++ .../garmin/fit/messages/FitBikeProfile.java | 388 +++++++++ .../garmin/fit/messages/FitBloodPressure.java | 164 ++++ .../garmin/fit/messages/FitCadenceZone.java | 74 ++ .../garmin/fit/messages/FitCapabilities.java | 108 +++ .../garmin/fit/messages/FitConnectivity.java | 40 + .../garmin/fit/messages/FitCpeStatus.java | 94 +++ .../garmin/fit/messages/FitDeveloperData.java | 30 + .../fit/messages/FitDeviceAuxBatteryInfo.java | 104 +++ .../garmin/fit/messages/FitDeviceInfo.java | 150 ++++ .../fit/messages/FitDeviceSettings.java | 87 ++ .../garmin/fit/messages/FitDeviceStatus.java | 94 +++ .../garmin/fit/messages/FitDeviceUsed.java | 124 +++ .../garmin/fit/messages/FitDiveGas.java | 10 + .../garmin/fit/messages/FitDiveSettings.java | 404 +++++++++ .../garmin/fit/messages/FitDiveSummary.java | 100 +++ .../garmin/fit/messages/FitEpoStatus.java | 94 +++ .../devices/garmin/fit/messages/FitEvent.java | 10 + .../garmin/fit/messages/FitExerciseTitle.java | 94 +++ .../fit/messages/FitFieldDescription.java | 90 ++ .../devices/garmin/fit/messages/FitGoals.java | 90 ++ .../garmin/fit/messages/FitGpsEvent.java | 84 ++ .../devices/garmin/fit/messages/FitHr.java | 135 +++ .../garmin/fit/messages/FitHrZone.java | 84 ++ .../garmin/fit/messages/FitHrmProfile.java | 104 +++ .../devices/garmin/fit/messages/FitHrv.java | 71 ++ .../fit/messages/FitHsaBodyBatteryData.java | 125 +++ .../fit/messages/FitHsaConfigurationData.java | 91 ++ .../garmin/fit/messages/FitHsaEvent.java | 74 ++ .../fit/messages/FitHsaHeartRateData.java | 101 +++ .../fit/messages/FitHsaRespirationData.java | 91 ++ .../garmin/fit/messages/FitHsaSpo2Data.java | 108 +++ .../garmin/fit/messages/FitHsaStepData.java | 91 ++ .../garmin/fit/messages/FitHsaStressData.java | 91 ++ .../messages/FitHsaWristTemperatureData.java | 91 ++ .../devices/garmin/fit/messages/FitLap.java | 414 ++++++++- .../garmin/fit/messages/FitLength.java | 288 +++++++ .../garmin/fit/messages/FitMaxMetData.java | 20 + .../garmin/fit/messages/FitMetZone.java | 94 +++ .../garmin/fit/messages/FitMonitoring.java | 170 ++++ .../garmin/fit/messages/FitOhrSettings.java | 74 ++ .../devices/garmin/fit/messages/FitPad.java | 54 ++ .../garmin/fit/messages/FitPowerZone.java | 84 ++ .../garmin/fit/messages/FitRecord.java | 357 ++++++++ .../fit/messages/FitRecordDataFactory.java | 48 ++ .../garmin/fit/messages/FitSdmProfile.java | 134 +++ .../garmin/fit/messages/FitSegmentFile.java | 144 ++++ .../fit/messages/FitSensorSettings.java | 114 +++ .../garmin/fit/messages/FitSession.java | 660 +++++++++++++++ .../fit/messages/FitSkinTempOvernight.java | 10 + .../garmin/fit/messages/FitSlaveDevice.java | 74 ++ .../garmin/fit/messages/FitSoftware.java | 84 ++ .../garmin/fit/messages/FitSpeedZone.java | 84 ++ .../devices/garmin/fit/messages/FitSplit.java | 244 ++++++ .../garmin/fit/messages/FitTankSummary.java | 104 +++ .../garmin/fit/messages/FitTankUpdate.java | 84 ++ .../garmin/fit/messages/FitTimeInZone.java | 80 ++ .../fit/messages/FitTimestampCorrelation.java | 50 ++ .../garmin/fit/messages/FitTotals.java | 154 ++++ .../garmin/fit/messages/FitTrainingFile.java | 114 +++ .../fit/messages/FitTrainingSettings.java | 94 +++ .../garmin/fit/messages/FitUserMetrics.java | 184 ++++ .../garmin/fit/messages/FitUserProfile.java | 70 ++ .../fit/messages/FitWatchfaceSettings.java | 10 + .../garmin/fit/messages/FitWeightScale.java | 194 +++++ .../garmin/fit/messages/FitWorkout.java | 20 + .../fit/messages/FitWorkoutSession.java | 124 +++ .../garmin/fit/messages/FitWorkoutStep.java | 244 ++++++ 77 files changed, 9465 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/.gitattributes create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBarometerData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatIntervals.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatsInterval.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBloodPressure.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCadenceZone.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCapabilities.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCpeStatus.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceAuxBatteryInfo.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceStatus.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSettings.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEpoStatus.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitExerciseTitle.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsEvent.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHr.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrZone.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrmProfile.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrv.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaBodyBatteryData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaConfigurationData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaEvent.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaHeartRateData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaRespirationData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaSpo2Data.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStepData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStressData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaWristTemperatureData.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLength.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetZone.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitOhrSettings.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPad.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPowerZone.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSdmProfile.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSegmentFile.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSlaveDevice.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSoftware.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpeedZone.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankSummary.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankUpdate.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTotals.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingFile.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeightScale.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSession.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileType.java index 0e33ac014a..afedb55c41 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/FileType.java @@ -48,9 +48,13 @@ public class FileType { COURSES(128, 6), SCHEDULES(128, 7), LOCATION(128, 8), + WEIGHT(128, 9), TOTALS(128, 10), GOALS(128, 11), + BLOOD_PRESSURE(128, 14), + MONITOR_A(128, 15), SUMMARY(128, 20), + MONITOR_DAILY(128, 28), RECORDS(128, 29), UNKNOWN_31(128, 31), // sent by HRM Pro Plus MONITOR(128, 32), @@ -78,6 +82,7 @@ public class FileType { FBT_BACKUP(128, 72), SKIN_TEMP(128, 73), FBT_PTD_BACKUP(128, 74), + SCHEDULE(128, 77), UNKNOWN_79(128, 79), // sent by instinct 3 // Other files 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 4a7350fa0f..b0ee853144 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 @@ -25,6 +25,13 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(8, BaseType.STRING, 20, "product_name") )); + public static GlobalFITMessage CAPABILITIES = new GlobalFITMessage(1, "CAPABILITIES", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8Z, "languages", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(1, BaseType.UINT8Z, "sports", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(21, BaseType.UINT32Z, "workouts_supported"), + new FieldDefinitionPrimitive(23, BaseType.UINT32Z, "connectivity_supported") + )); + public static GlobalFITMessage DEVICE_SETTINGS = new GlobalFITMessage(2, "DEVICE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "active_time_zone"), new FieldDefinitionPrimitive(1, BaseType.UINT32, "utc_offset"), @@ -36,6 +43,8 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(12, BaseType.ENUM, "backlight_mode"), new FieldDefinitionPrimitive(28, BaseType.ENUM, "alarms_enabled", FieldDefinitionFactory.FIELD.ARRAY), // [1,1] new FieldDefinitionPrimitive(36, BaseType.ENUM, "activity_tracker_enabled"), + new FieldDefinitionPrimitive(39, BaseType.UINT32, "clock_time"), + new FieldDefinitionPrimitive(40, BaseType.UINT16, "pages_enabled", FieldDefinitionFactory.FIELD.ARRAY), new FieldDefinitionPrimitive(46, BaseType.ENUM, "move_alert_enabled"), new FieldDefinitionPrimitive(47, BaseType.ENUM, "date_mode"), new FieldDefinitionPrimitive(55, BaseType.ENUM, "display_orientation"), @@ -43,9 +52,15 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(57, BaseType.UINT16, "default_page"), new FieldDefinitionPrimitive(58, BaseType.UINT16, "autosync_min_steps"), new FieldDefinitionPrimitive(59, BaseType.UINT16, "autosync_min_time"), + new FieldDefinitionPrimitive(80, BaseType.ENUM, "lactate_threshold_autodetect_enabled"), new FieldDefinitionPrimitive(86, BaseType.ENUM, "ble_auto_upload_enabled"), + new FieldDefinitionPrimitive(89, BaseType.ENUM, "auto_sync_frequency"), new FieldDefinitionPrimitive(90, BaseType.UINT32, "auto_activity_detect"), - new FieldDefinitionPrimitive(92, BaseType.UINT32Z, "alarms_repeat", FieldDefinitionFactory.FIELD.ARRAY) + new FieldDefinitionPrimitive(92, BaseType.UINT32Z, "alarms_repeat", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(94, BaseType.UINT8, "number_of_screens"), + new FieldDefinitionPrimitive(95, BaseType.ENUM, "smart_notification_display_orientation"), + new FieldDefinitionPrimitive(134, BaseType.ENUM, "tap_interface"), + new FieldDefinitionPrimitive(174, BaseType.ENUM, "tap_sensitivity") )); public static GlobalFITMessage USER_PROFILE = new GlobalFITMessage(3, "USER_PROFILE", Arrays.asList( @@ -58,6 +73,7 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(6, BaseType.ENUM, "elev_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), new FieldDefinitionPrimitive(7, BaseType.ENUM, "weight_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), new FieldDefinitionPrimitive(8, BaseType.UINT8, "resting_heart_rate"), + new FieldDefinitionPrimitive(9, BaseType.UINT8, "default_max_running_heart_rate"), new FieldDefinitionPrimitive(10, BaseType.UINT8, "default_max_biking_heart_rate"), new FieldDefinitionPrimitive(11, BaseType.UINT8, "default_max_heart_rate"), new FieldDefinitionPrimitive(12, BaseType.ENUM, "hr_setting"), @@ -67,11 +83,71 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(17, BaseType.ENUM, "activity_class"), new FieldDefinitionPrimitive(18, BaseType.ENUM, "position_setting"), new FieldDefinitionPrimitive(21, BaseType.ENUM, "temperature_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), + new FieldDefinitionPrimitive(22, BaseType.UINT16, "local_id"), + new FieldDefinitionPrimitive(23, BaseType.UINT8, 6, "global_id"), + new FieldDefinitionPrimitive(24, BaseType.UINT8, "year_of_birth", 1, -1900), new FieldDefinitionPrimitive(28, BaseType.UINT32, "wake_time"), new FieldDefinitionPrimitive(29, BaseType.UINT32, "sleep_time"), new FieldDefinitionPrimitive(30, BaseType.ENUM, "height_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), new FieldDefinitionPrimitive(31, BaseType.UINT16, "user_running_step_length"), - new FieldDefinitionPrimitive(32, BaseType.UINT16, "user_walking_step_length") + new FieldDefinitionPrimitive(32, BaseType.UINT16, "user_walking_step_length"), + new FieldDefinitionPrimitive(47, BaseType.ENUM, "depth_setting", FieldDefinitionFactory.FIELD.MEASUREMENT_SYSTEM), + new FieldDefinitionPrimitive(49, BaseType.UINT32, "dive_count"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage HRM_PROFILE = new GlobalFITMessage(4, "HRM_PROFILE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled"), + new FieldDefinitionPrimitive(1, BaseType.UINT16Z, "hrm_ant_id"), + new FieldDefinitionPrimitive(2, BaseType.ENUM, "log_hrv"), + new FieldDefinitionPrimitive(3, BaseType.UINT8Z, "hrm_ant_id_trans_type"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage SDM_PROFILE = new GlobalFITMessage(5, "SDM_PROFILE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled"), + new FieldDefinitionPrimitive(1, BaseType.UINT16Z, "sdm_ant_id"), + new FieldDefinitionPrimitive(2, BaseType.UINT16, "sdm_cal_factor", 10, 0), // % + new FieldDefinitionPrimitive(3, BaseType.UINT32, "odometer", 100, 0), // m + new FieldDefinitionPrimitive(4, BaseType.ENUM, "speed_source"), + new FieldDefinitionPrimitive(5, BaseType.UINT8Z, "sdm_ant_id_trans_type"), + new FieldDefinitionPrimitive(7, BaseType.UINT8, "odometer_rollover"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage BIKE_PROFILE = new GlobalFITMessage(6, "BIKE_PROFILE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "sport"), + new FieldDefinitionPrimitive(2, BaseType.ENUM, "sub_sport"), + new FieldDefinitionPrimitive(3, BaseType.UINT32, "odometer", 100, 0), // m + new FieldDefinitionPrimitive(4, BaseType.UINT16Z, "bike_spd_ant_id"), + new FieldDefinitionPrimitive(5, BaseType.UINT16Z, "bike_cad_ant_id"), + new FieldDefinitionPrimitive(6, BaseType.UINT16Z, "bike_spdcad_ant_id"), + new FieldDefinitionPrimitive(7, BaseType.UINT16Z, "bike_power_ant_id"), + new FieldDefinitionPrimitive(8, BaseType.UINT16, "custom_wheelsize", 1000, 0), // m + new FieldDefinitionPrimitive(9, BaseType.UINT16, "auto_wheelsize", 1000, 0), // m + new FieldDefinitionPrimitive(10, BaseType.UINT16, "bike_weight", 10, 0), // kg + new FieldDefinitionPrimitive(11, BaseType.UINT16, "power_cal_factor", 10, 0), // % + new FieldDefinitionPrimitive(12, BaseType.ENUM, "auto_wheel_cal"), + new FieldDefinitionPrimitive(13, BaseType.ENUM, "auto_power_zero"), + new FieldDefinitionPrimitive(14, BaseType.UINT8, "id"), + new FieldDefinitionPrimitive(15, BaseType.ENUM, "spd_enabled"), + new FieldDefinitionPrimitive(16, BaseType.ENUM, "cad_enabled"), + new FieldDefinitionPrimitive(17, BaseType.ENUM, "spdcad_enabled"), + new FieldDefinitionPrimitive(18, BaseType.ENUM, "power_enabled"), + new FieldDefinitionPrimitive(19, BaseType.UINT8, "crank_length", 2, -100), // mm + new FieldDefinitionPrimitive(20, BaseType.ENUM, "enabled"), + new FieldDefinitionPrimitive(21, BaseType.UINT8Z, "bike_spd_ant_id_trans_type"), + new FieldDefinitionPrimitive(22, BaseType.UINT8Z, "bike_cad_ant_id_trans_type"), + new FieldDefinitionPrimitive(23, BaseType.UINT8Z, "bike_spdcad_ant_id_trans_type"), + new FieldDefinitionPrimitive(24, BaseType.UINT8Z, "bike_power_ant_id_trans_type"), + new FieldDefinitionPrimitive(37, BaseType.UINT8, "odometer_rollover"), + new FieldDefinitionPrimitive(38, BaseType.UINT8Z, "front_gear_num"), + new FieldDefinitionPrimitive(39, BaseType.UINT8Z, "front_gear", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(40, BaseType.UINT8Z, "rear_gear_num"), + new FieldDefinitionPrimitive(41, BaseType.UINT8Z, "rear_gear", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(44, BaseType.ENUM, "shimano_di2_enabled"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static GlobalFITMessage ZONES_TARGET = new GlobalFITMessage(7, "ZONES_TARGET", Arrays.asList( @@ -82,15 +158,50 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(7, BaseType.ENUM, "pwr_calc_type") //1=percent_ftp )); + public static GlobalFITMessage HR_ZONE = new GlobalFITMessage(8, "HR_ZONE", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.UINT8, "high_bpm"), + new FieldDefinitionPrimitive(2, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage POWER_ZONE = new GlobalFITMessage(9, "POWER_ZONE", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.UINT16, "high_value"), // watt + new FieldDefinitionPrimitive(2, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage MET_ZONE = new GlobalFITMessage(10, "MET_ZONE", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.UINT8, "high_bpm"), + new FieldDefinitionPrimitive(2, BaseType.UINT16, "calories", 10, 0), // kcal/min + new FieldDefinitionPrimitive(3, BaseType.UINT8, "fat_calories", 10, 0), // kcal/min + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + public static GlobalFITMessage SPORT = new GlobalFITMessage(12, "SPORT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), new FieldDefinitionPrimitive(3, BaseType.STRING, 24, "name") )); + public static GlobalFITMessage TRAINING_SETTINGS = new GlobalFITMessage(13, "TRAINING_SETTINGS", Arrays.asList( + new FieldDefinitionPrimitive(31, BaseType.UINT32, "target_distance", 100, 0), // m + new FieldDefinitionPrimitive(32, BaseType.UINT16, "target_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(33, BaseType.UINT32, "target_time", 1, 0), // s + new FieldDefinitionPrimitive(153, BaseType.UINT32, "precise_target_speed", 1000000, 0) // m/s + )); + public static GlobalFITMessage GOALS = new GlobalFITMessage(15, "GOALS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_date"), + new FieldDefinitionPrimitive(3, BaseType.UINT32, "end_date"), new FieldDefinitionPrimitive(4, BaseType.ENUM, "type", FieldDefinitionFactory.FIELD.GOAL_TYPE), + new FieldDefinitionPrimitive(5, BaseType.UINT32, "value"), + new FieldDefinitionPrimitive(6, BaseType.ENUM, "repeat"), new FieldDefinitionPrimitive(7, BaseType.UINT32, "target_value"), + new FieldDefinitionPrimitive(8, BaseType.ENUM, "recurrence"), + new FieldDefinitionPrimitive(9, BaseType.UINT16, "recurrence_value"), + new FieldDefinitionPrimitive(10, BaseType.ENUM, "enabled"), new FieldDefinitionPrimitive(11, BaseType.ENUM, "source", FieldDefinitionFactory.FIELD.GOAL_SOURCE) )); @@ -107,6 +218,9 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(9, BaseType.UINT32, "total_distance"), // cm new FieldDefinitionPrimitive(10, BaseType.UINT32, "total_cycles"), new FieldDefinitionPrimitive(11, BaseType.UINT16, "total_calories"), + new FieldDefinitionPrimitive(13, BaseType.UINT16, "total_fat_calories"), // kcal + new FieldDefinitionPrimitive(14, BaseType.UINT16, "avg_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(15, BaseType.UINT16, "max_speed", 1000, 0), // m/s new FieldDefinitionPrimitive(16, BaseType.UINT8, "average_heart_rate"), new FieldDefinitionPrimitive(17, BaseType.UINT8, "max_heart_rate"), new FieldDefinitionPrimitive(18, BaseType.UINT8, "avg_cadence"), // rpm @@ -118,6 +232,7 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(24, BaseType.UINT8, "total_training_effect", 10, 0), new FieldDefinitionPrimitive(25, BaseType.UINT16, "first_lap_index"), new FieldDefinitionPrimitive(26, BaseType.UINT16, "num_laps"), + new FieldDefinitionPrimitive(27, BaseType.UINT8, "event_group"), new FieldDefinitionPrimitive(28, BaseType.ENUM, "trigger"), new FieldDefinitionPrimitive(29, BaseType.SINT32, "nec_latitude", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(30, BaseType.SINT32, "nec_longitude", FieldDefinitionFactory.FIELD.COORDINATE), @@ -130,25 +245,61 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(37, BaseType.UINT16, "left_right_balance"), new FieldDefinitionPrimitive(38, BaseType.SINT32, "end_latitude", FieldDefinitionFactory.FIELD.COORDINATE), new FieldDefinitionPrimitive(39, BaseType.SINT32, "end_longitude", FieldDefinitionFactory.FIELD.COORDINATE), + new FieldDefinitionPrimitive(41, BaseType.UINT32, "avg_stroke_count"), // strokes/lap + new FieldDefinitionPrimitive(42, BaseType.UINT16, "avg_stroke_distance", 100, 0), // m + new FieldDefinitionPrimitive(43, BaseType.ENUM, "swim_stroke"), new FieldDefinitionPrimitive(44, BaseType.UINT16, "pool_length", 100, 0), // m new FieldDefinitionPrimitive(45, BaseType.UINT16, "threshold_power"), // watt + new FieldDefinitionPrimitive(46, BaseType.ENUM, "pool_length_unit"), new FieldDefinitionPrimitive(47, BaseType.UINT16, "num_active_lengths"), new FieldDefinitionPrimitive(48, BaseType.UINT32, "total_work"), // joule + new FieldDefinitionPrimitive(49, BaseType.UINT32, "avg_altitude", 5, 500), // m + new FieldDefinitionPrimitive(50, BaseType.UINT32, "max_altitude", 5, 500), // m + new FieldDefinitionPrimitive(51, BaseType.UINT8, "gps_accuracy"), // m + new FieldDefinitionPrimitive(52, BaseType.SINT16, "avg_grade", 100, 0), // % + new FieldDefinitionPrimitive(53, BaseType.SINT16, "avg_pos_grade", 100, 0), // % + new FieldDefinitionPrimitive(54, BaseType.SINT16, "avg_neg_grade", 100, 0), // % + new FieldDefinitionPrimitive(55, BaseType.SINT16, "max_pos_grade", 100, 0), // % + new FieldDefinitionPrimitive(56, BaseType.SINT16, "max_neg_grade", 100, 0), // % + new FieldDefinitionPrimitive(57, BaseType.SINT8, "avg_temperature"), // °C + new FieldDefinitionPrimitive(58, BaseType.SINT8, "max_temperature"), // °C + new FieldDefinitionPrimitive(59, BaseType.UINT32, "total_moving_time", 1000, 0), // s + new FieldDefinitionPrimitive(60, BaseType.SINT16, "avg_pos_vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(61, BaseType.SINT16, "avg_neg_vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(62, BaseType.SINT16, "max_pos_vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(63, BaseType.SINT16, "max_neg_vertical_speed", 1000, 0), // m/s new FieldDefinitionPrimitive(64, BaseType.UINT8, "min_heart_rate"), // bpm + new FieldDefinitionPrimitive(65, BaseType.UINT32, "time_in_hr_zone", 1000, 0), // s + new FieldDefinitionPrimitive(66, BaseType.UINT32, "time_in_speed_zone", 1000, 0), // s + new FieldDefinitionPrimitive(67, BaseType.UINT32, "time_in_cadence_zone", 1000, 0), // s + new FieldDefinitionPrimitive(68, BaseType.UINT32, "time_in_power_zone", 1000, 0), // s + new FieldDefinitionPrimitive(69, BaseType.UINT32, "avg_lap_time", 1000, 0), // s + new FieldDefinitionPrimitive(70, BaseType.UINT16, "best_lap_index"), + new FieldDefinitionPrimitive(71, BaseType.UINT16, "min_altitude", 5, 500), // m new FieldDefinitionPrimitive(79, BaseType.UINT16, "avg_swim_cadence", 10, 0), // rpm new FieldDefinitionPrimitive(80, BaseType.UINT16, "avg_swolf"), + new FieldDefinitionPrimitive(82, BaseType.UINT16, "player_score"), + new FieldDefinitionPrimitive(83, BaseType.UINT16, "opponent_score"), + new FieldDefinitionPrimitive(84, BaseType.STRING, "opponent_name"), + new FieldDefinitionPrimitive(85, BaseType.UINT16, "stroke_count"), + new FieldDefinitionPrimitive(86, BaseType.UINT16, "zone_count"), + new FieldDefinitionPrimitive(87, BaseType.UINT16, "max_ball_speed", 100, 0), // m/s + new FieldDefinitionPrimitive(88, BaseType.UINT16, "avg_ball_speed", 100, 0), // m/s new FieldDefinitionPrimitive(89, BaseType.UINT16, "avg_vertical_oscillation", 10, 0), // mm new FieldDefinitionPrimitive(90, BaseType.UINT16, "avg_stance_time_percent", 100, 0), // % new FieldDefinitionPrimitive(91, BaseType.UINT16, "avg_stance_time", 10, 0), // ms new FieldDefinitionPrimitive(92, BaseType.UINT8, "avg_fractional_cadence", 128, 0), // rpm new FieldDefinitionPrimitive(93, BaseType.UINT8, "max_fractional_cadence", 128, 0), // rpm + new FieldDefinitionPrimitive(94, BaseType.UINT8, "total_fractional_cycles", 128, 0), // cycles new FieldDefinitionPrimitive(101, BaseType.UINT8, "avg_left_torque_effectiveness", 2, 0), // % new FieldDefinitionPrimitive(102, BaseType.UINT8, "avg_right_torque_effectiveness", 2, 0), // % new FieldDefinitionPrimitive(103, BaseType.UINT8, "avg_left_pedal_smoothness", 2, 0), // % new FieldDefinitionPrimitive(104, BaseType.UINT8, "avg_right_pedal_smoothness", 2, 0), // % + new FieldDefinitionPrimitive(105, BaseType.UINT8, "avg_combined_pedal_smoothness", 2, 0), // % new FieldDefinitionPrimitive(107, BaseType.UINT16, "front_shifts"), new FieldDefinitionPrimitive(108, BaseType.UINT16, "rear_shifts"), new FieldDefinitionPrimitive(110, BaseType.STRING, 64, "sport_profile_name"), + new FieldDefinitionPrimitive(111, BaseType.UINT8, "sport_index"), new FieldDefinitionPrimitive(112, BaseType.UINT32, "stand_time"), // s new FieldDefinitionPrimitive(113, BaseType.UINT16, "stand_count"), new FieldDefinitionPrimitive(114, BaseType.SINT8, "avg_left_pco"), // mm @@ -167,23 +318,49 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(133, BaseType.UINT16, "avg_stance_time_balance", 100, 0), // % new FieldDefinitionPrimitive(134, BaseType.UINT16, "avg_step_length", 10, 0), // mm new FieldDefinitionPrimitive(137, BaseType.UINT8, "total_anaerobic_training_effect", 10, 0), + new FieldDefinitionPrimitive(140, BaseType.UINT32, "avg_depth", 1000, 0), // m + new FieldDefinitionPrimitive(141, BaseType.UINT32, "max_depth", 1000, 0), // m + new FieldDefinitionPrimitive(142, BaseType.UINT32, "surface_interval"), // s + new FieldDefinitionPrimitive(143, BaseType.UINT8, "start_cns"), // % + new FieldDefinitionPrimitive(144, BaseType.UINT8, "end_cns"), // % + new FieldDefinitionPrimitive(145, BaseType.UINT16, "start_n2"), // % + new FieldDefinitionPrimitive(146, BaseType.UINT16, "end_n2"), // % + new FieldDefinitionPrimitive(147, BaseType.UINT8, "avg_respiration_rate"), + new FieldDefinitionPrimitive(148, BaseType.UINT8, "max_respiration_rate"), + new FieldDefinitionPrimitive(149, BaseType.UINT8, "min_respiration_rate"), + new FieldDefinitionPrimitive(150, BaseType.SINT8, "min_temperature"), // C + new FieldDefinitionPrimitive(155, BaseType.UINT16, "o2_toxicity"), // OTUs + new FieldDefinitionPrimitive(156, BaseType.UINT32, "dive_number"), new FieldDefinitionPrimitive(168, BaseType.SINT32, "training_load_peak", 65536, 0), new FieldDefinitionPrimitive(169, BaseType.UINT16, "enhanced_avg_respiration_rate", 100, 0), // breaths/min new FieldDefinitionPrimitive(170, BaseType.UINT16, "enhanced_max_respiration_rate", 100, 0), // breaths/min new FieldDefinitionPrimitive(178, BaseType.UINT16, "estimated_sweat_loss"), // ml new FieldDefinitionPrimitive(180, BaseType.UINT16, "enhanced_min_respiration_rate", 100, 0), // breaths/min + new FieldDefinitionPrimitive(181, BaseType.FLOAT32, "total_grit"), + new FieldDefinitionPrimitive(182, BaseType.FLOAT32, "total_flow"), + new FieldDefinitionPrimitive(183, BaseType.UINT16, "jump_count"), + new FieldDefinitionPrimitive(186, BaseType.FLOAT32, "avg_grit"), + new FieldDefinitionPrimitive(187, BaseType.FLOAT32, "avg_flow"), new FieldDefinitionPrimitive(188, BaseType.ENUM, "primary_benefit"), // 1 recovery + new FieldDefinitionPrimitive(192, BaseType.UINT8, "workout_feel"), // 0, bad 1 - 100 good + new FieldDefinitionPrimitive(193, BaseType.UINT8, "workout_rpe"), // 0, very weak effort 1 - 10 maximum effort new FieldDefinitionPrimitive(194, BaseType.UINT8, "avg_spo2"), new FieldDefinitionPrimitive(195, BaseType.UINT8, "avg_stress"), new FieldDefinitionPrimitive(196, BaseType.UINT16, "resting_calories"), // kcal new FieldDefinitionPrimitive(197, BaseType.UINT8, "hrv_sdrr"), // ms new FieldDefinitionPrimitive(198, BaseType.UINT8, "hrv_rmssd"), // ms + new FieldDefinitionPrimitive(199, BaseType.UINT8, "total_fractional_ascent", 100, 0), // m + new FieldDefinitionPrimitive(200, BaseType.UINT8, "total_fractional_descent", 100, 0), // m new FieldDefinitionPrimitive(205, BaseType.UINT8, "beginning_potential"), new FieldDefinitionPrimitive(206, BaseType.UINT8, "ending_potential"), new FieldDefinitionPrimitive(207, BaseType.UINT8, "min_stamina"), + new FieldDefinitionPrimitive(208, BaseType.UINT16, "avg_core_temperature", 100, 0), // °C + new FieldDefinitionPrimitive(209, BaseType.UINT16, "min_core_temperature", 100, 0), // °C + new FieldDefinitionPrimitive(210, BaseType.UINT16, "max_core_temperature", 100, 0), // °C new FieldDefinitionPrimitive(222, BaseType.UINT16, "step_speed_loss", 100, 0), new FieldDefinitionPrimitive(223, BaseType.UINT16, "step_speed_loss_percentage", 100, 0), - new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static GlobalFITMessage LAP = new GlobalFITMessage(19, "LAP", Arrays.asList( @@ -198,24 +375,65 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(8, BaseType.UINT32, "total_timer_time", 1000, 0), // s new FieldDefinitionPrimitive(9, BaseType.UINT32, "total_distance", 100, 0), // m new FieldDefinitionPrimitive(10, BaseType.UINT32, "total_cycles"), - new FieldDefinitionPrimitive(11, BaseType.UINT16, "total_calores"), + new FieldDefinitionPrimitive(11, BaseType.UINT16, "total_calories"), + new FieldDefinitionPrimitive(12, BaseType.UINT16, "total_fat_calories"), + new FieldDefinitionPrimitive(13, BaseType.UINT16, "avg_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(14, BaseType.UINT16, "max_speed", 1000, 0), // m/s new FieldDefinitionPrimitive(15, BaseType.UINT8, "avg_heart_rate"), new FieldDefinitionPrimitive(16, BaseType.UINT8, "max_heart_rate"), new FieldDefinitionPrimitive(17, BaseType.UINT8, "avg_cadence"), // rpm + new FieldDefinitionPrimitive(18, BaseType.UINT8, "max_cadence"), // rpm + new FieldDefinitionPrimitive(19, BaseType.UINT16, "avg_power"), // watt + new FieldDefinitionPrimitive(20, BaseType.UINT16, "max_power"), // watt new FieldDefinitionPrimitive(21, BaseType.UINT16, "total_ascent"), // m new FieldDefinitionPrimitive(22, BaseType.UINT16, "total_descent"), // m + new FieldDefinitionPrimitive(23, BaseType.ENUM, "intensity"), new FieldDefinitionPrimitive(24, BaseType.ENUM, "lap_trigger"), // 0 manual new FieldDefinitionPrimitive(25, BaseType.ENUM, "sport"), // 5 swimming + new FieldDefinitionPrimitive(26, BaseType.UINT8, "event_group"), new FieldDefinitionPrimitive(32, BaseType.UINT16, "num_lengths"), + new FieldDefinitionPrimitive(33, BaseType.UINT16, "normalized_power"), // watt + new FieldDefinitionPrimitive(34, BaseType.UINT16, "left_right_balance"), new FieldDefinitionPrimitive(35, BaseType.UINT16, "first_length_index"), new FieldDefinitionPrimitive(37, BaseType.UINT16, "avg_stroke_distance"), new FieldDefinitionPrimitive(38, BaseType.ENUM, "swim_style", FieldDefinitionFactory.FIELD.SWIM_STYLE), new FieldDefinitionPrimitive(39, BaseType.ENUM, "sub_sport"), // 17 = lap swimming new FieldDefinitionPrimitive(40, BaseType.UINT16, "num_active_lengths"), + new FieldDefinitionPrimitive(41, BaseType.UINT32, "total_work"), // Joule + new FieldDefinitionPrimitive(42, BaseType.UINT16, "avg_altitude", 5, 500), // m + new FieldDefinitionPrimitive(43, BaseType.UINT16, "max_altitude", 5, 500), // m + new FieldDefinitionPrimitive(44, BaseType.UINT8, "gps_accuracy"), // m + new FieldDefinitionPrimitive(45, BaseType.SINT16, "avg_grade", 100, 0), // % + new FieldDefinitionPrimitive(46, BaseType.SINT16, "avg_pos_grade", 100, 0), // % + new FieldDefinitionPrimitive(47, BaseType.SINT16, "avg_neg_grade", 100, 0), // % + new FieldDefinitionPrimitive(48, BaseType.SINT16, "max_pos_grade", 100, 0), // % + new FieldDefinitionPrimitive(49, BaseType.SINT16, "max_neg_grade", 100, 0), // % + new FieldDefinitionPrimitive(50, BaseType.SINT8, "avg_temperature"), // C + new FieldDefinitionPrimitive(51, BaseType.SINT8, "max_temperature"), // C + new FieldDefinitionPrimitive(52, BaseType.UINT32, "total_moving_time", 1000, 0), // s + new FieldDefinitionPrimitive(53, BaseType.SINT16, "avg_pos_vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(54, BaseType.SINT16, "avg_neg_vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(55, BaseType.SINT16, "max_pos_vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(56, BaseType.SINT16, "max_neg_vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(57, BaseType.UINT32, "time_in_hr_zone", 1000, 0), // s + new FieldDefinitionPrimitive(71, BaseType.UINT16, "wkt_step_index"), new FieldDefinitionPrimitive(73, BaseType.UINT16, "avg_swolf"), + new FieldDefinitionPrimitive(80, BaseType.UINT8, "avg_fractional_cadence", 128, 0), // rpm + new FieldDefinitionPrimitive(81, BaseType.UINT8, "max_fractional_cadence", 128, 0), // rpm + new FieldDefinitionPrimitive(100, BaseType.SINT8, "avg_left_pco"), // mm + new FieldDefinitionPrimitive(101, BaseType.SINT8, "avg_right_pco"), // mm + new FieldDefinitionPrimitive(102, BaseType.UINT8, "avg_left_power_phase"), + new FieldDefinitionPrimitive(103, BaseType.UINT8, "avg_left_power_phase_peak"), + new FieldDefinitionPrimitive(104, BaseType.UINT8, "avg_right_power_phase"), + new FieldDefinitionPrimitive(105, BaseType.UINT8, "avg_right_power_phase_peak"), + new FieldDefinitionPrimitive(106, BaseType.UINT16, "avg_power_position"), // watt + new FieldDefinitionPrimitive(107, BaseType.UINT16, "max_power_position"), // watt + new FieldDefinitionPrimitive(108, BaseType.UINT8, "avg_cadence_position"), // rpm + new FieldDefinitionPrimitive(109, BaseType.UINT8, "max_cadence_position"), // rpm new FieldDefinitionPrimitive(110, BaseType.UINT32, "enhanced_avg_speed", 100, 0), // m/s new FieldDefinitionPrimitive(111, BaseType.UINT32, "enhanced_max_speed", 100, 0), // m/s - new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static GlobalFITMessage RECORD = new GlobalFITMessage(20, "RECORD", Arrays.asList( @@ -227,15 +445,39 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(5, BaseType.UINT32, "distance", 100, 0), // m new FieldDefinitionPrimitive(6, BaseType.UINT16, "speed", 1000, 0), // m/s new FieldDefinitionPrimitive(7, BaseType.UINT16, "power"), // watt + new FieldDefinitionPrimitive(8, BaseType.BASE_TYPE_BYTE, 3, "compressed_speed_distance"), // 12 bit: speed|distance with scale 100|16 + new FieldDefinitionPrimitive(9, BaseType.SINT16,"grade", 100, 0), // % + new FieldDefinitionPrimitive(10, BaseType.UINT8,"resistance"), + new FieldDefinitionPrimitive(11, BaseType.SINT32,"time_from_course", 1000, 0), // s + new FieldDefinitionPrimitive(12, BaseType.UINT8,"cycle_length", 100, 0), // m new FieldDefinitionPrimitive(13, BaseType.SINT8, "temperature", 1, 0), // C + new FieldDefinitionPrimitive(17, BaseType.UINT8, "speed_1s", FieldDefinitionFactory.FIELD.ARRAY, 16, 0), // m/s + new FieldDefinitionPrimitive(18, BaseType.UINT8, "cycles"), + new FieldDefinitionPrimitive(19, BaseType.UINT32, "total_cycles"), + new FieldDefinitionPrimitive(28, BaseType.UINT16, "compressed_accumulated_power"), // watt new FieldDefinitionPrimitive(29, BaseType.UINT32, "accumulated_power"), // watt + new FieldDefinitionPrimitive(30, BaseType.UINT8, "left_right_balance"), + new FieldDefinitionPrimitive(31, BaseType.UINT8, "gps_accuracy"), // m + new FieldDefinitionPrimitive(32, BaseType.SINT16, "vertical_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(33, BaseType.UINT16, "calories"), // kcal new FieldDefinitionPrimitive(39, BaseType.UINT16, "oscillation", 10, 0), // mm + new FieldDefinitionPrimitive(40, BaseType.UINT16, "stance_time_percent", 100, 0), // % + new FieldDefinitionPrimitive(41, BaseType.UINT16, "stance_time", 10, 0), // ms new FieldDefinitionPrimitive(42, BaseType.ENUM, "activity"), + new FieldDefinitionPrimitive(49, BaseType.ENUM, "stroke_type"), + new FieldDefinitionPrimitive(50, BaseType.UINT8, "zone"), + new FieldDefinitionPrimitive(51, BaseType.UINT16, "ball_speed", 100, 0), // m/s + new FieldDefinitionPrimitive(52, BaseType.UINT16, "cadence256", 256, 0), // RPM new FieldDefinitionPrimitive(53, BaseType.UINT8, "fractional_cadence", 128, 0), // rpm + new FieldDefinitionPrimitive(62, BaseType.UINT8, "device_index"), new FieldDefinitionPrimitive(73, BaseType.UINT32, "enhanced_speed", 1000, 0), // mm/s new FieldDefinitionPrimitive(78, BaseType.UINT32, "enhanced_altitude", 5, 500), // m + new FieldDefinitionPrimitive(81, BaseType.UINT8, "battery_soc", 2, 0), // % + new FieldDefinitionPrimitive(82, BaseType.UINT16, "motor_power"), // watt new FieldDefinitionPrimitive(83, BaseType.UINT16, "vertical_ratio", 100, 0), // % + new FieldDefinitionPrimitive(84, BaseType.UINT16, "stance_time_balance", 100, 0), // % new FieldDefinitionPrimitive(85, BaseType.UINT16, "step_length", 10, 0), // mm + new FieldDefinitionPrimitive(87, BaseType.UINT16, "cycle_length16", 100, 0), // m new FieldDefinitionPrimitive(91, BaseType.UINT32, "absolute_pressure", 1, 0), // Pa new FieldDefinitionPrimitive(92, BaseType.UINT32, "depth", 1000, 0), // m new FieldDefinitionPrimitive(93, BaseType.UINT32, "next_stop_depth", 1000, 0), // m @@ -244,8 +486,19 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(96, BaseType.UINT32, "ndl_time", 1, 0), // s new FieldDefinitionPrimitive(97, BaseType.UINT8, "cns_load", 1, 0), // % new FieldDefinitionPrimitive(98, BaseType.UINT16, "n2_load", 1, 0), // % + new FieldDefinitionPrimitive(99, BaseType.UINT8, "respiration_rate", 1, 0), // s new FieldDefinitionPrimitive(108, BaseType.UINT16, "enhanced_respiration_rate"), + new FieldDefinitionPrimitive(114, BaseType.FLOAT32, "grit"), + new FieldDefinitionPrimitive(115, BaseType.FLOAT32, "flow"), + new FieldDefinitionPrimitive(116, BaseType.UINT16, "current_stress", 100, 0), + new FieldDefinitionPrimitive(123, BaseType.UINT32, "air_time_remaining"), // s + new FieldDefinitionPrimitive(124, BaseType.UINT16, "pressure_sac", 100, 0), // bar / min + new FieldDefinitionPrimitive(125, BaseType.UINT16, "volume_sac", 100, 0), // liter / min + new FieldDefinitionPrimitive(126, BaseType.UINT16, "rmv", 100, 0), // liter / min + new FieldDefinitionPrimitive(127, BaseType.SINT32, "ascent_rate", 1000, 0), // m/s + new FieldDefinitionPrimitive(129, BaseType.UINT8, "po2", 100, 0), // % new FieldDefinitionPrimitive(136, BaseType.UINT8, "wrist_heart_rate"), + new FieldDefinitionPrimitive(139, BaseType.UINT16, "core_temperature", 100, 0), // °C new FieldDefinitionPrimitive(143, BaseType.UINT8, "body_battery"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); @@ -253,16 +506,42 @@ public class GlobalFITMessage { public static GlobalFITMessage EVENT = new GlobalFITMessage(21, "EVENT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), // 0 timer, 74 sleep new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), // sleep: 0 start 1 stop, timer: 0 start 4 stop all + new FieldDefinitionPrimitive(2, BaseType.UINT16, "data16"), new FieldDefinitionPrimitive(3, BaseType.UINT32, "data"), // in sleep they're timestamps in garmin epoch? in timer, 0 for manual new FieldDefinitionPrimitive(4, BaseType.UINT8, "event_group"), // 0? new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage DEVICE_USED = new GlobalFITMessage(22, "DEVICE_USED", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8, "speed"), + new FieldDefinitionPrimitive(1, BaseType.UINT8, "distance"), + new FieldDefinitionPrimitive(2, BaseType.UINT8, "cadence"), + new FieldDefinitionPrimitive(3, BaseType.UINT8, "elevation"), + new FieldDefinitionPrimitive(4, BaseType.UINT8, "heart_rate"), + new FieldDefinitionPrimitive(6, BaseType.UINT8, "power"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage DEVICE_INFO = new GlobalFITMessage(23, "DEVICE_INFO", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8, "device_index"), + new FieldDefinitionPrimitive(1, BaseType.UINT8, "device_type"), new FieldDefinitionPrimitive(2, BaseType.UINT16, "manufacturer"), new FieldDefinitionPrimitive(3, BaseType.UINT32Z, "serial_number"), new FieldDefinitionPrimitive(4, BaseType.UINT16, "product"), new FieldDefinitionPrimitive(5, BaseType.UINT16, "software_version"), + new FieldDefinitionPrimitive(6, BaseType.UINT8, "hardware_version"), + new FieldDefinitionPrimitive(7, BaseType.UINT32, "cum_operating_time"), // s + new FieldDefinitionPrimitive(10, BaseType.UINT16, "battery_voltage", 256, 0), // V + new FieldDefinitionPrimitive(11, BaseType.UINT8, "battery_status"), + new FieldDefinitionPrimitive(18, BaseType.ENUM, "sensor_position"), + new FieldDefinitionPrimitive(19, BaseType.STRING, "descriptor"), + new FieldDefinitionPrimitive(20, BaseType.UINT8Z, "ant_transmission_type"), + new FieldDefinitionPrimitive(21, BaseType.UINT16Z, "ant_device_number"), + new FieldDefinitionPrimitive(22, BaseType.ENUM, "ant_network"), + new FieldDefinitionPrimitive(24, BaseType.UINT32Z, "ant_id"), + new FieldDefinitionPrimitive(25, BaseType.ENUM, "source_type"), + new FieldDefinitionPrimitive(27, BaseType.STRING, "product_name"), + new FieldDefinitionPrimitive(32, BaseType.UINT8, "battery_level"), // % new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); @@ -272,14 +551,68 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(6, BaseType.UINT16, "num_valid_steps"), new FieldDefinitionPrimitive(8, BaseType.STRING, "name"), new FieldDefinitionPrimitive(11, BaseType.ENUM, "sub_sport"), + new FieldDefinitionPrimitive(14, BaseType.UINT16, "pool_length", 100, 0), // m + new FieldDefinitionPrimitive(15, BaseType.ENUM, "pool_length_unit"), new FieldDefinitionPrimitive(17, BaseType.STRING, "notes") )); + public static GlobalFITMessage WORKOUT_STEP = new GlobalFITMessage(27, "WORKOUT_STEP", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.STRING, "wkt_step_name"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "duration_type"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "duration_value"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "target_type"), + new FieldDefinitionPrimitive(4, BaseType.UINT32, "target_value"), + new FieldDefinitionPrimitive(5, BaseType.UINT32, "custom_target_value_low"), + new FieldDefinitionPrimitive(6, BaseType.UINT32, "custom_target_value_high"), + new FieldDefinitionPrimitive(7, BaseType.ENUM, "intensity"), + new FieldDefinitionPrimitive(8, BaseType.STRING, "notes"), + new FieldDefinitionPrimitive(9, BaseType.ENUM, "equipment"), + new FieldDefinitionPrimitive(10, BaseType.UINT16, "exercise_category"), + new FieldDefinitionPrimitive(11, BaseType.UINT16, "exercise_name"), + new FieldDefinitionPrimitive(12, BaseType.UINT16, "exercise_weight", 100, 0), // kg + new FieldDefinitionPrimitive(13, BaseType.UINT16, "weight_display_unit"), + new FieldDefinitionPrimitive(19, BaseType.ENUM, "secondary_target_type"), + new FieldDefinitionPrimitive(20, BaseType.UINT32, "secondary_target_value"), + new FieldDefinitionPrimitive(21, BaseType.UINT32, "secondary_custom_target_value_low"), + new FieldDefinitionPrimitive(22, BaseType.UINT32, "secondary_custom_target_value_high"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage WEIGHT_SCALE = new GlobalFITMessage(30, "WEIGHT_SCALE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "weight", 100, 0), // kg + new FieldDefinitionPrimitive(1, BaseType.UINT16, "percent_fat", 100, 0), // % + new FieldDefinitionPrimitive(2, BaseType.UINT16, "percent_hydration", 100, 0), // % + new FieldDefinitionPrimitive(3, BaseType.UINT16, "visceral_fat_mass", 100, 0), // kg + new FieldDefinitionPrimitive(4, BaseType.UINT16, "bone_mass", 100, 0), // kg + new FieldDefinitionPrimitive(5, BaseType.UINT16, "muscle_mass", 100, 0), // kg + new FieldDefinitionPrimitive(7, BaseType.UINT16, "basal_met", 4, 0), // kcal/day + new FieldDefinitionPrimitive(8, BaseType.UINT8, "physique_rating"), + new FieldDefinitionPrimitive(9, BaseType.UINT16, "active_met", 4, 0), // kcal/day + new FieldDefinitionPrimitive(10, BaseType.UINT8, "metabolic_age"), // years + new FieldDefinitionPrimitive(11, BaseType.UINT8, "visceral_fat_rating"), + new FieldDefinitionPrimitive(12, BaseType.UINT16, "user_profile_index"), + new FieldDefinitionPrimitive(13, BaseType.UINT16, "bmi", 10, 0), // kg/m^2 + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage COURSE = new GlobalFITMessage(31, "COURSE", Arrays.asList( new FieldDefinitionPrimitive(4, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(5, BaseType.STRING, 16, "name") )); + public static GlobalFITMessage TOTALS = new GlobalFITMessage(33, "TOTALS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32, "timer_time"), // s + new FieldDefinitionPrimitive(1, BaseType.UINT32, "distance"), // m + new FieldDefinitionPrimitive(2, BaseType.UINT32, "calories"), // kcal + new FieldDefinitionPrimitive(3, BaseType.ENUM, "sport"), + new FieldDefinitionPrimitive(4, BaseType.UINT32, "elapsed_time"), // s + new FieldDefinitionPrimitive(5, BaseType.UINT16, "sessions"), + new FieldDefinitionPrimitive(6, BaseType.UINT32, "active_time"), // s + new FieldDefinitionPrimitive(9, BaseType.UINT8, "sport_index"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + public static GlobalFITMessage ACTIVITY = new GlobalFITMessage(34, "ACTIVITY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "total_timer_time"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "num_sessions"), @@ -287,29 +620,126 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(3, BaseType.ENUM, "event"), // 26 activity new FieldDefinitionPrimitive(4, BaseType.ENUM, "event_type"), // 1 stop new FieldDefinitionPrimitive(5, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone + new FieldDefinitionPrimitive(6, BaseType.UINT8, "event_group"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage SOFTWARE = new GlobalFITMessage(35, "SOFTWARE", Arrays.asList( + new FieldDefinitionPrimitive(3, BaseType.UINT16, "version", 100, 0), + new FieldDefinitionPrimitive(5, BaseType.STRING, "part_number"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + public static GlobalFITMessage FILE_CREATOR = new GlobalFITMessage(49, "FILE_CREATOR", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "software_version"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "hardware_version") )); + public static GlobalFITMessage BLOOD_PRESSURE = new GlobalFITMessage(51, "BLOOD_PRESSURE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "systolic_pressure"), // mmHg + new FieldDefinitionPrimitive(1, BaseType.UINT16, "diastolic_pressure"), // mmHg + new FieldDefinitionPrimitive(2, BaseType.UINT16, "mean_arterial_pressure"), // mmHg + new FieldDefinitionPrimitive(3, BaseType.UINT16, "map_3_sample_mean"), // mmHg + new FieldDefinitionPrimitive(4, BaseType.UINT16, "map_morning_values"), // mmHg + new FieldDefinitionPrimitive(5, BaseType.UINT16, "map_evening_values"), // mmHg + new FieldDefinitionPrimitive(6, BaseType.UINT8, "heart_rate"), // bpm + new FieldDefinitionPrimitive(7, BaseType.ENUM, "heart_rate_type"), + new FieldDefinitionPrimitive(8, BaseType.ENUM, "status"), + new FieldDefinitionPrimitive(9, BaseType.UINT16, "user_profile_index"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage SPEED_ZONE = new GlobalFITMessage(53, "SPEED_ZONE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "high_value", 1000, 0), // m/s + new FieldDefinitionPrimitive(1, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + public static GlobalFITMessage MONITORING = new GlobalFITMessage(55, "MONITORING", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8, "device_index"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "calories"), // kcal new FieldDefinitionPrimitive(2, BaseType.UINT32, "distance"), new FieldDefinitionPrimitive(3, BaseType.UINT32, "cycles"), new FieldDefinitionPrimitive(4, BaseType.UINT32, "active_time"), new FieldDefinitionPrimitive(5, BaseType.ENUM, "activity_type"), + new FieldDefinitionPrimitive(6, BaseType.ENUM, "activity_subtype"), + new FieldDefinitionPrimitive(7, BaseType.ENUM, "activity_level"), + new FieldDefinitionPrimitive(8, BaseType.UINT16, "distance_16"), + new FieldDefinitionPrimitive(9, BaseType.UINT16, "cycles_16"), + new FieldDefinitionPrimitive(10, BaseType.UINT16, "active_time_16"), + new FieldDefinitionPrimitive(11, BaseType.UINT16, "local_timestamp"), + new FieldDefinitionPrimitive(12, BaseType.SINT16, "temperature", 100, 0), // °C + new FieldDefinitionPrimitive(14, BaseType.SINT16, "temperature_min", 100, 0), // °C + new FieldDefinitionPrimitive(15, BaseType.SINT16, "temperature_max", 100, 0), // °C + new FieldDefinitionPrimitive(16, BaseType.UINT16, 8, "activity_time"), // minutes new FieldDefinitionPrimitive(19, BaseType.UINT16, "active_calories"), new FieldDefinitionPrimitive(29, BaseType.UINT16, "duration_min"), new FieldDefinitionPrimitive(24, BaseType.BASE_TYPE_BYTE, "current_activity_type_intensity"), new FieldDefinitionPrimitive(26, BaseType.UINT16, "timestamp_16"), + new FieldDefinitionPrimitive(25, BaseType.UINT8, "timestamp_min_8"), // min new FieldDefinitionPrimitive(27, BaseType.UINT8, "heart_rate"), + new FieldDefinitionPrimitive(28, BaseType.UINT8, "intensity", 10, 0), + new FieldDefinitionPrimitive(30, BaseType.UINT32, "duration"), // seconds + new FieldDefinitionPrimitive(31, BaseType.UINT32, "ascent", 1000, 0), // m + new FieldDefinitionPrimitive(32, BaseType.UINT32, "descent", 1000, 0), // m new FieldDefinitionPrimitive(33, BaseType.UINT16, "moderate_activity_minutes"), new FieldDefinitionPrimitive(34, BaseType.UINT16, "vigorous_activity_minutes"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage TRAINING_FILE = new GlobalFITMessage(72, "TRAINING_FILE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "type"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "manufacturer"), + new FieldDefinitionPrimitive(2, BaseType.UINT16, "product"), + new FieldDefinitionPrimitive(3, BaseType.UINT32Z, "serial_number"), + new FieldDefinitionPrimitive(4, BaseType.UINT32, "time_created"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage HRV = new GlobalFITMessage(78, "HRV", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ARRAY) + )); + + public static GlobalFITMessage USER_METRICS = new GlobalFITMessage(79, "USER_METRICS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "vo2_max"), // scale: 292.5714286 + new FieldDefinitionPrimitive(1, BaseType.UINT8, "age"), + new FieldDefinitionPrimitive(2, BaseType.UINT8, "height", 100, 0), // m + new FieldDefinitionPrimitive(3, BaseType.UINT16, "weight", 10, 0), // kg + new FieldDefinitionPrimitive(4, BaseType.ENUM, "gender"), + new FieldDefinitionPrimitive(6, BaseType.UINT8, "max_hr"), + new FieldDefinitionPrimitive(8, BaseType.UINT16, "remaining_recovery_time"), // min + new FieldDefinitionPrimitive(15, BaseType.UINT8, "initial_body_battery"), + new FieldDefinitionPrimitive(16, BaseType.UINT32, "start_of_activity"), + new FieldDefinitionPrimitive(32, BaseType.UINT8, "beginning_potential"), + new FieldDefinitionPrimitive(35, BaseType.UINT32, "end_of_previous_activity"), + new FieldDefinitionPrimitive(39, BaseType.UINT32, "wake_up_time"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage LENGTH = new GlobalFITMessage(101, "LENGTH", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "event"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "event_type"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "start_time"), + new FieldDefinitionPrimitive(3, BaseType.UINT32, "total_elapsed_time", 1000, 0), // s + new FieldDefinitionPrimitive(4, BaseType.UINT32, "total_timer_time", 1000, 0), // s + new FieldDefinitionPrimitive(5, BaseType.UINT16, "total_strokes"), + new FieldDefinitionPrimitive(6, BaseType.UINT16, "avg_speed", 1000, 0), // m/s + new FieldDefinitionPrimitive(7, BaseType.ENUM, "swim_stroke"), + new FieldDefinitionPrimitive(9, BaseType.UINT8, "avg_swimming_cadence"), // stroke / min + new FieldDefinitionPrimitive(10, BaseType.UINT8, "event_group"), + new FieldDefinitionPrimitive(11, BaseType.UINT16, "total_calories"), // kcal + new FieldDefinitionPrimitive(12, BaseType.ENUM, "length_type"), + new FieldDefinitionPrimitive(18, BaseType.UINT16, "player_score"), + new FieldDefinitionPrimitive(19, BaseType.UINT16, "opponent_score"), + new FieldDefinitionPrimitive(20, BaseType.UINT16, "stroke_count", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(21, BaseType.UINT16, "zone_count", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(22, BaseType.UINT16, "enhanced_avg_respiration_rate", 1000, 0), // breath / min + new FieldDefinitionPrimitive(23, BaseType.UINT16, "enhanced_max_respiration_rate", 1000, 0), // breath / min + new FieldDefinitionPrimitive(24, BaseType.UINT8, "avg_respiration_rate"), + new FieldDefinitionPrimitive(25, BaseType.UINT8, "max_respiration_rate"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + public static GlobalFITMessage MONITORING_INFO = new GlobalFITMessage(103, "MONITORING_INFO", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone new FieldDefinitionPrimitive(1, BaseType.ENUM, "activity_type", FieldDefinitionFactory.FIELD.ARRAY), // 6 walking, 1 running, 13 ? @@ -319,8 +749,26 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage DEVICE_STATUS = new GlobalFITMessage(104, "DEVICE_STATUS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "battery_voltage", 1000, 0), // V + new FieldDefinitionPrimitive(2, BaseType.UINT8, "battery_level"), // 0 - 100% + new FieldDefinitionPrimitive(3, BaseType.SINT8, "temperature"), // °C + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage PAD = new GlobalFITMessage(105, "PAD", Arrays.asList( + // only used to align other messages to memory boundaries + )); + + public static GlobalFITMessage SLAVE_DEVICE = new GlobalFITMessage(106, "SLAVE_DEVICE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "manufacturer"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "product") + )); + public static GlobalFITMessage CONNECTIVITY = new GlobalFITMessage(127, "CONNECTIVITY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "bluetooth_enabled"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "bluetooth_le_enabled"), + new FieldDefinitionPrimitive(2, BaseType.ENUM, "ant_enabled"), new FieldDefinitionPrimitive(3, BaseType.STRING, 20, "name"), new FieldDefinitionPrimitive(4, BaseType.ENUM, "live_tracking_enabled"), new FieldDefinitionPrimitive(5, BaseType.ENUM, "weather_conditions_enabled"), @@ -328,7 +776,9 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(7, BaseType.ENUM, "auto_activity_upload_enabled"), new FieldDefinitionPrimitive(8, BaseType.ENUM, "course_download_enabled"), new FieldDefinitionPrimitive(9, BaseType.ENUM, "workout_download_enabled"), - new FieldDefinitionPrimitive(10, BaseType.ENUM, "gps_ephemeris_download_enabled") + new FieldDefinitionPrimitive(10, BaseType.ENUM, "gps_ephemeris_download_enabled"), + new FieldDefinitionPrimitive(11, BaseType.ENUM, "incident_detection_enabled"), + new FieldDefinitionPrimitive(12, BaseType.ENUM, "grouptrack_enabled") )); public static GlobalFITMessage WEATHER = new GlobalFITMessage(128, "WEATHER", Arrays.asList( @@ -353,6 +803,20 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage CADENCE_ZONE = new GlobalFITMessage(131, "CADENCE_ZONE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8, "high_value"), // rpm + new FieldDefinitionPrimitive(1, BaseType.STRING, "name") + )); + + public static GlobalFITMessage HR = new GlobalFITMessage(132, "HR", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "fractional_timestamp", 32768, 0), // s + new FieldDefinitionPrimitive(1, BaseType.UINT8, "time256", 256, 0), // s + new FieldDefinitionPrimitive(6, BaseType.UINT8, "filtered_bpm", FieldDefinitionFactory.FIELD.ARRAY), // bpm + new FieldDefinitionPrimitive(9, BaseType.UINT32, "event_timestamp", FieldDefinitionFactory.FIELD.ARRAY, 1024, 0), // s + new FieldDefinitionPrimitive(10, BaseType.BASE_TYPE_BYTE, "event_timestamp_12", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + // https://github.com/GoldenCheetah/GoldenCheetah/blob/71e3928bc614f3209d9977d90cc50b942999b855/src/FileIO/FitRideFile.cpp#L1998 public static GlobalFITMessage PHYSIOLOGICAL_METRICS = new GlobalFITMessage(140, "PHYSIOLOGICAL_METRICS", Arrays.asList( new FieldDefinitionPrimitive(4, BaseType.UINT8, "aerobic_effect", 10, 0), @@ -364,9 +828,48 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage EPO_STATUS = new GlobalFITMessage(141, "EPO_STATUS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "status"), + new FieldDefinitionPrimitive(1, BaseType.UINT32, "start_time"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "end_time"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage SENSOR_SETTINGS = new GlobalFITMessage(147, "SENSOR_SETTINGS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "ant_id"), + new FieldDefinitionPrimitive(2, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(45, BaseType.ENUM, "use_for_speed"), + new FieldDefinitionPrimitive(46, BaseType.ENUM, "use_for_distance"), + new FieldDefinitionPrimitive(51, BaseType.ENUM, "connection_type"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage SEGMENT_FILE = new GlobalFITMessage(151, "SEGMENT_FILE", Arrays.asList( + new FieldDefinitionPrimitive(1, BaseType.STRING, "file_uuid"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "enabled"), + new FieldDefinitionPrimitive(4, BaseType.UINT32, "user_profile_primary_key"), + new FieldDefinitionPrimitive(7, BaseType.ENUM, "leader_type"), + new FieldDefinitionPrimitive(8, BaseType.UINT32, "leader_group_primary_key"), + new FieldDefinitionPrimitive(9, BaseType.UINT32, "leader_activity_id"), + new FieldDefinitionPrimitive(10, BaseType.STRING, "leader_activity_id_string"), + new FieldDefinitionPrimitive(11, BaseType.UINT8, "default_race_leader"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage WORKOUT_SESSION = new GlobalFITMessage(158, "WORKOUT_SESSION", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "sport"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "sub_sport"), + new FieldDefinitionPrimitive(2, BaseType.UINT16, "num_valid_steps"), + new FieldDefinitionPrimitive(3, BaseType.UINT16, "first_step_index"), + new FieldDefinitionPrimitive(4, BaseType.UINT16, "pool_length", 100, 0), // m + new FieldDefinitionPrimitive(5, BaseType.ENUM, "pool_length_unit"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + public static GlobalFITMessage WATCHFACE_SETTINGS = new GlobalFITMessage(159, "WATCHFACE_SETTINGS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.ENUM, "mode"), //1=analog - new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "layout") + new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, "layout"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static GlobalFITMessage GPS_METADATA = new GlobalFITMessage(160, "GPS_METADATA", Arrays.asList( @@ -375,7 +878,17 @@ public class GlobalFITMessage { )); public static GlobalFITMessage TIMESTAMP_CORRELATION = new GlobalFITMessage(162, "TIMESTAMP_CORRELATION", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "fractional_timestamp", 32768, 0), + new FieldDefinitionPrimitive(1, BaseType.UINT32, "system_timestamp"), + new FieldDefinitionPrimitive(2, BaseType.UINT16, "fractional_system_timestamp", 32768, 0), new FieldDefinitionPrimitive(3, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone + new FieldDefinitionPrimitive(4, BaseType.UINT16, "timestamp_ms"), + new FieldDefinitionPrimitive(5, BaseType.UINT16, "system_timestamp_ms"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage OHR_SETTINGS = new GlobalFITMessage(188, "OHR_SETTINGS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "enabled"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); @@ -384,12 +897,31 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(1, BaseType.UINT8, "field_definition_number"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "fit_base_type_id"), new FieldDefinitionPrimitive(3, BaseType.STRING, 64, "field_name"), - new FieldDefinitionPrimitive(8, BaseType.STRING, 16, "units") + new FieldDefinitionPrimitive(4, BaseType.UINT8, "array"), + new FieldDefinitionPrimitive(5, BaseType.STRING, "components"), + new FieldDefinitionPrimitive(6, BaseType.UINT8, "scale"), + new FieldDefinitionPrimitive(7, BaseType.SINT8, "offset"), + new FieldDefinitionPrimitive(8, BaseType.STRING, 16, "units"), + new FieldDefinitionPrimitive(9, BaseType.STRING, "bits"), + new FieldDefinitionPrimitive(10, BaseType.STRING, "accumulate"), + new FieldDefinitionPrimitive(13, BaseType.UINT16, "fit_base_unit_id"), + new FieldDefinitionPrimitive(14, BaseType.UINT16, "native_mesg_num"), + new FieldDefinitionPrimitive(15, BaseType.UINT8, "native_field_num") )); public static GlobalFITMessage DEVELOPER_DATA = new GlobalFITMessage(207, "DEVELOPER_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.BASE_TYPE_BYTE, 16, "developer_id"), new FieldDefinitionPrimitive(1, BaseType.BASE_TYPE_BYTE, 16, "application_id"), - new FieldDefinitionPrimitive(3, BaseType.UINT8, "developer_data_index") + new FieldDefinitionPrimitive(2, BaseType.UINT16, "manufacturer_id"), + new FieldDefinitionPrimitive(3, BaseType.UINT8, "developer_data_index"), + new FieldDefinitionPrimitive(4, BaseType.UINT32, "application_version") + )); + + public static GlobalFITMessage BAROMETER_DATA = new GlobalFITMessage(209, "BAROMETER_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms + new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_time_offset", FieldDefinitionFactory.FIELD.ARRAY), // ms + new FieldDefinitionPrimitive(2, BaseType.UINT32, "baro_pres", FieldDefinitionFactory.FIELD.ARRAY), // Pa + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); public static GlobalFITMessage MONITORING_HR_DATA = new GlobalFITMessage(211, "MONITORING_HR_DATA", Arrays.asList( @@ -402,11 +934,19 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(0, BaseType.UINT16, "reference_message"), new FieldDefinitionPrimitive(1, BaseType.UINT16, "reference_index"), new FieldDefinitionPrimitive(2, BaseType.UINT32, "time_in_zone", FieldDefinitionFactory.FIELD.HR_TIME_IN_ZONE), // seconds + new FieldDefinitionPrimitive(3, BaseType.UINT32, "time_in_speed_zone", 1000, 0), // s + new FieldDefinitionPrimitive(4, BaseType.UINT32, "time_in_cadence_zone", 1000, 0), // s + new FieldDefinitionPrimitive(5, BaseType.UINT32, "time_in_power_zone", 1000, 0), // s new FieldDefinitionPrimitive(6, BaseType.UINT8, "hr_zone_high_boundary", FieldDefinitionFactory.FIELD.HR_ZONE_HIGH_BOUNDARY), // bpm + new FieldDefinitionPrimitive(7, BaseType.UINT16, "speed_zone_high_boundary", 1000, 0), // m/s + new FieldDefinitionPrimitive(8, BaseType.UINT8, "cadence_zone_high_boundary"), // rpm + new FieldDefinitionPrimitive(9, BaseType.UINT16, "power_zone_high_boundary"), // watt new FieldDefinitionPrimitive(10, BaseType.ENUM, "hr_calc_type"), // 1 percent max hr new FieldDefinitionPrimitive(11, BaseType.UINT8, "max_heart_rate"), new FieldDefinitionPrimitive(12, BaseType.UINT8, "resting_heart_rate"), new FieldDefinitionPrimitive(13, BaseType.UINT8, "threshold_heart_rate"), + new FieldDefinitionPrimitive(14, BaseType.ENUM, "pwr_calc_type"), + new FieldDefinitionPrimitive(15, BaseType.UINT16, "functional_threshold_power"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); @@ -432,10 +972,48 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(10, BaseType.UINT16, "message_index"), new FieldDefinitionPrimitive(254, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage DIVE_SETTINGS = new GlobalFITMessage(258, "DIVE_SETTINGS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.STRING, "name"), + new FieldDefinitionPrimitive(1, BaseType.ENUM, "model"), + new FieldDefinitionPrimitive(2, BaseType.UINT8, "gf_low"), // % + new FieldDefinitionPrimitive(3, BaseType.UINT8, "gf_high"), // % + new FieldDefinitionPrimitive(4, BaseType.ENUM, "water_type"), // % + new FieldDefinitionPrimitive(5, BaseType.FLOAT32, "water_density"), // kg/m^3 + new FieldDefinitionPrimitive(6, BaseType.UINT8, "po2_warn", 100, 0), // % + new FieldDefinitionPrimitive(7, BaseType.UINT8, "po2_critical", 100, 0), // % + new FieldDefinitionPrimitive(8, BaseType.UINT8, "po2_deco", 100, 0), // % + new FieldDefinitionPrimitive(9, BaseType.ENUM, "safety_stop_enabled"), + new FieldDefinitionPrimitive(10, BaseType.FLOAT32, "bottom_depth"), + new FieldDefinitionPrimitive(11, BaseType.UINT32, "bottom_time"), + new FieldDefinitionPrimitive(12, BaseType.ENUM, "apnea_countdown_enabled"), + new FieldDefinitionPrimitive(13, BaseType.UINT32, "apnea_countdown_time"), + new FieldDefinitionPrimitive(14, BaseType.ENUM, "backlight_mode"), + new FieldDefinitionPrimitive(15, BaseType.UINT8, "backlight_brightness"), + new FieldDefinitionPrimitive(16, BaseType.UINT8, "backlight_timeout"), + new FieldDefinitionPrimitive(17, BaseType.UINT16, "repeat_dive_interval"), // s + new FieldDefinitionPrimitive(18, BaseType.UINT16, "safety_stop_time"), // s + new FieldDefinitionPrimitive(19, BaseType.ENUM, "heart_rate_source_type"), + new FieldDefinitionPrimitive(20, BaseType.UINT8, "heart_rate_source"), + new FieldDefinitionPrimitive(21, BaseType.UINT16, "travel_gas"), + new FieldDefinitionPrimitive(22, BaseType.ENUM, "ccr_low_setpoint_switch_mode"), + new FieldDefinitionPrimitive(23, BaseType.UINT8, "ccr_low_setpoint", 100, 0), // % + new FieldDefinitionPrimitive(24, BaseType.UINT32, "ccr_low_setpoint_depth", 1000, 0), // m + new FieldDefinitionPrimitive(25, BaseType.ENUM, "ccr_high_setpoint_switch_mode"), + new FieldDefinitionPrimitive(26, BaseType.UINT8, "ccr_high_setpoint", 100, 0), // % + new FieldDefinitionPrimitive(27, BaseType.UINT32, "ccr_high_setpoint_depth", 1000, 0), // m + new FieldDefinitionPrimitive(29, BaseType.ENUM, "gas_consumption_display"), + new FieldDefinitionPrimitive(30, BaseType.ENUM, "up_key_enabled"), + new FieldDefinitionPrimitive(35, BaseType.ENUM, "dive_sounds"), + new FieldDefinitionPrimitive(36, BaseType.UINT8, "last_stop_multiple", 10, 0), + new FieldDefinitionPrimitive(37, BaseType.UINT8, "no_fly_time_mode"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); public static GlobalFITMessage DIVE_GAS = new GlobalFITMessage(259, "DIVE_GAS", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "helium_content"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "oxygen_content"), new FieldDefinitionPrimitive(2, BaseType.UINT8, "status"), + new FieldDefinitionPrimitive(3, BaseType.ENUM, "mode"), new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") )); public static GlobalFITMessage STRESS_LEVEL = new GlobalFITMessage(227, "STRESS_LEVEL", Arrays.asList( @@ -444,6 +1022,13 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(3, BaseType.SINT8, "body_energy") )); + public static GlobalFITMessage EXERCISE_TITLE = new GlobalFITMessage(264, "EXERCISE_TITLE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "exercise_category"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "exercise_name"), + new FieldDefinitionPrimitive(2, BaseType.STRING, "wkt_step_name"), + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + public static GlobalFITMessage SPO2 = new GlobalFITMessage(269, "SPO2", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT8, "reading_spo2"), new FieldDefinitionPrimitive(1, BaseType.UINT8, "reading_confidence"), @@ -475,7 +1060,9 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(5, BaseType.ENUM, "sport"), new FieldDefinitionPrimitive(6, BaseType.ENUM, "sub_sport"), new FieldDefinitionPrimitive(8, BaseType.ENUM, "max_met_category"), // 0 generic - new FieldDefinitionPrimitive(9, BaseType.ENUM, "calibrated_data") // 1? + new FieldDefinitionPrimitive(9, BaseType.ENUM, "calibrated_data"), // 1? + new FieldDefinitionPrimitive(12, BaseType.ENUM, "hr_source"), + new FieldDefinitionPrimitive(13, BaseType.ENUM, "speed_source") )); public static GlobalFITMessage DIVE_SUMMARY = new GlobalFITMessage(268, "DIVE_SUMMARY", Arrays.asList( @@ -491,15 +1078,118 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(9, BaseType.UINT16, "o2_toxicity"), // OTUs new FieldDefinitionPrimitive(10, BaseType.UINT32, "dive_number"), new FieldDefinitionPrimitive(11, BaseType.UINT32, "bottom_time", 1000, 0), // s + new FieldDefinitionPrimitive(12, BaseType.UINT16, "avg_pressure_sac", 100, 0), // bar/min + new FieldDefinitionPrimitive(13, BaseType.UINT16, "avg_volume_sac", 100, 0), // L/min + new FieldDefinitionPrimitive(14, BaseType.UINT16, "avg_rmv", 100, 0), // L/min + new FieldDefinitionPrimitive(15, BaseType.UINT32, "descent_time", 1000, 0), // s + new FieldDefinitionPrimitive(16, BaseType.UINT32, "ascent_time", 1000, 0), // s + new FieldDefinitionPrimitive(17, BaseType.SINT32, "avg_ascent_rate", 1000, 0), // m/s + new FieldDefinitionPrimitive(22, BaseType.UINT32, "avg_descent_rate", 1000, 0), // m/s + new FieldDefinitionPrimitive(23, BaseType.UINT32, "max_ascent_rate", 1000, 0), // m/s + new FieldDefinitionPrimitive(24, BaseType.UINT32, "max_descent_rate", 1000, 0), // m/s + new FieldDefinitionPrimitive(25, BaseType.UINT32, "hang_time", 1000, 0), // s new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage BEAT_INTERVALS = new GlobalFITMessage(290, "BEAT_INTERVALS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms + new FieldDefinitionPrimitive(1, BaseType.UINT16, "time", FieldDefinitionFactory.FIELD.ARRAY), // ms + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage RESPIRATION_RATE = new GlobalFITMessage(297, "RESPIRATION_RATE", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.SINT16, "respiration_rate", 100, 0), // breaths / min new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage HSA_STEP_DATA = new GlobalFITMessage(304, "HSA_STEP_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds + new FieldDefinitionPrimitive(1, BaseType.UINT32, "steps", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage HSA_SPO2_DATA = new GlobalFITMessage(305, "HSA_SPO2_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds + new FieldDefinitionPrimitive(1, BaseType.UINT8, "reading_spo2", FieldDefinitionFactory.FIELD.ARRAY), // % + new FieldDefinitionPrimitive(2, BaseType.UINT8, "confidence", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage HSA_STRESS_DATA = new GlobalFITMessage(306, "HSA_STRESS_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds + new FieldDefinitionPrimitive(1, BaseType.SINT8, "stress_level", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage HSA_RESPIRATION_DATA = new GlobalFITMessage(307, "HSA_RESPIRATION_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds + new FieldDefinitionPrimitive(1, BaseType.SINT16, "respiration_rate", FieldDefinitionFactory.FIELD.ARRAY, 100, 0), // breath / minute + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage HSA_HEART_RATE_DATA = new GlobalFITMessage(308, "HSA_HEART_RATE_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds + new FieldDefinitionPrimitive(1, BaseType.UINT8, "status"), + new FieldDefinitionPrimitive(2, BaseType.UINT8, "heart_rate", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage SPLIT = new GlobalFITMessage(312, "SPLIT", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "split_type"), + new FieldDefinitionPrimitive(1, BaseType.UINT32, "total_elapsed_time", 1000, 0), // seconds + new FieldDefinitionPrimitive(2, BaseType.UINT32, "total_timer_time", 1000, 0), // seconds + new FieldDefinitionPrimitive(3, BaseType.UINT32, "total_distance", 100, 0), // meter + new FieldDefinitionPrimitive(4, BaseType.UINT32, "avg_speed", 1000, 0), // meter / second + new FieldDefinitionPrimitive(9, BaseType.UINT32, "start_time"), + new FieldDefinitionPrimitive(13, BaseType.UINT16, "total_ascent"), // meter + new FieldDefinitionPrimitive(14, BaseType.UINT16, "total_descent"), // meter + new FieldDefinitionPrimitive(21, BaseType.SINT32, "start_position_lat"), + new FieldDefinitionPrimitive(22, BaseType.SINT32, "start_position_long"), + new FieldDefinitionPrimitive(23, BaseType.SINT32, "end_position_lat"), + new FieldDefinitionPrimitive(24, BaseType.SINT32, "end_position_long"), + new FieldDefinitionPrimitive(25, BaseType.UINT32, "max_speed", 1000, 0), // meter / second + new FieldDefinitionPrimitive(26, BaseType.SINT32, "avg_vert_speed", 1000, 0), // meter / second + new FieldDefinitionPrimitive(27, BaseType.UINT32, "end_time"), + new FieldDefinitionPrimitive(28, BaseType.UINT32, "total_calories"), // kcal + new FieldDefinitionPrimitive(74, BaseType.UINT32, "start_elevation", 5, 500), // meter + new FieldDefinitionPrimitive(101, BaseType.UINT32, "total_moving_time", 1000, 0), // seconds + new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index") + )); + + public static GlobalFITMessage HSA_BODY_BATTERY_DATA = new GlobalFITMessage(314, "HSA_BODY_BATTERY_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // seconds + new FieldDefinitionPrimitive(1, BaseType.SINT8, "level", FieldDefinitionFactory.FIELD.ARRAY), // % + new FieldDefinitionPrimitive(2, BaseType.SINT16, "charged", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(3, BaseType.SINT16, "uncharged", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage HSA_EVENT = new GlobalFITMessage(315, "HSA_EVENT", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8, "event_id"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage TANK_UPDATE = new GlobalFITMessage(319, "TANK_UPDATE", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "sensor"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "pressure", 100, 0), // bar + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage TANK_SUMMARY = new GlobalFITMessage(323, "TANK_SUMMARY", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32Z, "sensor"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "start_pressure", 100, 0), // bar + new FieldDefinitionPrimitive(2, BaseType.UINT16, "end_pressure", 100, 0), // bar + new FieldDefinitionPrimitive(3, BaseType.UINT32, "volume_used", 100, 0), // liter + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage GPS_EVENT = new GlobalFITMessage(326, "GPS_EVENT", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT32, "event_type"), + new FieldDefinitionPrimitive(1, BaseType.UINT32, "data"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage ECG_SUMMARY = new GlobalFITMessage(336, "ECG_SUMMARY", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT16, "unknown_0"), // 10103 new FieldDefinitionPrimitive(1, BaseType.ENUM, "unknown_1"), // 3 @@ -558,6 +1248,14 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage DEVICE_AUX_BATTERY_INFO = new GlobalFITMessage(375, "DEVICE_AUX_BATTERY_INFO", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT8, "device_index"), + new FieldDefinitionPrimitive(1, BaseType.UINT16, "battery_voltage", 256, 0), // V + new FieldDefinitionPrimitive(2, BaseType.UINT8, "battery_status"), + new FieldDefinitionPrimitive(3, BaseType.UINT8, "battery_identifier"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage SKIN_TEMP_RAW = new GlobalFITMessage(397, "SKIN_TEMP_RAW", Arrays.asList( new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "deviation"), new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) @@ -569,11 +1267,31 @@ public class GlobalFITMessage { new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); + public static GlobalFITMessage HSA_CONFIGURATION_DATA = new GlobalFITMessage(389, "HSA_CONFIGURATION_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.BASE_TYPE_BYTE, "data", FieldDefinitionFactory.FIELD.ARRAY), + new FieldDefinitionPrimitive(1, BaseType.UINT8, "data_size"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage CPE_STATUS = new GlobalFITMessage(394, "CPE_STATUS", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.ENUM, "status"), + new FieldDefinitionPrimitive(1, BaseType.UINT32, "start_time"), + new FieldDefinitionPrimitive(2, BaseType.UINT32, "end_time"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + public static GlobalFITMessage SKIN_TEMP_OVERNIGHT = new GlobalFITMessage(398, "SKIN_TEMP_OVERNIGHT", Arrays.asList( new FieldDefinitionPrimitive(0, BaseType.UINT32, "local_timestamp"), // garmin timestamp, but in user timezone new FieldDefinitionPrimitive(1, BaseType.FLOAT32, "average_deviation"), new FieldDefinitionPrimitive(2, BaseType.FLOAT32, "average_7_day_deviation"), new FieldDefinitionPrimitive(3, BaseType.UINT8, "unk3"), + new FieldDefinitionPrimitive(4, BaseType.FLOAT32, "nightly_value"), + new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) + )); + + public static GlobalFITMessage HSA_WRIST_TEMPERATURE_DATA = new GlobalFITMessage(409, "HSA_WRIST_TEMPERATURE_DATA", Arrays.asList( + new FieldDefinitionPrimitive(0, BaseType.UINT16, "processing_interval"), // s + new FieldDefinitionPrimitive(1, BaseType.UINT16, "value", FieldDefinitionFactory.FIELD.ARRAY, 1000, 0), // °C new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP) )); @@ -590,52 +1308,100 @@ public class GlobalFITMessage { public static Map KNOWN_MESSAGES = new HashMap<>() {{ put(0, FILE_ID); + put(1, CAPABILITIES); put(2, DEVICE_SETTINGS); put(3, USER_PROFILE); + put(4, HRM_PROFILE); + put(5, SDM_PROFILE); + put(6, BIKE_PROFILE); put(7, ZONES_TARGET); + put(8, HR_ZONE); + put(9, POWER_ZONE); + put(10, MET_ZONE); put(12, SPORT); + put(13, TRAINING_SETTINGS); put(15, GOALS); put(18, SESSION); put(19, LAP); put(20, RECORD); put(21, EVENT); + put(22, DEVICE_USED); put(23, DEVICE_INFO); put(26, WORKOUT); + put(27, WORKOUT_STEP); + put(30, WEIGHT_SCALE); put(31, COURSE); + put(33, TOTALS); put(34, ACTIVITY); + put(35, SOFTWARE); put(49, FILE_CREATOR); + put(51, BLOOD_PRESSURE); + put(53, SPEED_ZONE); put(55, MONITORING); + put(72, TRAINING_FILE); + put(78, HRV); + put(79, USER_METRICS); + put(101, LENGTH); put(103, MONITORING_INFO); + put(104, DEVICE_STATUS); + put(105, PAD); + put(106, SLAVE_DEVICE); put(127, CONNECTIVITY); put(128, WEATHER); + put(131, CADENCE_ZONE); + put(132, HR); put(140, PHYSIOLOGICAL_METRICS); + put(141, EPO_STATUS); + put(147, SENSOR_SETTINGS); + put(151, SEGMENT_FILE); + put(158, WORKOUT_SESSION); put(159, WATCHFACE_SETTINGS); put(160, GPS_METADATA); put(162, TIMESTAMP_CORRELATION); + put(188, OHR_SETTINGS); put(206, FIELD_DESCRIPTION); put(207, DEVELOPER_DATA); + put(209, BAROMETER_DATA); put(211, MONITORING_HR_DATA); put(216, TIME_IN_ZONE); put(222, ALARM_SETTINGS); put(225, SET); put(227, STRESS_LEVEL); put(229, MAX_MET_DATA); + put(258, DIVE_SETTINGS); put(259, DIVE_GAS); + put(264, EXERCISE_TITLE); put(269, SPO2); put(273, SLEEP_DATA_INFO); put(274, SLEEP_DATA_RAW); put(268, DIVE_SUMMARY); put(275, SLEEP_STAGE); + put(290, BEAT_INTERVALS); put(297, RESPIRATION_RATE); + put(304, HSA_STEP_DATA); + put(305, HSA_SPO2_DATA); + put(306, HSA_STRESS_DATA); + put(307, HSA_RESPIRATION_DATA); + put(308, HSA_HEART_RATE_DATA); + put(312, SPLIT); + put(314, HSA_BODY_BATTERY_DATA); + put(315, HSA_EVENT); + put(319, TANK_UPDATE); + put(323, TANK_SUMMARY); + put(326, GPS_EVENT); put(336, ECG_SUMMARY); put(337, ECG_RAW_SAMPLE); put(338, ECG_SMOOTH_SAMPLE); put(346, SLEEP_STATS); put(370, HRV_SUMMARY); put(371, HRV_VALUE); + put(375, DEVICE_AUX_BATTERY_INFO); put(378, TRAINING_LOAD); + put(389, HSA_CONFIGURATION_DATA); + put(394, CPE_STATUS); put(397, SKIN_TEMP_RAW); put(398, SKIN_TEMP_OVERNIGHT); + put(409, HSA_WRIST_TEMPERATURE_DATA); put(412, NAP); }}; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionGoalType.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionGoalType.java index 938a40ed9b..364e91cc64 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionGoalType.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionGoalType.java @@ -33,7 +33,13 @@ public class FieldDefinitionGoalType extends FieldDefinition { } public enum Type { + time(0), + distance(1), + calories(2), + frequency(3), steps(4), + ascent(5), + active_minutes(6) ; private final int id; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionLanguage.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionLanguage.java index 5aa2b102ed..baf3e66f4a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionLanguage.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionLanguage.java @@ -34,7 +34,43 @@ public class FieldDefinitionLanguage extends FieldDefinition { public enum Language { english(0), + french(1), italian(2), + german(3), + spanish(4), + croatian(5), + czech(6), + danish(7), + dutch(8), + finnish(9), + greek(10), + hungarian(11), + norwegian(12), + polish(13), + portuguese(14), + slovakian(15), + slovenian(16), + swedish(17), + russian(18), + turkish(19), + latvian(20), + ukrainian(21), + arabic(22), + farsi(23), + bulgarian(24), + romanian(25), + chinese(26), + japanese(27), + korean(28), + taiwanese(29), + thai(30), + hebrew(31), + brazilian_portuguese(32), + indonesian(33), + malaysian(34), + vietnamese(35), + burmese(36), + mongolian(37) ; private final int id; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java index 927aa35ce8..0e14f718b3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/fieldDefinitions/FieldDefinitionMeasurementSystem.java @@ -34,6 +34,7 @@ public class FieldDefinitionMeasurementSystem extends FieldDefinition { public enum Type { metric, imperial, + nautical ; public static Type fromId(int id) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/.gitattributes b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/.gitattributes new file mode 100644 index 0000000000..a59cf64440 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/.gitattributes @@ -0,0 +1,3 @@ +# nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegenFitCodeGen +# is hard coded to uses \n +*.java text eol=lf \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitActivity.java index a28b06ac80..3e1d437e9c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitActivity.java @@ -68,6 +68,11 @@ public class FitActivity extends RecordData { return (Long) getFieldByNumber(5); } + @Nullable + public Integer getEventGroup() { + return (Integer) getFieldByNumber(6); + } + @Nullable public Long getTimestamp() { return (Long) getFieldByNumber(253); @@ -111,6 +116,11 @@ public class FitActivity extends RecordData { return this; } + public Builder setEventGroup(final Integer value) { + setFieldByNumber(6, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBarometerData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBarometerData.java new file mode 100644 index 0000000000..e6478fa730 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBarometerData.java @@ -0,0 +1,108 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitBarometerData extends RecordData { + public FitBarometerData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 209) { + throw new IllegalArgumentException("FitBarometerData expects global messages of " + 209 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getTimestampMs() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getSampleTimeOffset() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getBaroPres() { + final Object[] objectsArray = (Object[]) getFieldByNumber(2); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(209); + } + + public Builder setTimestampMs(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSampleTimeOffset(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setBaroPres(final Number[] value) { + setFieldByNumber(2, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitBarometerData build() { + return (FitBarometerData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatIntervals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatIntervals.java new file mode 100644 index 0000000000..27852c90fa --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatIntervals.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitBeatIntervals extends RecordData { + public FitBeatIntervals(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 290) { + throw new IllegalArgumentException("FitBeatIntervals expects global messages of " + 290 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getTimestampMs() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getTime() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(290); + } + + public Builder setTimestampMs(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTime(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitBeatIntervals build() { + return (FitBeatIntervals) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatsInterval.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatsInterval.java new file mode 100644 index 0000000000..154b0ca563 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBeatsInterval.java @@ -0,0 +1,64 @@ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +// +// WARNING: This class was auto-generated, please avoid modifying it directly. +// See nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen +// +public class FitBeatsInterval extends RecordData { + public FitBeatsInterval(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 290) { + throw new IllegalArgumentException("FitBeatsInterval expects global messages of " + 290 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getTimestampMs() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getTime() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(290); + } + + public Builder setTimestampMs(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTime(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitBeatsInterval build() { + return (FitBeatsInterval) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java new file mode 100644 index 0000000000..3d036895c2 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBikeProfile.java @@ -0,0 +1,388 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitBikeProfile extends RecordData { + public FitBikeProfile(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 6) { + throw new IllegalArgumentException("FitBikeProfile expects global messages of " + 6 + ", got " + globalNumber); + } + } + + @Nullable + public String getName() { + return (String) getFieldByNumber(0); + } + + @Nullable + public Integer getSport() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getSubSport() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Double getOdometer() { + return (Double) getFieldByNumber(3); + } + + @Nullable + public Integer getBikeSpdAntId() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Integer getBikeCadAntId() { + return (Integer) getFieldByNumber(5); + } + + @Nullable + public Integer getBikeSpdcadAntId() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Integer getBikePowerAntId() { + return (Integer) getFieldByNumber(7); + } + + @Nullable + public Float getCustomWheelsize() { + return (Float) getFieldByNumber(8); + } + + @Nullable + public Float getAutoWheelsize() { + return (Float) getFieldByNumber(9); + } + + @Nullable + public Float getBikeWeight() { + return (Float) getFieldByNumber(10); + } + + @Nullable + public Float getPowerCalFactor() { + return (Float) getFieldByNumber(11); + } + + @Nullable + public Integer getAutoWheelCal() { + return (Integer) getFieldByNumber(12); + } + + @Nullable + public Integer getAutoPowerZero() { + return (Integer) getFieldByNumber(13); + } + + @Nullable + public Integer getId() { + return (Integer) getFieldByNumber(14); + } + + @Nullable + public Integer getSpdEnabled() { + return (Integer) getFieldByNumber(15); + } + + @Nullable + public Integer getCadEnabled() { + return (Integer) getFieldByNumber(16); + } + + @Nullable + public Integer getSpdcadEnabled() { + return (Integer) getFieldByNumber(17); + } + + @Nullable + public Integer getPowerEnabled() { + return (Integer) getFieldByNumber(18); + } + + @Nullable + public Float getCrankLength() { + return (Float) getFieldByNumber(19); + } + + @Nullable + public Integer getEnabled() { + return (Integer) getFieldByNumber(20); + } + + @Nullable + public Integer getBikeSpdAntIdTransType() { + return (Integer) getFieldByNumber(21); + } + + @Nullable + public Integer getBikeCadAntIdTransType() { + return (Integer) getFieldByNumber(22); + } + + @Nullable + public Integer getBikeSpdcadAntIdTransType() { + return (Integer) getFieldByNumber(23); + } + + @Nullable + public Integer getBikePowerAntIdTransType() { + return (Integer) getFieldByNumber(24); + } + + @Nullable + public Integer getOdometerRollover() { + return (Integer) getFieldByNumber(37); + } + + @Nullable + public Integer getFrontGearNum() { + return (Integer) getFieldByNumber(38); + } + + @Nullable + public Number[] getFrontGear() { + final Object[] objectsArray = (Object[]) getFieldByNumber(39); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Integer getRearGearNum() { + return (Integer) getFieldByNumber(40); + } + + @Nullable + public Number[] getRearGear() { + final Object[] objectsArray = (Object[]) getFieldByNumber(41); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Integer getShimanoDi2Enabled() { + return (Integer) getFieldByNumber(44); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(6); + } + + public Builder setName(final String value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSport(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setSubSport(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setOdometer(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setBikeSpdAntId(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setBikeCadAntId(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setBikeSpdcadAntId(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setBikePowerAntId(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setCustomWheelsize(final Float value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setAutoWheelsize(final Float value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setBikeWeight(final Float value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setPowerCalFactor(final Float value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setAutoWheelCal(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setAutoPowerZero(final Integer value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setId(final Integer value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setSpdEnabled(final Integer value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setCadEnabled(final Integer value) { + setFieldByNumber(16, value); + return this; + } + + public Builder setSpdcadEnabled(final Integer value) { + setFieldByNumber(17, value); + return this; + } + + public Builder setPowerEnabled(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setCrankLength(final Float value) { + setFieldByNumber(19, value); + return this; + } + + public Builder setEnabled(final Integer value) { + setFieldByNumber(20, value); + return this; + } + + public Builder setBikeSpdAntIdTransType(final Integer value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setBikeCadAntIdTransType(final Integer value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setBikeSpdcadAntIdTransType(final Integer value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setBikePowerAntIdTransType(final Integer value) { + setFieldByNumber(24, value); + return this; + } + + public Builder setOdometerRollover(final Integer value) { + setFieldByNumber(37, value); + return this; + } + + public Builder setFrontGearNum(final Integer value) { + setFieldByNumber(38, value); + return this; + } + + public Builder setFrontGear(final Number[] value) { + setFieldByNumber(39, (Object[]) value); + return this; + } + + public Builder setRearGearNum(final Integer value) { + setFieldByNumber(40, value); + return this; + } + + public Builder setRearGear(final Number[] value) { + setFieldByNumber(41, (Object[]) value); + return this; + } + + public Builder setShimanoDi2Enabled(final Integer value) { + setFieldByNumber(44, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitBikeProfile build() { + return (FitBikeProfile) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBloodPressure.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBloodPressure.java new file mode 100644 index 0000000000..57e567a266 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitBloodPressure.java @@ -0,0 +1,164 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitBloodPressure extends RecordData { + public FitBloodPressure(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 51) { + throw new IllegalArgumentException("FitBloodPressure expects global messages of " + 51 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getSystolicPressure() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getDiastolicPressure() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getMeanArterialPressure() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Integer getMap3SampleMean() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Integer getMapMorningValues() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Integer getMapEveningValues() { + return (Integer) getFieldByNumber(5); + } + + @Nullable + public Integer getHeartRate() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Integer getHeartRateType() { + return (Integer) getFieldByNumber(7); + } + + @Nullable + public Integer getStatus() { + return (Integer) getFieldByNumber(8); + } + + @Nullable + public Integer getUserProfileIndex() { + return (Integer) getFieldByNumber(9); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(51); + } + + public Builder setSystolicPressure(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDiastolicPressure(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setMeanArterialPressure(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setMap3SampleMean(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setMapMorningValues(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setMapEveningValues(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setHeartRate(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setHeartRateType(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setStatus(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setUserProfileIndex(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitBloodPressure build() { + return (FitBloodPressure) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCadenceZone.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCadenceZone.java new file mode 100644 index 0000000000..c887f93c9e --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCadenceZone.java @@ -0,0 +1,74 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitCadenceZone extends RecordData { + public FitCadenceZone(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 131) { + throw new IllegalArgumentException("FitCadenceZone expects global messages of " + 131 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getHighValue() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public String getName() { + return (String) getFieldByNumber(1); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(131); + } + + public Builder setHighValue(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setName(final String value) { + setFieldByNumber(1, value); + return this; + } + + @Override + public FitCadenceZone build() { + return (FitCadenceZone) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCapabilities.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCapabilities.java new file mode 100644 index 0000000000..5473fd498b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCapabilities.java @@ -0,0 +1,108 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitCapabilities extends RecordData { + public FitCapabilities(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 1) { + throw new IllegalArgumentException("FitCapabilities expects global messages of " + 1 + ", got " + globalNumber); + } + } + + @Nullable + public Number[] getLanguages() { + final Object[] objectsArray = (Object[]) getFieldByNumber(0); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getSports() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getWorkoutsSupported() { + return (Long) getFieldByNumber(21); + } + + @Nullable + public Long getConnectivitySupported() { + return (Long) getFieldByNumber(23); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(1); + } + + public Builder setLanguages(final Number[] value) { + setFieldByNumber(0, (Object[]) value); + return this; + } + + public Builder setSports(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setWorkoutsSupported(final Long value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setConnectivitySupported(final Long value) { + setFieldByNumber(23, value); + return this; + } + + @Override + public FitCapabilities build() { + return (FitCapabilities) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java index 85c738848a..0270f08ab6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitConnectivity.java @@ -43,6 +43,16 @@ public class FitConnectivity extends RecordData { return (Integer) getFieldByNumber(0); } + @Nullable + public Integer getBluetoothLeEnabled() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getAntEnabled() { + return (Integer) getFieldByNumber(2); + } + @Nullable public String getName() { return (String) getFieldByNumber(3); @@ -83,6 +93,16 @@ public class FitConnectivity extends RecordData { return (Integer) getFieldByNumber(10); } + @Nullable + public Integer getIncidentDetectionEnabled() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Integer getGrouptrackEnabled() { + return (Integer) getFieldByNumber(12); + } + /** * @noinspection unused */ @@ -96,6 +116,16 @@ public class FitConnectivity extends RecordData { return this; } + public Builder setBluetoothLeEnabled(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setAntEnabled(final Integer value) { + setFieldByNumber(2, value); + return this; + } + public Builder setName(final String value) { setFieldByNumber(3, value); return this; @@ -136,6 +166,16 @@ public class FitConnectivity extends RecordData { return this; } + public Builder setIncidentDetectionEnabled(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setGrouptrackEnabled(final Integer value) { + setFieldByNumber(12, value); + return this; + } + @Override public FitConnectivity build() { return (FitConnectivity) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCpeStatus.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCpeStatus.java new file mode 100644 index 0000000000..a1aee7842c --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitCpeStatus.java @@ -0,0 +1,94 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitCpeStatus extends RecordData { + public FitCpeStatus(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 394) { + throw new IllegalArgumentException("FitCpeStatus expects global messages of " + 394 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getStatus() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Long getStartTime() { + return (Long) getFieldByNumber(1); + } + + @Nullable + public Long getEndTime() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(394); + } + + public Builder setStatus(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setStartTime(final Long value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setEndTime(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitCpeStatus build() { + return (FitCpeStatus) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java index 457e5e2ea9..e33f7ad419 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeveloperData.java @@ -38,16 +38,31 @@ public class FitDeveloperData extends RecordData { } } + @Nullable + public Integer getDeveloperId() { + return (Integer) getFieldByNumber(0); + } + @Nullable public Integer getApplicationId() { return (Integer) getFieldByNumber(1); } + @Nullable + public Integer getManufacturerId() { + return (Integer) getFieldByNumber(2); + } + @Nullable public Integer getDeveloperDataIndex() { return (Integer) getFieldByNumber(3); } + @Nullable + public Long getApplicationVersion() { + return (Long) getFieldByNumber(4); + } + /** * @noinspection unused */ @@ -56,16 +71,31 @@ public class FitDeveloperData extends RecordData { super(207); } + public Builder setDeveloperId(final Integer value) { + setFieldByNumber(0, value); + return this; + } + public Builder setApplicationId(final Integer value) { setFieldByNumber(1, value); return this; } + public Builder setManufacturerId(final Integer value) { + setFieldByNumber(2, value); + return this; + } + public Builder setDeveloperDataIndex(final Integer value) { setFieldByNumber(3, value); return this; } + public Builder setApplicationVersion(final Long value) { + setFieldByNumber(4, value); + return this; + } + @Override public FitDeveloperData build() { return (FitDeveloperData) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceAuxBatteryInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceAuxBatteryInfo.java new file mode 100644 index 0000000000..8ac223b148 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceAuxBatteryInfo.java @@ -0,0 +1,104 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitDeviceAuxBatteryInfo extends RecordData { + public FitDeviceAuxBatteryInfo(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 375) { + throw new IllegalArgumentException("FitDeviceAuxBatteryInfo expects global messages of " + 375 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getDeviceIndex() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Float getBatteryVoltage() { + return (Float) getFieldByNumber(1); + } + + @Nullable + public Integer getBatteryStatus() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Integer getBatteryIdentifier() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(375); + } + + public Builder setDeviceIndex(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setBatteryVoltage(final Float value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setBatteryStatus(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setBatteryIdentifier(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitDeviceAuxBatteryInfo build() { + return (FitDeviceAuxBatteryInfo) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java index c9856e0549..d5e43bbdd3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceInfo.java @@ -38,6 +38,16 @@ public class FitDeviceInfo extends RecordData { } } + @Nullable + public Integer getDeviceIndex() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getDeviceType() { + return (Integer) getFieldByNumber(1); + } + @Nullable public Integer getManufacturer() { return (Integer) getFieldByNumber(2); @@ -58,6 +68,71 @@ public class FitDeviceInfo extends RecordData { return (Integer) getFieldByNumber(5); } + @Nullable + public Integer getHardwareVersion() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Long getCumOperatingTime() { + return (Long) getFieldByNumber(7); + } + + @Nullable + public Float getBatteryVoltage() { + return (Float) getFieldByNumber(10); + } + + @Nullable + public Integer getBatteryStatus() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Integer getSensorPosition() { + return (Integer) getFieldByNumber(18); + } + + @Nullable + public String getDescriptor() { + return (String) getFieldByNumber(19); + } + + @Nullable + public Integer getAntTransmissionType() { + return (Integer) getFieldByNumber(20); + } + + @Nullable + public Integer getAntDeviceNumber() { + return (Integer) getFieldByNumber(21); + } + + @Nullable + public Integer getAntNetwork() { + return (Integer) getFieldByNumber(22); + } + + @Nullable + public Long getAntId() { + return (Long) getFieldByNumber(24); + } + + @Nullable + public Integer getSourceType() { + return (Integer) getFieldByNumber(25); + } + + @Nullable + public String getProductName() { + return (String) getFieldByNumber(27); + } + + @Nullable + public Integer getBatteryLevel() { + return (Integer) getFieldByNumber(32); + } + @Nullable public Long getTimestamp() { return (Long) getFieldByNumber(253); @@ -71,6 +146,16 @@ public class FitDeviceInfo extends RecordData { super(23); } + public Builder setDeviceIndex(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDeviceType(final Integer value) { + setFieldByNumber(1, value); + return this; + } + public Builder setManufacturer(final Integer value) { setFieldByNumber(2, value); return this; @@ -91,6 +176,71 @@ public class FitDeviceInfo extends RecordData { return this; } + public Builder setHardwareVersion(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setCumOperatingTime(final Long value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setBatteryVoltage(final Float value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setBatteryStatus(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setSensorPosition(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setDescriptor(final String value) { + setFieldByNumber(19, value); + return this; + } + + public Builder setAntTransmissionType(final Integer value) { + setFieldByNumber(20, value); + return this; + } + + public Builder setAntDeviceNumber(final Integer value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setAntNetwork(final Integer value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setAntId(final Long value) { + setFieldByNumber(24, value); + return this; + } + + public Builder setSourceType(final Integer value) { + setFieldByNumber(25, value); + return this; + } + + public Builder setProductName(final String value) { + setFieldByNumber(27, value); + return this; + } + + public Builder setBatteryLevel(final Integer value) { + setFieldByNumber(32, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java index 88fb2724a0..fbe4c4496f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceSettings.java @@ -109,6 +109,23 @@ public class FitDeviceSettings extends RecordData { return (Integer) getFieldByNumber(36); } + @Nullable + public Long getClockTime() { + return (Long) getFieldByNumber(39); + } + + @Nullable + public Number[] getPagesEnabled() { + final Object[] objectsArray = (Object[]) getFieldByNumber(40); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + @Nullable public Integer getMoveAlertEnabled() { return (Integer) getFieldByNumber(46); @@ -144,11 +161,21 @@ public class FitDeviceSettings extends RecordData { return (Integer) getFieldByNumber(59); } + @Nullable + public Integer getLactateThresholdAutodetectEnabled() { + return (Integer) getFieldByNumber(80); + } + @Nullable public Integer getBleAutoUploadEnabled() { return (Integer) getFieldByNumber(86); } + @Nullable + public Integer getAutoSyncFrequency() { + return (Integer) getFieldByNumber(89); + } + @Nullable public Long getAutoActivityDetect() { return (Long) getFieldByNumber(90); @@ -166,6 +193,26 @@ public class FitDeviceSettings extends RecordData { return ret; } + @Nullable + public Integer getNumberOfScreens() { + return (Integer) getFieldByNumber(94); + } + + @Nullable + public Integer getSmartNotificationDisplayOrientation() { + return (Integer) getFieldByNumber(95); + } + + @Nullable + public Integer getTapInterface() { + return (Integer) getFieldByNumber(134); + } + + @Nullable + public Integer getTapSensitivity() { + return (Integer) getFieldByNumber(174); + } + /** * @noinspection unused */ @@ -224,6 +271,16 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setClockTime(final Long value) { + setFieldByNumber(39, value); + return this; + } + + public Builder setPagesEnabled(final Number[] value) { + setFieldByNumber(40, (Object[]) value); + return this; + } + public Builder setMoveAlertEnabled(final Integer value) { setFieldByNumber(46, value); return this; @@ -259,11 +316,21 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setLactateThresholdAutodetectEnabled(final Integer value) { + setFieldByNumber(80, value); + return this; + } + public Builder setBleAutoUploadEnabled(final Integer value) { setFieldByNumber(86, value); return this; } + public Builder setAutoSyncFrequency(final Integer value) { + setFieldByNumber(89, value); + return this; + } + public Builder setAutoActivityDetect(final Long value) { setFieldByNumber(90, value); return this; @@ -274,6 +341,26 @@ public class FitDeviceSettings extends RecordData { return this; } + public Builder setNumberOfScreens(final Integer value) { + setFieldByNumber(94, value); + return this; + } + + public Builder setSmartNotificationDisplayOrientation(final Integer value) { + setFieldByNumber(95, value); + return this; + } + + public Builder setTapInterface(final Integer value) { + setFieldByNumber(134, value); + return this; + } + + public Builder setTapSensitivity(final Integer value) { + setFieldByNumber(174, value); + return this; + } + @Override public FitDeviceSettings build() { return (FitDeviceSettings) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceStatus.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceStatus.java new file mode 100644 index 0000000000..80c523e385 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceStatus.java @@ -0,0 +1,94 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitDeviceStatus extends RecordData { + public FitDeviceStatus(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 104) { + throw new IllegalArgumentException("FitDeviceStatus expects global messages of " + 104 + ", got " + globalNumber); + } + } + + @Nullable + public Float getBatteryVoltage() { + return (Float) getFieldByNumber(0); + } + + @Nullable + public Integer getBatteryLevel() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Integer getTemperature() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(104); + } + + public Builder setBatteryVoltage(final Float value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setBatteryLevel(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTemperature(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitDeviceStatus build() { + return (FitDeviceStatus) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java new file mode 100644 index 0000000000..96f631da60 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDeviceUsed.java @@ -0,0 +1,124 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitDeviceUsed extends RecordData { + public FitDeviceUsed(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 22) { + throw new IllegalArgumentException("FitDeviceUsed expects global messages of " + 22 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getSpeed() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getDistance() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getCadence() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Integer getElevation() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Integer getHeartRate() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Integer getPower() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(22); + } + + public Builder setSpeed(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDistance(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setCadence(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setElevation(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setHeartRate(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setPower(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitDeviceUsed build() { + return (FitDeviceUsed) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveGas.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveGas.java index 657f432beb..031b0a68df 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveGas.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveGas.java @@ -53,6 +53,11 @@ public class FitDiveGas extends RecordData { return (Integer) getFieldByNumber(2); } + @Nullable + public Integer getMode() { + return (Integer) getFieldByNumber(3); + } + @Nullable public Integer getMessageIndex() { return (Integer) getFieldByNumber(254); @@ -81,6 +86,11 @@ public class FitDiveGas extends RecordData { return this; } + public Builder setMode(final Integer value) { + setFieldByNumber(3, value); + return this; + } + public Builder setMessageIndex(final Integer value) { setFieldByNumber(254, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSettings.java new file mode 100644 index 0000000000..1b498a0c46 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSettings.java @@ -0,0 +1,404 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitDiveSettings extends RecordData { + public FitDiveSettings(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 258) { + throw new IllegalArgumentException("FitDiveSettings expects global messages of " + 258 + ", got " + globalNumber); + } + } + + @Nullable + public String getName() { + return (String) getFieldByNumber(0); + } + + @Nullable + public Integer getModel() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getGfLow() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Integer getGfHigh() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Integer getWaterType() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Float getWaterDensity() { + return (Float) getFieldByNumber(5); + } + + @Nullable + public Float getPo2Warn() { + return (Float) getFieldByNumber(6); + } + + @Nullable + public Float getPo2Critical() { + return (Float) getFieldByNumber(7); + } + + @Nullable + public Float getPo2Deco() { + return (Float) getFieldByNumber(8); + } + + @Nullable + public Integer getSafetyStopEnabled() { + return (Integer) getFieldByNumber(9); + } + + @Nullable + public Float getBottomDepth() { + return (Float) getFieldByNumber(10); + } + + @Nullable + public Long getBottomTime() { + return (Long) getFieldByNumber(11); + } + + @Nullable + public Integer getApneaCountdownEnabled() { + return (Integer) getFieldByNumber(12); + } + + @Nullable + public Long getApneaCountdownTime() { + return (Long) getFieldByNumber(13); + } + + @Nullable + public Integer getBacklightMode() { + return (Integer) getFieldByNumber(14); + } + + @Nullable + public Integer getBacklightBrightness() { + return (Integer) getFieldByNumber(15); + } + + @Nullable + public Integer getBacklightTimeout() { + return (Integer) getFieldByNumber(16); + } + + @Nullable + public Integer getRepeatDiveInterval() { + return (Integer) getFieldByNumber(17); + } + + @Nullable + public Integer getSafetyStopTime() { + return (Integer) getFieldByNumber(18); + } + + @Nullable + public Integer getHeartRateSourceType() { + return (Integer) getFieldByNumber(19); + } + + @Nullable + public Integer getHeartRateSource() { + return (Integer) getFieldByNumber(20); + } + + @Nullable + public Integer getTravelGas() { + return (Integer) getFieldByNumber(21); + } + + @Nullable + public Integer getCcrLowSetpointSwitchMode() { + return (Integer) getFieldByNumber(22); + } + + @Nullable + public Float getCcrLowSetpoint() { + return (Float) getFieldByNumber(23); + } + + @Nullable + public Double getCcrLowSetpointDepth() { + return (Double) getFieldByNumber(24); + } + + @Nullable + public Integer getCcrHighSetpointSwitchMode() { + return (Integer) getFieldByNumber(25); + } + + @Nullable + public Float getCcrHighSetpoint() { + return (Float) getFieldByNumber(26); + } + + @Nullable + public Double getCcrHighSetpointDepth() { + return (Double) getFieldByNumber(27); + } + + @Nullable + public Integer getGasConsumptionDisplay() { + return (Integer) getFieldByNumber(29); + } + + @Nullable + public Integer getUpKeyEnabled() { + return (Integer) getFieldByNumber(30); + } + + @Nullable + public Integer getDiveSounds() { + return (Integer) getFieldByNumber(35); + } + + @Nullable + public Float getLastStopMultiple() { + return (Float) getFieldByNumber(36); + } + + @Nullable + public Integer getNoFlyTimeMode() { + return (Integer) getFieldByNumber(37); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(258); + } + + public Builder setName(final String value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setModel(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setGfLow(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setGfHigh(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setWaterType(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setWaterDensity(final Float value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setPo2Warn(final Float value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setPo2Critical(final Float value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setPo2Deco(final Float value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setSafetyStopEnabled(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setBottomDepth(final Float value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setBottomTime(final Long value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setApneaCountdownEnabled(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setApneaCountdownTime(final Long value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setBacklightMode(final Integer value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setBacklightBrightness(final Integer value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setBacklightTimeout(final Integer value) { + setFieldByNumber(16, value); + return this; + } + + public Builder setRepeatDiveInterval(final Integer value) { + setFieldByNumber(17, value); + return this; + } + + public Builder setSafetyStopTime(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setHeartRateSourceType(final Integer value) { + setFieldByNumber(19, value); + return this; + } + + public Builder setHeartRateSource(final Integer value) { + setFieldByNumber(20, value); + return this; + } + + public Builder setTravelGas(final Integer value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setCcrLowSetpointSwitchMode(final Integer value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setCcrLowSetpoint(final Float value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setCcrLowSetpointDepth(final Double value) { + setFieldByNumber(24, value); + return this; + } + + public Builder setCcrHighSetpointSwitchMode(final Integer value) { + setFieldByNumber(25, value); + return this; + } + + public Builder setCcrHighSetpoint(final Float value) { + setFieldByNumber(26, value); + return this; + } + + public Builder setCcrHighSetpointDepth(final Double value) { + setFieldByNumber(27, value); + return this; + } + + public Builder setGasConsumptionDisplay(final Integer value) { + setFieldByNumber(29, value); + return this; + } + + public Builder setUpKeyEnabled(final Integer value) { + setFieldByNumber(30, value); + return this; + } + + public Builder setDiveSounds(final Integer value) { + setFieldByNumber(35, value); + return this; + } + + public Builder setLastStopMultiple(final Float value) { + setFieldByNumber(36, value); + return this; + } + + public Builder setNoFlyTimeMode(final Integer value) { + setFieldByNumber(37, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitDiveSettings build() { + return (FitDiveSettings) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSummary.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSummary.java index e40e2c2773..00cb3030d2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSummary.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitDiveSummary.java @@ -98,6 +98,56 @@ public class FitDiveSummary extends RecordData { return (Double) getFieldByNumber(11); } + @Nullable + public Float getAvgPressureSac() { + return (Float) getFieldByNumber(12); + } + + @Nullable + public Float getAvgVolumeSac() { + return (Float) getFieldByNumber(13); + } + + @Nullable + public Float getAvgRmv() { + return (Float) getFieldByNumber(14); + } + + @Nullable + public Double getDescentTime() { + return (Double) getFieldByNumber(15); + } + + @Nullable + public Double getAscentTime() { + return (Double) getFieldByNumber(16); + } + + @Nullable + public Double getAvgAscentRate() { + return (Double) getFieldByNumber(17); + } + + @Nullable + public Double getAvgDescentRate() { + return (Double) getFieldByNumber(22); + } + + @Nullable + public Double getMaxAscentRate() { + return (Double) getFieldByNumber(23); + } + + @Nullable + public Double getMaxDescentRate() { + return (Double) getFieldByNumber(24); + } + + @Nullable + public Double getHangTime() { + return (Double) getFieldByNumber(25); + } + @Nullable public Long getTimestamp() { return (Long) getFieldByNumber(253); @@ -171,6 +221,56 @@ public class FitDiveSummary extends RecordData { return this; } + public Builder setAvgPressureSac(final Float value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setAvgVolumeSac(final Float value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setAvgRmv(final Float value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setDescentTime(final Double value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setAscentTime(final Double value) { + setFieldByNumber(16, value); + return this; + } + + public Builder setAvgAscentRate(final Double value) { + setFieldByNumber(17, value); + return this; + } + + public Builder setAvgDescentRate(final Double value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setMaxAscentRate(final Double value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setMaxDescentRate(final Double value) { + setFieldByNumber(24, value); + return this; + } + + public Builder setHangTime(final Double value) { + setFieldByNumber(25, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEpoStatus.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEpoStatus.java new file mode 100644 index 0000000000..718f633903 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEpoStatus.java @@ -0,0 +1,94 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitEpoStatus extends RecordData { + public FitEpoStatus(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 141) { + throw new IllegalArgumentException("FitEpoStatus expects global messages of " + 141 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getStatus() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Long getStartTime() { + return (Long) getFieldByNumber(1); + } + + @Nullable + public Long getEndTime() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(141); + } + + public Builder setStatus(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setStartTime(final Long value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setEndTime(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitEpoStatus build() { + return (FitEpoStatus) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java index 5183acfa5d..88dbc8136a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitEvent.java @@ -48,6 +48,11 @@ public class FitEvent extends RecordData { return (Integer) getFieldByNumber(1); } + @Nullable + public Integer getData16() { + return (Integer) getFieldByNumber(2); + } + @Nullable public Long getData() { return (Long) getFieldByNumber(3); @@ -81,6 +86,11 @@ public class FitEvent extends RecordData { return this; } + public Builder setData16(final Integer value) { + setFieldByNumber(2, value); + return this; + } + public Builder setData(final Long value) { setFieldByNumber(3, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitExerciseTitle.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitExerciseTitle.java new file mode 100644 index 0000000000..5beb289af2 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitExerciseTitle.java @@ -0,0 +1,94 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitExerciseTitle extends RecordData { + public FitExerciseTitle(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 264) { + throw new IllegalArgumentException("FitExerciseTitle expects global messages of " + 264 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getExerciseCategory() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getExerciseName() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public String getWktStepName() { + return (String) getFieldByNumber(2); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(264); + } + + public Builder setExerciseCategory(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setExerciseName(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setWktStepName(final String value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitExerciseTitle build() { + return (FitExerciseTitle) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java index 338f6df7a1..4471aa18a5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitFieldDescription.java @@ -58,11 +58,56 @@ public class FitFieldDescription extends RecordData { return (String) getFieldByNumber(3); } + @Nullable + public Integer getArray() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public String getComponents() { + return (String) getFieldByNumber(5); + } + + @Nullable + public Integer getScale() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Integer getOffset() { + return (Integer) getFieldByNumber(7); + } + @Nullable public String getUnits() { return (String) getFieldByNumber(8); } + @Nullable + public String getBits() { + return (String) getFieldByNumber(9); + } + + @Nullable + public String getAccumulate() { + return (String) getFieldByNumber(10); + } + + @Nullable + public Integer getFitBaseUnitId() { + return (Integer) getFieldByNumber(13); + } + + @Nullable + public Integer getNativeMesgNum() { + return (Integer) getFieldByNumber(14); + } + + @Nullable + public Integer getNativeFieldNum() { + return (Integer) getFieldByNumber(15); + } + /** * @noinspection unused */ @@ -91,11 +136,56 @@ public class FitFieldDescription extends RecordData { return this; } + public Builder setArray(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setComponents(final String value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setScale(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setOffset(final Integer value) { + setFieldByNumber(7, value); + return this; + } + public Builder setUnits(final String value) { setFieldByNumber(8, value); return this; } + public Builder setBits(final String value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setAccumulate(final String value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setFitBaseUnitId(final Integer value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setNativeMesgNum(final Integer value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setNativeFieldNum(final Integer value) { + setFieldByNumber(15, value); + return this; + } + @Override public FitFieldDescription build() { return (FitFieldDescription) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java index 55eaf962a3..b536021a6c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGoals.java @@ -40,16 +40,61 @@ public class FitGoals extends RecordData { } } + @Nullable + public Integer getSport() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getSubSport() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getStartDate() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Long getEndDate() { + return (Long) getFieldByNumber(3); + } + @Nullable public Type getType() { return (Type) getFieldByNumber(4); } + @Nullable + public Long getValue() { + return (Long) getFieldByNumber(5); + } + + @Nullable + public Integer getRepeat() { + return (Integer) getFieldByNumber(6); + } + @Nullable public Long getTargetValue() { return (Long) getFieldByNumber(7); } + @Nullable + public Integer getRecurrence() { + return (Integer) getFieldByNumber(8); + } + + @Nullable + public Integer getRecurrenceValue() { + return (Integer) getFieldByNumber(9); + } + + @Nullable + public Integer getEnabled() { + return (Integer) getFieldByNumber(10); + } + @Nullable public Source getSource() { return (Source) getFieldByNumber(11); @@ -63,16 +108,61 @@ public class FitGoals extends RecordData { super(15); } + public Builder setSport(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSubSport(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setStartDate(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setEndDate(final Long value) { + setFieldByNumber(3, value); + return this; + } + public Builder setType(final Type value) { setFieldByNumber(4, value); return this; } + public Builder setValue(final Long value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setRepeat(final Integer value) { + setFieldByNumber(6, value); + return this; + } + public Builder setTargetValue(final Long value) { setFieldByNumber(7, value); return this; } + public Builder setRecurrence(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setRecurrenceValue(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setEnabled(final Integer value) { + setFieldByNumber(10, value); + return this; + } + public Builder setSource(final Source value) { setFieldByNumber(11, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsEvent.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsEvent.java new file mode 100644 index 0000000000..f8f403c11b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitGpsEvent.java @@ -0,0 +1,84 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitGpsEvent extends RecordData { + public FitGpsEvent(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 326) { + throw new IllegalArgumentException("FitGpsEvent expects global messages of " + 326 + ", got " + globalNumber); + } + } + + @Nullable + public Long getEventType() { + return (Long) getFieldByNumber(0); + } + + @Nullable + public Long getData() { + return (Long) getFieldByNumber(1); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(326); + } + + public Builder setEventType(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setData(final Long value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitGpsEvent build() { + return (FitGpsEvent) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHr.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHr.java new file mode 100644 index 0000000000..0bb2e5963f --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHr.java @@ -0,0 +1,135 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHr extends RecordData { + public FitHr(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 132) { + throw new IllegalArgumentException("FitHr expects global messages of " + 132 + ", got " + globalNumber); + } + } + + @Nullable + public Float getFractionalTimestamp() { + return (Float) getFieldByNumber(0); + } + + @Nullable + public Float getTime256() { + return (Float) getFieldByNumber(1); + } + + @Nullable + public Number[] getFilteredBpm() { + final Object[] objectsArray = (Object[]) getFieldByNumber(6); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getEventTimestamp() { + final Object[] objectsArray = (Object[]) getFieldByNumber(9); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getEventTimestamp12() { + final Object[] objectsArray = (Object[]) getFieldByNumber(10); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(132); + } + + public Builder setFractionalTimestamp(final Float value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTime256(final Float value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setFilteredBpm(final Number[] value) { + setFieldByNumber(6, (Object[]) value); + return this; + } + + public Builder setEventTimestamp(final Number[] value) { + setFieldByNumber(9, (Object[]) value); + return this; + } + + public Builder setEventTimestamp12(final Number[] value) { + setFieldByNumber(10, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHr build() { + return (FitHr) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrZone.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrZone.java new file mode 100644 index 0000000000..178efe4816 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrZone.java @@ -0,0 +1,84 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHrZone extends RecordData { + public FitHrZone(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 8) { + throw new IllegalArgumentException("FitHrZone expects global messages of " + 8 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getHighBpm() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public String getName() { + return (String) getFieldByNumber(2); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(8); + } + + public Builder setHighBpm(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setName(final String value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitHrZone build() { + return (FitHrZone) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrmProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrmProfile.java new file mode 100644 index 0000000000..f5fb063f14 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrmProfile.java @@ -0,0 +1,104 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHrmProfile extends RecordData { + public FitHrmProfile(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 4) { + throw new IllegalArgumentException("FitHrmProfile expects global messages of " + 4 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getEnabled() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getHrmAntId() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getLogHrv() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Integer getHrmAntIdTransType() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(4); + } + + public Builder setEnabled(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setHrmAntId(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setLogHrv(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setHrmAntIdTransType(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitHrmProfile build() { + return (FitHrmProfile) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrv.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrv.java new file mode 100644 index 0000000000..d5b87a64c5 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHrv.java @@ -0,0 +1,71 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHrv extends RecordData { + public FitHrv(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 78) { + throw new IllegalArgumentException("FitHrv expects global messages of " + 78 + ", got " + globalNumber); + } + } + + @Nullable + public Number[] getTime() { + final Object[] objectsArray = (Object[]) getFieldByNumber(0); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(78); + } + + public Builder setTime(final Number[] value) { + setFieldByNumber(0, (Object[]) value); + return this; + } + + @Override + public FitHrv build() { + return (FitHrv) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaBodyBatteryData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaBodyBatteryData.java new file mode 100644 index 0000000000..997c0894ac --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaBodyBatteryData.java @@ -0,0 +1,125 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaBodyBatteryData extends RecordData { + public FitHsaBodyBatteryData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 314) { + throw new IllegalArgumentException("FitHsaBodyBatteryData expects global messages of " + 314 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getProcessingInterval() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getLevel() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getCharged() { + final Object[] objectsArray = (Object[]) getFieldByNumber(2); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getUncharged() { + final Object[] objectsArray = (Object[]) getFieldByNumber(3); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(314); + } + + public Builder setProcessingInterval(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setLevel(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setCharged(final Number[] value) { + setFieldByNumber(2, (Object[]) value); + return this; + } + + public Builder setUncharged(final Number[] value) { + setFieldByNumber(3, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaBodyBatteryData build() { + return (FitHsaBodyBatteryData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaConfigurationData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaConfigurationData.java new file mode 100644 index 0000000000..01e5e2947d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaConfigurationData.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaConfigurationData extends RecordData { + public FitHsaConfigurationData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 389) { + throw new IllegalArgumentException("FitHsaConfigurationData expects global messages of " + 389 + ", got " + globalNumber); + } + } + + @Nullable + public Number[] getData() { + final Object[] objectsArray = (Object[]) getFieldByNumber(0); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Integer getDataSize() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(389); + } + + public Builder setData(final Number[] value) { + setFieldByNumber(0, (Object[]) value); + return this; + } + + public Builder setDataSize(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaConfigurationData build() { + return (FitHsaConfigurationData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaEvent.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaEvent.java new file mode 100644 index 0000000000..b8c056ef7d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaEvent.java @@ -0,0 +1,74 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaEvent extends RecordData { + public FitHsaEvent(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 315) { + throw new IllegalArgumentException("FitHsaEvent expects global messages of " + 315 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getEventId() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(315); + } + + public Builder setEventId(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaEvent build() { + return (FitHsaEvent) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaHeartRateData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaHeartRateData.java new file mode 100644 index 0000000000..24f7344045 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaHeartRateData.java @@ -0,0 +1,101 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaHeartRateData extends RecordData { + public FitHsaHeartRateData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 308) { + throw new IllegalArgumentException("FitHsaHeartRateData expects global messages of " + 308 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getProcessingInterval() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getStatus() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Number[] getHeartRate() { + final Object[] objectsArray = (Object[]) getFieldByNumber(2); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(308); + } + + public Builder setProcessingInterval(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setStatus(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setHeartRate(final Number[] value) { + setFieldByNumber(2, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaHeartRateData build() { + return (FitHsaHeartRateData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaRespirationData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaRespirationData.java new file mode 100644 index 0000000000..68b24d3a93 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaRespirationData.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaRespirationData extends RecordData { + public FitHsaRespirationData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 307) { + throw new IllegalArgumentException("FitHsaRespirationData expects global messages of " + 307 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getProcessingInterval() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getRespirationRate() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(307); + } + + public Builder setProcessingInterval(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setRespirationRate(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaRespirationData build() { + return (FitHsaRespirationData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaSpo2Data.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaSpo2Data.java new file mode 100644 index 0000000000..b8964bfcd9 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaSpo2Data.java @@ -0,0 +1,108 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaSpo2Data extends RecordData { + public FitHsaSpo2Data(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 305) { + throw new IllegalArgumentException("FitHsaSpo2Data expects global messages of " + 305 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getProcessingInterval() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getReadingSpo2() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getConfidence() { + final Object[] objectsArray = (Object[]) getFieldByNumber(2); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(305); + } + + public Builder setProcessingInterval(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setReadingSpo2(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setConfidence(final Number[] value) { + setFieldByNumber(2, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaSpo2Data build() { + return (FitHsaSpo2Data) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStepData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStepData.java new file mode 100644 index 0000000000..908b12e34b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStepData.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaStepData extends RecordData { + public FitHsaStepData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 304) { + throw new IllegalArgumentException("FitHsaStepData expects global messages of " + 304 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getProcessingInterval() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getSteps() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(304); + } + + public Builder setProcessingInterval(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSteps(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaStepData build() { + return (FitHsaStepData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStressData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStressData.java new file mode 100644 index 0000000000..0eeb1641f5 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaStressData.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaStressData extends RecordData { + public FitHsaStressData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 306) { + throw new IllegalArgumentException("FitHsaStressData expects global messages of " + 306 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getProcessingInterval() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getStressLevel() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(306); + } + + public Builder setProcessingInterval(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setStressLevel(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaStressData build() { + return (FitHsaStressData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaWristTemperatureData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaWristTemperatureData.java new file mode 100644 index 0000000000..ddf9b955ec --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitHsaWristTemperatureData.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitHsaWristTemperatureData extends RecordData { + public FitHsaWristTemperatureData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 409) { + throw new IllegalArgumentException("FitHsaWristTemperatureData expects global messages of " + 409 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getProcessingInterval() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Number[] getValue() { + final Object[] objectsArray = (Object[]) getFieldByNumber(1); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(409); + } + + public Builder setProcessingInterval(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setValue(final Number[] value) { + setFieldByNumber(1, (Object[]) value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitHsaWristTemperatureData build() { + return (FitHsaWristTemperatureData) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java index 3aec3a7401..70994981e8 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLap.java @@ -95,10 +95,25 @@ public class FitLap extends RecordData { } @Nullable - public Integer getTotalCalores() { + public Integer getTotalCalories() { return (Integer) getFieldByNumber(11); } + @Nullable + public Integer getTotalFatCalories() { + return (Integer) getFieldByNumber(12); + } + + @Nullable + public Float getAvgSpeed() { + return (Float) getFieldByNumber(13); + } + + @Nullable + public Float getMaxSpeed() { + return (Float) getFieldByNumber(14); + } + @Nullable public Integer getAvgHeartRate() { return (Integer) getFieldByNumber(15); @@ -114,6 +129,21 @@ public class FitLap extends RecordData { return (Integer) getFieldByNumber(17); } + @Nullable + public Integer getMaxCadence() { + return (Integer) getFieldByNumber(18); + } + + @Nullable + public Integer getAvgPower() { + return (Integer) getFieldByNumber(19); + } + + @Nullable + public Integer getMaxPower() { + return (Integer) getFieldByNumber(20); + } + @Nullable public Integer getTotalAscent() { return (Integer) getFieldByNumber(21); @@ -124,6 +154,11 @@ public class FitLap extends RecordData { return (Integer) getFieldByNumber(22); } + @Nullable + public Integer getIntensity() { + return (Integer) getFieldByNumber(23); + } + @Nullable public Integer getLapTrigger() { return (Integer) getFieldByNumber(24); @@ -134,11 +169,26 @@ public class FitLap extends RecordData { return (Integer) getFieldByNumber(25); } + @Nullable + public Integer getEventGroup() { + return (Integer) getFieldByNumber(26); + } + @Nullable public Integer getNumLengths() { return (Integer) getFieldByNumber(32); } + @Nullable + public Integer getNormalizedPower() { + return (Integer) getFieldByNumber(33); + } + + @Nullable + public Integer getLeftRightBalance() { + return (Integer) getFieldByNumber(34); + } + @Nullable public Integer getFirstLengthIndex() { return (Integer) getFieldByNumber(35); @@ -164,11 +214,161 @@ public class FitLap extends RecordData { return (Integer) getFieldByNumber(40); } + @Nullable + public Long getTotalWork() { + return (Long) getFieldByNumber(41); + } + + @Nullable + public Float getAvgAltitude() { + return (Float) getFieldByNumber(42); + } + + @Nullable + public Float getMaxAltitude() { + return (Float) getFieldByNumber(43); + } + + @Nullable + public Integer getGpsAccuracy() { + return (Integer) getFieldByNumber(44); + } + + @Nullable + public Float getAvgGrade() { + return (Float) getFieldByNumber(45); + } + + @Nullable + public Float getAvgPosGrade() { + return (Float) getFieldByNumber(46); + } + + @Nullable + public Float getAvgNegGrade() { + return (Float) getFieldByNumber(47); + } + + @Nullable + public Float getMaxPosGrade() { + return (Float) getFieldByNumber(48); + } + + @Nullable + public Float getMaxNegGrade() { + return (Float) getFieldByNumber(49); + } + + @Nullable + public Integer getAvgTemperature() { + return (Integer) getFieldByNumber(50); + } + + @Nullable + public Integer getMaxTemperature() { + return (Integer) getFieldByNumber(51); + } + + @Nullable + public Double getTotalMovingTime() { + return (Double) getFieldByNumber(52); + } + + @Nullable + public Float getAvgPosVerticalSpeed() { + return (Float) getFieldByNumber(53); + } + + @Nullable + public Float getAvgNegVerticalSpeed() { + return (Float) getFieldByNumber(54); + } + + @Nullable + public Float getMaxPosVerticalSpeed() { + return (Float) getFieldByNumber(55); + } + + @Nullable + public Float getMaxNegVerticalSpeed() { + return (Float) getFieldByNumber(56); + } + + @Nullable + public Double getTimeInHrZone() { + return (Double) getFieldByNumber(57); + } + + @Nullable + public Integer getWktStepIndex() { + return (Integer) getFieldByNumber(71); + } + @Nullable public Integer getAvgSwolf() { return (Integer) getFieldByNumber(73); } + @Nullable + public Float getAvgFractionalCadence() { + return (Float) getFieldByNumber(80); + } + + @Nullable + public Float getMaxFractionalCadence() { + return (Float) getFieldByNumber(81); + } + + @Nullable + public Integer getAvgLeftPco() { + return (Integer) getFieldByNumber(100); + } + + @Nullable + public Integer getAvgRightPco() { + return (Integer) getFieldByNumber(101); + } + + @Nullable + public Integer getAvgLeftPowerPhase() { + return (Integer) getFieldByNumber(102); + } + + @Nullable + public Integer getAvgLeftPowerPhasePeak() { + return (Integer) getFieldByNumber(103); + } + + @Nullable + public Integer getAvgRightPowerPhase() { + return (Integer) getFieldByNumber(104); + } + + @Nullable + public Integer getAvgRightPowerPhasePeak() { + return (Integer) getFieldByNumber(105); + } + + @Nullable + public Integer getAvgPowerPosition() { + return (Integer) getFieldByNumber(106); + } + + @Nullable + public Integer getMaxPowerPosition() { + return (Integer) getFieldByNumber(107); + } + + @Nullable + public Integer getAvgCadencePosition() { + return (Integer) getFieldByNumber(108); + } + + @Nullable + public Integer getMaxCadencePosition() { + return (Integer) getFieldByNumber(109); + } + @Nullable public Double getEnhancedAvgSpeed() { return (Double) getFieldByNumber(110); @@ -184,6 +384,11 @@ public class FitLap extends RecordData { return (Long) getFieldByNumber(253); } + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + /** * @noinspection unused */ @@ -247,11 +452,26 @@ public class FitLap extends RecordData { return this; } - public Builder setTotalCalores(final Integer value) { + public Builder setTotalCalories(final Integer value) { setFieldByNumber(11, value); return this; } + public Builder setTotalFatCalories(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setAvgSpeed(final Float value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setMaxSpeed(final Float value) { + setFieldByNumber(14, value); + return this; + } + public Builder setAvgHeartRate(final Integer value) { setFieldByNumber(15, value); return this; @@ -267,6 +487,21 @@ public class FitLap extends RecordData { return this; } + public Builder setMaxCadence(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setAvgPower(final Integer value) { + setFieldByNumber(19, value); + return this; + } + + public Builder setMaxPower(final Integer value) { + setFieldByNumber(20, value); + return this; + } + public Builder setTotalAscent(final Integer value) { setFieldByNumber(21, value); return this; @@ -277,6 +512,11 @@ public class FitLap extends RecordData { return this; } + public Builder setIntensity(final Integer value) { + setFieldByNumber(23, value); + return this; + } + public Builder setLapTrigger(final Integer value) { setFieldByNumber(24, value); return this; @@ -287,11 +527,26 @@ public class FitLap extends RecordData { return this; } + public Builder setEventGroup(final Integer value) { + setFieldByNumber(26, value); + return this; + } + public Builder setNumLengths(final Integer value) { setFieldByNumber(32, value); return this; } + public Builder setNormalizedPower(final Integer value) { + setFieldByNumber(33, value); + return this; + } + + public Builder setLeftRightBalance(final Integer value) { + setFieldByNumber(34, value); + return this; + } + public Builder setFirstLengthIndex(final Integer value) { setFieldByNumber(35, value); return this; @@ -317,11 +572,161 @@ public class FitLap extends RecordData { return this; } + public Builder setTotalWork(final Long value) { + setFieldByNumber(41, value); + return this; + } + + public Builder setAvgAltitude(final Float value) { + setFieldByNumber(42, value); + return this; + } + + public Builder setMaxAltitude(final Float value) { + setFieldByNumber(43, value); + return this; + } + + public Builder setGpsAccuracy(final Integer value) { + setFieldByNumber(44, value); + return this; + } + + public Builder setAvgGrade(final Float value) { + setFieldByNumber(45, value); + return this; + } + + public Builder setAvgPosGrade(final Float value) { + setFieldByNumber(46, value); + return this; + } + + public Builder setAvgNegGrade(final Float value) { + setFieldByNumber(47, value); + return this; + } + + public Builder setMaxPosGrade(final Float value) { + setFieldByNumber(48, value); + return this; + } + + public Builder setMaxNegGrade(final Float value) { + setFieldByNumber(49, value); + return this; + } + + public Builder setAvgTemperature(final Integer value) { + setFieldByNumber(50, value); + return this; + } + + public Builder setMaxTemperature(final Integer value) { + setFieldByNumber(51, value); + return this; + } + + public Builder setTotalMovingTime(final Double value) { + setFieldByNumber(52, value); + return this; + } + + public Builder setAvgPosVerticalSpeed(final Float value) { + setFieldByNumber(53, value); + return this; + } + + public Builder setAvgNegVerticalSpeed(final Float value) { + setFieldByNumber(54, value); + return this; + } + + public Builder setMaxPosVerticalSpeed(final Float value) { + setFieldByNumber(55, value); + return this; + } + + public Builder setMaxNegVerticalSpeed(final Float value) { + setFieldByNumber(56, value); + return this; + } + + public Builder setTimeInHrZone(final Double value) { + setFieldByNumber(57, value); + return this; + } + + public Builder setWktStepIndex(final Integer value) { + setFieldByNumber(71, value); + return this; + } + public Builder setAvgSwolf(final Integer value) { setFieldByNumber(73, value); return this; } + public Builder setAvgFractionalCadence(final Float value) { + setFieldByNumber(80, value); + return this; + } + + public Builder setMaxFractionalCadence(final Float value) { + setFieldByNumber(81, value); + return this; + } + + public Builder setAvgLeftPco(final Integer value) { + setFieldByNumber(100, value); + return this; + } + + public Builder setAvgRightPco(final Integer value) { + setFieldByNumber(101, value); + return this; + } + + public Builder setAvgLeftPowerPhase(final Integer value) { + setFieldByNumber(102, value); + return this; + } + + public Builder setAvgLeftPowerPhasePeak(final Integer value) { + setFieldByNumber(103, value); + return this; + } + + public Builder setAvgRightPowerPhase(final Integer value) { + setFieldByNumber(104, value); + return this; + } + + public Builder setAvgRightPowerPhasePeak(final Integer value) { + setFieldByNumber(105, value); + return this; + } + + public Builder setAvgPowerPosition(final Integer value) { + setFieldByNumber(106, value); + return this; + } + + public Builder setMaxPowerPosition(final Integer value) { + setFieldByNumber(107, value); + return this; + } + + public Builder setAvgCadencePosition(final Integer value) { + setFieldByNumber(108, value); + return this; + } + + public Builder setMaxCadencePosition(final Integer value) { + setFieldByNumber(109, value); + return this; + } + public Builder setEnhancedAvgSpeed(final Double value) { setFieldByNumber(110, value); return this; @@ -337,6 +742,11 @@ public class FitLap extends RecordData { return this; } + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + @Override public FitLap build() { return (FitLap) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLength.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLength.java new file mode 100644 index 0000000000..d3278b0e00 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitLength.java @@ -0,0 +1,288 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitLength extends RecordData { + public FitLength(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 101) { + throw new IllegalArgumentException("FitLength expects global messages of " + 101 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getEvent() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getEventType() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getStartTime() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Double getTotalElapsedTime() { + return (Double) getFieldByNumber(3); + } + + @Nullable + public Double getTotalTimerTime() { + return (Double) getFieldByNumber(4); + } + + @Nullable + public Integer getTotalStrokes() { + return (Integer) getFieldByNumber(5); + } + + @Nullable + public Float getAvgSpeed() { + return (Float) getFieldByNumber(6); + } + + @Nullable + public Integer getSwimStroke() { + return (Integer) getFieldByNumber(7); + } + + @Nullable + public Integer getAvgSwimmingCadence() { + return (Integer) getFieldByNumber(9); + } + + @Nullable + public Integer getEventGroup() { + return (Integer) getFieldByNumber(10); + } + + @Nullable + public Integer getTotalCalories() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Integer getLengthType() { + return (Integer) getFieldByNumber(12); + } + + @Nullable + public Integer getPlayerScore() { + return (Integer) getFieldByNumber(18); + } + + @Nullable + public Integer getOpponentScore() { + return (Integer) getFieldByNumber(19); + } + + @Nullable + public Number[] getStrokeCount() { + final Object[] objectsArray = (Object[]) getFieldByNumber(20); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Number[] getZoneCount() { + final Object[] objectsArray = (Object[]) getFieldByNumber(21); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Float getEnhancedAvgRespirationRate() { + return (Float) getFieldByNumber(22); + } + + @Nullable + public Float getEnhancedMaxRespirationRate() { + return (Float) getFieldByNumber(23); + } + + @Nullable + public Integer getAvgRespirationRate() { + return (Integer) getFieldByNumber(24); + } + + @Nullable + public Integer getMaxRespirationRate() { + return (Integer) getFieldByNumber(25); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(101); + } + + public Builder setEvent(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setEventType(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setStartTime(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTotalElapsedTime(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTotalTimerTime(final Double value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setTotalStrokes(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setAvgSpeed(final Float value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setSwimStroke(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setAvgSwimmingCadence(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setEventGroup(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setTotalCalories(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setLengthType(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setPlayerScore(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setOpponentScore(final Integer value) { + setFieldByNumber(19, value); + return this; + } + + public Builder setStrokeCount(final Number[] value) { + setFieldByNumber(20, (Object[]) value); + return this; + } + + public Builder setZoneCount(final Number[] value) { + setFieldByNumber(21, (Object[]) value); + return this; + } + + public Builder setEnhancedAvgRespirationRate(final Float value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setEnhancedMaxRespirationRate(final Float value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setAvgRespirationRate(final Integer value) { + setFieldByNumber(24, value); + return this; + } + + public Builder setMaxRespirationRate(final Integer value) { + setFieldByNumber(25, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitLength build() { + return (FitLength) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMaxMetData.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMaxMetData.java index 1e73474d54..3e10179f34 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMaxMetData.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMaxMetData.java @@ -68,6 +68,16 @@ public class FitMaxMetData extends RecordData { return (Integer) getFieldByNumber(9); } + @Nullable + public Integer getHrSource() { + return (Integer) getFieldByNumber(12); + } + + @Nullable + public Integer getSpeedSource() { + return (Integer) getFieldByNumber(13); + } + /** * @noinspection unused */ @@ -106,6 +116,16 @@ public class FitMaxMetData extends RecordData { return this; } + public Builder setHrSource(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setSpeedSource(final Integer value) { + setFieldByNumber(13, value); + return this; + } + @Override public FitMaxMetData build() { return (FitMaxMetData) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetZone.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetZone.java new file mode 100644 index 0000000000..82a2e4a719 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMetZone.java @@ -0,0 +1,94 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitMetZone extends RecordData { + public FitMetZone(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 10) { + throw new IllegalArgumentException("FitMetZone expects global messages of " + 10 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getHighBpm() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Float getCalories() { + return (Float) getFieldByNumber(2); + } + + @Nullable + public Float getFatCalories() { + return (Float) getFieldByNumber(3); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(10); + } + + public Builder setHighBpm(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setCalories(final Float value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setFatCalories(final Float value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitMetZone build() { + return (FitMetZone) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java index 6329d79d42..07313cbb4c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitMonitoring.java @@ -41,6 +41,16 @@ public class FitMonitoring extends RecordData { } } + @Nullable + public Integer getDeviceIndex() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getCalories() { + return (Integer) getFieldByNumber(1); + } + @Nullable public Long getDistance() { return (Long) getFieldByNumber(2); @@ -61,6 +71,56 @@ public class FitMonitoring extends RecordData { return (Integer) getFieldByNumber(5); } + @Nullable + public Integer getActivitySubtype() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Integer getActivityLevel() { + return (Integer) getFieldByNumber(7); + } + + @Nullable + public Integer getDistance16() { + return (Integer) getFieldByNumber(8); + } + + @Nullable + public Integer getCycles16() { + return (Integer) getFieldByNumber(9); + } + + @Nullable + public Integer getActiveTime16() { + return (Integer) getFieldByNumber(10); + } + + @Nullable + public Integer getLocalTimestamp() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Float getTemperature() { + return (Float) getFieldByNumber(12); + } + + @Nullable + public Float getTemperatureMin() { + return (Float) getFieldByNumber(14); + } + + @Nullable + public Float getTemperatureMax() { + return (Float) getFieldByNumber(15); + } + + @Nullable + public Integer getActivityTime() { + return (Integer) getFieldByNumber(16); + } + @Nullable public Integer getActiveCalories() { return (Integer) getFieldByNumber(19); @@ -81,11 +141,36 @@ public class FitMonitoring extends RecordData { return (Integer) getFieldByNumber(26); } + @Nullable + public Integer getTimestampMin8() { + return (Integer) getFieldByNumber(25); + } + @Nullable public Integer getHeartRate() { return (Integer) getFieldByNumber(27); } + @Nullable + public Float getIntensity() { + return (Float) getFieldByNumber(28); + } + + @Nullable + public Long getDuration() { + return (Long) getFieldByNumber(30); + } + + @Nullable + public Double getAscent() { + return (Double) getFieldByNumber(31); + } + + @Nullable + public Double getDescent() { + return (Double) getFieldByNumber(32); + } + @Nullable public Integer getModerateActivityMinutes() { return (Integer) getFieldByNumber(33); @@ -109,6 +194,16 @@ public class FitMonitoring extends RecordData { super(55); } + public Builder setDeviceIndex(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setCalories(final Integer value) { + setFieldByNumber(1, value); + return this; + } + public Builder setDistance(final Long value) { setFieldByNumber(2, value); return this; @@ -129,6 +224,56 @@ public class FitMonitoring extends RecordData { return this; } + public Builder setActivitySubtype(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setActivityLevel(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setDistance16(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setCycles16(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setActiveTime16(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setLocalTimestamp(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setTemperature(final Float value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setTemperatureMin(final Float value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setTemperatureMax(final Float value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setActivityTime(final Integer value) { + setFieldByNumber(16, value); + return this; + } + public Builder setActiveCalories(final Integer value) { setFieldByNumber(19, value); return this; @@ -149,11 +294,36 @@ public class FitMonitoring extends RecordData { return this; } + public Builder setTimestampMin8(final Integer value) { + setFieldByNumber(25, value); + return this; + } + public Builder setHeartRate(final Integer value) { setFieldByNumber(27, value); return this; } + public Builder setIntensity(final Float value) { + setFieldByNumber(28, value); + return this; + } + + public Builder setDuration(final Long value) { + setFieldByNumber(30, value); + return this; + } + + public Builder setAscent(final Double value) { + setFieldByNumber(31, value); + return this; + } + + public Builder setDescent(final Double value) { + setFieldByNumber(32, value); + return this; + } + public Builder setModerateActivityMinutes(final Integer value) { setFieldByNumber(33, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitOhrSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitOhrSettings.java new file mode 100644 index 0000000000..4d7cc31f4d --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitOhrSettings.java @@ -0,0 +1,74 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitOhrSettings extends RecordData { + public FitOhrSettings(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 188) { + throw new IllegalArgumentException("FitOhrSettings expects global messages of " + 188 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getEnabled() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(188); + } + + public Builder setEnabled(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitOhrSettings build() { + return (FitOhrSettings) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPad.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPad.java new file mode 100644 index 0000000000..1e512ea855 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPad.java @@ -0,0 +1,54 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitPad extends RecordData { + public FitPad(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 105) { + throw new IllegalArgumentException("FitPad expects global messages of " + 105 + ", got " + globalNumber); + } + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(105); + } + + @Override + public FitPad build() { + return (FitPad) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPowerZone.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPowerZone.java new file mode 100644 index 0000000000..f9126792a2 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitPowerZone.java @@ -0,0 +1,84 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitPowerZone extends RecordData { + public FitPowerZone(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 9) { + throw new IllegalArgumentException("FitPowerZone expects global messages of " + 9 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getHighValue() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public String getName() { + return (String) getFieldByNumber(2); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(9); + } + + public Builder setHighValue(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setName(final String value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitPowerZone build() { + return (FitPowerZone) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java index bedcc418b7..d518076dba 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecord.java @@ -82,31 +82,138 @@ public class FitRecord extends RecordData { return (Integer) getFieldByNumber(7); } + @Nullable + public Integer getCompressedSpeedDistance() { + return (Integer) getFieldByNumber(8); + } + + @Nullable + public Float getGrade() { + return (Float) getFieldByNumber(9); + } + + @Nullable + public Integer getResistance() { + return (Integer) getFieldByNumber(10); + } + + @Nullable + public Double getTimeFromCourse() { + return (Double) getFieldByNumber(11); + } + + @Nullable + public Float getCycleLength() { + return (Float) getFieldByNumber(12); + } + @Nullable public Integer getTemperature() { return (Integer) getFieldByNumber(13); } + @Nullable + public Number[] getSpeed1s() { + final Object[] objectsArray = (Object[]) getFieldByNumber(17); + if (objectsArray == null) + return null; + final Number[] ret = new Number[objectsArray.length]; + for (int i = 0; i < objectsArray.length; i++) { + ret[i] = (Number) objectsArray[i]; + } + return ret; + } + + @Nullable + public Integer getCycles() { + return (Integer) getFieldByNumber(18); + } + + @Nullable + public Long getTotalCycles() { + return (Long) getFieldByNumber(19); + } + + @Nullable + public Integer getCompressedAccumulatedPower() { + return (Integer) getFieldByNumber(28); + } + @Nullable public Long getAccumulatedPower() { return (Long) getFieldByNumber(29); } + @Nullable + public Integer getLeftRightBalance() { + return (Integer) getFieldByNumber(30); + } + + @Nullable + public Integer getGpsAccuracy() { + return (Integer) getFieldByNumber(31); + } + + @Nullable + public Float getVerticalSpeed() { + return (Float) getFieldByNumber(32); + } + + @Nullable + public Integer getCalories() { + return (Integer) getFieldByNumber(33); + } + @Nullable public Float getOscillation() { return (Float) getFieldByNumber(39); } + @Nullable + public Float getStanceTimePercent() { + return (Float) getFieldByNumber(40); + } + + @Nullable + public Float getStanceTime() { + return (Float) getFieldByNumber(41); + } + @Nullable public Integer getActivity() { return (Integer) getFieldByNumber(42); } + @Nullable + public Integer getStrokeType() { + return (Integer) getFieldByNumber(49); + } + + @Nullable + public Integer getZone() { + return (Integer) getFieldByNumber(50); + } + + @Nullable + public Float getBallSpeed() { + return (Float) getFieldByNumber(51); + } + + @Nullable + public Float getCadence256() { + return (Float) getFieldByNumber(52); + } + @Nullable public Float getFractionalCadence() { return (Float) getFieldByNumber(53); } + @Nullable + public Integer getDeviceIndex() { + return (Integer) getFieldByNumber(62); + } + @Nullable public Double getEnhancedSpeed() { return (Double) getFieldByNumber(73); @@ -117,16 +224,36 @@ public class FitRecord extends RecordData { return (Double) getFieldByNumber(78); } + @Nullable + public Float getBatterySoc() { + return (Float) getFieldByNumber(81); + } + + @Nullable + public Integer getMotorPower() { + return (Integer) getFieldByNumber(82); + } + @Nullable public Float getVerticalRatio() { return (Float) getFieldByNumber(83); } + @Nullable + public Float getStanceTimeBalance() { + return (Float) getFieldByNumber(84); + } + @Nullable public Float getStepLength() { return (Float) getFieldByNumber(85); } + @Nullable + public Float getCycleLength16() { + return (Float) getFieldByNumber(87); + } + @Nullable public Long getAbsolutePressure() { return (Long) getFieldByNumber(91); @@ -167,16 +294,71 @@ public class FitRecord extends RecordData { return (Integer) getFieldByNumber(98); } + @Nullable + public Integer getRespirationRate() { + return (Integer) getFieldByNumber(99); + } + @Nullable public Integer getEnhancedRespirationRate() { return (Integer) getFieldByNumber(108); } + @Nullable + public Float getGrit() { + return (Float) getFieldByNumber(114); + } + + @Nullable + public Float getFlow() { + return (Float) getFieldByNumber(115); + } + + @Nullable + public Float getCurrentStress() { + return (Float) getFieldByNumber(116); + } + + @Nullable + public Long getAirTimeRemaining() { + return (Long) getFieldByNumber(123); + } + + @Nullable + public Float getPressureSac() { + return (Float) getFieldByNumber(124); + } + + @Nullable + public Float getVolumeSac() { + return (Float) getFieldByNumber(125); + } + + @Nullable + public Float getRmv() { + return (Float) getFieldByNumber(126); + } + + @Nullable + public Double getAscentRate() { + return (Double) getFieldByNumber(127); + } + + @Nullable + public Float getPo2() { + return (Float) getFieldByNumber(129); + } + @Nullable public Integer getWristHeartRate() { return (Integer) getFieldByNumber(136); } + @Nullable + public Float getCoreTemperature() { + return (Float) getFieldByNumber(139); + } + @Nullable public Integer getBodyBattery() { return (Integer) getFieldByNumber(143); @@ -235,31 +417,131 @@ public class FitRecord extends RecordData { return this; } + public Builder setCompressedSpeedDistance(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setGrade(final Float value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setResistance(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setTimeFromCourse(final Double value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setCycleLength(final Float value) { + setFieldByNumber(12, value); + return this; + } + public Builder setTemperature(final Integer value) { setFieldByNumber(13, value); return this; } + public Builder setSpeed1s(final Number[] value) { + setFieldByNumber(17, (Object[]) value); + return this; + } + + public Builder setCycles(final Integer value) { + setFieldByNumber(18, value); + return this; + } + + public Builder setTotalCycles(final Long value) { + setFieldByNumber(19, value); + return this; + } + + public Builder setCompressedAccumulatedPower(final Integer value) { + setFieldByNumber(28, value); + return this; + } + public Builder setAccumulatedPower(final Long value) { setFieldByNumber(29, value); return this; } + public Builder setLeftRightBalance(final Integer value) { + setFieldByNumber(30, value); + return this; + } + + public Builder setGpsAccuracy(final Integer value) { + setFieldByNumber(31, value); + return this; + } + + public Builder setVerticalSpeed(final Float value) { + setFieldByNumber(32, value); + return this; + } + + public Builder setCalories(final Integer value) { + setFieldByNumber(33, value); + return this; + } + public Builder setOscillation(final Float value) { setFieldByNumber(39, value); return this; } + public Builder setStanceTimePercent(final Float value) { + setFieldByNumber(40, value); + return this; + } + + public Builder setStanceTime(final Float value) { + setFieldByNumber(41, value); + return this; + } + public Builder setActivity(final Integer value) { setFieldByNumber(42, value); return this; } + public Builder setStrokeType(final Integer value) { + setFieldByNumber(49, value); + return this; + } + + public Builder setZone(final Integer value) { + setFieldByNumber(50, value); + return this; + } + + public Builder setBallSpeed(final Float value) { + setFieldByNumber(51, value); + return this; + } + + public Builder setCadence256(final Float value) { + setFieldByNumber(52, value); + return this; + } + public Builder setFractionalCadence(final Float value) { setFieldByNumber(53, value); return this; } + public Builder setDeviceIndex(final Integer value) { + setFieldByNumber(62, value); + return this; + } + public Builder setEnhancedSpeed(final Double value) { setFieldByNumber(73, value); return this; @@ -270,16 +552,36 @@ public class FitRecord extends RecordData { return this; } + public Builder setBatterySoc(final Float value) { + setFieldByNumber(81, value); + return this; + } + + public Builder setMotorPower(final Integer value) { + setFieldByNumber(82, value); + return this; + } + public Builder setVerticalRatio(final Float value) { setFieldByNumber(83, value); return this; } + public Builder setStanceTimeBalance(final Float value) { + setFieldByNumber(84, value); + return this; + } + public Builder setStepLength(final Float value) { setFieldByNumber(85, value); return this; } + public Builder setCycleLength16(final Float value) { + setFieldByNumber(87, value); + return this; + } + public Builder setAbsolutePressure(final Long value) { setFieldByNumber(91, value); return this; @@ -320,16 +622,71 @@ public class FitRecord extends RecordData { return this; } + public Builder setRespirationRate(final Integer value) { + setFieldByNumber(99, value); + return this; + } + public Builder setEnhancedRespirationRate(final Integer value) { setFieldByNumber(108, value); return this; } + public Builder setGrit(final Float value) { + setFieldByNumber(114, value); + return this; + } + + public Builder setFlow(final Float value) { + setFieldByNumber(115, value); + return this; + } + + public Builder setCurrentStress(final Float value) { + setFieldByNumber(116, value); + return this; + } + + public Builder setAirTimeRemaining(final Long value) { + setFieldByNumber(123, value); + return this; + } + + public Builder setPressureSac(final Float value) { + setFieldByNumber(124, value); + return this; + } + + public Builder setVolumeSac(final Float value) { + setFieldByNumber(125, value); + return this; + } + + public Builder setRmv(final Float value) { + setFieldByNumber(126, value); + return this; + } + + public Builder setAscentRate(final Double value) { + setFieldByNumber(127, value); + return this; + } + + public Builder setPo2(final Float value) { + setFieldByNumber(129, value); + return this; + } + public Builder setWristHeartRate(final Integer value) { setFieldByNumber(136, value); return this; } + public Builder setCoreTemperature(final Float value) { + setFieldByNumber(139, value); + return this; + } + public Builder setBodyBattery(final Integer value) { setFieldByNumber(143, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java index 5a36ada9b0..b5dca6b159 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitRecordDataFactory.java @@ -16,52 +16,100 @@ public class FitRecordDataFactory { public static RecordData create(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { return switch (recordDefinition.getGlobalFITMessage().getNumber()) { case 0 -> new FitFileId(recordDefinition, recordHeader); + case 1 -> new FitCapabilities(recordDefinition, recordHeader); case 2 -> new FitDeviceSettings(recordDefinition, recordHeader); case 3 -> new FitUserProfile(recordDefinition, recordHeader); + case 4 -> new FitHrmProfile(recordDefinition, recordHeader); + case 5 -> new FitSdmProfile(recordDefinition, recordHeader); + case 6 -> new FitBikeProfile(recordDefinition, recordHeader); case 7 -> new FitZonesTarget(recordDefinition, recordHeader); + case 8 -> new FitHrZone(recordDefinition, recordHeader); + case 9 -> new FitPowerZone(recordDefinition, recordHeader); + case 10 -> new FitMetZone(recordDefinition, recordHeader); case 12 -> new FitSport(recordDefinition, recordHeader); + case 13 -> new FitTrainingSettings(recordDefinition, recordHeader); case 15 -> new FitGoals(recordDefinition, recordHeader); case 18 -> new FitSession(recordDefinition, recordHeader); case 19 -> new FitLap(recordDefinition, recordHeader); case 20 -> new FitRecord(recordDefinition, recordHeader); case 21 -> new FitEvent(recordDefinition, recordHeader); + case 22 -> new FitDeviceUsed(recordDefinition, recordHeader); case 23 -> new FitDeviceInfo(recordDefinition, recordHeader); case 26 -> new FitWorkout(recordDefinition, recordHeader); + case 27 -> new FitWorkoutStep(recordDefinition, recordHeader); + case 30 -> new FitWeightScale(recordDefinition, recordHeader); case 31 -> new FitCourse(recordDefinition, recordHeader); + case 33 -> new FitTotals(recordDefinition, recordHeader); case 34 -> new FitActivity(recordDefinition, recordHeader); + case 35 -> new FitSoftware(recordDefinition, recordHeader); case 49 -> new FitFileCreator(recordDefinition, recordHeader); + case 51 -> new FitBloodPressure(recordDefinition, recordHeader); + case 53 -> new FitSpeedZone(recordDefinition, recordHeader); case 55 -> new FitMonitoring(recordDefinition, recordHeader); + case 72 -> new FitTrainingFile(recordDefinition, recordHeader); + case 78 -> new FitHrv(recordDefinition, recordHeader); + case 79 -> new FitUserMetrics(recordDefinition, recordHeader); + case 101 -> new FitLength(recordDefinition, recordHeader); case 103 -> new FitMonitoringInfo(recordDefinition, recordHeader); + case 104 -> new FitDeviceStatus(recordDefinition, recordHeader); + case 105 -> new FitPad(recordDefinition, recordHeader); + case 106 -> new FitSlaveDevice(recordDefinition, recordHeader); case 127 -> new FitConnectivity(recordDefinition, recordHeader); case 128 -> new FitWeather(recordDefinition, recordHeader); + case 131 -> new FitCadenceZone(recordDefinition, recordHeader); + case 132 -> new FitHr(recordDefinition, recordHeader); case 140 -> new FitPhysiologicalMetrics(recordDefinition, recordHeader); + case 141 -> new FitEpoStatus(recordDefinition, recordHeader); + case 147 -> new FitSensorSettings(recordDefinition, recordHeader); + case 151 -> new FitSegmentFile(recordDefinition, recordHeader); + case 158 -> new FitWorkoutSession(recordDefinition, recordHeader); case 159 -> new FitWatchfaceSettings(recordDefinition, recordHeader); case 160 -> new FitGpsMetadata(recordDefinition, recordHeader); case 162 -> new FitTimestampCorrelation(recordDefinition, recordHeader); + case 188 -> new FitOhrSettings(recordDefinition, recordHeader); case 206 -> new FitFieldDescription(recordDefinition, recordHeader); case 207 -> new FitDeveloperData(recordDefinition, recordHeader); + case 209 -> new FitBarometerData(recordDefinition, recordHeader); case 211 -> new FitMonitoringHrData(recordDefinition, recordHeader); case 216 -> new FitTimeInZone(recordDefinition, recordHeader); case 222 -> new FitAlarmSettings(recordDefinition, recordHeader); case 225 -> new FitSet(recordDefinition, recordHeader); case 227 -> new FitStressLevel(recordDefinition, recordHeader); case 229 -> new FitMaxMetData(recordDefinition, recordHeader); + case 258 -> new FitDiveSettings(recordDefinition, recordHeader); case 259 -> new FitDiveGas(recordDefinition, recordHeader); + case 264 -> new FitExerciseTitle(recordDefinition, recordHeader); case 268 -> new FitDiveSummary(recordDefinition, recordHeader); case 269 -> new FitSpo2(recordDefinition, recordHeader); case 273 -> new FitSleepDataInfo(recordDefinition, recordHeader); case 274 -> new FitSleepDataRaw(recordDefinition, recordHeader); case 275 -> new FitSleepStage(recordDefinition, recordHeader); + case 290 -> new FitBeatIntervals(recordDefinition, recordHeader); case 297 -> new FitRespirationRate(recordDefinition, recordHeader); + case 304 -> new FitHsaStepData(recordDefinition, recordHeader); + case 305 -> new FitHsaSpo2Data(recordDefinition, recordHeader); + case 306 -> new FitHsaStressData(recordDefinition, recordHeader); + case 307 -> new FitHsaRespirationData(recordDefinition, recordHeader); + case 308 -> new FitHsaHeartRateData(recordDefinition, recordHeader); + case 312 -> new FitSplit(recordDefinition, recordHeader); + case 314 -> new FitHsaBodyBatteryData(recordDefinition, recordHeader); + case 315 -> new FitHsaEvent(recordDefinition, recordHeader); + case 319 -> new FitTankUpdate(recordDefinition, recordHeader); + case 323 -> new FitTankSummary(recordDefinition, recordHeader); + case 326 -> new FitGpsEvent(recordDefinition, recordHeader); case 336 -> new FitEcgSummary(recordDefinition, recordHeader); case 337 -> new FitEcgRawSample(recordDefinition, recordHeader); case 338 -> new FitEcgSmoothSample(recordDefinition, recordHeader); case 346 -> new FitSleepStats(recordDefinition, recordHeader); case 370 -> new FitHrvSummary(recordDefinition, recordHeader); case 371 -> new FitHrvValue(recordDefinition, recordHeader); + case 375 -> new FitDeviceAuxBatteryInfo(recordDefinition, recordHeader); case 378 -> new FitTrainingLoad(recordDefinition, recordHeader); + case 389 -> new FitHsaConfigurationData(recordDefinition, recordHeader); + case 394 -> new FitCpeStatus(recordDefinition, recordHeader); case 397 -> new FitSkinTempRaw(recordDefinition, recordHeader); case 398 -> new FitSkinTempOvernight(recordDefinition, recordHeader); + case 409 -> new FitHsaWristTemperatureData(recordDefinition, recordHeader); case 412 -> new FitNap(recordDefinition, recordHeader); default -> new RecordData(recordDefinition, recordHeader); }; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSdmProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSdmProfile.java new file mode 100644 index 0000000000..5a451bfaa4 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSdmProfile.java @@ -0,0 +1,134 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitSdmProfile extends RecordData { + public FitSdmProfile(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 5) { + throw new IllegalArgumentException("FitSdmProfile expects global messages of " + 5 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getEnabled() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getSdmAntId() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Float getSdmCalFactor() { + return (Float) getFieldByNumber(2); + } + + @Nullable + public Double getOdometer() { + return (Double) getFieldByNumber(3); + } + + @Nullable + public Integer getSpeedSource() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Integer getSdmAntIdTransType() { + return (Integer) getFieldByNumber(5); + } + + @Nullable + public Integer getOdometerRollover() { + return (Integer) getFieldByNumber(7); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(5); + } + + public Builder setEnabled(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSdmAntId(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setSdmCalFactor(final Float value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setOdometer(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setSpeedSource(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setSdmAntIdTransType(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setOdometerRollover(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitSdmProfile build() { + return (FitSdmProfile) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSegmentFile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSegmentFile.java new file mode 100644 index 0000000000..731bb9b956 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSegmentFile.java @@ -0,0 +1,144 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitSegmentFile extends RecordData { + public FitSegmentFile(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 151) { + throw new IllegalArgumentException("FitSegmentFile expects global messages of " + 151 + ", got " + globalNumber); + } + } + + @Nullable + public String getFileUuid() { + return (String) getFieldByNumber(1); + } + + @Nullable + public Integer getEnabled() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Long getUserProfilePrimaryKey() { + return (Long) getFieldByNumber(4); + } + + @Nullable + public Integer getLeaderType() { + return (Integer) getFieldByNumber(7); + } + + @Nullable + public Long getLeaderGroupPrimaryKey() { + return (Long) getFieldByNumber(8); + } + + @Nullable + public Long getLeaderActivityId() { + return (Long) getFieldByNumber(9); + } + + @Nullable + public String getLeaderActivityIdString() { + return (String) getFieldByNumber(10); + } + + @Nullable + public Integer getDefaultRaceLeader() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(151); + } + + public Builder setFileUuid(final String value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setEnabled(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setUserProfilePrimaryKey(final Long value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setLeaderType(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setLeaderGroupPrimaryKey(final Long value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setLeaderActivityId(final Long value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setLeaderActivityIdString(final String value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setDefaultRaceLeader(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitSegmentFile build() { + return (FitSegmentFile) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java new file mode 100644 index 0000000000..f0821bc4e8 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSensorSettings.java @@ -0,0 +1,114 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitSensorSettings extends RecordData { + public FitSensorSettings(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 147) { + throw new IllegalArgumentException("FitSensorSettings expects global messages of " + 147 + ", got " + globalNumber); + } + } + + @Nullable + public Long getAntId() { + return (Long) getFieldByNumber(0); + } + + @Nullable + public String getName() { + return (String) getFieldByNumber(2); + } + + @Nullable + public Integer getUseForSpeed() { + return (Integer) getFieldByNumber(45); + } + + @Nullable + public Integer getUseForDistance() { + return (Integer) getFieldByNumber(46); + } + + @Nullable + public Integer getConnectionType() { + return (Integer) getFieldByNumber(51); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(147); + } + + public Builder setAntId(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setName(final String value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setUseForSpeed(final Integer value) { + setFieldByNumber(45, value); + return this; + } + + public Builder setUseForDistance(final Integer value) { + setFieldByNumber(46, value); + return this; + } + + public Builder setConnectionType(final Integer value) { + setFieldByNumber(51, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitSensorSettings build() { + return (FitSensorSettings) super.build(); + } + } +} 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 8072ba9339..dce3349164 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 @@ -98,6 +98,21 @@ public class FitSession extends RecordData { return (Integer) getFieldByNumber(11); } + @Nullable + public Integer getTotalFatCalories() { + return (Integer) getFieldByNumber(13); + } + + @Nullable + public Float getAvgSpeed() { + return (Float) getFieldByNumber(14); + } + + @Nullable + public Float getMaxSpeed() { + return (Float) getFieldByNumber(15); + } + @Nullable public Integer getAverageHeartRate() { return (Integer) getFieldByNumber(16); @@ -153,6 +168,11 @@ public class FitSession extends RecordData { return (Integer) getFieldByNumber(26); } + @Nullable + public Integer getEventGroup() { + return (Integer) getFieldByNumber(27); + } + @Nullable public Integer getTrigger() { return (Integer) getFieldByNumber(28); @@ -213,6 +233,21 @@ public class FitSession extends RecordData { return (Double) getFieldByNumber(39); } + @Nullable + public Long getAvgStrokeCount() { + return (Long) getFieldByNumber(41); + } + + @Nullable + public Float getAvgStrokeDistance() { + return (Float) getFieldByNumber(42); + } + + @Nullable + public Integer getSwimStroke() { + return (Integer) getFieldByNumber(43); + } + @Nullable public Float getPoolLength() { return (Float) getFieldByNumber(44); @@ -223,6 +258,11 @@ public class FitSession extends RecordData { return (Integer) getFieldByNumber(45); } + @Nullable + public Integer getPoolLengthUnit() { + return (Integer) getFieldByNumber(46); + } + @Nullable public Integer getNumActiveLengths() { return (Integer) getFieldByNumber(47); @@ -233,11 +273,121 @@ public class FitSession extends RecordData { return (Long) getFieldByNumber(48); } + @Nullable + public Double getAvgAltitude() { + return (Double) getFieldByNumber(49); + } + + @Nullable + public Double getMaxAltitude() { + return (Double) getFieldByNumber(50); + } + + @Nullable + public Integer getGpsAccuracy() { + return (Integer) getFieldByNumber(51); + } + + @Nullable + public Float getAvgGrade() { + return (Float) getFieldByNumber(52); + } + + @Nullable + public Float getAvgPosGrade() { + return (Float) getFieldByNumber(53); + } + + @Nullable + public Float getAvgNegGrade() { + return (Float) getFieldByNumber(54); + } + + @Nullable + public Float getMaxPosGrade() { + return (Float) getFieldByNumber(55); + } + + @Nullable + public Float getMaxNegGrade() { + return (Float) getFieldByNumber(56); + } + + @Nullable + public Integer getAvgTemperature() { + return (Integer) getFieldByNumber(57); + } + + @Nullable + public Integer getMaxTemperature() { + return (Integer) getFieldByNumber(58); + } + + @Nullable + public Double getTotalMovingTime() { + return (Double) getFieldByNumber(59); + } + + @Nullable + public Float getAvgPosVerticalSpeed() { + return (Float) getFieldByNumber(60); + } + + @Nullable + public Float getAvgNegVerticalSpeed() { + return (Float) getFieldByNumber(61); + } + + @Nullable + public Float getMaxPosVerticalSpeed() { + return (Float) getFieldByNumber(62); + } + + @Nullable + public Float getMaxNegVerticalSpeed() { + return (Float) getFieldByNumber(63); + } + @Nullable public Integer getMinHeartRate() { return (Integer) getFieldByNumber(64); } + @Nullable + public Double getTimeInHrZone() { + return (Double) getFieldByNumber(65); + } + + @Nullable + public Double getTimeInSpeedZone() { + return (Double) getFieldByNumber(66); + } + + @Nullable + public Double getTimeInCadenceZone() { + return (Double) getFieldByNumber(67); + } + + @Nullable + public Double getTimeInPowerZone() { + return (Double) getFieldByNumber(68); + } + + @Nullable + public Double getAvgLapTime() { + return (Double) getFieldByNumber(69); + } + + @Nullable + public Integer getBestLapIndex() { + return (Integer) getFieldByNumber(70); + } + + @Nullable + public Float getMinAltitude() { + return (Float) getFieldByNumber(71); + } + @Nullable public Float getAvgSwimCadence() { return (Float) getFieldByNumber(79); @@ -248,6 +398,41 @@ public class FitSession extends RecordData { return (Integer) getFieldByNumber(80); } + @Nullable + public Integer getPlayerScore() { + return (Integer) getFieldByNumber(82); + } + + @Nullable + public Integer getOpponentScore() { + return (Integer) getFieldByNumber(83); + } + + @Nullable + public String getOpponentName() { + return (String) getFieldByNumber(84); + } + + @Nullable + public Integer getStrokeCount() { + return (Integer) getFieldByNumber(85); + } + + @Nullable + public Integer getZoneCount() { + return (Integer) getFieldByNumber(86); + } + + @Nullable + public Float getMaxBallSpeed() { + return (Float) getFieldByNumber(87); + } + + @Nullable + public Float getAvgBallSpeed() { + return (Float) getFieldByNumber(88); + } + @Nullable public Float getAvgVerticalOscillation() { return (Float) getFieldByNumber(89); @@ -273,6 +458,11 @@ public class FitSession extends RecordData { return (Float) getFieldByNumber(93); } + @Nullable + public Float getTotalFractionalCycles() { + return (Float) getFieldByNumber(94); + } + @Nullable public Float getAvgLeftTorqueEffectiveness() { return (Float) getFieldByNumber(101); @@ -293,6 +483,11 @@ public class FitSession extends RecordData { return (Float) getFieldByNumber(104); } + @Nullable + public Float getAvgCombinedPedalSmoothness() { + return (Float) getFieldByNumber(105); + } + @Nullable public Integer getFrontShifts() { return (Integer) getFieldByNumber(107); @@ -308,6 +503,11 @@ public class FitSession extends RecordData { return (String) getFieldByNumber(110); } + @Nullable + public Integer getSportIndex() { + return (Integer) getFieldByNumber(111); + } + @Nullable public Long getStandTime() { return (Long) getFieldByNumber(112); @@ -454,6 +654,71 @@ public class FitSession extends RecordData { return (Float) getFieldByNumber(137); } + @Nullable + public Double getAvgDepth() { + return (Double) getFieldByNumber(140); + } + + @Nullable + public Double getMaxDepth() { + return (Double) getFieldByNumber(141); + } + + @Nullable + public Long getSurfaceInterval() { + return (Long) getFieldByNumber(142); + } + + @Nullable + public Integer getStartCns() { + return (Integer) getFieldByNumber(143); + } + + @Nullable + public Integer getEndCns() { + return (Integer) getFieldByNumber(144); + } + + @Nullable + public Integer getStartN2() { + return (Integer) getFieldByNumber(145); + } + + @Nullable + public Integer getEndN2() { + return (Integer) getFieldByNumber(146); + } + + @Nullable + public Integer getAvgRespirationRate() { + return (Integer) getFieldByNumber(147); + } + + @Nullable + public Integer getMaxRespirationRate() { + return (Integer) getFieldByNumber(148); + } + + @Nullable + public Integer getMinRespirationRate() { + return (Integer) getFieldByNumber(149); + } + + @Nullable + public Integer getMinTemperature() { + return (Integer) getFieldByNumber(150); + } + + @Nullable + public Integer getO2Toxicity() { + return (Integer) getFieldByNumber(155); + } + + @Nullable + public Long getDiveNumber() { + return (Long) getFieldByNumber(156); + } + @Nullable public Double getTrainingLoadPeak() { return (Double) getFieldByNumber(168); @@ -479,11 +744,46 @@ public class FitSession extends RecordData { return (Float) getFieldByNumber(180); } + @Nullable + public Float getTotalGrit() { + return (Float) getFieldByNumber(181); + } + + @Nullable + public Float getTotalFlow() { + return (Float) getFieldByNumber(182); + } + + @Nullable + public Integer getJumpCount() { + return (Integer) getFieldByNumber(183); + } + + @Nullable + public Float getAvgGrit() { + return (Float) getFieldByNumber(186); + } + + @Nullable + public Float getAvgFlow() { + return (Float) getFieldByNumber(187); + } + @Nullable public Integer getPrimaryBenefit() { return (Integer) getFieldByNumber(188); } + @Nullable + public Integer getWorkoutFeel() { + return (Integer) getFieldByNumber(192); + } + + @Nullable + public Integer getWorkoutRpe() { + return (Integer) getFieldByNumber(193); + } + @Nullable public Integer getAvgSpo2() { return (Integer) getFieldByNumber(194); @@ -509,6 +809,16 @@ public class FitSession extends RecordData { return (Integer) getFieldByNumber(198); } + @Nullable + public Float getTotalFractionalAscent() { + return (Float) getFieldByNumber(199); + } + + @Nullable + public Float getTotalFractionalDescent() { + return (Float) getFieldByNumber(200); + } + @Nullable public Integer getBeginningPotential() { return (Integer) getFieldByNumber(205); @@ -524,6 +834,21 @@ public class FitSession extends RecordData { return (Integer) getFieldByNumber(207); } + @Nullable + public Float getAvgCoreTemperature() { + return (Float) getFieldByNumber(208); + } + + @Nullable + public Float getMinCoreTemperature() { + return (Float) getFieldByNumber(209); + } + + @Nullable + public Float getMaxCoreTemperature() { + return (Float) getFieldByNumber(210); + } + @Nullable public Float getStepSpeedLoss() { return (Float) getFieldByNumber(222); @@ -539,6 +864,11 @@ public class FitSession extends RecordData { return (Long) getFieldByNumber(253); } + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + /** * @noinspection unused */ @@ -607,6 +937,21 @@ public class FitSession extends RecordData { return this; } + public Builder setTotalFatCalories(final Integer value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setAvgSpeed(final Float value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setMaxSpeed(final Float value) { + setFieldByNumber(15, value); + return this; + } + public Builder setAverageHeartRate(final Integer value) { setFieldByNumber(16, value); return this; @@ -662,6 +1007,11 @@ public class FitSession extends RecordData { return this; } + public Builder setEventGroup(final Integer value) { + setFieldByNumber(27, value); + return this; + } + public Builder setTrigger(final Integer value) { setFieldByNumber(28, value); return this; @@ -722,6 +1072,21 @@ public class FitSession extends RecordData { return this; } + public Builder setAvgStrokeCount(final Long value) { + setFieldByNumber(41, value); + return this; + } + + public Builder setAvgStrokeDistance(final Float value) { + setFieldByNumber(42, value); + return this; + } + + public Builder setSwimStroke(final Integer value) { + setFieldByNumber(43, value); + return this; + } + public Builder setPoolLength(final Float value) { setFieldByNumber(44, value); return this; @@ -732,6 +1097,11 @@ public class FitSession extends RecordData { return this; } + public Builder setPoolLengthUnit(final Integer value) { + setFieldByNumber(46, value); + return this; + } + public Builder setNumActiveLengths(final Integer value) { setFieldByNumber(47, value); return this; @@ -742,11 +1112,121 @@ public class FitSession extends RecordData { return this; } + public Builder setAvgAltitude(final Double value) { + setFieldByNumber(49, value); + return this; + } + + public Builder setMaxAltitude(final Double value) { + setFieldByNumber(50, value); + return this; + } + + public Builder setGpsAccuracy(final Integer value) { + setFieldByNumber(51, value); + return this; + } + + public Builder setAvgGrade(final Float value) { + setFieldByNumber(52, value); + return this; + } + + public Builder setAvgPosGrade(final Float value) { + setFieldByNumber(53, value); + return this; + } + + public Builder setAvgNegGrade(final Float value) { + setFieldByNumber(54, value); + return this; + } + + public Builder setMaxPosGrade(final Float value) { + setFieldByNumber(55, value); + return this; + } + + public Builder setMaxNegGrade(final Float value) { + setFieldByNumber(56, value); + return this; + } + + public Builder setAvgTemperature(final Integer value) { + setFieldByNumber(57, value); + return this; + } + + public Builder setMaxTemperature(final Integer value) { + setFieldByNumber(58, value); + return this; + } + + public Builder setTotalMovingTime(final Double value) { + setFieldByNumber(59, value); + return this; + } + + public Builder setAvgPosVerticalSpeed(final Float value) { + setFieldByNumber(60, value); + return this; + } + + public Builder setAvgNegVerticalSpeed(final Float value) { + setFieldByNumber(61, value); + return this; + } + + public Builder setMaxPosVerticalSpeed(final Float value) { + setFieldByNumber(62, value); + return this; + } + + public Builder setMaxNegVerticalSpeed(final Float value) { + setFieldByNumber(63, value); + return this; + } + public Builder setMinHeartRate(final Integer value) { setFieldByNumber(64, value); return this; } + public Builder setTimeInHrZone(final Double value) { + setFieldByNumber(65, value); + return this; + } + + public Builder setTimeInSpeedZone(final Double value) { + setFieldByNumber(66, value); + return this; + } + + public Builder setTimeInCadenceZone(final Double value) { + setFieldByNumber(67, value); + return this; + } + + public Builder setTimeInPowerZone(final Double value) { + setFieldByNumber(68, value); + return this; + } + + public Builder setAvgLapTime(final Double value) { + setFieldByNumber(69, value); + return this; + } + + public Builder setBestLapIndex(final Integer value) { + setFieldByNumber(70, value); + return this; + } + + public Builder setMinAltitude(final Float value) { + setFieldByNumber(71, value); + return this; + } + public Builder setAvgSwimCadence(final Float value) { setFieldByNumber(79, value); return this; @@ -757,6 +1237,41 @@ public class FitSession extends RecordData { return this; } + public Builder setPlayerScore(final Integer value) { + setFieldByNumber(82, value); + return this; + } + + public Builder setOpponentScore(final Integer value) { + setFieldByNumber(83, value); + return this; + } + + public Builder setOpponentName(final String value) { + setFieldByNumber(84, value); + return this; + } + + public Builder setStrokeCount(final Integer value) { + setFieldByNumber(85, value); + return this; + } + + public Builder setZoneCount(final Integer value) { + setFieldByNumber(86, value); + return this; + } + + public Builder setMaxBallSpeed(final Float value) { + setFieldByNumber(87, value); + return this; + } + + public Builder setAvgBallSpeed(final Float value) { + setFieldByNumber(88, value); + return this; + } + public Builder setAvgVerticalOscillation(final Float value) { setFieldByNumber(89, value); return this; @@ -782,6 +1297,11 @@ public class FitSession extends RecordData { return this; } + public Builder setTotalFractionalCycles(final Float value) { + setFieldByNumber(94, value); + return this; + } + public Builder setAvgLeftTorqueEffectiveness(final Float value) { setFieldByNumber(101, value); return this; @@ -802,6 +1322,11 @@ public class FitSession extends RecordData { return this; } + public Builder setAvgCombinedPedalSmoothness(final Float value) { + setFieldByNumber(105, value); + return this; + } + public Builder setFrontShifts(final Integer value) { setFieldByNumber(107, value); return this; @@ -817,6 +1342,11 @@ public class FitSession extends RecordData { return this; } + public Builder setSportIndex(final Integer value) { + setFieldByNumber(111, value); + return this; + } + public Builder setStandTime(final Long value) { setFieldByNumber(112, value); return this; @@ -907,6 +1437,71 @@ public class FitSession extends RecordData { return this; } + public Builder setAvgDepth(final Double value) { + setFieldByNumber(140, value); + return this; + } + + public Builder setMaxDepth(final Double value) { + setFieldByNumber(141, value); + return this; + } + + public Builder setSurfaceInterval(final Long value) { + setFieldByNumber(142, value); + return this; + } + + public Builder setStartCns(final Integer value) { + setFieldByNumber(143, value); + return this; + } + + public Builder setEndCns(final Integer value) { + setFieldByNumber(144, value); + return this; + } + + public Builder setStartN2(final Integer value) { + setFieldByNumber(145, value); + return this; + } + + public Builder setEndN2(final Integer value) { + setFieldByNumber(146, value); + return this; + } + + public Builder setAvgRespirationRate(final Integer value) { + setFieldByNumber(147, value); + return this; + } + + public Builder setMaxRespirationRate(final Integer value) { + setFieldByNumber(148, value); + return this; + } + + public Builder setMinRespirationRate(final Integer value) { + setFieldByNumber(149, value); + return this; + } + + public Builder setMinTemperature(final Integer value) { + setFieldByNumber(150, value); + return this; + } + + public Builder setO2Toxicity(final Integer value) { + setFieldByNumber(155, value); + return this; + } + + public Builder setDiveNumber(final Long value) { + setFieldByNumber(156, value); + return this; + } + public Builder setTrainingLoadPeak(final Double value) { setFieldByNumber(168, value); return this; @@ -932,11 +1527,46 @@ public class FitSession extends RecordData { return this; } + public Builder setTotalGrit(final Float value) { + setFieldByNumber(181, value); + return this; + } + + public Builder setTotalFlow(final Float value) { + setFieldByNumber(182, value); + return this; + } + + public Builder setJumpCount(final Integer value) { + setFieldByNumber(183, value); + return this; + } + + public Builder setAvgGrit(final Float value) { + setFieldByNumber(186, value); + return this; + } + + public Builder setAvgFlow(final Float value) { + setFieldByNumber(187, value); + return this; + } + public Builder setPrimaryBenefit(final Integer value) { setFieldByNumber(188, value); return this; } + public Builder setWorkoutFeel(final Integer value) { + setFieldByNumber(192, value); + return this; + } + + public Builder setWorkoutRpe(final Integer value) { + setFieldByNumber(193, value); + return this; + } + public Builder setAvgSpo2(final Integer value) { setFieldByNumber(194, value); return this; @@ -962,6 +1592,16 @@ public class FitSession extends RecordData { return this; } + public Builder setTotalFractionalAscent(final Float value) { + setFieldByNumber(199, value); + return this; + } + + public Builder setTotalFractionalDescent(final Float value) { + setFieldByNumber(200, value); + return this; + } + public Builder setBeginningPotential(final Integer value) { setFieldByNumber(205, value); return this; @@ -977,6 +1617,21 @@ public class FitSession extends RecordData { return this; } + public Builder setAvgCoreTemperature(final Float value) { + setFieldByNumber(208, value); + return this; + } + + public Builder setMinCoreTemperature(final Float value) { + setFieldByNumber(209, value); + return this; + } + + public Builder setMaxCoreTemperature(final Float value) { + setFieldByNumber(210, value); + return this; + } + public Builder setStepSpeedLoss(final Float value) { setFieldByNumber(222, value); return this; @@ -992,6 +1647,11 @@ public class FitSession extends RecordData { return this; } + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + @Override public FitSession build() { return (FitSession) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSkinTempOvernight.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSkinTempOvernight.java index aafcf48bbe..e7c72a5149 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSkinTempOvernight.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSkinTempOvernight.java @@ -58,6 +58,11 @@ public class FitSkinTempOvernight extends RecordData { return (Integer) getFieldByNumber(3); } + @Nullable + public Float getNightlyValue() { + return (Float) getFieldByNumber(4); + } + @Nullable public Long getTimestamp() { return (Long) getFieldByNumber(253); @@ -91,6 +96,11 @@ public class FitSkinTempOvernight extends RecordData { return this; } + public Builder setNightlyValue(final Float value) { + setFieldByNumber(4, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSlaveDevice.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSlaveDevice.java new file mode 100644 index 0000000000..6940815c32 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSlaveDevice.java @@ -0,0 +1,74 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitSlaveDevice extends RecordData { + public FitSlaveDevice(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 106) { + throw new IllegalArgumentException("FitSlaveDevice expects global messages of " + 106 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getManufacturer() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getProduct() { + return (Integer) getFieldByNumber(1); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(106); + } + + public Builder setManufacturer(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setProduct(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + @Override + public FitSlaveDevice build() { + return (FitSlaveDevice) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSoftware.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSoftware.java new file mode 100644 index 0000000000..5360295124 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSoftware.java @@ -0,0 +1,84 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitSoftware extends RecordData { + public FitSoftware(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 35) { + throw new IllegalArgumentException("FitSoftware expects global messages of " + 35 + ", got " + globalNumber); + } + } + + @Nullable + public Float getVersion() { + return (Float) getFieldByNumber(3); + } + + @Nullable + public String getPartNumber() { + return (String) getFieldByNumber(5); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(35); + } + + public Builder setVersion(final Float value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setPartNumber(final String value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitSoftware build() { + return (FitSoftware) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpeedZone.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpeedZone.java new file mode 100644 index 0000000000..20c73d7934 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSpeedZone.java @@ -0,0 +1,84 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitSpeedZone extends RecordData { + public FitSpeedZone(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 53) { + throw new IllegalArgumentException("FitSpeedZone expects global messages of " + 53 + ", got " + globalNumber); + } + } + + @Nullable + public Float getHighValue() { + return (Float) getFieldByNumber(0); + } + + @Nullable + public String getName() { + return (String) getFieldByNumber(1); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(53); + } + + public Builder setHighValue(final Float value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setName(final String value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitSpeedZone build() { + return (FitSpeedZone) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java new file mode 100644 index 0000000000..e08c740f03 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitSplit.java @@ -0,0 +1,244 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitSplit extends RecordData { + public FitSplit(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 312) { + throw new IllegalArgumentException("FitSplit expects global messages of " + 312 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getSplitType() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Double getTotalElapsedTime() { + return (Double) getFieldByNumber(1); + } + + @Nullable + public Double getTotalTimerTime() { + return (Double) getFieldByNumber(2); + } + + @Nullable + public Double getTotalDistance() { + return (Double) getFieldByNumber(3); + } + + @Nullable + public Double getAvgSpeed() { + return (Double) getFieldByNumber(4); + } + + @Nullable + public Long getStartTime() { + return (Long) getFieldByNumber(9); + } + + @Nullable + public Integer getTotalAscent() { + return (Integer) getFieldByNumber(13); + } + + @Nullable + public Integer getTotalDescent() { + return (Integer) getFieldByNumber(14); + } + + @Nullable + public Long getStartPositionLat() { + return (Long) getFieldByNumber(21); + } + + @Nullable + public Long getStartPositionLong() { + return (Long) getFieldByNumber(22); + } + + @Nullable + public Long getEndPositionLat() { + return (Long) getFieldByNumber(23); + } + + @Nullable + public Long getEndPositionLong() { + return (Long) getFieldByNumber(24); + } + + @Nullable + public Double getMaxSpeed() { + return (Double) getFieldByNumber(25); + } + + @Nullable + public Double getAvgVertSpeed() { + return (Double) getFieldByNumber(26); + } + + @Nullable + public Long getEndTime() { + return (Long) getFieldByNumber(27); + } + + @Nullable + public Long getTotalCalories() { + return (Long) getFieldByNumber(28); + } + + @Nullable + public Double getStartElevation() { + return (Double) getFieldByNumber(74); + } + + @Nullable + public Double getTotalMovingTime() { + return (Double) getFieldByNumber(101); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(312); + } + + public Builder setSplitType(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setTotalElapsedTime(final Double value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTotalTimerTime(final Double value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTotalDistance(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setAvgSpeed(final Double value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setStartTime(final Long value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setTotalAscent(final Integer value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setTotalDescent(final Integer value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setStartPositionLat(final Long value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setStartPositionLong(final Long value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setEndPositionLat(final Long value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setEndPositionLong(final Long value) { + setFieldByNumber(24, value); + return this; + } + + public Builder setMaxSpeed(final Double value) { + setFieldByNumber(25, value); + return this; + } + + public Builder setAvgVertSpeed(final Double value) { + setFieldByNumber(26, value); + return this; + } + + public Builder setEndTime(final Long value) { + setFieldByNumber(27, value); + return this; + } + + public Builder setTotalCalories(final Long value) { + setFieldByNumber(28, value); + return this; + } + + public Builder setStartElevation(final Double value) { + setFieldByNumber(74, value); + return this; + } + + public Builder setTotalMovingTime(final Double value) { + setFieldByNumber(101, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitSplit build() { + return (FitSplit) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankSummary.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankSummary.java new file mode 100644 index 0000000000..03029cfd75 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankSummary.java @@ -0,0 +1,104 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitTankSummary extends RecordData { + public FitTankSummary(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 323) { + throw new IllegalArgumentException("FitTankSummary expects global messages of " + 323 + ", got " + globalNumber); + } + } + + @Nullable + public Long getSensor() { + return (Long) getFieldByNumber(0); + } + + @Nullable + public Float getStartPressure() { + return (Float) getFieldByNumber(1); + } + + @Nullable + public Float getEndPressure() { + return (Float) getFieldByNumber(2); + } + + @Nullable + public Double getVolumeUsed() { + return (Double) getFieldByNumber(3); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(323); + } + + public Builder setSensor(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setStartPressure(final Float value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setEndPressure(final Float value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setVolumeUsed(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitTankSummary build() { + return (FitTankSummary) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankUpdate.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankUpdate.java new file mode 100644 index 0000000000..42a1c4a58e --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTankUpdate.java @@ -0,0 +1,84 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitTankUpdate extends RecordData { + public FitTankUpdate(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 319) { + throw new IllegalArgumentException("FitTankUpdate expects global messages of " + 319 + ", got " + globalNumber); + } + } + + @Nullable + public Long getSensor() { + return (Long) getFieldByNumber(0); + } + + @Nullable + public Float getPressure() { + return (Float) getFieldByNumber(1); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(319); + } + + public Builder setSensor(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setPressure(final Float value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitTankUpdate build() { + return (FitTankUpdate) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java index 00d8030b3a..3767fd6bd6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimeInZone.java @@ -60,6 +60,21 @@ public class FitTimeInZone extends RecordData { return ret; } + @Nullable + public Double getTimeInSpeedZone() { + return (Double) getFieldByNumber(3); + } + + @Nullable + public Double getTimeInCadenceZone() { + return (Double) getFieldByNumber(4); + } + + @Nullable + public Double getTimeInPowerZone() { + return (Double) getFieldByNumber(5); + } + @Nullable public Integer[] getHrZoneHighBoundary() { final Object[] objectsArray = (Object[]) getFieldByNumber(6); @@ -72,6 +87,21 @@ public class FitTimeInZone extends RecordData { return ret; } + @Nullable + public Float getSpeedZoneHighBoundary() { + return (Float) getFieldByNumber(7); + } + + @Nullable + public Integer getCadenceZoneHighBoundary() { + return (Integer) getFieldByNumber(8); + } + + @Nullable + public Integer getPowerZoneHighBoundary() { + return (Integer) getFieldByNumber(9); + } + @Nullable public Integer getHrCalcType() { return (Integer) getFieldByNumber(10); @@ -92,6 +122,16 @@ public class FitTimeInZone extends RecordData { return (Integer) getFieldByNumber(13); } + @Nullable + public Integer getPwrCalcType() { + return (Integer) getFieldByNumber(14); + } + + @Nullable + public Integer getFunctionalThresholdPower() { + return (Integer) getFieldByNumber(15); + } + @Nullable public Long getTimestamp() { return (Long) getFieldByNumber(253); @@ -120,11 +160,41 @@ public class FitTimeInZone extends RecordData { return this; } + public Builder setTimeInSpeedZone(final Double value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimeInCadenceZone(final Double value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setTimeInPowerZone(final Double value) { + setFieldByNumber(5, value); + return this; + } + public Builder setHrZoneHighBoundary(final Integer[] value) { setFieldByNumber(6, (Object[]) value); return this; } + public Builder setSpeedZoneHighBoundary(final Float value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setCadenceZoneHighBoundary(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setPowerZoneHighBoundary(final Integer value) { + setFieldByNumber(9, value); + return this; + } + public Builder setHrCalcType(final Integer value) { setFieldByNumber(10, value); return this; @@ -145,6 +215,16 @@ public class FitTimeInZone extends RecordData { return this; } + public Builder setPwrCalcType(final Integer value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setFunctionalThresholdPower(final Integer value) { + setFieldByNumber(15, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimestampCorrelation.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimestampCorrelation.java index 056db4c980..2bbd6d58e7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimestampCorrelation.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTimestampCorrelation.java @@ -38,11 +38,36 @@ public class FitTimestampCorrelation extends RecordData { } } + @Nullable + public Float getFractionalTimestamp() { + return (Float) getFieldByNumber(0); + } + + @Nullable + public Long getSystemTimestamp() { + return (Long) getFieldByNumber(1); + } + + @Nullable + public Float getFractionalSystemTimestamp() { + return (Float) getFieldByNumber(2); + } + @Nullable public Long getLocalTimestamp() { return (Long) getFieldByNumber(3); } + @Nullable + public Integer getTimestampMs() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Integer getSystemTimestampMs() { + return (Integer) getFieldByNumber(5); + } + @Nullable public Long getTimestamp() { return (Long) getFieldByNumber(253); @@ -56,11 +81,36 @@ public class FitTimestampCorrelation extends RecordData { super(162); } + public Builder setFractionalTimestamp(final Float value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSystemTimestamp(final Long value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setFractionalSystemTimestamp(final Float value) { + setFieldByNumber(2, value); + return this; + } + public Builder setLocalTimestamp(final Long value) { setFieldByNumber(3, value); return this; } + public Builder setTimestampMs(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setSystemTimestampMs(final Integer value) { + setFieldByNumber(5, value); + return this; + } + public Builder setTimestamp(final Long value) { setFieldByNumber(253, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTotals.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTotals.java new file mode 100644 index 0000000000..463094bc8e --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTotals.java @@ -0,0 +1,154 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitTotals extends RecordData { + public FitTotals(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 33) { + throw new IllegalArgumentException("FitTotals expects global messages of " + 33 + ", got " + globalNumber); + } + } + + @Nullable + public Long getTimerTime() { + return (Long) getFieldByNumber(0); + } + + @Nullable + public Long getDistance() { + return (Long) getFieldByNumber(1); + } + + @Nullable + public Long getCalories() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Integer getSport() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Long getElapsedTime() { + return (Long) getFieldByNumber(4); + } + + @Nullable + public Integer getSessions() { + return (Integer) getFieldByNumber(5); + } + + @Nullable + public Long getActiveTime() { + return (Long) getFieldByNumber(6); + } + + @Nullable + public Integer getSportIndex() { + return (Integer) getFieldByNumber(9); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(33); + } + + public Builder setTimerTime(final Long value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDistance(final Long value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setCalories(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setSport(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setElapsedTime(final Long value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setSessions(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setActiveTime(final Long value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setSportIndex(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitTotals build() { + return (FitTotals) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingFile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingFile.java new file mode 100644 index 0000000000..460a6e722c --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingFile.java @@ -0,0 +1,114 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitTrainingFile extends RecordData { + public FitTrainingFile(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 72) { + throw new IllegalArgumentException("FitTrainingFile expects global messages of " + 72 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getType() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getManufacturer() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getProduct() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Long getSerialNumber() { + return (Long) getFieldByNumber(3); + } + + @Nullable + public Long getTimeCreated() { + return (Long) getFieldByNumber(4); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(72); + } + + public Builder setType(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setManufacturer(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setProduct(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setSerialNumber(final Long value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTimeCreated(final Long value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitTrainingFile build() { + return (FitTrainingFile) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java new file mode 100644 index 0000000000..30c02140f6 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitTrainingSettings.java @@ -0,0 +1,94 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitTrainingSettings extends RecordData { + public FitTrainingSettings(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 13) { + throw new IllegalArgumentException("FitTrainingSettings expects global messages of " + 13 + ", got " + globalNumber); + } + } + + @Nullable + public Double getTargetDistance() { + return (Double) getFieldByNumber(31); + } + + @Nullable + public Float getTargetSpeed() { + return (Float) getFieldByNumber(32); + } + + @Nullable + public Long getTargetTime() { + return (Long) getFieldByNumber(33); + } + + @Nullable + public Double getPreciseTargetSpeed() { + return (Double) getFieldByNumber(153); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(13); + } + + public Builder setTargetDistance(final Double value) { + setFieldByNumber(31, value); + return this; + } + + public Builder setTargetSpeed(final Float value) { + setFieldByNumber(32, value); + return this; + } + + public Builder setTargetTime(final Long value) { + setFieldByNumber(33, value); + return this; + } + + public Builder setPreciseTargetSpeed(final Double value) { + setFieldByNumber(153, value); + return this; + } + + @Override + public FitTrainingSettings build() { + return (FitTrainingSettings) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java new file mode 100644 index 0000000000..8c84326c81 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserMetrics.java @@ -0,0 +1,184 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitUserMetrics extends RecordData { + public FitUserMetrics(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 79) { + throw new IllegalArgumentException("FitUserMetrics expects global messages of " + 79 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getVo2Max() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getAge() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Float getHeight() { + return (Float) getFieldByNumber(2); + } + + @Nullable + public Float getWeight() { + return (Float) getFieldByNumber(3); + } + + @Nullable + public Integer getGender() { + return (Integer) getFieldByNumber(4); + } + + @Nullable + public Integer getMaxHr() { + return (Integer) getFieldByNumber(6); + } + + @Nullable + public Integer getRemainingRecoveryTime() { + return (Integer) getFieldByNumber(8); + } + + @Nullable + public Integer getInitialBodyBattery() { + return (Integer) getFieldByNumber(15); + } + + @Nullable + public Long getStartOfActivity() { + return (Long) getFieldByNumber(16); + } + + @Nullable + public Integer getBeginningPotential() { + return (Integer) getFieldByNumber(32); + } + + @Nullable + public Long getEndOfPreviousActivity() { + return (Long) getFieldByNumber(35); + } + + @Nullable + public Long getWakeUpTime() { + return (Long) getFieldByNumber(39); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(79); + } + + public Builder setVo2Max(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setAge(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setHeight(final Float value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setWeight(final Float value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setGender(final Integer value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setMaxHr(final Integer value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setRemainingRecoveryTime(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setInitialBodyBattery(final Integer value) { + setFieldByNumber(15, value); + return this; + } + + public Builder setStartOfActivity(final Long value) { + setFieldByNumber(16, value); + return this; + } + + public Builder setBeginningPotential(final Integer value) { + setFieldByNumber(32, value); + return this; + } + + public Builder setEndOfPreviousActivity(final Long value) { + setFieldByNumber(35, value); + return this; + } + + public Builder setWakeUpTime(final Long value) { + setFieldByNumber(39, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitUserMetrics build() { + return (FitUserMetrics) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java index 630b600dc5..488c95ad7d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitUserProfile.java @@ -85,6 +85,11 @@ public class FitUserProfile extends RecordData { return (Integer) getFieldByNumber(8); } + @Nullable + public Integer getDefaultMaxRunningHeartRate() { + return (Integer) getFieldByNumber(9); + } + @Nullable public Integer getDefaultMaxBikingHeartRate() { return (Integer) getFieldByNumber(10); @@ -130,6 +135,21 @@ public class FitUserProfile extends RecordData { return (Type) getFieldByNumber(21); } + @Nullable + public Integer getLocalId() { + return (Integer) getFieldByNumber(22); + } + + @Nullable + public Integer getGlobalId() { + return (Integer) getFieldByNumber(23); + } + + @Nullable + public Integer getYearOfBirth() { + return (Integer) getFieldByNumber(24); + } + @Nullable public Long getWakeTime() { return (Long) getFieldByNumber(28); @@ -155,6 +175,21 @@ public class FitUserProfile extends RecordData { return (Integer) getFieldByNumber(32); } + @Nullable + public Type getDepthSetting() { + return (Type) getFieldByNumber(47); + } + + @Nullable + public Long getDiveCount() { + return (Long) getFieldByNumber(49); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + /** * @noinspection unused */ @@ -208,6 +243,11 @@ public class FitUserProfile extends RecordData { return this; } + public Builder setDefaultMaxRunningHeartRate(final Integer value) { + setFieldByNumber(9, value); + return this; + } + public Builder setDefaultMaxBikingHeartRate(final Integer value) { setFieldByNumber(10, value); return this; @@ -253,6 +293,21 @@ public class FitUserProfile extends RecordData { return this; } + public Builder setLocalId(final Integer value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setGlobalId(final Integer value) { + setFieldByNumber(23, value); + return this; + } + + public Builder setYearOfBirth(final Integer value) { + setFieldByNumber(24, value); + return this; + } + public Builder setWakeTime(final Long value) { setFieldByNumber(28, value); return this; @@ -278,6 +333,21 @@ public class FitUserProfile extends RecordData { return this; } + public Builder setDepthSetting(final Type value) { + setFieldByNumber(47, value); + return this; + } + + public Builder setDiveCount(final Long value) { + setFieldByNumber(49, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + @Override public FitUserProfile build() { return (FitUserProfile) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java index fdec3a9fa4..7cb824fd31 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWatchfaceSettings.java @@ -48,6 +48,11 @@ public class FitWatchfaceSettings extends RecordData { return (Integer) getFieldByNumber(1); } + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + /** * @noinspection unused */ @@ -66,6 +71,11 @@ public class FitWatchfaceSettings extends RecordData { return this; } + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + @Override public FitWatchfaceSettings build() { return (FitWatchfaceSettings) super.build(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeightScale.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeightScale.java new file mode 100644 index 0000000000..c9ac9e988a --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWeightScale.java @@ -0,0 +1,194 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitWeightScale extends RecordData { + public FitWeightScale(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 30) { + throw new IllegalArgumentException("FitWeightScale expects global messages of " + 30 + ", got " + globalNumber); + } + } + + @Nullable + public Float getWeight() { + return (Float) getFieldByNumber(0); + } + + @Nullable + public Float getPercentFat() { + return (Float) getFieldByNumber(1); + } + + @Nullable + public Float getPercentHydration() { + return (Float) getFieldByNumber(2); + } + + @Nullable + public Float getVisceralFatMass() { + return (Float) getFieldByNumber(3); + } + + @Nullable + public Float getBoneMass() { + return (Float) getFieldByNumber(4); + } + + @Nullable + public Float getMuscleMass() { + return (Float) getFieldByNumber(5); + } + + @Nullable + public Float getBasalMet() { + return (Float) getFieldByNumber(7); + } + + @Nullable + public Integer getPhysiqueRating() { + return (Integer) getFieldByNumber(8); + } + + @Nullable + public Float getActiveMet() { + return (Float) getFieldByNumber(9); + } + + @Nullable + public Integer getMetabolicAge() { + return (Integer) getFieldByNumber(10); + } + + @Nullable + public Integer getVisceralFatRating() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Integer getUserProfileIndex() { + return (Integer) getFieldByNumber(12); + } + + @Nullable + public Float getBmi() { + return (Float) getFieldByNumber(13); + } + + @Nullable + public Long getTimestamp() { + return (Long) getFieldByNumber(253); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(30); + } + + public Builder setWeight(final Float value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setPercentFat(final Float value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setPercentHydration(final Float value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setVisceralFatMass(final Float value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setBoneMass(final Float value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setMuscleMass(final Float value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setBasalMet(final Float value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setPhysiqueRating(final Integer value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setActiveMet(final Float value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setMetabolicAge(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setVisceralFatRating(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setUserProfileIndex(final Integer value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setBmi(final Float value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setTimestamp(final Long value) { + setFieldByNumber(253, value); + return this; + } + + @Override + public FitWeightScale build() { + return (FitWeightScale) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java index b295738c18..b4f421ee9d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkout.java @@ -63,6 +63,16 @@ public class FitWorkout extends RecordData { return (Integer) getFieldByNumber(11); } + @Nullable + public Float getPoolLength() { + return (Float) getFieldByNumber(14); + } + + @Nullable + public Integer getPoolLengthUnit() { + return (Integer) getFieldByNumber(15); + } + @Nullable public String getNotes() { return (String) getFieldByNumber(17); @@ -101,6 +111,16 @@ public class FitWorkout extends RecordData { return this; } + public Builder setPoolLength(final Float value) { + setFieldByNumber(14, value); + return this; + } + + public Builder setPoolLengthUnit(final Integer value) { + setFieldByNumber(15, value); + return this; + } + public Builder setNotes(final String value) { setFieldByNumber(17, value); return this; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSession.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSession.java new file mode 100644 index 0000000000..763977f018 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutSession.java @@ -0,0 +1,124 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitWorkoutSession extends RecordData { + public FitWorkoutSession(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 158) { + throw new IllegalArgumentException("FitWorkoutSession expects global messages of " + 158 + ", got " + globalNumber); + } + } + + @Nullable + public Integer getSport() { + return (Integer) getFieldByNumber(0); + } + + @Nullable + public Integer getSubSport() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Integer getNumValidSteps() { + return (Integer) getFieldByNumber(2); + } + + @Nullable + public Integer getFirstStepIndex() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Float getPoolLength() { + return (Float) getFieldByNumber(4); + } + + @Nullable + public Integer getPoolLengthUnit() { + return (Integer) getFieldByNumber(5); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(158); + } + + public Builder setSport(final Integer value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setSubSport(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setNumValidSteps(final Integer value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setFirstStepIndex(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setPoolLength(final Float value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setPoolLengthUnit(final Integer value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitWorkoutSession build() { + return (FitWorkoutSession) super.build(); + } + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java new file mode 100644 index 0000000000..ee1c0b399b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/garmin/fit/messages/FitWorkoutStep.java @@ -0,0 +1,244 @@ +/* Copyright (C) 2025 Freeyourgadget + + This file is part of Gadgetbridge. + + Gadgetbridge is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Gadgetbridge is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ +package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.messages; + +import androidx.annotation.Nullable; + +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.FitRecordDataBuilder; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordData; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordDefinition; +import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.RecordHeader; + +/** + * WARNING: This class was auto-generated, please avoid modifying it directly. + * See {@link nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.codegen.FitCodeGen} + * @noinspection unused + */ +public class FitWorkoutStep extends RecordData { + public FitWorkoutStep(final RecordDefinition recordDefinition, final RecordHeader recordHeader) { + super(recordDefinition, recordHeader); + + final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber(); + if (globalNumber != 27) { + throw new IllegalArgumentException("FitWorkoutStep expects global messages of " + 27 + ", got " + globalNumber); + } + } + + @Nullable + public String getWktStepName() { + return (String) getFieldByNumber(0); + } + + @Nullable + public Integer getDurationType() { + return (Integer) getFieldByNumber(1); + } + + @Nullable + public Long getDurationValue() { + return (Long) getFieldByNumber(2); + } + + @Nullable + public Integer getTargetType() { + return (Integer) getFieldByNumber(3); + } + + @Nullable + public Long getTargetValue() { + return (Long) getFieldByNumber(4); + } + + @Nullable + public Long getCustomTargetValueLow() { + return (Long) getFieldByNumber(5); + } + + @Nullable + public Long getCustomTargetValueHigh() { + return (Long) getFieldByNumber(6); + } + + @Nullable + public Integer getIntensity() { + return (Integer) getFieldByNumber(7); + } + + @Nullable + public String getNotes() { + return (String) getFieldByNumber(8); + } + + @Nullable + public Integer getEquipment() { + return (Integer) getFieldByNumber(9); + } + + @Nullable + public Integer getExerciseCategory() { + return (Integer) getFieldByNumber(10); + } + + @Nullable + public Integer getExerciseName() { + return (Integer) getFieldByNumber(11); + } + + @Nullable + public Float getExerciseWeight() { + return (Float) getFieldByNumber(12); + } + + @Nullable + public Integer getWeightDisplayUnit() { + return (Integer) getFieldByNumber(13); + } + + @Nullable + public Integer getSecondaryTargetType() { + return (Integer) getFieldByNumber(19); + } + + @Nullable + public Long getSecondaryTargetValue() { + return (Long) getFieldByNumber(20); + } + + @Nullable + public Long getSecondaryCustomTargetValueLow() { + return (Long) getFieldByNumber(21); + } + + @Nullable + public Long getSecondaryCustomTargetValueHigh() { + return (Long) getFieldByNumber(22); + } + + @Nullable + public Integer getMessageIndex() { + return (Integer) getFieldByNumber(254); + } + + /** + * @noinspection unused + */ + public static class Builder extends FitRecordDataBuilder { + public Builder() { + super(27); + } + + public Builder setWktStepName(final String value) { + setFieldByNumber(0, value); + return this; + } + + public Builder setDurationType(final Integer value) { + setFieldByNumber(1, value); + return this; + } + + public Builder setDurationValue(final Long value) { + setFieldByNumber(2, value); + return this; + } + + public Builder setTargetType(final Integer value) { + setFieldByNumber(3, value); + return this; + } + + public Builder setTargetValue(final Long value) { + setFieldByNumber(4, value); + return this; + } + + public Builder setCustomTargetValueLow(final Long value) { + setFieldByNumber(5, value); + return this; + } + + public Builder setCustomTargetValueHigh(final Long value) { + setFieldByNumber(6, value); + return this; + } + + public Builder setIntensity(final Integer value) { + setFieldByNumber(7, value); + return this; + } + + public Builder setNotes(final String value) { + setFieldByNumber(8, value); + return this; + } + + public Builder setEquipment(final Integer value) { + setFieldByNumber(9, value); + return this; + } + + public Builder setExerciseCategory(final Integer value) { + setFieldByNumber(10, value); + return this; + } + + public Builder setExerciseName(final Integer value) { + setFieldByNumber(11, value); + return this; + } + + public Builder setExerciseWeight(final Float value) { + setFieldByNumber(12, value); + return this; + } + + public Builder setWeightDisplayUnit(final Integer value) { + setFieldByNumber(13, value); + return this; + } + + public Builder setSecondaryTargetType(final Integer value) { + setFieldByNumber(19, value); + return this; + } + + public Builder setSecondaryTargetValue(final Long value) { + setFieldByNumber(20, value); + return this; + } + + public Builder setSecondaryCustomTargetValueLow(final Long value) { + setFieldByNumber(21, value); + return this; + } + + public Builder setSecondaryCustomTargetValueHigh(final Long value) { + setFieldByNumber(22, value); + return this; + } + + public Builder setMessageIndex(final Integer value) { + setFieldByNumber(254, value); + return this; + } + + @Override + public FitWorkoutStep build() { + return (FitWorkoutStep) super.build(); + } + } +}