mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Garmin: add sleep disruption FIT fields
This commit is contained in:
committed by
José Rebelo
parent
9a9ba5b30c
commit
bacc85bcb8
+13
@@ -2064,6 +2064,17 @@ public class NativeFITMessage {
|
|||||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||||
));
|
));
|
||||||
|
|
||||||
|
public static NativeFITMessage SLEEP_DISRUPTION_SEVERITY_PERIOD = new NativeFITMessage(470, "SLEEP_DISRUPTION_SEVERITY_PERIOD", Arrays.asList(
|
||||||
|
new FieldDefinitionPrimitive(0, BaseType.ENUM, "severity"),
|
||||||
|
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP),
|
||||||
|
new FieldDefinitionPrimitive(254, BaseType.UINT16, "message_index")
|
||||||
|
));
|
||||||
|
|
||||||
|
public static NativeFITMessage SLEEP_DISRUPTION_OVERNIGHT_SEVERITY = new NativeFITMessage(471, "SLEEP_DISRUPTION_OVERNIGHT_SEVERITY", Arrays.asList(
|
||||||
|
new FieldDefinitionPrimitive(0, BaseType.ENUM, "severity"),
|
||||||
|
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||||
|
));
|
||||||
|
|
||||||
public static Map<Integer, NativeFITMessage> KNOWN_MESSAGES = new HashMap<>() {{
|
public static Map<Integer, NativeFITMessage> KNOWN_MESSAGES = new HashMap<>() {{
|
||||||
put(0, FILE_ID);
|
put(0, FILE_ID);
|
||||||
put(1, CAPABILITIES);
|
put(1, CAPABILITIES);
|
||||||
@@ -2211,6 +2222,8 @@ public class NativeFITMessage {
|
|||||||
put(403, ENDURANCE_SCORE);
|
put(403, ENDURANCE_SCORE);
|
||||||
put(409, HSA_WRIST_TEMPERATURE_DATA);
|
put(409, HSA_WRIST_TEMPERATURE_DATA);
|
||||||
put(412, NAP);
|
put(412, NAP);
|
||||||
|
put(470, SLEEP_DISRUPTION_SEVERITY_PERIOD);
|
||||||
|
put(471, SLEEP_DISRUPTION_OVERNIGHT_SEVERITY);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
private final int number;
|
private final int number;
|
||||||
|
|||||||
+2
@@ -177,6 +177,8 @@ public class FitRecordDataFactory {
|
|||||||
case 403 -> new FitEnduranceScore(recordDefinition, recordHeader);
|
case 403 -> new FitEnduranceScore(recordDefinition, recordHeader);
|
||||||
case 409 -> new FitHsaWristTemperatureData(recordDefinition, recordHeader);
|
case 409 -> new FitHsaWristTemperatureData(recordDefinition, recordHeader);
|
||||||
case 412 -> new FitNap(recordDefinition, recordHeader);
|
case 412 -> new FitNap(recordDefinition, recordHeader);
|
||||||
|
case 470 -> new FitSleepDisruptionSeverityPeriod(recordDefinition, recordHeader);
|
||||||
|
case 471 -> new FitSleepDisruptionOvernightSeverity(recordDefinition, recordHeader);
|
||||||
default -> new RecordData(recordDefinition, recordHeader);
|
default -> new RecordData(recordDefinition, recordHeader);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
+80
@@ -0,0 +1,80 @@
|
|||||||
|
/* Copyright (C) 2026 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
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 FitSleepDisruptionOvernightSeverity extends RecordData {
|
||||||
|
public FitSleepDisruptionOvernightSeverity(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||||
|
super(recordDefinition, recordHeader);
|
||||||
|
|
||||||
|
final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber();
|
||||||
|
if (nativeNumber != 471) {
|
||||||
|
throw new IllegalArgumentException("FitSleepDisruptionOvernightSeverity expects native messages of " + 471 + ", got " + nativeNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Integer getSeverity() {
|
||||||
|
return getFieldByNumber(0, Integer.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Long getTimestamp() {
|
||||||
|
return getFieldByNumber(253, Long.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @noinspection unused
|
||||||
|
*/
|
||||||
|
public static class Builder extends FitRecordDataBuilder {
|
||||||
|
public Builder() {
|
||||||
|
super(471);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setSeverity(final Integer value) {
|
||||||
|
setFieldByNumber(0, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setTimestamp(final Long value) {
|
||||||
|
setFieldByNumber(253, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FitSleepDisruptionOvernightSeverity build() {
|
||||||
|
return (FitSleepDisruptionOvernightSeverity) super.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FitSleepDisruptionOvernightSeverity build(final int localMessageType) {
|
||||||
|
return (FitSleepDisruptionOvernightSeverity) super.build(localMessageType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+90
@@ -0,0 +1,90 @@
|
|||||||
|
/* Copyright (C) 2026 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 <https://www.gnu.org/licenses/>. */
|
||||||
|
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 FitSleepDisruptionSeverityPeriod extends RecordData {
|
||||||
|
public FitSleepDisruptionSeverityPeriod(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||||
|
super(recordDefinition, recordHeader);
|
||||||
|
|
||||||
|
final int nativeNumber = recordDefinition.getNativeFITMessage().getNumber();
|
||||||
|
if (nativeNumber != 470) {
|
||||||
|
throw new IllegalArgumentException("FitSleepDisruptionSeverityPeriod expects native messages of " + 470 + ", got " + nativeNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Integer getSeverity() {
|
||||||
|
return getFieldByNumber(0, Integer.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Long getTimestamp() {
|
||||||
|
return getFieldByNumber(253, Long.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public Integer getMessageIndex() {
|
||||||
|
return getFieldByNumber(254, Integer.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @noinspection unused
|
||||||
|
*/
|
||||||
|
public static class Builder extends FitRecordDataBuilder {
|
||||||
|
public Builder() {
|
||||||
|
super(470);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setSeverity(final Integer value) {
|
||||||
|
setFieldByNumber(0, 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 FitSleepDisruptionSeverityPeriod build() {
|
||||||
|
return (FitSleepDisruptionSeverityPeriod) super.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FitSleepDisruptionSeverityPeriod build(final int localMessageType) {
|
||||||
|
return (FitSleepDisruptionSeverityPeriod) super.build(localMessageType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -12,7 +12,7 @@ FitMetZone{high_bpm=1, calories=1.0, fat_calories=1.0, message_index=1},
|
|||||||
FitSport{sport=1, sub_sport=1, name=a},
|
FitSport{sport=1, sub_sport=1, name=a},
|
||||||
FitTrainingSettings{target_distance=1.0, target_speed=1.0, target_time=1, precise_target_speed=1.0},
|
FitTrainingSettings{target_distance=1.0, target_speed=1.0, target_time=1, precise_target_speed=1.0},
|
||||||
FitGoals{sport=1, sub_sport=1, start_date=1127433599, end_date=1127433599, type=distance, value=1, repeat=1, target_value=1, recurrence=1, recurrence_value=1, enabled=1, source=community, message_index=1},
|
FitGoals{sport=1, sub_sport=1, start_date=1127433599, end_date=1127433599, type=distance, value=1, repeat=1, target_value=1, recurrence=1, recurrence_value=1, enabled=1, source=community, message_index=1},
|
||||||
FitSession{2025-09-21 23:59:59.000, event=3, event_type=1, start_time=1127433599, start_latitude=8.381903171539307E-8, start_longitude=8.381903171539307E-8, sport=1, sub_sport=1, total_elapsed_time=1000, total_timer_time=1000, total_distance=100, total_cycles=1, total_calories=1, total_fat_calories=1, avg_speed=1.0, max_speed=1.0, average_heart_rate=1, max_heart_rate=1, avg_cadence=1, max_cadence=1, avg_power=1, max_power=1, total_ascent=1, total_descent=1, total_training_effect=1.0, first_lap_index=1, num_laps=1, event_group=1, trigger=1, nec_latitude=8.381903171539307E-8, nec_longitude=8.381903171539307E-8, swc_latitude=8.381903171539307E-8, swc_longitude=8.381903171539307E-8, num_lengths=1, normalized_power=1, training_stress_score=1.0, intensity_factor=1.0, left_right_balance=1, end_latitude=8.381903171539307E-8, end_longitude=8.381903171539307E-8, avg_stroke_count=10, avg_stroke_distance=1.0, swim_stroke=1, pool_length=1.0, threshold_power=1, pool_length_unit=1, num_active_lengths=1, total_work=1, avg_altitude=1.0, max_altitude=1.0, gps_accuracy=1, avg_grade=1.0, avg_pos_grade=1.0, avg_neg_grade=1.0, max_pos_grade=1.0, max_neg_grade=1.0, avg_temperature=1, max_temperature=1, total_moving_time=1.0, avg_pos_vertical_speed=1.0, avg_neg_vertical_speed=1.0, max_pos_vertical_speed=1.0, max_neg_vertical_speed=1.0, min_heart_rate=1, time_in_hr_zone=[1.0,,4.2], time_in_speed_zone=[1.0,,4.2], time_in_cadence_zone=[1.0,,4.2], time_in_power_zone=[1.0,,4.2], avg_lap_time=1.0, best_lap_index=1, min_altitude=1.0, player_score=1, opponent_score=1, opponent_name=a, stroke_count=[1,,65534], zone_count=[1,,65534], max_ball_speed=1.0, avg_ball_speed=1.0, avg_vertical_oscillation=1.0, avg_stance_time_percent=1.0, avg_stance_time=1.0, avg_fractional_cadence=1.0, max_fractional_cadence=1.0, total_fractional_cycles=1.0, avg_total_hemoglobin_conc=[1.0,,4.2], min_total_hemoglobin_conc=[1.0,,4.2], max_total_hemoglobin_conc=[1.0,,4.2], avg_saturated_hemoglobin_percent=[1.0,,4.2], min_saturated_hemoglobin_percent=[1.0,,4.2], max_saturated_hemoglobin_percent=[1.0,,4.2], avg_left_torque_effectiveness=1.0, avg_right_torque_effectiveness=1.0, avg_left_pedal_smoothness=1.0, avg_right_pedal_smoothness=1.0, avg_combined_pedal_smoothness=1.0, sport_profile_name=a, sport_index=1, stand_time=1000, stand_count=1, avg_left_pco=1, avg_right_pco=1, avg_left_power_phase=[1,,3], avg_left_power_phase_peak=[1,,3], avg_right_power_phase=[1,,3], avg_right_power_phase_peak=[1,,3], avg_power_position=[1,,65534], max_power_position=[1,,65534], avg_cadence_position=[1,,254], max_cadence_position=[1,,254], enhanced_avg_speed=1.0, enhanced_max_speed=1.0, enhanced_avg_altitude=1.0, enhanced_min_altitude=1.0, enhanced_max_altitude=1.0, avg_lev_motor_power=1, max_lev_motor_power=1, lev_battery_consumption=1.0, avg_vertical_ratio=1.0, avg_stance_time_balance=1.0, avg_step_length=1.0, total_anaerobic_training_effect=1.0, avg_vam=1.0, avg_depth=1.0, max_depth=1.0, surface_interval=1, start_cns=1, end_cns=1, start_n2=1, end_n2=1, avg_respiration_rate=1, max_respiration_rate=1, min_respiration_rate=1, min_temperature=1, o2_toxicity=1, dive_number=1, training_load_peak=1.0, enhanced_avg_respiration_rate=1.0, enhanced_max_respiration_rate=1.0, enhanced_min_respiration_rate=1.0, total_grit=1.0, total_flow=1.0, jump_count=1, avg_grit=1.0, avg_flow=1.0, workout_feel=1, workout_rpe=1, avg_spo2=1, avg_stress=1, hrv_sdrr=1, hrv_rmssd=1, total_fractional_ascent=1.0, total_fractional_descent=1.0, avg_core_temperature=1.0, min_core_temperature=1.0, max_core_temperature=1.0, timestamp=1758499199, message_index=1},
|
FitSession{2025-09-21 23:59:59.000, event=3, event_type=1, start_time=1127433599, start_latitude=8.381903171539307E-8, start_longitude=8.381903171539307E-8, sport=1, sub_sport=1, total_elapsed_time=1000, total_timer_time=1000, total_distance=100, total_cycles=1, total_calories=1, total_fat_calories=1, avg_speed=1.0, max_speed=1.0, average_heart_rate=1, max_heart_rate=1, avg_cadence=1, max_cadence=1, avg_power=1, max_power=1, total_ascent=1, total_descent=1, total_training_effect=1.0, first_lap_index=1, num_laps=1, event_group=1, trigger=1, nec_latitude=8.381903171539307E-8, nec_longitude=8.381903171539307E-8, swc_latitude=8.381903171539307E-8, swc_longitude=8.381903171539307E-8, num_lengths=1, normalized_power=1, training_stress_score=1.0, intensity_factor=1.0, left_right_balance=1, end_latitude=8.381903171539307E-8, end_longitude=8.381903171539307E-8, avg_stroke_count=10, avg_stroke_distance=1.0, swim_stroke=1, pool_length=1.0, threshold_power=1, pool_length_unit=1, num_active_lengths=1, total_work=1, avg_altitude=1.0, max_altitude=1.0, gps_accuracy=1, avg_grade=1.0, avg_pos_grade=1.0, avg_neg_grade=1.0, max_pos_grade=1.0, max_neg_grade=1.0, avg_temperature=1, max_temperature=1, total_moving_time=1.0, avg_pos_vertical_speed=1.0, avg_neg_vertical_speed=1.0, max_pos_vertical_speed=1.0, max_neg_vertical_speed=1.0, min_heart_rate=1, time_in_hr_zone=[1.0,,4.2], time_in_speed_zone=[1.0,,4.2], time_in_cadence_zone=[1.0,,4.2], time_in_power_zone=[1.0,,4.2], avg_lap_time=1.0, best_lap_index=1, min_altitude=1.0, player_score=1, opponent_score=1, opponent_name=a, stroke_count=[1,,65534], zone_count=[1,,65534], max_ball_speed=1.0, avg_ball_speed=1.0, avg_vertical_oscillation=1.0, avg_stance_time_percent=1.0, avg_stance_time=1.0, avg_fractional_cadence=1.0, max_fractional_cadence=1.0, total_fractional_cycles=1.0, avg_total_hemoglobin_conc=[1.0,,4.2], min_total_hemoglobin_conc=[1.0,,4.2], max_total_hemoglobin_conc=[1.0,,4.2], avg_saturated_hemoglobin_percent=[1.0,,4.2], min_saturated_hemoglobin_percent=[1.0,,4.2], max_saturated_hemoglobin_percent=[1.0,,4.2], avg_left_torque_effectiveness=1.0, avg_right_torque_effectiveness=1.0, avg_left_pedal_smoothness=1.0, avg_right_pedal_smoothness=1.0, avg_combined_pedal_smoothness=1.0, sport_profile_name=a, sport_index=1, stand_time=1000, stand_count=1, avg_left_pco=1, avg_right_pco=1, avg_left_power_phase=[1,,3], avg_left_power_phase_peak=[1,,3], avg_right_power_phase=[1,,3], avg_right_power_phase_peak=[1,,3], avg_power_position=[1,,65534], max_power_position=[1,,65534], avg_cadence_position=[1,,254], max_cadence_position=[1,,254], enhanced_avg_speed=1.0, enhanced_max_speed=1.0, enhanced_avg_altitude=1.0, enhanced_min_altitude=1.0, enhanced_max_altitude=1.0, avg_lev_motor_power=1, max_lev_motor_power=1, lev_battery_consumption=1.0, avg_vertical_ratio=1.0, avg_stance_time_balance=1.0, avg_step_length=1.0, total_anaerobic_training_effect=1.0, avg_vam=1.0, avg_depth=1.0, max_depth=1.0, surface_interval=1, start_cns=1, end_cns=1, start_n2=1, end_n2=1, avg_respiration_rate=1, max_respiration_rate=1, min_respiration_rate=1, min_temperature=1, o2_toxicity=1, dive_number=1, training_load_peak=1.0, enhanced_avg_respiration_rate=1.0, enhanced_max_respiration_rate=1.0, enhanced_min_respiration_rate=1.0, total_grit=1.0, total_flow=1.0, jump_count=1, avg_grit=1.0, avg_flow=1.0, workout_feel=1, workout_rpe=1, avg_spo2=1, avg_stress=1, resting_calories=1, hrv_sdrr=1, hrv_rmssd=1, total_fractional_ascent=1.0, total_fractional_descent=1.0, avg_core_temperature=1.0, min_core_temperature=1.0, max_core_temperature=1.0, timestamp=1758499199, message_index=1},
|
||||||
FitLap{2025-09-21 23:59:59.000, event=3, event_type=1, start_time=1127433599, start_lat=8.381903171539307E-8, start_long=8.381903171539307E-8, end_lat=8.381903171539307E-8, end_long=8.381903171539307E-8, total_elapsed_time=1.0, total_timer_time=1.0, total_distance=1.0, total_cycles=1, total_calories=1, total_fat_calories=1, avg_speed=1.0, max_speed=1.0, avg_heart_rate=1, max_heart_rate=1, avg_cadence=1, max_cadence=1, avg_power=1, max_power=1, total_ascent=1, total_descent=1, intensity=1, lap_trigger=1, sport=1, event_group=1, num_lengths=1, normalized_power=1, left_right_balance=1, first_length_index=1, avg_stroke_distance=100, swim_style=BACKSTROKE, sub_sport=1, num_active_lengths=1, total_work=1, avg_altitude=1.0, max_altitude=1.0, gps_accuracy=1, avg_grade=1.0, avg_pos_grade=1.0, avg_neg_grade=1.0, max_pos_grade=1.0, max_neg_grade=1.0, avg_temperature=1, max_temperature=1, total_moving_time=1.0, avg_pos_vertical_speed=1.0, avg_neg_vertical_speed=1.0, max_pos_vertical_speed=1.0, max_neg_vertical_speed=1.0, time_in_hr_zone=[1.0,,4.2], time_in_speed_zone=[1.0,,4.2], time_in_cadence_zone=[1.0,,4.2], time_in_power_zone=[1.0,,4.2], repetition_num=1, min_altitude=1.0, min_heart_rate=1, wkt_step_index=1, opponent_score=1, stroke_count=[1,,65534], zone_count=[1,,65534], avg_vertical_oscillation=1.0, avg_stance_time_percent=1.0, avg_stance_time=1.0, avg_fractional_cadence=1.0, max_fractional_cadence=1.0, total_fractional_cycles=1.0, player_score=1, avg_total_hemoglobin_conc=[1.0,,4.2], min_total_hemoglobin_conc=[1.0,,4.2], max_total_hemoglobin_conc=[1.0,,4.2], avg_saturated_hemoglobin_percent=[1.0,,4.2], min_saturated_hemoglobin_percent=[1.0,,4.2], max_saturated_hemoglobin_percent=[1.0,,4.2], avg_left_torque_effectiveness=1.0, avg_right_torque_effectiveness=1.0, avg_left_pedal_smoothness=1.0, avg_right_pedal_smoothness=1.0, avg_combined_pedal_smoothness=1.0, time_standing=1.0, stand_count=1, avg_left_pco=1, avg_right_pco=1, avg_left_power_phase=[1,,3], avg_left_power_phase_peak=[1,,3], avg_right_power_phase=[1,,3], avg_right_power_phase_peak=[1,,3], avg_power_position=[1,,65534], max_power_position=[1,,65534], avg_cadence_position=[1,,254], max_cadence_position=[1,,254], enhanced_avg_speed=1.0, enhanced_max_speed=1.0, enhanced_avg_altitude=1.0, enhanced_min_altitude=1.0, enhanced_max_altitude=1.0, avg_lev_motor_power=1, max_lev_motor_power=1, lev_battery_consumption=1.0, avg_vertical_ratio=1.0, avg_stance_time_balance=1.0, avg_step_length=1.0, avg_vam=1.0, avg_depth=1.0, max_depth=1.0, min_temperature=1, enhanced_avg_respiration_rate=1.0, enhanced_max_respiration_rate=1.0, avg_respiration_rate=1, max_respiration_rate=1, total_grit=1.0, total_flow=1.0, jump_count=1, avg_grit=1.0, avg_flow=1.0, total_fractional_ascent=1.0, total_fractional_descent=1.0, avg_core_temperature=1.0, min_core_temperature=1.0, max_core_temperature=1.0, timestamp=1758499199, message_index=1},
|
FitLap{2025-09-21 23:59:59.000, event=3, event_type=1, start_time=1127433599, start_lat=8.381903171539307E-8, start_long=8.381903171539307E-8, end_lat=8.381903171539307E-8, end_long=8.381903171539307E-8, total_elapsed_time=1.0, total_timer_time=1.0, total_distance=1.0, total_cycles=1, total_calories=1, total_fat_calories=1, avg_speed=1.0, max_speed=1.0, avg_heart_rate=1, max_heart_rate=1, avg_cadence=1, max_cadence=1, avg_power=1, max_power=1, total_ascent=1, total_descent=1, intensity=1, lap_trigger=1, sport=1, event_group=1, num_lengths=1, normalized_power=1, left_right_balance=1, first_length_index=1, avg_stroke_distance=100, swim_style=BACKSTROKE, sub_sport=1, num_active_lengths=1, total_work=1, avg_altitude=1.0, max_altitude=1.0, gps_accuracy=1, avg_grade=1.0, avg_pos_grade=1.0, avg_neg_grade=1.0, max_pos_grade=1.0, max_neg_grade=1.0, avg_temperature=1, max_temperature=1, total_moving_time=1.0, avg_pos_vertical_speed=1.0, avg_neg_vertical_speed=1.0, max_pos_vertical_speed=1.0, max_neg_vertical_speed=1.0, time_in_hr_zone=[1.0,,4.2], time_in_speed_zone=[1.0,,4.2], time_in_cadence_zone=[1.0,,4.2], time_in_power_zone=[1.0,,4.2], repetition_num=1, min_altitude=1.0, min_heart_rate=1, wkt_step_index=1, opponent_score=1, stroke_count=[1,,65534], zone_count=[1,,65534], avg_vertical_oscillation=1.0, avg_stance_time_percent=1.0, avg_stance_time=1.0, avg_fractional_cadence=1.0, max_fractional_cadence=1.0, total_fractional_cycles=1.0, player_score=1, avg_total_hemoglobin_conc=[1.0,,4.2], min_total_hemoglobin_conc=[1.0,,4.2], max_total_hemoglobin_conc=[1.0,,4.2], avg_saturated_hemoglobin_percent=[1.0,,4.2], min_saturated_hemoglobin_percent=[1.0,,4.2], max_saturated_hemoglobin_percent=[1.0,,4.2], avg_left_torque_effectiveness=1.0, avg_right_torque_effectiveness=1.0, avg_left_pedal_smoothness=1.0, avg_right_pedal_smoothness=1.0, avg_combined_pedal_smoothness=1.0, time_standing=1.0, stand_count=1, avg_left_pco=1, avg_right_pco=1, avg_left_power_phase=[1,,3], avg_left_power_phase_peak=[1,,3], avg_right_power_phase=[1,,3], avg_right_power_phase_peak=[1,,3], avg_power_position=[1,,65534], max_power_position=[1,,65534], avg_cadence_position=[1,,254], max_cadence_position=[1,,254], enhanced_avg_speed=1.0, enhanced_max_speed=1.0, enhanced_avg_altitude=1.0, enhanced_min_altitude=1.0, enhanced_max_altitude=1.0, avg_lev_motor_power=1, max_lev_motor_power=1, lev_battery_consumption=1.0, avg_vertical_ratio=1.0, avg_stance_time_balance=1.0, avg_step_length=1.0, avg_vam=1.0, avg_depth=1.0, max_depth=1.0, min_temperature=1, enhanced_avg_respiration_rate=1.0, enhanced_max_respiration_rate=1.0, avg_respiration_rate=1, max_respiration_rate=1, total_grit=1.0, total_flow=1.0, jump_count=1, avg_grit=1.0, avg_flow=1.0, total_fractional_ascent=1.0, total_fractional_descent=1.0, avg_core_temperature=1.0, min_core_temperature=1.0, max_core_temperature=1.0, timestamp=1758499199, message_index=1},
|
||||||
FitRecord{2025-09-21 23:59:59.000, latitude=8.381903171539307E-8, longitude=8.381903171539307E-8, altitude=1.0, heart_rate=1, cadence=1, distance=1.0, speed=1.0, power=1, compressed_speed_distance=[1,,254], grade=1.0, resistance=1, time_from_course=1.0, cycle_length=1.0, temperature=1, speed_1s=[1.0,,4.1875], cycles=1, total_cycles=1, compressed_accumulated_power=1, accumulated_power=1, left_right_balance=1, gps_accuracy=1, vertical_speed=1.0, calories=1, oscillation=1.0, stance_time_percent=1.0, stance_time=1.0, activity=1, left_torque_effectiveness=1.0, right_torque_effectiveness=1.0, left_pedal_smoothness=1.0, right_pedal_smoothness=1.0, combined_pedal_smoothness=1.0, time128=1.0, stroke_type=1, zone=1, ball_speed=1.0, cadence256=1.0, fractional_cadence=1.0, avg_total_hemoglobin_conc=1.0, min_total_hemoglobin_conc=1.0, max_total_hemoglobin_conc=1.0, avg_saturated_hemoglobin_percent=1.0, min_saturated_hemoglobin_percent=1.0, max_saturated_hemoglobin_percent=1.0, device_index=1, left_pco=1, right_pco=1, left_power_phase=[1,,3], left_power_phase_peak=[1,,3], right_power_phase=[1,,3], right_power_phase_peak=[1,,3], enhanced_speed=1.0, enhanced_altitude=1.0, battery_soc=1.0, motor_power=1, vertical_ratio=1.0, stance_time_balance=1.0, step_length=1.0, cycle_length16=1.0, absolute_pressure=1, depth=1.0, next_stop_depth=1.0, next_stop_time=1, time_to_surface=1, ndl_time=1, cns_load=1, n2_load=1, respiration_rate=1, enhanced_respiration_rate=1.0, grit=1.0, flow=1.0, current_stress=1.0, ebike_travel_rang=1, ebike_battery_level=1, ebike_assist_mode=1, ebike_assist_level_percent=1, air_time_remaining=1, pressure_sac=1.0, volume_sac=1.0, rmv=1.0, ascent_rate=1.0, po2=1.0, core_temperature=1.0, timestamp=1758499199},
|
FitRecord{2025-09-21 23:59:59.000, latitude=8.381903171539307E-8, longitude=8.381903171539307E-8, altitude=1.0, heart_rate=1, cadence=1, distance=1.0, speed=1.0, power=1, compressed_speed_distance=[1,,254], grade=1.0, resistance=1, time_from_course=1.0, cycle_length=1.0, temperature=1, speed_1s=[1.0,,4.1875], cycles=1, total_cycles=1, compressed_accumulated_power=1, accumulated_power=1, left_right_balance=1, gps_accuracy=1, vertical_speed=1.0, calories=1, oscillation=1.0, stance_time_percent=1.0, stance_time=1.0, activity=1, left_torque_effectiveness=1.0, right_torque_effectiveness=1.0, left_pedal_smoothness=1.0, right_pedal_smoothness=1.0, combined_pedal_smoothness=1.0, time128=1.0, stroke_type=1, zone=1, ball_speed=1.0, cadence256=1.0, fractional_cadence=1.0, avg_total_hemoglobin_conc=1.0, min_total_hemoglobin_conc=1.0, max_total_hemoglobin_conc=1.0, avg_saturated_hemoglobin_percent=1.0, min_saturated_hemoglobin_percent=1.0, max_saturated_hemoglobin_percent=1.0, device_index=1, left_pco=1, right_pco=1, left_power_phase=[1,,3], left_power_phase_peak=[1,,3], right_power_phase=[1,,3], right_power_phase_peak=[1,,3], enhanced_speed=1.0, enhanced_altitude=1.0, battery_soc=1.0, motor_power=1, vertical_ratio=1.0, stance_time_balance=1.0, step_length=1.0, cycle_length16=1.0, absolute_pressure=1, depth=1.0, next_stop_depth=1.0, next_stop_time=1, time_to_surface=1, ndl_time=1, cns_load=1, n2_load=1, respiration_rate=1, enhanced_respiration_rate=1.0, grit=1.0, flow=1.0, current_stress=1.0, ebike_travel_rang=1, ebike_battery_level=1, ebike_assist_mode=1, ebike_assist_level_percent=1, air_time_remaining=1, pressure_sac=1.0, volume_sac=1.0, rmv=1.0, ascent_rate=1.0, po2=1.0, core_temperature=1.0, timestamp=1758499199},
|
||||||
FitEvent{2025-09-21 23:59:59.000, event=3, event_type=1, data16=1, data=1, event_group=1, score=1, opponent_score=1, front_gear_num=1, front_gear=1, rear_gear_num=1, rear_gear=1, device_index=1, activity_type=1, start_timestamp=1127433599, radar_threat_level_max=1, radar_threat_count=1, radar_threat_avg_approach_speed=1.0, radar_threat_max_approach_speed=1.0, timestamp=1758499199},
|
FitEvent{2025-09-21 23:59:59.000, event=3, event_type=1, data16=1, data=1, event_group=1, score=1, opponent_score=1, front_gear_num=1, front_gear=1, rear_gear_num=1, rear_gear=1, device_index=1, activity_type=1, start_timestamp=1127433599, radar_threat_level_max=1, radar_threat_count=1, radar_threat_avg_approach_speed=1.0, radar_threat_max_approach_speed=1.0, timestamp=1758499199},
|
||||||
@@ -119,6 +119,8 @@ FitHsaConfigurationData{2025-09-21 23:59:59.000, data=[1,,254], data_size=1, tim
|
|||||||
FitDiveApneaAlarm{2025-09-21 23:59:59.000, depth=1.0, time=1, enabled=true, alarm_type=1, sound=1, dive_types=[1,,0], id=1, popup_enabled=true, trigger_on_descent=true, trigger_on_ascent=true, repeating=true, speed=1.0, message_index=1},
|
FitDiveApneaAlarm{2025-09-21 23:59:59.000, depth=1.0, time=1, enabled=true, alarm_type=1, sound=1, dive_types=[1,,0], id=1, popup_enabled=true, trigger_on_descent=true, trigger_on_ascent=true, repeating=true, speed=1.0, message_index=1},
|
||||||
FitSkinTempOvernight{2025-09-21 23:59:59.000, local_timestamp=1, average_deviation=1.0, average_7_day_deviation=1.0, nightly_value=1.0, timestamp=1758499199},
|
FitSkinTempOvernight{2025-09-21 23:59:59.000, local_timestamp=1, average_deviation=1.0, average_7_day_deviation=1.0, nightly_value=1.0, timestamp=1758499199},
|
||||||
FitHsaWristTemperatureData{2025-09-21 23:59:59.000, processing_interval=1, value=[1.0,,4.2], timestamp=1758499199},
|
FitHsaWristTemperatureData{2025-09-21 23:59:59.000, processing_interval=1, value=[1.0,,4.2], timestamp=1758499199},
|
||||||
|
FitSleepDisruptionSeverityPeriod{2025-09-21 23:59:59.000, severity=1, timestamp=1758499199, message_index=1},
|
||||||
|
FitSleepDisruptionOvernightSeverity{2025-09-21 23:59:59.000, severity=1, timestamp=1758499199},
|
||||||
FitLap{2025-09-21 23:59:59.000, event=11, event_type=3, start_time=1127433599, time_in_hr_zone=1.0, time_in_speed_zone=[1.0,2.0], time_in_cadence_zone=[1.0,0.0,3.0], avg_total_hemoglobin_conc=1.0, min_total_hemoglobin_conc=[1.0,2.0], max_total_hemoglobin_conc=[1.0,0.0,3.0], lev_battery_consumption=20.0, timestamp=1758499199, message_index=2},
|
FitLap{2025-09-21 23:59:59.000, event=11, event_type=3, start_time=1127433599, time_in_hr_zone=1.0, time_in_speed_zone=[1.0,2.0], time_in_cadence_zone=[1.0,0.0,3.0], avg_total_hemoglobin_conc=1.0, min_total_hemoglobin_conc=[1.0,2.0], max_total_hemoglobin_conc=[1.0,0.0,3.0], lev_battery_consumption=20.0, timestamp=1758499199, message_index=2},
|
||||||
FitSegmentFile{2025-09-21 23:59:59.000, leader_activity_id_string=a, message_index=0},
|
FitSegmentFile{2025-09-21 23:59:59.000, leader_activity_id_string=a, message_index=0},
|
||||||
FitSegmentFile{2025-09-21 23:59:59.000, leader_activity_id_string=a, message_index=1},
|
FitSegmentFile{2025-09-21 23:59:59.000, leader_activity_id_string=a, message_index=1},
|
||||||
|
|||||||
Reference in New Issue
Block a user