diff --git a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java index aef27819..e5921f34 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java +++ b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java @@ -61,11 +61,12 @@ public class OpenScale { return scaleDBEntries; } - public void addScaleData(String date_time, float weight, float fat, + public void addScaleData(int user_id, String date_time, float weight, float fat, float water, float muscle) { ScaleData scaleData = new ScaleData(); try { + scaleData.user_id = user_id; scaleData.date_time = dateTimeFormat.parse(date_time); scaleData.weight = weight; scaleData.fat = fat; @@ -103,11 +104,12 @@ public class OpenScale { ScaleData newScaleData = new ScaleData(); - newScaleData.date_time = dateTimeFormat.parse(csvField[0]); - newScaleData.weight = Float.parseFloat(csvField[1]); - newScaleData.fat = Float.parseFloat(csvField[2]); - newScaleData.water = Float.parseFloat(csvField[3]); - newScaleData.muscle = Float.parseFloat(csvField[4]); + newScaleData.user_id = Integer.parseInt(csvField[0]); + newScaleData.date_time = dateTimeFormat.parse(csvField[1]); + newScaleData.weight = Float.parseFloat(csvField[2]); + newScaleData.fat = Float.parseFloat(csvField[3]); + newScaleData.water = Float.parseFloat(csvField[4]); + newScaleData.muscle = Float.parseFloat(csvField[5]); scaleDB.insertEntry(newScaleData); @@ -133,6 +135,7 @@ public class OpenScale { OutputStreamWriter csvWriter = new OutputStreamWriter(outputStream); for (ScaleData scaleData : scaleDBEntries) { + csvWriter.append(Integer.toString(scaleData.user_id) + ","); csvWriter.append(dateTimeFormat.format(scaleData.date_time) + ","); csvWriter.append(Float.toString(scaleData.weight) + ","); csvWriter.append(Float.toString(scaleData.fat) + ","); @@ -237,6 +240,7 @@ public class OpenScale { try { int checksum = 0; + checksum ^= Integer.parseInt(csvField[0]); checksum ^= Integer.parseInt(csvField[1]); checksum ^= Integer.parseInt(csvField[2]); checksum ^= Integer.parseInt(csvField[3]); @@ -250,7 +254,8 @@ public class OpenScale { int btChecksum = Integer.parseInt(csvField[10]); if (checksum == btChecksum) { - scaleBtData.id = Long.parseLong(csvField[0]); + scaleBtData.id = -1; + scaleBtData.user_id = Integer.parseInt(csvField[0]); String date_string = csvField[1] + "/" + csvField[2] + "/" + csvField[3] + "/" + csvField[4] + "/" + csvField[5]; scaleBtData.date_time = new SimpleDateFormat("yyyy/MM/dd/HH/mm").parse(date_string); diff --git a/android_app/app/src/main/java/com/health/openscale/core/ScaleData.java b/android_app/app/src/main/java/com/health/openscale/core/ScaleData.java index 57607458..0525565c 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/ScaleData.java +++ b/android_app/app/src/main/java/com/health/openscale/core/ScaleData.java @@ -20,6 +20,7 @@ import java.util.Date; public class ScaleData { public long id; + public int user_id; public Date date_time; public float weight; public float fat; @@ -29,6 +30,6 @@ public class ScaleData { @Override public String toString() { - return "ID : " + id + " DATE_TIME: " + date_time.toString() + " WEIGHT: " + weight + " FAT: " + fat + " WATER: " + water + " MUSCLE: " + muscle; + return "ID : " + id + " USER_ID: " + user_id + " DATE_TIME: " + date_time.toString() + " WEIGHT: " + weight + " FAT: " + fat + " WATER: " + water + " MUSCLE: " + muscle; } } diff --git a/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java b/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java index 6904104f..2304446a 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java +++ b/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java @@ -36,6 +36,7 @@ public class ScaleDatabase extends SQLiteOpenHelper { private static final String TABLE_NAME = "scaledata"; private static final String COLUMN_NAME_ID = "id"; + private static final String COLUMN_NAME_USER_ID = "user_id"; private static final String COLUMN_NAME_DATE_TIME = "date_time"; private static final String COLUMN_NAME_WEIGHT = "weight"; private static final String COLUMN_NAME_FAT = "fat"; @@ -45,6 +46,7 @@ public class ScaleDatabase extends SQLiteOpenHelper { private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_NAME_ID + " INTEGER PRIMARY KEY," + + COLUMN_NAME_USER_ID + " INTEGER," + COLUMN_NAME_DATE_TIME + " TEXT UNIQUE," + COLUMN_NAME_WEIGHT + " REAL," + COLUMN_NAME_FAT + " REAL," + @@ -89,6 +91,7 @@ public class ScaleDatabase extends SQLiteOpenHelper { return false; } else { ContentValues values = new ContentValues(); + values.put(COLUMN_NAME_USER_ID, scaleData.user_id); values.put(COLUMN_NAME_DATE_TIME, formatDateTime.format(scaleData.date_time)); values.put(COLUMN_NAME_WEIGHT, scaleData.weight); values.put(COLUMN_NAME_FAT, scaleData.fat); @@ -195,6 +198,7 @@ public class ScaleDatabase extends SQLiteOpenHelper { String[] projection = { COLUMN_NAME_ID, + COLUMN_NAME_USER_ID, COLUMN_NAME_DATE_TIME, COLUMN_NAME_WEIGHT, COLUMN_NAME_FAT, @@ -228,6 +232,7 @@ public class ScaleDatabase extends SQLiteOpenHelper { ScaleData dataEntry = new ScaleData(); dataEntry.id = cursorScaleDB.getLong(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_ID)); + dataEntry.user_id = cursorScaleDB.getInt(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_USER_ID)); String date_time = cursorScaleDB.getString(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_DATE_TIME)); dataEntry.weight = cursorScaleDB.getFloat(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_WEIGHT)); dataEntry.fat = cursorScaleDB.getFloat(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_FAT)); @@ -256,6 +261,7 @@ public class ScaleDatabase extends SQLiteOpenHelper { String[] projection = { COLUMN_NAME_ID, + COLUMN_NAME_USER_ID, COLUMN_NAME_DATE_TIME, COLUMN_NAME_WEIGHT, COLUMN_NAME_FAT, @@ -282,6 +288,7 @@ public class ScaleDatabase extends SQLiteOpenHelper { ScaleData dataEntry = new ScaleData(); dataEntry.id = cursorScaleDB.getLong(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_ID)); + dataEntry.user_id = cursorScaleDB.getInt(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_USER_ID)); String date_time = cursorScaleDB.getString(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_DATE_TIME)); dataEntry.weight = cursorScaleDB.getFloat(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_WEIGHT)); dataEntry.fat = cursorScaleDB.getFloat(cursorScaleDB.getColumnIndexOrThrow(COLUMN_NAME_FAT)); @@ -291,7 +298,6 @@ public class ScaleDatabase extends SQLiteOpenHelper { dataEntry.date_time = formatDateTime.parse(date_time); scaleDBEntries.add(dataEntry); - //Log.d("ScaleDatabase", dataEntry.toString()); cursorScaleDB.moveToNext(); } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/NewEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/NewEntryActivity.java index 3d69faba..832a5841 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/NewEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/NewEntryActivity.java @@ -160,7 +160,8 @@ public class NewEntryActivity extends Activity { if (validateInput()) { OpenScale openScale = OpenScale.getInstance(context); - + + int user_id = 0; float weight = Float.valueOf(txtWeight.getText().toString()); float fat = Float.valueOf(txtFat.getText().toString()); float water = Float.valueOf(txtWater.getText().toString()); @@ -169,7 +170,7 @@ public class NewEntryActivity extends Activity { String date = txtDate.getText().toString(); String time = txtTime.getText().toString(); - openScale.addScaleData(date + " " + time, weight, fat, water, muscle); + openScale.addScaleData(user_id, date + " " + time, weight, fat, water, muscle); finish(); } diff --git a/arduino_mcu/openScale_MCU/openScale_MCU.ino b/arduino_mcu/openScale_MCU/openScale_MCU.ino index 08468e46..f4dfb7b4 100644 --- a/arduino_mcu/openScale_MCU/openScale_MCU.ino +++ b/arduino_mcu/openScale_MCU/openScale_MCU.ino @@ -73,12 +73,14 @@ int no_activity_cycles = 0; volatile boolean sleep_state = true; +int measured_user_id = -1; int measured_weight = -1; int measured_fat = -1; int measured_water = -1; int measured_muscle = -1; typedef struct scale_data{ + byte user_id; int year; byte month; byte day; @@ -217,8 +219,8 @@ void before_sleep_event() { Serial.println("$I$ going to sleep in 3 seconds!"); - if (measured_weight != -1 && measured_fat != -1 && measured_water != -1 && measured_muscle != -1) { - write_scale_data(measured_weight, measured_fat, measured_water, measured_muscle); + if (measured_user_id != -1 && measured_weight != -1 && measured_fat != -1 && measured_water != -1 && measured_muscle != -1) { + write_scale_data(measured_user_id, measured_weight, measured_fat, measured_water, measured_muscle); delay(100); } @@ -233,6 +235,7 @@ void after_sleep_event() { digitalWrite(EXT_SWITCH_PIN, HIGH); + measured_user_id = -1; measured_weight = -1; measured_fat = -1; measured_water = -1; @@ -299,6 +302,7 @@ int calc_checksum(struct scale_data* wdata) { int checksum = 0; + checksum ^= wdata->user_id; checksum ^= wdata->year; checksum ^= wdata->month; checksum ^= wdata->day; @@ -312,13 +316,14 @@ int calc_checksum(struct scale_data* wdata) return checksum; } -void write_scale_data(int weight, int fat, int water, int muscle) +void write_scale_data(int user_id, int weight, int fat, int water, int muscle) { int data_size = 0; struct scale_data wdata; eeprom.readBlock(0, (uint8_t*)&data_size, sizeof(data_size)); + wdata.user_id = user_id; wdata.year = year(); wdata.month = month(); wdata.day = day(); @@ -363,7 +368,7 @@ void send_scale_data() } Serial.print("$D$"); - Serial.print(i); + Serial.print(wdata.user_id); Serial.print(','); Serial.print(wdata.year); Serial.print(','); @@ -471,6 +476,10 @@ void loop() if (seg_value_4 == 'M') { measured_muscle = char_to_int(seg_value_1) + char_to_int(seg_value_2)*10 + char_to_int(seg_value_3)*100; } + + if (seg_value_4 == 'P') { + measured_user_id = char_to_int(seg_value_1) - 1; // user id starts by 0 + } sample_count = 0; } @@ -509,7 +518,7 @@ int char_to_int(char c) void print_debug_output() { - Serial.print("Debug Ausgabe\n"); + Serial.print("Debug output\n"); Serial.print("-----------------------------------\n"); Serial.print("\nSeg 1\n"); for (int i=0; i<4; i++)