1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-16 18:10:17 +02:00

[Huawei] Fix PR #3742, add workout frequency and altitude

This commit is contained in:
Martin.JM 2024-05-01 18:15:34 +02:00 committed by José Rebelo
parent 2d32822ff8
commit 83fd09939f
6 changed files with 123 additions and 3 deletions

View File

@ -45,7 +45,7 @@ public class GBDaoGenerator {
public static void main(String[] args) throws Exception {
final Schema schema = new Schema(72, MAIN_PACKAGE + ".entities");
final Schema schema = new Schema(73, MAIN_PACKAGE + ".entities");
Entity userAttributes = addUserAttributes(schema);
Entity user = addUserInfo(schema, userAttributes);
@ -1170,6 +1170,9 @@ public class GBDaoGenerator {
workoutDataSample.addShortProperty("calories").notNull();
workoutDataSample.addShortProperty("cyclingPower").notNull();
workoutDataSample.addShortProperty("frequency").notNull();
workoutDataSample.addIntProperty("altitude");
return workoutDataSample;
}

View File

@ -0,0 +1,43 @@
/* Copyright (C) 2024 Martin.JM
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.database.schema;
import android.database.sqlite.SQLiteDatabase;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.database.DBUpdateScript;
import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiWorkoutDataSampleDao;
public class GadgetbridgeUpdate_73 implements DBUpdateScript {
@Override
public void upgradeSchema(final SQLiteDatabase db) {
if (!DBHelper.existsColumn(HuaweiWorkoutDataSampleDao.TABLENAME, HuaweiWorkoutDataSampleDao.Properties.Frequency.columnName, db)) {
final String statement = "ALTER TABLE " + HuaweiWorkoutDataSampleDao.TABLENAME + " ADD COLUMN \""
+ HuaweiWorkoutDataSampleDao.Properties.Frequency.columnName + "\" INTEGER NOT NULL DEFAULT -1";
db.execSQL(statement);
}
if (!DBHelper.existsColumn(HuaweiWorkoutDataSampleDao.TABLENAME, HuaweiWorkoutDataSampleDao.Properties.Altitude.columnName, db)) {
final String statement = "ALTER TABLE " + HuaweiWorkoutDataSampleDao.TABLENAME + " ADD COLUMN \""
+ HuaweiWorkoutDataSampleDao.Properties.Altitude.columnName + "\" INTEGER DEFAULT NULL";
db.execSQL(statement);
}
}
@Override
public void downgradeSchema(final SQLiteDatabase db) {
}
}

View File

@ -241,6 +241,8 @@ public class Workout {
public short calories = -1;
public short cyclingPower = -1;
public short frequency = -1;
public Integer altitude = null;
public int timestamp = -1; // Calculated timestamp for this data point
@ -264,6 +266,8 @@ public class Workout {
", strokeRate=" + strokeRate +
", calories=" + calories +
", cyclingPower=" + cyclingPower +
", frequency=" + frequency +
", altitude=" + altitude +
", timestamp=" + timestamp +
'}';
}
@ -372,6 +376,9 @@ public class Workout {
case 4:
data.strokeRate = buf.getShort();
break;
case 5:
data.altitude = buf.getInt();
break;
case 6:
// Inner data, parsing into data
// TODO: function for readability?
@ -419,6 +426,9 @@ public class Workout {
data.calories = buf.getShort();
break;
case 8:
data.frequency = buf.getShort();
break;
case 9:
data.cyclingPower = buf.getShort();
break;
default:

View File

@ -1515,7 +1515,9 @@ public class HuaweiSupportProvider {
data.strokeRate,
unknown,
data.calories,
data.cyclingPower
data.cyclingPower,
data.frequency,
data.altitude
);
dao.insertOrReplace(dataSample);
}

View File

@ -108,7 +108,9 @@ public class HuaweiWorkoutGbParser {
responseData.strokeRate,
dataErrorHex,
responseData.calories,
responseData.cyclingPower
responseData.cyclingPower,
responseData.frequency,
responseData.altitude
);
dbHandler.getDaoSession().getHuaweiWorkoutDataSampleDao().insertOrReplace(dataSample);
@ -308,6 +310,13 @@ public class HuaweiWorkoutGbParser {
int maxCyclingPower = 0;
int cyclingPower = 0;
int cyclingPowerCount = 0;
int avgAltitude = 0;
int altitudeCount = 0;
int minAltitude = 0;
int maxAltitude = 0;
Integer previousAlt = null;
int sumAltitudeUp = 0;
int sumAltitudeDown = 0;
for (HuaweiWorkoutDataSample dataSample : dataSamples) {
if (dataSample.getSpeed() != -1) {
speed += dataSample.getSpeed();
@ -391,6 +400,22 @@ public class HuaweiWorkoutGbParser {
if (cp < minCyclingPower)
minCyclingPower = cp;
}
if (dataSample.getAltitude() != null) {
int alt = dataSample.getAltitude();
avgAltitude += alt;
altitudeCount += 1;
if (alt > maxAltitude)
maxAltitude = alt;
if (alt < minAltitude)
minAltitude = alt;
if (previousAlt != null) {
if (alt > previousAlt)
sumAltitudeUp += alt - previousAlt;
else if (alt < previousAlt)
sumAltitudeDown += previousAlt - alt;
}
previousAlt = alt;
}
if (dataSample.getDataErrorHex() != null)
unknownData = true;
}
@ -420,6 +445,8 @@ public class HuaweiWorkoutGbParser {
heartRate = heartRate / heartRateCount;
if (cyclingPowerCount > 0)
cyclingPower = cyclingPower / cyclingPowerCount;
if (altitudeCount > 0)
avgAltitude = avgAltitude / altitudeCount;
if (speedCount > 0) {
JSONObject speedJson = new JSONObject();
@ -578,6 +605,33 @@ public class HuaweiWorkoutGbParser {
maxCyclingPowerJson.put("unit", "");
jsonObject.put(ActivitySummaryEntries.CYCLING_POWER_MAX, maxCyclingPowerJson);
}
if (altitudeCount > 0) {
JSONObject avgAltitudeJson = new JSONObject();
avgAltitudeJson.put("value", avgAltitude);
avgAltitudeJson.put("unit", "");
jsonObject.put(ActivitySummaryEntries.ALTITUDE_AVG, avgAltitudeJson);
JSONObject minAltitudeJson = new JSONObject();
minAltitudeJson.put("value", minAltitude);
minAltitudeJson.put("unit", "");
jsonObject.put(ActivitySummaryEntries.ALTITUDE_MIN, minAltitudeJson);
JSONObject maxAltitudeJson = new JSONObject();
maxAltitudeJson.put("value", maxAltitude);
maxAltitudeJson.put("unit", "");
jsonObject.put(ActivitySummaryEntries.ALTITUDE_MAX, maxAltitudeJson);
JSONObject sumUpAltitudeJson = new JSONObject();
sumUpAltitudeJson.put("value", sumAltitudeUp);
sumUpAltitudeJson.put("unit", "");
jsonObject.put(ActivitySummaryEntries.ELEVATION_GAIN, sumUpAltitudeJson);
JSONObject sumDownAltitudeJson = new JSONObject();
sumDownAltitudeJson.put("value", sumAltitudeDown);
sumDownAltitudeJson.put("unit", "");
jsonObject.put(ActivitySummaryEntries.ELEVATION_LOSS, sumDownAltitudeJson);
}
}
try (CloseableListIterator<HuaweiWorkoutPaceSample> it = qbPace.build().listIterator()) {

View File

@ -259,6 +259,14 @@ public class TestWorkout {
byte backFootLanding2 = 0x26;
byte eversionAngle2 = 0x27;
// TODO: Add:
// - swolf
// - stoke rate
// - calories
// - cycling power
// - frequency
// - altitude
ByteBuffer headerBuf = ByteBuffer.allocate(14);
headerBuf.putShort(workoutNumber);
headerBuf.putShort(dataNumber);