From d6ead66c3c3620ad204abd6d05058154852ce8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ing=2E=20Jan=20Kal=C3=A1b?= Date: Mon, 10 Aug 2015 09:46:02 +0200 Subject: [PATCH 1/2] Code and test --- .../com/squareup/seismic/ShakeDetector.java | 25 ++++++++++++++++--- .../squareup/seismic/ShakeDetectorTest.java | 15 +++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/com/squareup/seismic/ShakeDetector.java b/library/src/main/java/com/squareup/seismic/ShakeDetector.java index b4fc6c1..e0c77c6 100644 --- a/library/src/main/java/com/squareup/seismic/ShakeDetector.java +++ b/library/src/main/java/com/squareup/seismic/ShakeDetector.java @@ -109,12 +109,20 @@ public void setSensitivity(int accelerationThreshold) { this.accelerationThreshold = accelerationThreshold; } + /** Sets window size. */ + public void setWindowSize(long size) { + queue.setWindowSize(size); + } + /** Queue of samples. Keeps a running average. */ static class SampleQueue { + private static final long DEFAULT_MAX_WINDOW_SIZE = 500000000; // 0.5s + private static final long DEFAULT_MIN_WINDOW_SIZE = DEFAULT_MAX_WINDOW_SIZE >> 1; // 0.25s + /** Window size in ns. Used to compute the average. */ - private static final long MAX_WINDOW_SIZE = 500000000; // 0.5s - private static final long MIN_WINDOW_SIZE = MAX_WINDOW_SIZE >> 1; // 0.25s + private long maxWindowSize = DEFAULT_MAX_WINDOW_SIZE; + private long minWindowSize = DEFAULT_MIN_WINDOW_SIZE; /** * Ensure the queue size never falls below this size, even if the device @@ -138,7 +146,7 @@ static class SampleQueue { */ void add(long timestamp, boolean accelerating) { // Purge samples that proceed window. - purge(timestamp - MAX_WINDOW_SIZE); + purge(timestamp - maxWindowSize); // Add the sample to the queue. Sample added = pool.acquire(); @@ -191,6 +199,15 @@ void purge(long cutoff) { } } + /** Changes window size. */ + void setWindowSize(long size) { + maxWindowSize = size; + minWindowSize = maxWindowSize >> 1; + if (sampleCount > 0) { + purge(newest.timestamp - maxWindowSize); + } + } + /** Copies the samples into a list, with the oldest entry at index 0. */ List asList() { List list = new ArrayList(); @@ -209,7 +226,7 @@ List asList() { boolean isShaking() { return newest != null && oldest != null - && newest.timestamp - oldest.timestamp >= MIN_WINDOW_SIZE + && newest.timestamp - oldest.timestamp >= minWindowSize && acceleratingCount >= (sampleCount >> 1) + (sampleCount >> 2); } } diff --git a/library/src/test/java/com/squareup/seismic/ShakeDetectorTest.java b/library/src/test/java/com/squareup/seismic/ShakeDetectorTest.java index 31eb05f..a374918 100644 --- a/library/src/test/java/com/squareup/seismic/ShakeDetectorTest.java +++ b/library/src/test/java/com/squareup/seismic/ShakeDetectorTest.java @@ -71,4 +71,19 @@ private void assertContent(ShakeDetector.SampleQueue q, boolean... expected) { q.clear(); assertThat(q.isShaking()).isFalse(); } + + @Test public void testWindowSize() { + ShakeDetector.SampleQueue q = new ShakeDetector.SampleQueue(); + q.setWindowSize(4000000000L); + q.add(1000000000L, true); + q.add(2000000000L, true); + q.add(3000000000L, true); + q.add(4000000000L, true); + q.add(5000000000L, true); + q.add(6000000000L, true); + q.add(7000000000L, true); + assertThat(q.asList()).hasSize(5); + q.setWindowSize(1000000000L); + assertThat(q.asList()).hasSize(4); // MIN_QUEUE_SIZE + } } From 6a56ea2f1422616ed89d023a66c14ba6e55b4c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ing=2E=20Jan=20Kal=C3=A1b?= Date: Mon, 10 Aug 2015 10:03:46 +0200 Subject: [PATCH 2/2] Only purge when there is enough items --- library/src/main/java/com/squareup/seismic/ShakeDetector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/squareup/seismic/ShakeDetector.java b/library/src/main/java/com/squareup/seismic/ShakeDetector.java index e0c77c6..4c403c1 100644 --- a/library/src/main/java/com/squareup/seismic/ShakeDetector.java +++ b/library/src/main/java/com/squareup/seismic/ShakeDetector.java @@ -203,7 +203,7 @@ void purge(long cutoff) { void setWindowSize(long size) { maxWindowSize = size; minWindowSize = maxWindowSize >> 1; - if (sampleCount > 0) { + if (sampleCount > MIN_QUEUE_SIZE) { purge(newest.timestamp - maxWindowSize); } }