Garmin: Persist SpO2 measurement type

This commit is contained in:
José Rebelo
2025-08-07 19:07:01 +01:00
parent f0b6d874bc
commit 573134a7cd
4 changed files with 40 additions and 4 deletions
@@ -58,7 +58,7 @@ public class GBDaoGenerator {
public static void main(String[] args) throws Exception {
final Schema schema = new Schema(110, MAIN_PACKAGE + ".entities");
final Schema schema = new Schema(111, MAIN_PACKAGE + ".entities");
Entity userAttributes = addUserAttributes(schema);
Entity user = addUserInfo(schema, userAttributes);
@@ -892,6 +892,7 @@ public class GBDaoGenerator {
Entity spo2sample = addEntity(schema, "GarminSpo2Sample");
addCommonTimeSampleProperties("AbstractSpo2Sample", spo2sample, user, device);
spo2sample.addIntProperty(SAMPLE_SPO2).notNull().codeBeforeGetter(OVERRIDE);
spo2sample.addIntProperty("typeNum").notNull().codeBeforeGetter(OVERRIDE);
return spo2sample;
}
@@ -0,0 +1,23 @@
package nodomain.freeyourgadget.gadgetbridge.database.schema;
import android.database.sqlite.SQLiteDatabase;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.database.DBUpdateScript;
import nodomain.freeyourgadget.gadgetbridge.entities.GarminSpo2SampleDao;
public class GadgetbridgeUpdate_111 implements DBUpdateScript {
@Override
public void upgradeSchema(final SQLiteDatabase db) {
if (!DBHelper.existsColumn(GarminSpo2SampleDao.TABLENAME, GarminSpo2SampleDao.Properties.TypeNum.columnName, db)) {
final String statement = "ALTER TABLE " + GarminSpo2SampleDao.TABLENAME + " ADD COLUMN \""
+ GarminSpo2SampleDao.Properties.TypeNum.columnName + "\" INTEGER NOT NULL DEFAULT 2;";
db.execSQL(statement);
}
}
@Override
public void downgradeSchema(SQLiteDatabase database) {
}
}
@@ -65,6 +65,7 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryParser;
import nodomain.freeyourgadget.gadgetbridge.model.Spo2Sample;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.FileType;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.exception.FitParseException;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.fit.fieldDefinitions.FieldDefinitionHrvStatus;
@@ -225,8 +226,8 @@ public class FitImporter {
}
Objects.requireNonNull(activitySamplesPerTimestamp.get(currentMonitoringTimestamp)).add(monitoringRecord);
lastMonitoringTimestamp = currentMonitoringTimestamp;
} else if (record instanceof FitSpo2) {
final Integer spo2 = ((FitSpo2) record).getReadingSpo2();
} else if (record instanceof FitSpo2 fitSpo2) {
final Integer spo2 = fitSpo2.getReadingSpo2();
if (spo2 == null || spo2 <= 0) {
continue;
}
@@ -234,6 +235,17 @@ public class FitImporter {
final GarminSpo2Sample sample = new GarminSpo2Sample();
sample.setTimestamp(ts * 1000L);
sample.setSpo2(spo2);
sample.setTypeNum(Spo2Sample.Type.UNKNOWN.getNum());
if (fitSpo2.getMode() != null) {
switch (fitSpo2.getMode()) {
case 1:
sample.setTypeNum(Spo2Sample.Type.MANUAL.getNum());
break;
case 3:
sample.setTypeNum(Spo2Sample.Type.AUTOMATIC.getNum());
break;
}
}
spo2samples.add(sample);
} else if (record instanceof FitRespirationRate) {
final Float respiratoryRate = ((FitRespirationRate) record).getRespirationRate();
@@ -436,7 +436,7 @@ public class GlobalFITMessage {
public static GlobalFITMessage SPO2 = new GlobalFITMessage(269, "SPO2", Arrays.asList(
new FieldDefinitionPrimitive(0, BaseType.UINT8, "reading_spo2"),
new FieldDefinitionPrimitive(1, BaseType.UINT8, "reading_confidence"),
new FieldDefinitionPrimitive(2, BaseType.UINT8, "mode"), // 3 periodic
new FieldDefinitionPrimitive(2, BaseType.UINT8, "mode"), // 1 manual 3 periodic
new FieldDefinitionPrimitive(253, BaseType.UINT32, "timestamp", FieldDefinitionFactory.FIELD.TIMESTAMP)
));