mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Garmin: extend FIT file parsing 10
This commit is contained in:
+66
@@ -1290,6 +1290,16 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage THREE_D_SENSOR_CALIBRATION = new GlobalFITMessage(167, "THREE_D_SENSOR_CALIBRATION", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.ENUM, "sensor_type"),
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT32, "calibration_factor"),
|
||||
new FieldDefinitionPrimitive(2, BaseType.UINT32, "calibration_divisor"),
|
||||
new FieldDefinitionPrimitive(3, BaseType.UINT32, "level_shift"),
|
||||
new FieldDefinitionPrimitive(4, BaseType.SINT32, 3, "offset_cal", FieldDefinitionFactory.FIELD.ARRAY, 1, 0),
|
||||
new FieldDefinitionPrimitive(5, BaseType.SINT32, 9, "orientation_matrix", FieldDefinitionFactory.FIELD.ARRAY, 65535, 0),
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage VIDEO_FRAME = new GlobalFITMessage(169, "VIDEO_FRAME", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT32, "frame_number"),
|
||||
@@ -1417,6 +1427,18 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(4, BaseType.UINT32, "application_version")
|
||||
));
|
||||
|
||||
public static GlobalFITMessage MAGNETOMETER_DATA = new GlobalFITMessage(208, "MAGNETOMETER_DATA", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT16, "sample_time_offset", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(2, BaseType.UINT16, "mag_x", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(3, BaseType.UINT16, "mag_y", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(4, BaseType.UINT16, "mag_z", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(5, BaseType.FLOAT32, "calibrated_mag_x", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(6, BaseType.FLOAT32, "calibrated_mag_y", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(7, BaseType.FLOAT32, "calibrated_mag_z", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
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
|
||||
@@ -1424,6 +1446,15 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage ONE_D_SENSOR_CALIBRATION = new GlobalFITMessage(210, "ONE_D_SENSOR_CALIBRATION", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.ENUM, "sensor_type"),
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT32, "calibration_factor"),
|
||||
new FieldDefinitionPrimitive(2, BaseType.UINT32, "calibration_divisor"),
|
||||
new FieldDefinitionPrimitive(3, BaseType.UINT32, "level_shift"),
|
||||
new FieldDefinitionPrimitive(4, BaseType.SINT32, "offset_cal"),
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage MONITORING_HR_DATA = new GlobalFITMessage(211, "MONITORING_HR_DATA", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT8, "resting_heart_rate"),
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT8, "current_day_resting_heart_rate"),
|
||||
@@ -1624,6 +1655,15 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage AAD_ACCEL_FEATURES = new GlobalFITMessage(289, "AAD_ACCEL_FEATURES", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT16, "time"), // s
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT32, "energy_total"),
|
||||
new FieldDefinitionPrimitive(2, BaseType.UINT16, "zero_cross_cnt"),
|
||||
new FieldDefinitionPrimitive(3, BaseType.UINT8, "instance"),
|
||||
new FieldDefinitionPrimitive(4, BaseType.UINT16, "time_above_threshold"), // 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
|
||||
@@ -1635,6 +1675,16 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage HSA_ACCELEROMETER_DATA = new GlobalFITMessage(302, "HSA_ACCELEROMETER_DATA", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT16, "sampling_interval"),
|
||||
new FieldDefinitionPrimitive(2, BaseType.SINT16, "accel_x", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(3, BaseType.SINT16, "accel_y", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(4, BaseType.SINT16, "accel_z", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(5, BaseType.UINT32, "timestamp_32k"),
|
||||
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),
|
||||
@@ -1825,6 +1875,16 @@ public class GlobalFITMessage {
|
||||
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
|
||||
));
|
||||
|
||||
public static GlobalFITMessage HSA_GYROSCOPE_DATA = new GlobalFITMessage(376, "HSA_GYROSCOPE_DATA", Arrays.asList(
|
||||
new FieldDefinitionPrimitive(0, BaseType.UINT16, "timestamp_ms"), // ms
|
||||
new FieldDefinitionPrimitive(1, BaseType.UINT16, "sampling_interval"),
|
||||
new FieldDefinitionPrimitive(2, BaseType.SINT16, "gyro_x", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(3, BaseType.SINT16, "gyro_y", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(4, BaseType.SINT16, "gyro_z", FieldDefinitionFactory.FIELD.ARRAY),
|
||||
new FieldDefinitionPrimitive(5, BaseType.UINT32, "timestamp_32k"),
|
||||
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)
|
||||
@@ -1985,6 +2045,7 @@ public class GlobalFITMessage {
|
||||
put(162, TIMESTAMP_CORRELATION);
|
||||
put(164, GYROSCOPE_DATA);
|
||||
put(165, ACCELEROMETER_DATA);
|
||||
put(167, THREE_D_SENSOR_CALIBRATION);
|
||||
put(169, VIDEO_FRAME);
|
||||
put(174, OBDII_DATA);
|
||||
put(177, NMEA_SENTENCE);
|
||||
@@ -1999,7 +2060,9 @@ public class GlobalFITMessage {
|
||||
put(202, EXD_DATA_CONCEPT_CONFIGURATION);
|
||||
put(206, FIELD_DESCRIPTION);
|
||||
put(207, DEVELOPER_DATA);
|
||||
put(208, MAGNETOMETER_DATA);
|
||||
put(209, BAROMETER_DATA);
|
||||
put(210, ONE_D_SENSOR_CALIBRATION);
|
||||
put(211, MONITORING_HR_DATA);
|
||||
put(216, TIME_IN_ZONE);
|
||||
put(222, ALARM_SETTINGS);
|
||||
@@ -2016,8 +2079,10 @@ public class GlobalFITMessage {
|
||||
put(268, DIVE_SUMMARY);
|
||||
put(275, SLEEP_STAGE);
|
||||
put(285, JUMP);
|
||||
put(289, AAD_ACCEL_FEATURES);
|
||||
put(290, BEAT_INTERVALS);
|
||||
put(297, RESPIRATION_RATE);
|
||||
put(302, HSA_ACCELEROMETER_DATA);
|
||||
put(304, HSA_STEP_DATA);
|
||||
put(305, HSA_SPO2_DATA);
|
||||
put(306, HSA_STRESS_DATA);
|
||||
@@ -2039,6 +2104,7 @@ public class GlobalFITMessage {
|
||||
put(371, HRV_VALUE);
|
||||
put(372, RAW_BBI);
|
||||
put(375, DEVICE_AUX_BATTERY_INFO);
|
||||
put(376, HSA_GYROSCOPE_DATA);
|
||||
put(378, TRAINING_LOAD);
|
||||
put(379, SLEEP_SCHEDULE);
|
||||
put(387, CHRONO_SHOT_SESSION);
|
||||
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
/* 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 <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 FitAadAccelFeatures extends RecordData {
|
||||
public FitAadAccelFeatures(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 289) {
|
||||
throw new IllegalArgumentException("FitAadAccelFeatures expects global messages of " + 289 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getTime() {
|
||||
return (Integer) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getEnergyTotal() {
|
||||
return (Long) getFieldByNumber(1);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getZeroCrossCnt() {
|
||||
return (Integer) getFieldByNumber(2);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getInstance() {
|
||||
return (Integer) getFieldByNumber(3);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getTimeAboveThreshold() {
|
||||
return (Integer) getFieldByNumber(4);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestamp() {
|
||||
return (Long) getFieldByNumber(253);
|
||||
}
|
||||
|
||||
/**
|
||||
* @noinspection unused
|
||||
*/
|
||||
public static class Builder extends FitRecordDataBuilder {
|
||||
public Builder() {
|
||||
super(289);
|
||||
}
|
||||
|
||||
public Builder setTime(final Integer value) {
|
||||
setFieldByNumber(0, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setEnergyTotal(final Long value) {
|
||||
setFieldByNumber(1, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setZeroCrossCnt(final Integer value) {
|
||||
setFieldByNumber(2, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setInstance(final Integer value) {
|
||||
setFieldByNumber(3, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimeAboveThreshold(final Integer value) {
|
||||
setFieldByNumber(4, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp(final Long value) {
|
||||
setFieldByNumber(253, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FitAadAccelFeatures build() {
|
||||
return (FitAadAccelFeatures) super.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
+158
@@ -0,0 +1,158 @@
|
||||
/* 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 <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 FitHsaAccelerometerData extends RecordData {
|
||||
public FitHsaAccelerometerData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 302) {
|
||||
throw new IllegalArgumentException("FitHsaAccelerometerData expects global messages of " + 302 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getTimestampMs() {
|
||||
return (Integer) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getSamplingInterval() {
|
||||
return (Integer) getFieldByNumber(1);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Number[] getAccelX() {
|
||||
final Object object = getFieldByNumber(2);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getAccelY() {
|
||||
final Object object = getFieldByNumber(3);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getAccelZ() {
|
||||
final Object object = getFieldByNumber(4);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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 getTimestamp32k() {
|
||||
return (Long) getFieldByNumber(5);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestamp() {
|
||||
return (Long) getFieldByNumber(253);
|
||||
}
|
||||
|
||||
/**
|
||||
* @noinspection unused
|
||||
*/
|
||||
public static class Builder extends FitRecordDataBuilder {
|
||||
public Builder() {
|
||||
super(302);
|
||||
}
|
||||
|
||||
public Builder setTimestampMs(final Integer value) {
|
||||
setFieldByNumber(0, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setSamplingInterval(final Integer value) {
|
||||
setFieldByNumber(1, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setAccelX(final Number[] value) {
|
||||
setFieldByNumber(2, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setAccelY(final Number[] value) {
|
||||
setFieldByNumber(3, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setAccelZ(final Number[] value) {
|
||||
setFieldByNumber(4, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp32k(final Long value) {
|
||||
setFieldByNumber(5, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp(final Long value) {
|
||||
setFieldByNumber(253, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FitHsaAccelerometerData build() {
|
||||
return (FitHsaAccelerometerData) super.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
+158
@@ -0,0 +1,158 @@
|
||||
/* 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 <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 FitHsaGyroscopeData extends RecordData {
|
||||
public FitHsaGyroscopeData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 376) {
|
||||
throw new IllegalArgumentException("FitHsaGyroscopeData expects global messages of " + 376 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getTimestampMs() {
|
||||
return (Integer) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getSamplingInterval() {
|
||||
return (Integer) getFieldByNumber(1);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Number[] getGyroX() {
|
||||
final Object object = getFieldByNumber(2);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getGyroY() {
|
||||
final Object object = getFieldByNumber(3);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getGyroZ() {
|
||||
final Object object = getFieldByNumber(4);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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 getTimestamp32k() {
|
||||
return (Long) getFieldByNumber(5);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestamp() {
|
||||
return (Long) getFieldByNumber(253);
|
||||
}
|
||||
|
||||
/**
|
||||
* @noinspection unused
|
||||
*/
|
||||
public static class Builder extends FitRecordDataBuilder {
|
||||
public Builder() {
|
||||
super(376);
|
||||
}
|
||||
|
||||
public Builder setTimestampMs(final Integer value) {
|
||||
setFieldByNumber(0, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setSamplingInterval(final Integer value) {
|
||||
setFieldByNumber(1, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setGyroX(final Number[] value) {
|
||||
setFieldByNumber(2, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setGyroY(final Number[] value) {
|
||||
setFieldByNumber(3, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setGyroZ(final Number[] value) {
|
||||
setFieldByNumber(4, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp32k(final Long value) {
|
||||
setFieldByNumber(5, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp(final Long value) {
|
||||
setFieldByNumber(253, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FitHsaGyroscopeData build() {
|
||||
return (FitHsaGyroscopeData) super.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
+222
@@ -0,0 +1,222 @@
|
||||
/* 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 <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 FitMagnetometerData extends RecordData {
|
||||
public FitMagnetometerData(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 208) {
|
||||
throw new IllegalArgumentException("FitMagnetometerData expects global messages of " + 208 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getTimestampMs() {
|
||||
return (Integer) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Number[] getSampleTimeOffset() {
|
||||
final Object object = getFieldByNumber(1);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getMagX() {
|
||||
final Object object = getFieldByNumber(2);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getMagY() {
|
||||
final Object object = getFieldByNumber(3);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getMagZ() {
|
||||
final Object object = getFieldByNumber(4);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getCalibratedMagX() {
|
||||
final Object object = getFieldByNumber(5);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getCalibratedMagY() {
|
||||
final Object object = getFieldByNumber(6);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getCalibratedMagZ() {
|
||||
final Object object = getFieldByNumber(7);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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(208);
|
||||
}
|
||||
|
||||
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 setMagX(final Number[] value) {
|
||||
setFieldByNumber(2, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setMagY(final Number[] value) {
|
||||
setFieldByNumber(3, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setMagZ(final Number[] value) {
|
||||
setFieldByNumber(4, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCalibratedMagX(final Number[] value) {
|
||||
setFieldByNumber(5, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCalibratedMagY(final Number[] value) {
|
||||
setFieldByNumber(6, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCalibratedMagZ(final Number[] value) {
|
||||
setFieldByNumber(7, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp(final Long value) {
|
||||
setFieldByNumber(253, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FitMagnetometerData build() {
|
||||
return (FitMagnetometerData) super.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
/* 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 <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 FitOneDSensorCalibration extends RecordData {
|
||||
public FitOneDSensorCalibration(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 210) {
|
||||
throw new IllegalArgumentException("FitOneDSensorCalibration expects global messages of " + 210 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getSensorType() {
|
||||
return (Integer) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getCalibrationFactor() {
|
||||
return (Long) getFieldByNumber(1);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getCalibrationDivisor() {
|
||||
return (Long) getFieldByNumber(2);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getLevelShift() {
|
||||
return (Long) getFieldByNumber(3);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getOffsetCal() {
|
||||
return (Long) getFieldByNumber(4);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getTimestamp() {
|
||||
return (Long) getFieldByNumber(253);
|
||||
}
|
||||
|
||||
/**
|
||||
* @noinspection unused
|
||||
*/
|
||||
public static class Builder extends FitRecordDataBuilder {
|
||||
public Builder() {
|
||||
super(210);
|
||||
}
|
||||
|
||||
public Builder setSensorType(final Integer value) {
|
||||
setFieldByNumber(0, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCalibrationFactor(final Long value) {
|
||||
setFieldByNumber(1, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCalibrationDivisor(final Long value) {
|
||||
setFieldByNumber(2, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setLevelShift(final Long value) {
|
||||
setFieldByNumber(3, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setOffsetCal(final Long value) {
|
||||
setFieldByNumber(4, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp(final Long value) {
|
||||
setFieldByNumber(253, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FitOneDSensorCalibration build() {
|
||||
return (FitOneDSensorCalibration) super.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
@@ -101,6 +101,7 @@ public class FitRecordDataFactory {
|
||||
case 162 -> new FitTimestampCorrelation(recordDefinition, recordHeader);
|
||||
case 164 -> new FitGyroscopeData(recordDefinition, recordHeader);
|
||||
case 165 -> new FitAccelerometerData(recordDefinition, recordHeader);
|
||||
case 167 -> new FitThreeDSensorCalibration(recordDefinition, recordHeader);
|
||||
case 169 -> new FitVideoFrame(recordDefinition, recordHeader);
|
||||
case 174 -> new FitObdiiData(recordDefinition, recordHeader);
|
||||
case 177 -> new FitNmeaSentence(recordDefinition, recordHeader);
|
||||
@@ -115,7 +116,9 @@ public class FitRecordDataFactory {
|
||||
case 202 -> new FitExdDataConceptConfiguration(recordDefinition, recordHeader);
|
||||
case 206 -> new FitFieldDescription(recordDefinition, recordHeader);
|
||||
case 207 -> new FitDeveloperData(recordDefinition, recordHeader);
|
||||
case 208 -> new FitMagnetometerData(recordDefinition, recordHeader);
|
||||
case 209 -> new FitBarometerData(recordDefinition, recordHeader);
|
||||
case 210 -> new FitOneDSensorCalibration(recordDefinition, recordHeader);
|
||||
case 211 -> new FitMonitoringHrData(recordDefinition, recordHeader);
|
||||
case 216 -> new FitTimeInZone(recordDefinition, recordHeader);
|
||||
case 222 -> new FitAlarmSettings(recordDefinition, recordHeader);
|
||||
@@ -132,8 +135,10 @@ public class FitRecordDataFactory {
|
||||
case 274 -> new FitSleepDataRaw(recordDefinition, recordHeader);
|
||||
case 275 -> new FitSleepStage(recordDefinition, recordHeader);
|
||||
case 285 -> new FitJump(recordDefinition, recordHeader);
|
||||
case 289 -> new FitAadAccelFeatures(recordDefinition, recordHeader);
|
||||
case 290 -> new FitBeatIntervals(recordDefinition, recordHeader);
|
||||
case 297 -> new FitRespirationRate(recordDefinition, recordHeader);
|
||||
case 302 -> new FitHsaAccelerometerData(recordDefinition, recordHeader);
|
||||
case 304 -> new FitHsaStepData(recordDefinition, recordHeader);
|
||||
case 305 -> new FitHsaSpo2Data(recordDefinition, recordHeader);
|
||||
case 306 -> new FitHsaStressData(recordDefinition, recordHeader);
|
||||
@@ -155,6 +160,7 @@ public class FitRecordDataFactory {
|
||||
case 371 -> new FitHrvValue(recordDefinition, recordHeader);
|
||||
case 372 -> new FitRawBbi(recordDefinition, recordHeader);
|
||||
case 375 -> new FitDeviceAuxBatteryInfo(recordDefinition, recordHeader);
|
||||
case 376 -> new FitHsaGyroscopeData(recordDefinition, recordHeader);
|
||||
case 378 -> new FitTrainingLoad(recordDefinition, recordHeader);
|
||||
case 379 -> new FitSleepSchedule(recordDefinition, recordHeader);
|
||||
case 387 -> new FitChronoShotSession(recordDefinition, recordHeader);
|
||||
|
||||
+147
@@ -0,0 +1,147 @@
|
||||
/* 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 <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 FitThreeDSensorCalibration extends RecordData {
|
||||
public FitThreeDSensorCalibration(final RecordDefinition recordDefinition, final RecordHeader recordHeader) {
|
||||
super(recordDefinition, recordHeader);
|
||||
|
||||
final int globalNumber = recordDefinition.getGlobalFITMessage().getNumber();
|
||||
if (globalNumber != 167) {
|
||||
throw new IllegalArgumentException("FitThreeDSensorCalibration expects global messages of " + 167 + ", got " + globalNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Integer getSensorType() {
|
||||
return (Integer) getFieldByNumber(0);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getCalibrationFactor() {
|
||||
return (Long) getFieldByNumber(1);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getCalibrationDivisor() {
|
||||
return (Long) getFieldByNumber(2);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Long getLevelShift() {
|
||||
return (Long) getFieldByNumber(3);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Number[] getOffsetCal() {
|
||||
final Object object = getFieldByNumber(4);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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[] getOrientationMatrix() {
|
||||
final Object object = getFieldByNumber(5);
|
||||
if (object == null)
|
||||
return null;
|
||||
if (!object.getClass().isArray()) {
|
||||
return new Number[]{(Number) object};
|
||||
}
|
||||
final Object[] objectsArray = (Object[]) object;
|
||||
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(167);
|
||||
}
|
||||
|
||||
public Builder setSensorType(final Integer value) {
|
||||
setFieldByNumber(0, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCalibrationFactor(final Long value) {
|
||||
setFieldByNumber(1, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setCalibrationDivisor(final Long value) {
|
||||
setFieldByNumber(2, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setLevelShift(final Long value) {
|
||||
setFieldByNumber(3, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setOffsetCal(final Number[] value) {
|
||||
setFieldByNumber(4, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setOrientationMatrix(final Number[] value) {
|
||||
setFieldByNumber(5, (Object[]) value);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setTimestamp(final Long value) {
|
||||
setFieldByNumber(253, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FitThreeDSensorCalibration build() {
|
||||
return (FitThreeDSensorCalibration) super.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -60,7 +60,7 @@ FitCameraEvent{2025-09-21 23:59:59.000, timestamp_ms=1, camera_event_type=1, cam
|
||||
FitTimestampCorrelation{2025-09-21 23:59:59.000, fractional_timestamp=1.0, system_timestamp=1127433599, fractional_system_timestamp=1.0, local_timestamp=1, timestamp_ms=1, system_timestamp_ms=1, timestamp=1758499199},
|
||||
FitGyroscopeData{2025-09-21 23:59:59.000, timestamp_ms=1, sample_time_offset=[1,,65534], gyro_x=[1,,65534], gyro_y=[1,,65534], gyro_z=[1,,65534], calibrated_gyro_x=[1.0,,4.2], calibrated_gyro_y=[1.0,,4.2], calibrated_gyro_z=[1.0,,4.2], timestamp=1758499199},
|
||||
FitAccelerometerData{2025-09-21 23:59:59.000, timestamp_ms=1, sample_time_offset=[1,,65534], accel_x=[1,,65534], accel_y=[1,,65534], accel_z=[1,,65534], calibrated_accel_x=[1.0,,4.2], calibrated_accel_y=[1.0,,4.2], calibrated_accel_z=[1.0,,4.2], compressed_calibrated_accel_x=[1,,32766], compressed_calibrated_accel_y=[1,,32766], compressed_calibrated_accel_z=[1,,32766], timestamp=1758499199},
|
||||
RecordData{UNK_167_three_d_sensor_calibration, 2025-09-21 23:59:59.000, unknown_0(ENUM/1)=1, unknown_1(UINT32/4)=1, unknown_2(UINT32/4)=1, unknown_3(UINT32/4)=1, unknown_4(SINT32/12)=[1,,2147483646], unknown_5(SINT32/12)=[65535,,275247], 253_timestamp=1758499199},
|
||||
FitThreeDSensorCalibration{2025-09-21 23:59:59.000, sensor_type=1, calibration_factor=1, calibration_divisor=1, level_shift=1, offset_cal=[1,,2147483646], orientation_matrix=[1.0,,4.2], timestamp=1758499199},
|
||||
FitVideoFrame{2025-09-21 23:59:59.000, timestamp_ms=1, frame_number=1, timestamp=1758499199},
|
||||
FitObdiiData{2025-09-21 23:59:59.000, timestamp_ms=1, time_offset=[1,,65534], pid=1, raw_data=[1,,254], pid_data_size=[1,,254], system_time=[1,,4294967294], start_timestamp=1127433599, start_timestamp_ms=1, timestamp=1758499199},
|
||||
FitNmeaSentence{2025-09-21 23:59:59.000, timestamp_ms=1, sentence=a, timestamp=1758499199},
|
||||
@@ -75,9 +75,9 @@ FitExdDataFieldConfiguration{2025-09-21 23:59:59.000, screen_index=1, concept_fi
|
||||
FitExdDataConceptConfiguration{2025-09-21 23:59:59.000, screen_index=1, concept_field=1, field_id=1, concept_count=1, data_page=1, concept_key=1, scaling=1, data_units=1, qualifier=1, descriptor=1, is_signed=true},
|
||||
FitFieldDescription{2025-09-21 23:59:59.000, developer_data_index=1, field_definition_number=1, fit_base_type_id=1, field_name=a, array=1, components=a, scale=1, offset=1, units=a, bits=a, accumulate=a, fit_base_unit_id=1, native_mesg_num=1, native_field_num=1},
|
||||
FitDeveloperData{2025-09-21 23:59:59.000, developer_id=[1,,254], application_id=[1,,254], manufacturer_id=1, developer_data_index=1, application_version=1},
|
||||
RecordData{UNK_208_magnetometer_data, 2025-09-21 23:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT16/6)=[1,,65534], unknown_2(UINT16/6)=[1,,65534], unknown_3(UINT16/6)=[1,,65534], unknown_4(UINT16/6)=[1,,65534], unknown_5(FLOAT32/12)=[1.0,,4.2], unknown_6(FLOAT32/12)=[1.0,,4.2], unknown_7(FLOAT32/12)=[1.0,,4.2], 253_timestamp=1758499199},
|
||||
FitMagnetometerData{2025-09-21 23:59:59.000, timestamp_ms=1, sample_time_offset=[1,,65534], mag_x=[1,,65534], mag_y=[1,,65534], mag_z=[1,,65534], calibrated_mag_x=[1.0,,4.2], calibrated_mag_y=[1.0,,4.2], calibrated_mag_z=[1.0,,4.2], timestamp=1758499199},
|
||||
FitBarometerData{2025-09-21 23:59:59.000, timestamp_ms=1, sample_time_offset=[1,,65534], baro_pres=[1,,4294967294], timestamp=1758499199},
|
||||
RecordData{UNK_210_one_d_sensor_calibration, 2025-09-21 23:59:59.000, unknown_0(ENUM/1)=1, unknown_1(UINT32/4)=1, unknown_2(UINT32/4)=1, unknown_3(UINT32/4)=1, unknown_4(SINT32/4)=1, 253_timestamp=1758499199},
|
||||
FitOneDSensorCalibration{2025-09-21 23:59:59.000, sensor_type=1, calibration_factor=1, calibration_divisor=1, level_shift=1, offset_cal=1, timestamp=1758499199},
|
||||
FitMonitoringHrData{2025-09-21 23:59:59.000, resting_heart_rate=1, current_day_resting_heart_rate=1, timestamp=1758499199},
|
||||
FitTimeInZone{2025-09-21 23:59:59.000, reference_message=1, reference_index=1, time_in_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], hr_zone_high_boundary=[1,,254], speed_zone_high_boundary=[1.0,,4.2], cadence_zone_high_boundary=[1,,254], power_zone_high_boundary=[1,,65534], hr_calc_type=1, max_heart_rate=1, resting_heart_rate=1, threshold_heart_rate=1, pwr_calc_type=1, functional_threshold_power=1, timestamp=1758499199},
|
||||
FitSet{2025-09-21 23:59:59.000, duration=1.0, repetitions=1, weight=1.0, set_type=1, start_time=1758499199, category=[CATEGORY_CALF_RAISE,,CATEGORY_UNKNOWN], category_subtype=[1,,65534], weight_display_unit=1, message_index=1, wkt_step_index=1, timestamp=1758499199},
|
||||
@@ -91,10 +91,10 @@ FitDiveSummary{2025-09-21 23:59:59.000, reference_mesg=1, reference_index=1, avg
|
||||
FitSpo2{2025-09-21 23:59:59.000, reading_spo2=1, reading_confidence=1, mode=1, timestamp=1758499199},
|
||||
FitSleepStage{2025-09-21 23:59:59.000, sleep_stage=AWAKE, timestamp=1758499199},
|
||||
FitJump{2025-09-21 23:59:59.000, distance=1.0, heigh=1.0, rotations=1, hang_time=1.0, score=1.0, position_lat=8.381903171539307E-8, position_long=8.381903171539307E-8, speed=1.0, enhanced_speed=1.0, timestamp=1758499199},
|
||||
RecordData{UNK_289_aad_accel_features, 2025-09-21 23:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT32/4)=1, unknown_2(UINT16/2)=1, unknown_3(UINT8/1)=1, unknown_4(UINT16/2)=25, 253_timestamp=1758499199},
|
||||
FitAadAccelFeatures{2025-09-21 23:59:59.000, time=1, energy_total=1, zero_cross_cnt=1, instance=1, time_above_threshold=25, timestamp=1758499199},
|
||||
FitBeatIntervals{2025-09-21 23:59:59.000, timestamp_ms=1, time=[1,,65534], timestamp=1758499199},
|
||||
FitRespirationRate{2025-09-21 23:59:59.000, respiration_rate=1.0, timestamp=1758499199},
|
||||
RecordData{UNK_302_hsa_accelerometer_data, 2025-09-21 23:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT16/2)=1, unknown_2(SINT16/6)=[1,,4], unknown_3(SINT16/6)=[1,,4], unknown_4(SINT16/6)=[1,,4], unknown_5(UINT32/4)=1, 253_timestamp=1758499199},
|
||||
FitHsaAccelerometerData{2025-09-21 23:59:59.000, timestamp_ms=1, sampling_interval=1, accel_x=[1,,4], accel_y=[1,,4], accel_z=[1,,4], timestamp_32k=1, timestamp=1758499199},
|
||||
FitHsaStepData{2025-09-21 23:59:59.000, processing_interval=1, steps=[1,,4294967294], timestamp=1758499199},
|
||||
FitHsaSpo2Data{2025-09-21 23:59:59.000, processing_interval=1, reading_spo2=[1,,254], confidence=[1,,254], timestamp=1758499199},
|
||||
FitHsaStressData{2025-09-21 23:59:59.000, processing_interval=1, stress_level=[1,,126], timestamp=1758499199},
|
||||
@@ -112,7 +112,7 @@ FitHrvSummary{2025-09-21 23:59:59.000, weekly_average=1.0, last_night_average=1.
|
||||
FitHrvValue{2025-09-21 23:59:59.000, value=1.0, timestamp=1758499199},
|
||||
FitRawBbi{2025-09-21 23:59:59.000, timestamp_ms=1, data=[1,,65534], time=[1,,65534], quality=[1,,254], gap=[1,,254], timestamp=1758499199},
|
||||
FitDeviceAuxBatteryInfo{2025-09-21 23:59:59.000, device_index=1, battery_voltage=1.0, battery_status=1, battery_identifier=1, timestamp=1758499199},
|
||||
RecordData{UNK_376_hsa_gyroscope_data, 2025-09-21 23:59:59.000, unknown_0(UINT16/2)=1, unknown_1(UINT16/2)=1, unknown_2(SINT16/6)=[29,,120], unknown_3(SINT16/6)=[29,,120], unknown_4(SINT16/6)=[29,,120], unknown_5(UINT32/4)=1, 253_timestamp=1758499199},
|
||||
FitHsaGyroscopeData{2025-09-21 23:59:59.000, timestamp_ms=1, sampling_interval=1, gyro_x=[29,,120], gyro_y=[29,,120], gyro_z=[29,,120], timestamp_32k=1, timestamp=1758499199},
|
||||
FitChronoShotSession{2025-09-21 23:59:59.000, min_speed=1.0, max_speed=1.0, avg_speed=1.0, shot_count=1, projectile_type=1, grain_weight=1.0, standard_deviation=1.0, timestamp=1758499199},
|
||||
FitChronoShotData{2025-09-21 23:59:59.000, shot_speed=1.0, shot_num=1, timestamp=1758499199},
|
||||
FitHsaConfigurationData{2025-09-21 23:59:59.000, data=[1,,254], data_size=1, timestamp=1758499199},
|
||||
|
||||
Reference in New Issue
Block a user