From 40ca7dbc7a003bbbf6fc625a3b166dbd0f8c5df3 Mon Sep 17 00:00:00 2001 From: Me7c7 Date: Tue, 2 Sep 2025 00:07:07 +0300 Subject: [PATCH] Huawei: new step rate support --- .../gadgetbridge/daogen/GBDaoGenerator.java | 4 ++- .../schema/GadgetbridgeUpdate_116.java | 23 +++++++++++++++ .../devices/huawei/HuaweiSupportProvider.java | 6 ++-- .../devices/huawei/HuaweiWorkoutGbParser.java | 29 ++++++++++--------- 4 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/GadgetbridgeUpdate_116.java diff --git a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java index a0c897aa41..df4dbc1407 100644 --- a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java +++ b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java @@ -58,7 +58,7 @@ public class GBDaoGenerator { 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 user = addUserInfo(schema, userAttributes); @@ -1673,6 +1673,8 @@ public class GBDaoGenerator { workoutSummary.addIntProperty("longestStreak").notNull(); workoutSummary.addIntProperty("tripped").notNull(); + workoutSummary.addBooleanProperty("newSteps").notNull(); + return workoutSummary; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/GadgetbridgeUpdate_116.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/GadgetbridgeUpdate_116.java new file mode 100644 index 0000000000..c137875fe0 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/database/schema/GadgetbridgeUpdate_116.java @@ -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) { + + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java index 5f61be0e75..2a38fe3655 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSupportProvider.java @@ -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.GetSmartAlarmList; 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.SendCameraRemoteSetupEvent; import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendDeviceReportThreshold; @@ -888,7 +889,7 @@ public class HuaweiSupportProvider { initRequestQueue.add(new GetContactsCount(this)); initRequestQueue.add(new SendOTASetAutoUpdate(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 GetSmartAlarmList(this)); @@ -1956,7 +1957,8 @@ public class HuaweiSupportProvider { packet.algType, packet.trainingPoints, packet.longestStreak, - packet.tripped + packet.tripped, + getHuaweiCoordinator().isSupportsWorkoutNewSteps() ); db.getDaoSession().getHuaweiWorkoutSummarySampleDao().insertOrReplace(summarySample); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java index c67b216982..334ae0e78e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java @@ -620,8 +620,6 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { int maxSpeed = Integer.MIN_VALUE; int speed = 0; int speedCount = 0; - boolean stepRatePresent = false; - int stepRate = 0; int avgStepRate = 0; int cadence = 0; int cadenceCount = 0; @@ -712,14 +710,17 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { maxSpeed = dataSample.getSpeed(); ac.setSpeed(dataSample.getSpeed() / 10.0f); } - if (dataSample.getStepRate() != -1) { - stepRate += dataSample.getStepRate(); - stepRatePresent = true; - } - if (dataSample.getCadence() != -1) { - cadence += dataSample.getCadence(); - cadenceCount += 1; - ac.setCadence(dataSample.getCadence()); + //TODO: currently only for walking but I suppose it can be used for all workouts + if(summary.getNewSteps() && (type == ActivityKind.WALKING || type == ActivityKind.OUTDOOR_WALKING)) { + if (dataSample.getStepRate() != -1) { + ac.setCadence(dataSample.getStepRate()); + } + } else { + if (dataSample.getCadence() != -1) { + cadence += dataSample.getCadence(); + cadenceCount += 1; + ac.setCadence(dataSample.getCadence()); + } } if (dataSample.getStepLength() != -1) { stepLength += dataSample.getStepLength(); @@ -846,11 +847,11 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { // Average the things that should be averaged if (speedCount > 0) - speed = speed / speedCount; + speed = (int)((float)speed / speedCount); if (cadenceCount > 0) 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) stepLength = stepLength / stepLengthCount; if (groundContactTimeCount > 0) @@ -877,7 +878,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { 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); }