From 6cbdfbbe05bc6e0cfc0d4d503961024e679e7dfc Mon Sep 17 00:00:00 2001 From: OliE Date: Sat, 19 May 2018 14:14:46 +0200 Subject: [PATCH] added support for activity level --- .../bluetooth/BluetoothBeurerSanitas.java | 2 +- .../bluetooth/BluetoothExcelvanCF369BLE.java | 17 ++++++ .../core/datatypes/ScaleMeasurement.java | 22 +++++++- .../openscale/core/datatypes/ScaleUser.java | 9 ++-- .../openscale/core/utils/Converters.java | 48 +++++++++++++++++ .../gui/activities/UserSettingsActivity.java | 41 ++++++++++++++ .../main/res/layout/activity_usersettings.xml | 53 +++++++++++++++++++ .../app/src/main/res/values/strings.xml | 1 + 8 files changed, 187 insertions(+), 6 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothBeurerSanitas.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothBeurerSanitas.java index 98272c90..2b646a6d 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothBeurerSanitas.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothBeurerSanitas.java @@ -210,7 +210,7 @@ public class BluetoothBeurerSanitas extends BluetoothCommunication { int maxIdx = Math.min(3, selectedUser.getUserName().length()); byte[] nick = selectedUser.getUserName().toUpperCase().substring(0, maxIdx).getBytes(); - byte activity = 2; // activity level: 1 - 5 + byte activity = (byte)(selectedUser.getActivityLevel().toInt() + 1); // activity level: 1 - 5 Timber.d("Create User: %s", selectedUser.getUserName()); writeBytes(new byte[]{ diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java index d1f491bb..7b4faab3 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java @@ -20,6 +20,7 @@ import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCharacteristic; import android.content.Context; +import com.health.openscale.R; import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.datatypes.ScaleUser; @@ -58,8 +59,24 @@ public class BluetoothExcelvanCF369BLE extends BluetoothCommunication { byte userId = (byte) 0x01; byte sex = selectedUser.getGender().isMale() ? (byte) 0x01 : (byte) 0x00; + // 0x00 = ordinary, 0x01 = amateur, 0x02 = professional byte exerciseLevel = (byte) 0x01; + + switch (selectedUser.getActivityLevel()) { + case SEDENTARY: + case MILD: + exerciseLevel = (byte) 0x00; + break; + case MODERATE: + exerciseLevel = (byte) 0x01; + break; + case HEAVY: + case EXTREME: + exerciseLevel = (byte) 0x02; + break; + } + byte height = (byte) selectedUser.getBodyHeight(); byte age = (byte) selectedUser.getAge(); diff --git a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java index b774837a..ed8a66a4 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java +++ b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java @@ -22,6 +22,7 @@ import android.arch.persistence.room.ForeignKey; import android.arch.persistence.room.Index; import android.arch.persistence.room.PrimaryKey; +import com.health.openscale.R; import com.health.openscale.core.utils.Converters; import com.j256.simplecsv.common.CsvColumn; @@ -361,6 +362,25 @@ public class ScaleMeasurement implements Cloneable { public float getBMR(ScaleUser scaleUser) { float bmr; + float factor = 1.0f; + + switch (scaleUser.getActivityLevel()) { + case SEDENTARY: + factor = 1.2f; + break; + case MILD: + factor = 1.3f; + break; + case MODERATE: + factor = 1.5f; + break; + case HEAVY: + factor = 1.7f; + break; + case EXTREME: + factor = 1.9f; + break; + } // BMR formula by Mifflin, St Jeor et al: A new predictive equation for resting energy expenditure in healthy individuals if (scaleUser.getGender().isMale()) { @@ -369,7 +389,7 @@ public class ScaleMeasurement implements Cloneable { bmr = 10.0f * weight + 6.25f * scaleUser.getBodyHeight() - 5.0f * scaleUser.getAge(dateTime) - 161.0f; } - return bmr; // kCal / day + return bmr * factor; // kCal / day } public float getWHtR(float body_height) { diff --git a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleUser.java b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleUser.java index 71fff50f..083c5c6b 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleUser.java +++ b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleUser.java @@ -56,8 +56,9 @@ public class ScaleUser { @NonNull @ColumnInfo(name = "measureUnit") private Converters.MeasureUnit measureUnit; + @NonNull @ColumnInfo(name = "activityLevel") - private int activityLevel; + private Converters.ActivityLevel activityLevel; public ScaleUser() { userName = ""; @@ -69,7 +70,7 @@ public class ScaleUser { goalWeight = -1; goalDate = new Date(); measureUnit = Converters.MeasureUnit.CM; - activityLevel = 0; + activityLevel = Converters.ActivityLevel.SEDENTARY; } public int getId() { @@ -168,11 +169,11 @@ public class ScaleUser { return measureUnit; } - public void setActivityLevel(int level) { + public void setActivityLevel(Converters.ActivityLevel level) { activityLevel = level; } - public int getActivityLevel() { + public Converters.ActivityLevel getActivityLevel() { return activityLevel; } diff --git a/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java b/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java index 8e678048..1f755885 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java +++ b/android_app/app/src/main/java/com/health/openscale/core/utils/Converters.java @@ -107,6 +107,44 @@ public class Converters { } } + public enum ActivityLevel { + SEDENTARY, MILD, MODERATE, HEAVY, EXTREME; + + public static ActivityLevel fromInt(int unit) { + switch (unit) { + case 0: + return SEDENTARY; + case 1: + return MILD; + case 2: + return MODERATE; + case 3: + return HEAVY; + case 4: + return EXTREME; + } + + return SEDENTARY; + } + + public int toInt() { + switch (this) { + case SEDENTARY: + return 0; + case MILD: + return 1; + case MODERATE: + return 2; + case HEAVY: + return 3; + case EXTREME: + return 4; + } + + return 0; + } + } + private static final float KG_LB = 2.20462f; private static final float KG_ST = 0.157473f; private static final float CM_IN = 0.393701f; @@ -151,6 +189,16 @@ public class Converters { return gender.toInt(); } + @TypeConverter + public static ActivityLevel fromActivityLevelInt(int level) { + return ActivityLevel.fromInt(level); + } + + @TypeConverter + public static int toActivityLevelInt(ActivityLevel level) { + return level.toInt(); + } + public static float toCentimeter(float value, MeasureUnit unit) { switch (unit) { case INCH: diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java index 0bf1fae8..b5393b75 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java @@ -63,6 +63,7 @@ public class UserSettingsActivity extends BaseAppCompatActivity { private RadioGroup radioScaleUnit; private RadioGroup radioGender; private RadioGroup radioMeasurementUnit; + private RadioGroup radioActivityLevel; private final DateFormat dateFormat = DateFormat.getDateInstance(); @@ -86,6 +87,7 @@ public class UserSettingsActivity extends BaseAppCompatActivity { radioScaleUnit = findViewById(R.id.groupScaleUnit); radioGender = findViewById(R.id.groupGender); radioMeasurementUnit = findViewById(R.id.groupMeasureUnit); + radioActivityLevel = findViewById(R.id.groupActivityLevel); txtInitialWeight = findViewById(R.id.txtInitialWeight); txtGoalWeight = findViewById(R.id.txtGoalWeight); @@ -244,6 +246,24 @@ public class UserSettingsActivity extends BaseAppCompatActivity { radioGender.check(R.id.btnRadioWoman); break; } + + switch (scaleUser.getActivityLevel()) { + case SEDENTARY: + radioActivityLevel.check(R.id.btnRadioSedentary); + break; + case MILD: + radioActivityLevel.check(R.id.btnRadioMild); + break; + case MODERATE: + radioActivityLevel.check(R.id.btnRadioModerate); + break; + case HEAVY: + radioActivityLevel.check(R.id.btnRadioHeavy); + break; + case EXTREME: + radioActivityLevel.check(R.id.btnRadioExtreme); + break; + } } private boolean validateInput() @@ -389,6 +409,26 @@ public class UserSettingsActivity extends BaseAppCompatActivity { break; } + Converters.ActivityLevel activity_level = Converters.ActivityLevel.SEDENTARY; + + switch (radioActivityLevel.getCheckedRadioButtonId()) { + case R.id.btnRadioSedentary: + activity_level = Converters.ActivityLevel.SEDENTARY; + break; + case R.id.btnRadioMild: + activity_level = Converters.ActivityLevel.MILD; + break; + case R.id.btnRadioModerate: + activity_level = Converters.ActivityLevel.MODERATE; + break; + case R.id.btnRadioHeavy: + activity_level = Converters.ActivityLevel.HEAVY; + break; + case R.id.btnRadioExtreme: + activity_level = Converters.ActivityLevel.EXTREME; + break; + } + final ScaleUser scaleUser = new ScaleUser(); scaleUser.setUserName(name); @@ -396,6 +436,7 @@ public class UserSettingsActivity extends BaseAppCompatActivity { scaleUser.setBodyHeight(Converters.toCentimeter(body_height, measure_unit)); scaleUser.setScaleUnit(scale_unit); scaleUser.setMeasureUnit(measure_unit); + scaleUser.setActivityLevel(activity_level); scaleUser.setGender(gender); scaleUser.setInitialWeight(Converters.toKilogram(initial_weight, scale_unit)); scaleUser.setGoalWeight(Converters.toKilogram(goal_weight, scale_unit)); diff --git a/android_app/app/src/main/res/layout/activity_usersettings.xml b/android_app/app/src/main/res/layout/activity_usersettings.xml index dd3ed66f..4e07df20 100644 --- a/android_app/app/src/main/res/layout/activity_usersettings.xml +++ b/android_app/app/src/main/res/layout/activity_usersettings.xml @@ -168,6 +168,59 @@ + + + + + + + + + + + + + + + + + + + Abdominal skinfold Hip skinfold Measurement unit + Activity level