From 5e5aaff9d4650f3ecd2d614c53022ad80b6b9e63 Mon Sep 17 00:00:00 2001 From: toni Date: Thu, 10 Oct 2019 19:16:58 +0200 Subject: [PATCH 1/2] quickfixes for lindenberg disable heart rate sensor, because you have to ask for permissions sequentially! so we have to create a class for all these requests now we only ask for location permission fixed ble stuff added some todos --- .idea/caches/build_file_checksums.ser | Bin 534 -> 591 bytes .idea/codeStyles/Project.xml | 116 ++++++++++++++++++ .idea/gradle.xml | 4 + .idea/misc.xml | 2 +- .idea/modules.xml | 4 +- app/build.gradle | 14 +-- app/src/main/AndroidManifest.xml | 3 +- .../indoor/sensorreadout/MainActivity.java | 16 +-- .../sensorreadout/sensors/PhoneSensors.java | 30 ++--- .../indoor/sensorreadout/sensors/iBeacon.java | 26 +++- 10 files changed, 176 insertions(+), 39 deletions(-) create mode 100644 .idea/codeStyles/Project.xml diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index e96d59a23f991ff59bbdd50be9dea49fb847e731..3b627419cbeddc3e37aff1c889752c02848051bd 100644 GIT binary patch delta 162 zcmV;T0A2r<1kVJJmj!LMr>3TnoQMGolkWi*5T3&`B7*@m=Q?iHgxcY%Fq4e|9UM8n zF`*l%9Z+J^pE4Co7Rz)1Brj-hZDlWXZ*G$>0XI8JFKupgFGOKX?kIFX>V>XQ)O;*Z*o#)VPtQ0bT5Fx&bZ$cyfL~r2qf` delta 143 zcmX@lGL2=zbk>}%i_E7c>M*)z8S!P1P?>&CHtI!f39}lT@0SlcJYil$er}T3X0Z z$H2zGz#zc0@reF{RWW-Df4=l6;yc1W*_%;TK-0)sBC#gzr25+;K1a!QUXvA=^z=#? d1QH7h^syUL%p%b0Ys2+!heL`|=H0nxD*!*oF@gX9 diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c7..ee635a3 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -3,6 +3,9 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 7bfef59..37a7509 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 36c117d..114d914 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,8 @@ - - + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0b1ebf4..fc32ebe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { defaultConfig { applicationId "de.fhws.indoor.sensorreadout" - minSdkVersion 19 - targetSdkVersion 23 + minSdkVersion 23 + targetSdkVersion 29 versionCode 1 versionName "1.0" multiDexEnabled true @@ -21,11 +21,11 @@ android { } dependencies { - implementation 'com.android.support:design:23.4.0' - compile fileTree(include: ['*.jar'], dir: 'libs') - testCompile 'junit:junit:4.12' - implementation 'com.android.support:appcompat-v7:23.4.0' - implementation 'com.google.android.gms:play-services:10.2.0' + implementation 'com.android.support:design:28.0.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + testImplementation 'junit:junit:4.12' + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.google.android.gms:play-services:12.0.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'org.apmem.tools:layouts:1.10@aar' //compile 'com.google.android.support:wearable:1.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index de7f3dc..553e304 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,10 +10,9 @@ - + - = Build.VERSION_CODES.LOLLIPOP) { diff --git a/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/PhoneSensors.java b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/PhoneSensors.java index ebd04e9..a3bc8bd 100644 --- a/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/PhoneSensors.java +++ b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/PhoneSensors.java @@ -24,7 +24,7 @@ import java.io.IOException; */ public class PhoneSensors extends mySensor implements SensorEventListener{ - private static final int SENSOR_TYPE_HEARTRATE = 65562; + //private static final int SENSOR_TYPE_HEARTRATE = 65562; private SensorManager sensorManager; private Sensor acc; @@ -34,7 +34,7 @@ public class PhoneSensors extends mySensor implements SensorEventListener{ private Sensor magnet; private Sensor press; private Sensor ori; - private Sensor heart; + //private Sensor heart; private Sensor humidity; private Sensor rotationVector; private Sensor light; @@ -61,7 +61,7 @@ public class PhoneSensors extends mySensor implements SensorEventListener{ magnet = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); press = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); ori = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); - heart = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); + //heart = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE); humidity = sensorManager.getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY); rotationVector = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); light = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); @@ -103,7 +103,7 @@ public class PhoneSensors extends mySensor implements SensorEventListener{ dumpSensor(sb, SensorType.ORIENTATION_OLD, ori); dumpSensor(sb, SensorType.LIGHT, light); dumpSensor(sb, SensorType.AMBIENT_TEMPERATURE, temperature); - dumpSensor(sb, SensorType.HEART_RATE, heart); + //dumpSensor(sb, SensorType.HEART_RATE, heart); dumpSensor(sb, SensorType.GAME_ROTATION_VECTOR, gameRotationVector); // write @@ -156,16 +156,16 @@ public class PhoneSensors extends mySensor implements SensorEventListener{ } - if(event.sensor.getType() == Sensor.TYPE_HEART_RATE) { - - // inform listeners - if (listener != null){ - listener.onData(SensorType.HEART_RATE, event.timestamp, - Float.toString(event.values[0]) - ); - } - - } +// if(event.sensor.getType() == Sensor.TYPE_HEART_RATE) { +// +// // inform listeners +// if (listener != null){ +// listener.onData(SensorType.HEART_RATE, event.timestamp, +// Float.toString(event.values[0]) +// ); +// } +// +// } else if(event.sensor.getType() == Sensor.TYPE_LIGHT) { @@ -410,7 +410,7 @@ public class PhoneSensors extends mySensor implements SensorEventListener{ registerIfPresent(magnet, SensorManager.SENSOR_DELAY_FASTEST); registerIfPresent(press, SensorManager.SENSOR_DELAY_FASTEST); registerIfPresent(ori, SensorManager.SENSOR_DELAY_FASTEST); - registerIfPresent(heart, SensorManager.SENSOR_DELAY_FASTEST); + //registerIfPresent(heart, SensorManager.SENSOR_DELAY_FASTEST); registerIfPresent(humidity, SensorManager.SENSOR_DELAY_FASTEST); registerIfPresent(rotationVector, SensorManager.SENSOR_DELAY_FASTEST); registerIfPresent(light, SensorManager.SENSOR_DELAY_FASTEST); diff --git a/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java index 9b78cdf..3597aba 100644 --- a/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java +++ b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java @@ -5,18 +5,24 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothManager; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.ScanCallback; +import android.bluetooth.le.ScanFilter; +import android.bluetooth.le.ScanSettings; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.widget.Toast; +import java.util.ArrayList; +import java.util.List; + /** * Created by Frank on 25.03.2015. */ public class iBeacon extends mySensor { - private BluetoothAdapter bt = null; - private BluetoothLeScanner scanner = null; + private BluetoothAdapter bt; + private BluetoothLeScanner scanner; + private static ScanSettings settings; private static final int REQUEST_ENABLE_BT = 1; private ScanCallback mLeScanCallback; @@ -35,7 +41,9 @@ public class iBeacon extends mySensor { bt = mgr.getAdapter(); // bluetooth supported? - if (bt == null) { + if (bt == null || !bt.isEnabled()) { + + //TODO: add something that asks the user to enable BLE. this need also be called in onResum() Toast.makeText(act, "Bluetooth not supported!", Toast.LENGTH_SHORT).show(); return; } @@ -53,9 +61,15 @@ public class iBeacon extends mySensor { } }; + settings = new ScanSettings.Builder() + .setReportDelay(0) + .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) + .setNumOfMatches(ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT) + .build(); + } - private final void enableBT(final Activity act) { + private void enableBT(final Activity act) { if (bt == null) {throw new RuntimeException("BT not supported!");} if (!bt.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); @@ -66,7 +80,9 @@ public class iBeacon extends mySensor { @Override public void onResume(final Activity act) { if (bt != null) { enableBT(act); - scanner.startScan(mLeScanCallback); + List filters = new ArrayList(); + scanner.startScan(filters, settings, mLeScanCallback); + //scanner.startScan(mLeScanCallback); } } From cb6677fb6a2982225a547f47b5a6eda5cdcc37d2 Mon Sep 17 00:00:00 2001 From: toni Date: Tue, 18 Feb 2020 16:44:37 +0100 Subject: [PATCH 2/2] letzter stand lindenberg mit unorderedlogger --- .idea/caches/build_file_checksums.ser | Bin 591 -> 591 bytes app/build.gradle | 2 +- .../indoor/sensorreadout/MainActivity.java | 4 +- .../sensors/UnorderedLogger.java | 190 ++++++++++++++++++ .../indoor/sensorreadout/sensors/iBeacon.java | 2 +- 5 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/de/fhws/indoor/sensorreadout/sensors/UnorderedLogger.java diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 3b627419cbeddc3e37aff1c889752c02848051bd..bb92e910b096c535ada091f71966242bfc44f37e 100644 GIT binary patch delta 62 zcmV-E0Kxyy1kVJJmj!TG?9jrIoXijkhk{shhd?R#C||y~!8oIncmYF`A_6RvxdB%Z Ur%rl|&HXcF3F-j_KePMUczJ0X`~Uy| delta 70 zcmV-M0J;Cq1kVJJmj!LMr>3TnoXik8zA>R2s2xyZ)1NXGOBTzMcmYF`=>b&}2(6&` c5`VCWIk2PVq^F@WbN~^PjsY8!*8va#cv2W0!vFvP diff --git a/app/build.gradle b/app/build.gradle index fc32ebe..dbb041f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "de.fhws.indoor.sensorreadout" - minSdkVersion 23 + minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" diff --git a/app/src/main/java/de/fhws/indoor/sensorreadout/MainActivity.java b/app/src/main/java/de/fhws/indoor/sensorreadout/MainActivity.java index f1b605a..e730976 100644 --- a/app/src/main/java/de/fhws/indoor/sensorreadout/MainActivity.java +++ b/app/src/main/java/de/fhws/indoor/sensorreadout/MainActivity.java @@ -39,6 +39,7 @@ import de.fhws.indoor.sensorreadout.sensors.LoggerRAM; import de.fhws.indoor.sensorreadout.sensors.PedestrianActivity; import de.fhws.indoor.sensorreadout.sensors.PedestrianActivityButton; import de.fhws.indoor.sensorreadout.sensors.PhoneSensors; +import de.fhws.indoor.sensorreadout.sensors.UnorderedLogger; import de.fhws.indoor.sensorreadout.sensors.WiFi; import de.fhws.indoor.sensorreadout.sensors.iBeacon; import de.fhws.indoor.sensorreadout.sensors.mySensor; @@ -54,7 +55,8 @@ public class MainActivity extends Activity { private final ArrayList sensors = new ArrayList(); //private final Logger logger = new Logger(this); - private final LoggerRAM logger = new LoggerRAM(this); + //private final LoggerRAM logger = new LoggerRAM(this); + private final UnorderedLogger logger = new UnorderedLogger(this); private Button btnStart; private Button btnStop; private Button btnGround; diff --git a/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/UnorderedLogger.java b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/UnorderedLogger.java new file mode 100644 index 0000000..ee81367 --- /dev/null +++ b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/UnorderedLogger.java @@ -0,0 +1,190 @@ +package de.fhws.indoor.sensorreadout.sensors; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.SystemClock; +import android.support.annotation.NonNull; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.PriorityQueue; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Semaphore; + +/** + * log sensor data to file + * Created by Frank on 25.03.2015. + * Re-Written by Markus on 20.06.2019. + */ +public final class UnorderedLogger { + + public static final long BEGINNING_TS = -1; + + private StringBuilder stringBuilder = new StringBuilder(); + private File file; + private FileOutputStream fos; + private Context context; + + private int entries = 0; + private int sizeTotal = 0; + private int currentSize = 0; + + private volatile boolean addingStopped = false; // Just to be sure + private ArrayBlockingQueue lineBuffer = new ArrayBlockingQueue<>(5000); + private WriteBackWorker writeBackWorker; + + /** timestamp of logging start. all entries are relative to this one */ + private long startTS = 0; + + public UnorderedLogger(Context context) { + this.context = context; + } + + /** start logging (caching a couple of entries in RAM) */ + public final void start() { + + // start empty + stringBuilder.setLength(0); + entries = 0; + sizeTotal = 0; + addingStopped = false; + writeBackWorker = new WriteBackWorker(); + + // starting timestamp + startTS = SystemClock.elapsedRealtimeNanos(); + + // open the output-file immediately (to get permission errors) + // but do NOT yet write anything to the file + final DataFolder folder = new DataFolder(context, "sensorOutFiles"); + file = new File(folder.getFolder(), startTS + ".csv"); + + try { + fos = new FileOutputStream(file); + Log.d("logger", "will write to: " + file.toString()); + } catch (final Exception e) { + throw new MyException("error while opening log-file", e); + } + writeBackWorker.start(); + } + + /** stop logging and flush RAM-data to the flash-chip */ + public final void stop() { + debug(true); + addingStopped = true; + // wait for flushing to succeed + try { + writeBackWorker.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + debug(true); + close(); + } + + public File getFile() { + return file; + } + + public int getCurrentBufferSize() {return currentSize;} + public int getTotalSize() {return sizeTotal;} + + public int getNumEntries() {return entries;} + + /** add a new CSV entry for the given sensor number to the internal buffer */ + public final void addCSV(final SensorType sensorNr, final long timestamp, final String csv) { + final long relTS = (timestamp == BEGINNING_TS) ? 0 : (timestamp - startTS); + if(relTS >= 0) { // drop pre startTS logs (at the beginning, sensors sometimes deliver old values) + if(addingStopped) { + // addCSV was called after calling stop(); + return; + } + + stringBuilder.append(relTS); // relative timestamp (uses less space) + stringBuilder.append(';'); + stringBuilder.append(sensorNr.id()); + stringBuilder.append(';'); + stringBuilder.append(csv); + stringBuilder.append('\n'); + ++entries; + LogEntry logEntry = new LogEntry(relTS, stringBuilder.toString()); + sizeTotal += logEntry.csv.length(); + currentSize += logEntry.csv.length(); + stringBuilder.setLength(0); + + + // Commit to line/flush buffer + lineBuffer.add(logEntry); + } + debug(false); + } + + private final void close() { + try { + fos.close(); + } catch (final Exception e) { + throw new MyException("error while writing log-file", e); + } + } + + public final long getStartTS() { + return startTS; + } + + int cnt = 0; + private final void debug(boolean force) { + if (++cnt % 1000 == 0 || force) { + Log.d("buffer", "size: " + lineBuffer.size() + " lines"); + } + } + + + + private static class LogEntry implements Comparable { + public long timestamp; + public String csv; + + public LogEntry(long timestamp, String csv) { + this.timestamp = timestamp; + this.csv = csv; + } + + @Override + public int compareTo(@NonNull LogEntry another) { + return (timestamp < another.timestamp) ? (-1) : (+1); + } + } + + private class WriteBackWorker extends Thread { + + public WriteBackWorker() { + setName("WriteBackWorker"); + setPriority(Thread.MIN_PRIORITY); + } + + @Override + public void run() { + try { + while (true) { + LogEntry entry = lineBuffer.poll(); + if (entry == null) { + if (addingStopped) { // Queue empty, recording stopped. exit + return; + } else { // Currently no line in queue, wait 10 ms + Thread.sleep(10); + } + } else { // print log line + fos.write(entry.csv.getBytes()); + } + } + } catch(InterruptedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + +} diff --git a/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java index 3597aba..3f3b2a7 100644 --- a/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java +++ b/app/src/main/java/de/fhws/indoor/sensorreadout/sensors/iBeacon.java @@ -64,7 +64,7 @@ public class iBeacon extends mySensor { settings = new ScanSettings.Builder() .setReportDelay(0) .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) - .setNumOfMatches(ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT) + //.setNumOfMatches(ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT) //comment this out for apk < 23 .build(); }