Huawei: new step rate support

This commit is contained in:
Me7c7
2025-09-07 21:35:03 +02:00
parent 6034e1a212
commit 40ca7dbc7a
4 changed files with 45 additions and 17 deletions
@@ -58,7 +58,7 @@ public class GBDaoGenerator {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
final Schema schema = new Schema(115, MAIN_PACKAGE + ".entities"); final Schema schema = new Schema(116, MAIN_PACKAGE + ".entities");
Entity userAttributes = addUserAttributes(schema); Entity userAttributes = addUserAttributes(schema);
Entity user = addUserInfo(schema, userAttributes); Entity user = addUserInfo(schema, userAttributes);
@@ -1673,6 +1673,8 @@ public class GBDaoGenerator {
workoutSummary.addIntProperty("longestStreak").notNull(); workoutSummary.addIntProperty("longestStreak").notNull();
workoutSummary.addIntProperty("tripped").notNull(); workoutSummary.addIntProperty("tripped").notNull();
workoutSummary.addBooleanProperty("newSteps").notNull();
return workoutSummary; return workoutSummary;
} }
@@ -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.HuaweiWorkoutSummarySampleDao;
public class GadgetbridgeUpdate_116 implements DBUpdateScript {
@Override
public void upgradeSchema(final SQLiteDatabase db) {
if (!DBHelper.existsColumn(HuaweiWorkoutSummarySampleDao.TABLENAME, HuaweiWorkoutSummarySampleDao.Properties.NewSteps.columnName, db)) {
final String statement = "ALTER TABLE " + HuaweiWorkoutSummarySampleDao.TABLENAME + " ADD COLUMN \""
+ HuaweiWorkoutSummarySampleDao.Properties.NewSteps.columnName + "\" INTEGER NOT NULL DEFAULT false;";
db.execSQL(statement);
}
}
@Override
public void downgradeSchema(SQLiteDatabase database) {
}
}
@@ -154,6 +154,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetN
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetOTAChangeLog; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetOTAChangeLog;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetSmartAlarmList; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetSmartAlarmList;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWatchfaceParams; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWatchfaceParams;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWorkoutCapability;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWorkoutTotalsRequest; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.GetWorkoutTotalsRequest;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendCameraRemoteSetupEvent; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendCameraRemoteSetupEvent;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendDeviceReportThreshold; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendDeviceReportThreshold;
@@ -888,7 +889,7 @@ public class HuaweiSupportProvider {
initRequestQueue.add(new GetContactsCount(this)); initRequestQueue.add(new GetContactsCount(this));
initRequestQueue.add(new SendOTASetAutoUpdate(this)); initRequestQueue.add(new SendOTASetAutoUpdate(this));
initRequestQueue.add(new GetOTAChangeLog(this)); initRequestQueue.add(new GetOTAChangeLog(this));
//initRequestQueue.add(new GetWorkoutCapability(this)); // TODO: in current stage I don't understand how to parse new steps. initRequestQueue.add(new GetWorkoutCapability(this));
initRequestQueue.add(new GetEventAlarmList(this)); initRequestQueue.add(new GetEventAlarmList(this));
initRequestQueue.add(new GetSmartAlarmList(this)); initRequestQueue.add(new GetSmartAlarmList(this));
@@ -1956,7 +1957,8 @@ public class HuaweiSupportProvider {
packet.algType, packet.algType,
packet.trainingPoints, packet.trainingPoints,
packet.longestStreak, packet.longestStreak,
packet.tripped packet.tripped,
getHuaweiCoordinator().isSupportsWorkoutNewSteps()
); );
db.getDaoSession().getHuaweiWorkoutSummarySampleDao().insertOrReplace(summarySample); db.getDaoSession().getHuaweiWorkoutSummarySampleDao().insertOrReplace(summarySample);
@@ -620,8 +620,6 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser {
int maxSpeed = Integer.MIN_VALUE; int maxSpeed = Integer.MIN_VALUE;
int speed = 0; int speed = 0;
int speedCount = 0; int speedCount = 0;
boolean stepRatePresent = false;
int stepRate = 0;
int avgStepRate = 0; int avgStepRate = 0;
int cadence = 0; int cadence = 0;
int cadenceCount = 0; int cadenceCount = 0;
@@ -712,14 +710,17 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser {
maxSpeed = dataSample.getSpeed(); maxSpeed = dataSample.getSpeed();
ac.setSpeed(dataSample.getSpeed() / 10.0f); ac.setSpeed(dataSample.getSpeed() / 10.0f);
} }
if (dataSample.getStepRate() != -1) { //TODO: currently only for walking but I suppose it can be used for all workouts
stepRate += dataSample.getStepRate(); if(summary.getNewSteps() && (type == ActivityKind.WALKING || type == ActivityKind.OUTDOOR_WALKING)) {
stepRatePresent = true; if (dataSample.getStepRate() != -1) {
} ac.setCadence(dataSample.getStepRate());
if (dataSample.getCadence() != -1) { }
cadence += dataSample.getCadence(); } else {
cadenceCount += 1; if (dataSample.getCadence() != -1) {
ac.setCadence(dataSample.getCadence()); cadence += dataSample.getCadence();
cadenceCount += 1;
ac.setCadence(dataSample.getCadence());
}
} }
if (dataSample.getStepLength() != -1) { if (dataSample.getStepLength() != -1) {
stepLength += dataSample.getStepLength(); stepLength += dataSample.getStepLength();
@@ -846,11 +847,11 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser {
// Average the things that should be averaged // Average the things that should be averaged
if (speedCount > 0) if (speedCount > 0)
speed = speed / speedCount; speed = (int)((float)speed / speedCount);
if (cadenceCount > 0) if (cadenceCount > 0)
cadence = cadence / cadenceCount; cadence = cadence / cadenceCount;
if (summary.getDuration() > 60)
avgStepRate = stepRate / (summary.getDuration() / 60); // steps per minute avgStepRate = (int)((summary.getStepCount() / ((float)dataSamples.size() * (float)dataDelta)) * 60.0f); // steps per minute
if (stepLengthCount > 0) if (stepLengthCount > 0)
stepLength = stepLength / stepLengthCount; stepLength = stepLength / stepLengthCount;
if (groundContactTimeCount > 0) if (groundContactTimeCount > 0)
@@ -877,7 +878,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser {
summaryData.add(ActivitySummaryEntries.SPEED_MAX, maxSpeed / 10f, ActivitySummaryEntries.UNIT_METERS_PER_SECOND); summaryData.add(ActivitySummaryEntries.SPEED_MAX, maxSpeed / 10f, ActivitySummaryEntries.UNIT_METERS_PER_SECOND);
} }
if (stepRatePresent) { if (avgStepRate > 0) {
summaryData.add(ActivitySummaryEntries.STEP_RATE_AVG, avgStepRate, ActivitySummaryEntries.UNIT_SPM); summaryData.add(ActivitySummaryEntries.STEP_RATE_AVG, avgStepRate, ActivitySummaryEntries.UNIT_SPM);
} }