From 813a02d5c7f1275d619afd618beab39cfbef286b Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Fri, 5 Jun 2015 19:32:09 +0200 Subject: [PATCH] Unify SleepMonitor with code from PR #59. Thanks Daniele! --- .../gadgetbridge/GBActivitySample.java | 4 +- .../gadgetbridge/SleepMonitorActivity.java | 64 ++++++++++++++----- .../gadgetbridge/pebble/MorpheuzSupport.java | 12 +++- 3 files changed, 59 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBActivitySample.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBActivitySample.java index 2e4ae9cc1..12160afe2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBActivitySample.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBActivitySample.java @@ -4,7 +4,9 @@ public class GBActivitySample { public static final byte PROVIDER_MIBAND = 0; public static final byte PROVIDER_PEBBLE_MORPHEUZ = 1; - public static final byte TYPE_SLEEP = 0; //FIXME: we could just adapt to Mi Band (Dont know the correct values) + public static final byte TYPE_DEEP_SLEEP = 5; + public static final byte TYPE_LIGHT_SLEEP = 4; + public static final byte TYPE_UNKNOWN = -1; // add more here private final int timestamp; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepMonitorActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepMonitorActivity.java index becefb4f4..c08b0c01a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepMonitorActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/SleepMonitorActivity.java @@ -96,9 +96,27 @@ public class SleepMonitorActivity extends Activity implements SurfaceHolder.Call int height = canvas.getHeight(); RectF r = new RectF(0.0f, 0.0f, 0.0f, height); - short last_movement = 5000; + float movement_divisor; + boolean annotate; + boolean use_steps_as_movement; + switch (provider) { + case GBActivitySample.PROVIDER_MIBAND: + movement_divisor = 256.0f; + annotate = false; // sample density to high? + use_steps_as_movement = true; + break; + default: // Morpheuz + movement_divisor = 5000.0f; + annotate = true; + use_steps_as_movement = false; + break; + } + + byte last_type = GBActivitySample.TYPE_UNKNOWN; + for (int i = 0; i < samples.size(); i++) { GBActivitySample sample = samples.get(i); + byte type = sample.getType(); if (i == 0) { cal.setTimeInMillis((long) sample.getTimestamp() * 1000L); @@ -109,30 +127,42 @@ public class SleepMonitorActivity extends Activity implements SurfaceHolder.Call date = cal.getTime(); dateStringTo = new SimpleDateFormat("dd.MM.yyyy HH:mm").format(date); } - boolean annotate = false; + short movement = sample.getIntensity(); r.left = r.right; r.right = (float) (i + 1) / (samples.size()) * width; - r.top = (1.0f - (float) movement / 5000.0f) * height; - if (movement > 1000) { - paint.setColor(Color.RED); - if (last_movement <= 1000) { - annotate = true; - } - } else if (movement > 120) { - paint.setColor(Color.YELLOW); + if (type == GBActivitySample.TYPE_DEEP_SLEEP) { + paint.setColor(Color.BLUE); + r.top = 0.98f * height; } else { - paint.setColor(Color.GREEN); + if (type == GBActivitySample.TYPE_LIGHT_SLEEP) { + paint.setColor(Color.CYAN); + } else { + if (use_steps_as_movement) { + movement = sample.getSteps(); + } + paint.setColor(Color.YELLOW); + } + r.top = (1.0f - (float) movement / movement_divisor) * height; } + canvas.drawRect(r, paint); + boolean annotate_this = false; if (annotate) { - cal.setTimeInMillis((long) (sample.getTimestamp()) * 1000L); - date = cal.getTime(); - String dateString = new SimpleDateFormat("HH:mm").format(date); - paint.setColor(Color.WHITE); - canvas.drawText(dateString, r.left - 20, r.top - 20, paint); + if (type != GBActivitySample.TYPE_DEEP_SLEEP && type != GBActivitySample.TYPE_LIGHT_SLEEP && + (last_type == GBActivitySample.TYPE_DEEP_SLEEP || last_type == GBActivitySample.TYPE_LIGHT_SLEEP)) { + // seems that we woke up + annotate_this = true; + } + if (annotate_this) { + cal.setTimeInMillis((long) (sample.getTimestamp()) * 1000L); + date = cal.getTime(); + String dateString = new SimpleDateFormat("HH:mm").format(date); + paint.setColor(Color.WHITE); + canvas.drawText(dateString, r.left - 20, r.top - 20, paint); + } + last_type = type; } - last_movement = movement; } textView.setText(dateStringFrom + " to " + dateStringTo); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/pebble/MorpheuzSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/pebble/MorpheuzSupport.java index 7c83fe1e2..6c0fc789d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/pebble/MorpheuzSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/pebble/MorpheuzSupport.java @@ -98,10 +98,16 @@ public class MorpheuzSupport { ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_GONEOFF_DONE | MorpheuzSupport.CTRL_TRANSMIT_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT; } else { short index = (short) ((int) pair.second >> 16); - short data = (short) ((int) pair.second & 0xffff); - LOG.info("got point:" + index + " " + data); + short intensity = (short) ((int) pair.second & 0xffff); + LOG.info("got point:" + index + " " + intensity); + byte type = GBActivitySample.TYPE_UNKNOWN; + if (intensity <= 120) { + type = GBActivitySample.TYPE_DEEP_SLEEP; + } else if (intensity <= 1000) { + type = GBActivitySample.TYPE_LIGHT_SLEEP; + } if (index >= 0 && index < 54) { - GBApplication.getActivityDatabaseHandler().addGBActivitySample(recording_base_timestamp + index * 600, GBActivitySample.PROVIDER_PEBBLE_MORPHEUZ, data, (byte) 0, GBActivitySample.TYPE_SLEEP); + GBApplication.getActivityDatabaseHandler().addGBActivitySample(recording_base_timestamp + index * 600, GBActivitySample.PROVIDER_PEBBLE_MORPHEUZ, intensity, (byte) 0, type); } ctrl_message = MorpheuzSupport.CTRL_VERSION_DONE | MorpheuzSupport.CTRL_SET_LAST_SENT | MorpheuzSupport.CTRL_DO_NEXT;