From 620528302e929f634db62079325acf23a3c29994 Mon Sep 17 00:00:00 2001 From: Leon Market Date: Wed, 24 May 2023 20:39:31 +0200 Subject: [PATCH 01/14] added Beschleunigungssensor --- .../Beschleunigungssensor.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java diff --git a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java new file mode 100644 index 0000000..e15dc5b --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java @@ -0,0 +1,86 @@ +package com.example.ueberwachungssystem; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.widget.TextView; +import com.example.ueberwachungssystem.Logger; + +public class Beschleunigungssensor extends AppCompatActivity implements SensorEventListener +{ + + private Logger logger; + private SensorManager sensorManager; + private int sensorType = Sensor.TYPE_ACCELEROMETER; + private Sensor sensor; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setTitle(this.getClass().getSimpleName()); + TextView textView = new TextView(this); + setContentView(textView); + + logger = new Logger(this.getClass().getSimpleName(),textView,""); + + sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); + if(sensorManager.getSensorList(sensorType).size()==0) + { + logger.log("Es gibt den gewünschten Sensor nicht"); + sensor = null; + } + else + { + sensor = sensorManager.getSensorList(sensorType).get(0); + } + } + + @Override + protected void onResume() + { + super.onResume(); + if(sensor != null) + { + if(sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME)) + { + logger.log("Wir haben uns beim Sensor angemeldet."); + } + else + { + logger.log("Das Anmelden beim Sensor hat nicht so gut geklappt"); + } + } + } + + @Override + protected void onPause() + { + super.onPause(); + if(sensor != null) { + sensorManager.unregisterListener(this, sensor); + logger.log("Wir haben uns beim Sensor abgemeldet"); + } + } + + @Override + public void onSensorChanged(SensorEvent event) + { + StringBuilder sb = new StringBuilder(); + sb.append("t=").append(event.timestamp) + .append("\nx=").append(event.values[0]) + .append("\ny=").append(event.values[1]) + .append("\nz=").append(event.values[2]); + logger.clearLog(); + logger.log(sb.toString()); + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) + { + } +} From 4999f1b99827960a425da38f087b1ae13985f022 Mon Sep 17 00:00:00 2001 From: Leon Market Date: Wed, 24 May 2023 20:39:31 +0200 Subject: [PATCH 02/14] added Detector, DetectorReport, Logger --- .../Beschleunigungssensor.java | 83 +++++++++++++++++++ .../ueberwachungssystem/DetectionReport.java | 36 ++++++++ .../example/ueberwachungssystem/Detector.java | 39 +++++++++ .../example/ueberwachungssystem/Logger.java | 44 ++++++++++ .../ueberwachungssystem/MainActivity.java | 7 +- app/src/main/res/layout/activity_main.xml | 2 +- 6 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java create mode 100644 app/src/main/java/com/example/ueberwachungssystem/DetectionReport.java create mode 100644 app/src/main/java/com/example/ueberwachungssystem/Detector.java create mode 100644 app/src/main/java/com/example/ueberwachungssystem/Logger.java diff --git a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java new file mode 100644 index 0000000..f15ae8e --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java @@ -0,0 +1,83 @@ +package com.example.ueberwachungssystem; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import android.widget.TextView; + +public class Beschleunigungssensor extends AppCompatActivity implements SensorEventListener +{ + private Logger logger; + private SensorManager sensorManager; + private int sensorType = Sensor.TYPE_ACCELEROMETER; + private Sensor sensor; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setTitle(this.getClass().getSimpleName()); + TextView textView = new TextView(this); + setContentView(textView); + + logger = new Logger(this.getClass().getSimpleName(),textView,""); + + sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); + if(sensorManager.getSensorList(sensorType).size()==0) + { + logger.log("Es gibt den gewünschten Sensor nicht"); + sensor = null; + } + else + { + sensor = sensorManager.getSensorList(sensorType).get(0); + } + } + + @Override + protected void onResume() + { + super.onResume(); + if(sensor != null) + { + if(sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME)) + { + logger.log("Wir haben uns beim Sensor angemeldet."); + } + else + { + logger.log("Das Anmelden beim Sensor hat nicht so gut geklappt"); + } + } + } + + @Override + protected void onPause() + { + super.onPause(); + if(sensor != null) { + sensorManager.unregisterListener(this, sensor); + logger.log("Wir haben uns beim Sensor abgemeldet"); + } + } + + @Override + public void onSensorChanged(SensorEvent event) + { + String sb = "t=" + event.timestamp + + "\nx=" + event.values[0] + // Wert legend: x = 0.04 + "\ny=" + event.values[1] + // Wert liegend: y = 0.44 + "\nz=" + event.values[2]; // Wert liegend: z = 9.90 = Erdbeschleunigung --> Wenn Ausrichtung unbekannt ist, müsste kalibrierung bei Start der Bewegungsüberwachung vorgenommen werden + logger.clearLog(); + logger.log(sb); + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) + { + } +} diff --git a/app/src/main/java/com/example/ueberwachungssystem/DetectionReport.java b/app/src/main/java/com/example/ueberwachungssystem/DetectionReport.java new file mode 100644 index 0000000..bfcb52c --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/DetectionReport.java @@ -0,0 +1,36 @@ +package com.example.ueberwachungssystem; + +import android.util.Log; + +import java.util.Calendar; + +/** Detection Report Class */ +public class DetectionReport { + public String timeStamp; + public String detectionType; + public float detectedValue; + public String detectorID; + + public DetectionReport(String detectorID, String detectionType, float detectedAmplitude) { + this.timeStamp = String.valueOf(Calendar.getInstance().getTime()); + this.detectionType = detectionType; + this.detectedValue = detectedAmplitude; + this.detectorID = detectorID; + } + + + /** Get Detection Report in String format */ + public String toString() { + String time = "Time: " + "[" + this.timeStamp + "]"; + String type = "Type: " + "[" + this.detectionType + "]"; + String value = "Value: " + "[" + this.detectedValue + "]"; + String id = "ID: " + "[" + this.detectorID + "]"; + + return String.join("\t", time, type, value, id); + } + + /** Debug Report */ + public void log(String tag) { + Log.d(tag, this.toString()); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/ueberwachungssystem/Detector.java b/app/src/main/java/com/example/ueberwachungssystem/Detector.java new file mode 100644 index 0000000..d09fe1f --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/Detector.java @@ -0,0 +1,39 @@ +package com.example.ueberwachungssystem; + +import android.content.Context; +import androidx.annotation.NonNull; + + +abstract public class Detector { + private OnDetectionListener listener; + + /** Constructor - takes context of current activity */ + public Detector(Context context) {}; + + + /** On Detection Listener - runs when violation is reported */ + public interface OnDetectionListener { + void onDetection(@NonNull DetectionReport detectionReport); + } + public void setOnDetectionListener(@NonNull OnDetectionListener listener) { + this.listener = listener; + } + + + /** Triggers onDetectionListener - call this to trigger violation/alarm */ + private void reportViolation(String detectorID, String detectionType, float amplitude) { + if (listener != null) { + DetectionReport detectionReport = new DetectionReport(detectorID, detectionType, amplitude); + listener.onDetection(detectionReport); + } else { + throw new IllegalStateException("No listener set for violation reporting"); + } + } + + + /** Starts Detection (abstract method: needs to be overridden in child class) */ + public abstract void startDetection(); + + /** Stops Detection (abstract method: needs to be overridden in child class) */ + public abstract void stopDetection(); +} \ No newline at end of file diff --git a/app/src/main/java/com/example/ueberwachungssystem/Logger.java b/app/src/main/java/com/example/ueberwachungssystem/Logger.java new file mode 100644 index 0000000..86299fb --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/Logger.java @@ -0,0 +1,44 @@ +package com.example.ueberwachungssystem; + +import android.widget.TextView; +import android.util.Log; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class Logger { + private TextView textView; + private StringBuffer sb = new StringBuffer(); + private String tag; + + public Logger(String tag, TextView textView, String logInitText) { + this.tag = tag; + this.textView = textView; + sb.append(logInitText); + } + + public void log(String s) { + Log.d(tag, s); + sb.append(s).append("\n"); + if (textView != null) { + textView.setText(sb.toString()); + } + } + public void log(Exception e) { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + log(sw.toString()); + } + + public void clearLog() { + sb.setLength(0); + if (textView != null) { + textView.setText(""); + } + } + + public String getLoggedText() { + return sb.toString(); + } +} + + diff --git a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java index f4fdae7..5a5c92a 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java +++ b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java @@ -4,11 +4,16 @@ import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; -public class MainActivity extends AppCompatActivity { +public class MainActivity extends AppCompatActivity{ + + private Logger logger; + private Beschleunigungssensor beschleunigungssensor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setTitle(this.getClass().getSimpleName()); setContentView(R.layout.activity_main); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 17eab17..7762181 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".MainActivityBackup"> Date: Wed, 14 Jun 2023 22:11:17 +0200 Subject: [PATCH 03/14] Added --- Neues Textdokument.txt | 0 app/src/main/AndroidManifest.xml | 2 +- .../Beschleunigungssensor.java | 146 +++++++++++++++++- .../ueberwachungssystem/MainActivity.java | 44 +++++- app/src/main/res/layout/activity_main.xml | 25 +++ build.gradle | 4 +- gradle.properties | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 213 insertions(+), 14 deletions(-) delete mode 100644 Neues Textdokument.txt diff --git a/Neues Textdokument.txt b/Neues Textdokument.txt deleted file mode 100644 index e69de29..0000000 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cef8f3d..c49da9f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:theme="@style/Theme.Ueberwachungssystem" tools:targetApi="31"> diff --git a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java index f15ae8e..7521863 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java +++ b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java @@ -1,21 +1,45 @@ package com.example.ueberwachungssystem; +import static java.lang.Math.sqrt; + import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import android.widget.TextView; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Collection; +import java.util.Deque; +import java.util.Iterator; +import java.util.OptionalDouble; +import java.util.Queue; + public class Beschleunigungssensor extends AppCompatActivity implements SensorEventListener { private Logger logger; private SensorManager sensorManager; - private int sensorType = Sensor.TYPE_ACCELEROMETER; + private static final int sensorType = Sensor.TYPE_LINEAR_ACCELERATION; private Sensor sensor; + //Matrizen für Datenverarbeitung: + double[] linear_acceleration = new double[3]; + int numberOfValues = 100; + double[][] calibrationMatrix = new double[3][numberOfValues]; + boolean alarm = false; + //Preallocate memory for the data of each axis of the acceleration sensor + double x; + double y; + double z; + double betrag; //Betrag aller drei Achsen sqrt(x*x + y*y + z*z) + @Override protected void onCreate(Bundle savedInstanceState) { @@ -44,7 +68,7 @@ public class Beschleunigungssensor extends AppCompatActivity implements SensorEv super.onResume(); if(sensor != null) { - if(sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME)) + if(sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL)) { logger.log("Wir haben uns beim Sensor angemeldet."); } @@ -65,15 +89,106 @@ public class Beschleunigungssensor extends AppCompatActivity implements SensorEv } } + private void checkAlarm (SensorEvent event) { + x = event.values[0]; + y = event.values[1]; + z = event.values[2]; + betrag = sqrt(x*x + y*y + z*z); + double schwelle = 1.5; + + if (!alarm) { + if (betrag > schwelle) { + logger.log("Betragswert über Schwelle erkannt, Alarm wird gleich angeschaltet"); + alarm = true; + logger.log("Alarm an"); + logger.log("Betrag: " + betrag + event.timestamp); + } + } else { + if (betrag < schwelle) { + logger.log("Alarm ist noch an; Neuer Betragswert unter Schwellwert: " + betrag); + alarm = false; + logger.log("Alarm wieder ausgeschaltet"); + } else { + logger.log("Betragswert immer noch über Schwellwert: " + betrag + "; Alarm bleibt an."); + } + } + } + int i = 0; + boolean stopp_mal = false; + @Override public void onSensorChanged(SensorEvent event) { - String sb = "t=" + event.timestamp + - "\nx=" + event.values[0] + // Wert legend: x = 0.04 + checkAlarm(event); + + //Alter Code, erstmal wild mit if statement ausgeschlossen + if (stopp_mal) { + if (i + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index f05eacf..41532d1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.4.2' apply false - id 'com.android.library' version '7.4.2' apply false + id 'com.android.application' version '8.0.0' apply false + id 'com.android.library' version '8.0.0' apply false } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 3e927b1..3a131ca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,6 @@ android.useAndroidX=true # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +android.defaults.buildfeatures.buildconfig=true +android.nonFinalResIds=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a5dbc0d..3a67f74 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu May 11 15:04:30 CEST 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 9e5b669986dd276078b25aae559b32bdcb29fa46 Mon Sep 17 00:00:00 2001 From: Leon Market Date: Wed, 14 Jun 2023 22:25:54 +0200 Subject: [PATCH 04/14] Added Accelerometer as Runnable Class and ThreadDemo as example --- .../ueberwachungssystem/Accelerometer.java | 124 ++++++++++++++++++ .../ueberwachungssystem/ThreadDemo.java | 70 ++++++++++ 2 files changed, 194 insertions(+) create mode 100644 app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java create mode 100644 app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java diff --git a/app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java b/app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java new file mode 100644 index 0000000..f3c92f4 --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java @@ -0,0 +1,124 @@ +package com.example.ueberwachungssystem; + + + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + + +public class Accelerometer implements Runnable, SensorEventListener { + + Logger logger; + private volatile boolean running = false; + public SensorManager sensorManager; + private int sensorType = Sensor.TYPE_ACCELEROMETER; + private Sensor accelerometer; + private Context context; + private Thread thread; + private String threadName = "Accelerometer Thread"; + double[] gravity = new double[3]; + double[] linear_acceleration = new double[3]; + private TextView textViewWorkerThread; + + // In constructor pass Context from MainActivity in Accelerometer class + public Accelerometer(Context context, TextView textViewWorkerThread){ + this.context = context; + this.textViewWorkerThread = textViewWorkerThread; + } + // Passing Activity's instance as argument on worker thread + AppCompatActivity activity; + public Accelerometer(AppCompatActivity activity){ + this.activity = activity; + } + + private void print (final String s){ + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + textViewWorkerThread.setText(s); + } + }); + } + + @Override + public void run() { + while (running) { + sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + if (sensorManager.getSensorList(sensorType).size() == 0) { + logger.log("Es gibt den gewünschten Sensor nicht"); + accelerometer = null; + } else { + accelerometer = sensorManager.getSensorList(sensorType).get(0); + } + } + } + void start(){ + logger.log("Starting" + threadName); + running = true; + thread = new Thread(this); + thread.setName(threadName); + thread.start(); + logger.log("alright, " + threadName + " started!"); + + // register the sensor before using // + sensorManager.registerListener((SensorEventListener) context, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); + logger.log("Accelerometer, du bist dran!"); + } + + void stop() { + // unregister from the sensor to stop using it // + sensorManager.unregisterListener((SensorEventListener) context, accelerometer); + logger.log("Das reicht Accelerometer, komm zurück!"); + if (!running){ + logger.log(threadName + " not running."); + } else { + logger.log("Stopping " + threadName); + running = false; + while (true) { + try { + thread.join(); + logger.log("..." + threadName + " stopped"); + break; + } catch (InterruptedException e){ + e.printStackTrace(); + } + } + } + } + + @Override + public void onSensorChanged(SensorEvent event) { + // Highpass filter to filter out gravity influence + final double alpha = 0.8; + + gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; + gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; + gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; + linear_acceleration[0] = event.values[0] - gravity[0]; + + linear_acceleration[1] = event.values[1] - gravity[1]; + linear_acceleration[2] = event.values[2] - gravity[2]; + + String sb = "t=" + event.timestamp + + "\nx=" + event.values[0] + // Wert liegend: x = 0.04 + "\ny=" + event.values[1] + // Wert liegend: y = 0.44 + "\nz=" + event.values[2] + // Wert liegend: z = 9.90 = Erdbeschleunigung --> Wenn Ausrichtung unbekannt ist, müsste kalibrierung bei Start der Bewegungsüberwachung vorgenommen werden + "\nlin_x=" + linear_acceleration[0] + + "\nlin_x=" + linear_acceleration[1] + + "\nlin_x=" + linear_acceleration[2]; + + logger.clearLog(); + logger.log(sb); + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java b/app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java new file mode 100644 index 0000000..91bf39e --- /dev/null +++ b/app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java @@ -0,0 +1,70 @@ +package com.example.ueberwachungssystem; + +import android.content.Context; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +public class ThreadDemo implements Runnable { + private volatile boolean running = false; + private Thread thread; + private String threadname = "testThread"; + Logger logger; + + // Passing Activity's instance as argument on worker thread + AppCompatActivity activity; + public ThreadDemo(AppCompatActivity activity){ + this.activity = activity; + } + + //Method print which delegates access on MainActivity to runOnUiThread + private void print(final String s) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + //textViewWorkerThread.setText(s); + } + }); + } + + @Override + public void run() { + int i = 0; + while (running) { + i++; + print(String.valueOf(i)); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + //print(activity.getString(R.string.workerThread) + " endet mit " + i); + } + + void start() { + logger.log("Starting " + threadname + "..."); + running = true; + thread = new Thread(this); + thread.setName(threadname); + thread.start(); + logger.log("..." + threadname + " started"); + } + void stop() { + if (!running) { + logger.log(threadname + " not running"); + } else { + logger.log("Stopping " + threadname + "..."); + running = false; + while(true){ + try { + thread.join(); + logger.log("... " + threadname + " stopped"); + break; + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } +} From 402b73e4bd91b0fd44b439c6fe9e0ceab78ed36c Mon Sep 17 00:00:00 2001 From: Leon Market Date: Wed, 14 Jun 2023 22:28:05 +0200 Subject: [PATCH 05/14] Removed calibration code and added method checkAlarm --- .../Beschleunigungssensor.java | 90 +------------------ 1 file changed, 1 insertion(+), 89 deletions(-) diff --git a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java index 7521863..e74d635 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java +++ b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java @@ -113,103 +113,15 @@ public class Beschleunigungssensor extends AppCompatActivity implements SensorEv } } } - int i = 0; - boolean stopp_mal = false; @Override public void onSensorChanged(SensorEvent event) { checkAlarm(event); - - //Alter Code, erstmal wild mit if statement ausgeschlossen - if (stopp_mal) { - if (i diff --git a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java index e74d635..d5fc8e2 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java +++ b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java @@ -28,11 +28,6 @@ public class Beschleunigungssensor extends AppCompatActivity implements SensorEv private SensorManager sensorManager; private static final int sensorType = Sensor.TYPE_LINEAR_ACCELERATION; private Sensor sensor; - - //Matrizen für Datenverarbeitung: - double[] linear_acceleration = new double[3]; - int numberOfValues = 100; - double[][] calibrationMatrix = new double[3][numberOfValues]; boolean alarm = false; //Preallocate memory for the data of each axis of the acceleration sensor double x; diff --git a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java index 0b13931..f3ba22b 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java +++ b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java @@ -4,6 +4,7 @@ import static java.lang.Boolean.TRUE; import androidx.appcompat.app.AppCompatActivity; +import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.TextView; @@ -12,10 +13,12 @@ import android.widget.ToggleButton; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Logger logger; + private Context context; //private Accelerometer beschleunigungssensor; - //private SensorManager sensorManager; + private ThreadDemo threadDemo; private TextView textViewLog; private TextView textViewWorkerThread; + //private WorkerUsingThread workerUsingThread; ToggleButton toggleButton1; @@ -32,7 +35,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1); //togglebutton um Thread zu steuern toggleButton1.setOnClickListener(this); textViewWorkerThread = (TextView) findViewById(R.id.textViewWorkerThread); //TextView um Thread zu überwachen - + // beschleunigungssensor = new Accelerometer(this); + threadDemo = new ThreadDemo(this, textViewWorkerThread); logger.log("onCreate"); } @@ -44,6 +48,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe protected void onPause() { super.onPause(); //beschleunigungssensor.stop(); + threadDemo.stop(); + } @@ -52,8 +58,11 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe logger.log("toggleButton1 is clicked"); if (toggleButton1.isChecked()) { logger.log("ToggleButton is ON"); + //beschleunigungssensor.start(); + threadDemo.start(); } else { logger.log("ToggleButton is OFF"); + threadDemo.stop(); } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java b/app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java index 91bf39e..70f69bb 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java +++ b/app/src/main/java/com/example/ueberwachungssystem/ThreadDemo.java @@ -9,20 +9,21 @@ public class ThreadDemo implements Runnable { private volatile boolean running = false; private Thread thread; private String threadname = "testThread"; - Logger logger; + //Logger logger; + TextView textViewWorkerThread; // Passing Activity's instance as argument on worker thread AppCompatActivity activity; - public ThreadDemo(AppCompatActivity activity){ + public ThreadDemo(AppCompatActivity activity, TextView textViewWorkerThread){ this.activity = activity; + this.textViewWorkerThread = textViewWorkerThread; } - //Method print which delegates access on MainActivity to runOnUiThread private void print(final String s) { activity.runOnUiThread(new Runnable() { @Override public void run() { - //textViewWorkerThread.setText(s); + textViewWorkerThread.setText(s); } }); } @@ -43,23 +44,23 @@ public class ThreadDemo implements Runnable { } void start() { - logger.log("Starting " + threadname + "..."); + //logger.log("Starting " + threadname + "..."); running = true; thread = new Thread(this); thread.setName(threadname); thread.start(); - logger.log("..." + threadname + " started"); + //logger.log("..." + threadname + " started"); } void stop() { if (!running) { - logger.log(threadname + " not running"); + //logger.log(threadname + " not running"); } else { - logger.log("Stopping " + threadname + "..."); + //logger.log("Stopping " + threadname + "..."); running = false; while(true){ try { thread.join(); - logger.log("... " + threadname + " stopped"); + //logger.log("... " + threadname + " stopped"); break; } catch (InterruptedException e) { e.printStackTrace(); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 33535a7..0726f26 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -10,7 +10,7 @@ android:id="@+id/textViewLog" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Hello World!" + android:text="TextViewLoggerMain" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -35,7 +35,7 @@ android:layout_marginStart="174dp" android:layout_marginTop="85dp" android:layout_marginEnd="179dp" - android:text="TextView" + android:text="textViewWorkerThreadTextView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/toggleButton1" /> From 2cff334056d53b94e538cde47707957b588a79bc Mon Sep 17 00:00:00 2001 From: Leon Market Date: Sat, 17 Jun 2023 19:00:44 +0200 Subject: [PATCH 07/14] Added detection report --- .../ueberwachungssystem/Accelerometer.java | 175 ++++++++++-------- .../Beschleunigungssensor.java | 3 +- .../ueberwachungssystem/MainActivity.java | 51 +++-- app/src/main/res/layout/activity_main.xml | 30 ++- 4 files changed, 159 insertions(+), 100 deletions(-) diff --git a/app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java b/app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java index f3c92f4..a8731bc 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java +++ b/app/src/main/java/com/example/ueberwachungssystem/Accelerometer.java @@ -1,6 +1,6 @@ package com.example.ueberwachungssystem; - +import static java.lang.Math.sqrt; import android.content.Context; import android.hardware.Sensor; @@ -11,114 +11,129 @@ import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; - -public class Accelerometer implements Runnable, SensorEventListener { +public class Accelerometer extends Detector implements SensorEventListener { Logger logger; + private volatile boolean running = false; public SensorManager sensorManager; - private int sensorType = Sensor.TYPE_ACCELEROMETER; + private static final int sensorType = Sensor.TYPE_LINEAR_ACCELERATION; private Sensor accelerometer; private Context context; - private Thread thread; - private String threadName = "Accelerometer Thread"; - double[] gravity = new double[3]; - double[] linear_acceleration = new double[3]; - private TextView textViewWorkerThread; - // In constructor pass Context from MainActivity in Accelerometer class - public Accelerometer(Context context, TextView textViewWorkerThread){ + private String threadName = "Accelerometer Thread"; + boolean alarm = false; + //Preallocate memory for the data of each axis of the acceleration sensor + float x; + float y; + float z; + float betrag; //Betrag aller drei Achsen sqrt(x*x + y*y + z*z) + private TextView textViewWorkerThread; + private AppCompatActivity activity; + private DetectionReport detectionReport; + + + // In constructor pass Activity, Context and TextView from MainActivity in Accelerometer class + public Accelerometer(Context context, Logger mainLogger, TextView textViewWorkerThread){ + super(context); //von Detektor + logger = mainLogger; this.context = context; this.textViewWorkerThread = textViewWorkerThread; - } - // Passing Activity's instance as argument on worker thread - AppCompatActivity activity; - public Accelerometer(AppCompatActivity activity){ - this.activity = activity; + Logger logger = new Logger(this.getClass().getSimpleName(), textViewWorkerThread, ""); } - private void print (final String s){ - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - textViewWorkerThread.setText(s); - } - }); - } - - @Override - public void run() { - while (running) { - sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); - if (sensorManager.getSensorList(sensorType).size() == 0) { - logger.log("Es gibt den gewünschten Sensor nicht"); - accelerometer = null; - } else { - accelerometer = sensorManager.getSensorList(sensorType).get(0); - } + public void getSensor(){ + sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE); + if(sensorManager.getSensorList(sensorType).size()==0) { + logger.log("Es gibt den gewünschten Sensor nicht"); + accelerometer = null; + } + else { + accelerometer = sensorManager.getSensorList(sensorType).get(0); + logger.log("Sensor gefunden"); } } - void start(){ - logger.log("Starting" + threadName); - running = true; - thread = new Thread(this); - thread.setName(threadName); - thread.start(); - logger.log("alright, " + threadName + " started!"); + + void start() { // register the sensor before using // - sensorManager.registerListener((SensorEventListener) context, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); - logger.log("Accelerometer, du bist dran!"); + sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); + logger.log("Accelerometer, start!"); } + void stop() { // unregister from the sensor to stop using it // - sensorManager.unregisterListener((SensorEventListener) context, accelerometer); - logger.log("Das reicht Accelerometer, komm zurück!"); - if (!running){ - logger.log(threadName + " not running."); - } else { - logger.log("Stopping " + threadName); - running = false; - while (true) { - try { - thread.join(); - logger.log("..." + threadName + " stopped"); - break; - } catch (InterruptedException e){ - e.printStackTrace(); - } - } - } + sensorManager.unregisterListener(this, accelerometer); + logger.log("Accelerometer unregistered!"); } + @Override public void onSensorChanged(SensorEvent event) { - // Highpass filter to filter out gravity influence - final double alpha = 0.8; + checkAlarm(event); + } - gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; - gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; - gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; - linear_acceleration[0] = event.values[0] - gravity[0]; + StringBuffer stringBuffer = new StringBuffer(); + public void checkAlarm (SensorEvent event) { + x = event.values[0]; + y = event.values[1]; + z = event.values[2]; + betrag = (float) sqrt(x*x + y*y + z*z); + double schwelle = 1.5; + //stringBuffer.append("\nBetrag =" + betrag); + //logger.log("Betrag" + betrag); - linear_acceleration[1] = event.values[1] - gravity[1]; - linear_acceleration[2] = event.values[2] - gravity[2]; - - String sb = "t=" + event.timestamp + - "\nx=" + event.values[0] + // Wert liegend: x = 0.04 - "\ny=" + event.values[1] + // Wert liegend: y = 0.44 - "\nz=" + event.values[2] + // Wert liegend: z = 9.90 = Erdbeschleunigung --> Wenn Ausrichtung unbekannt ist, müsste kalibrierung bei Start der Bewegungsüberwachung vorgenommen werden - "\nlin_x=" + linear_acceleration[0] + - "\nlin_x=" + linear_acceleration[1] + - "\nlin_x=" + linear_acceleration[2]; - - logger.clearLog(); - logger.log(sb); + if (!alarm) { + if (betrag > schwelle) { + stringBuffer.append("\n Betragswert über Schwelle, Detection Report wird gleich aufgerufen"); + //logger.log("Betragswert über Schwelle erkannt, Alarm wird gleich angeschaltet"); + alarm = true; + stringBuffer.append("\nAlarm = " + alarm); + detectionReport = new DetectionReport("Accelerometer1", "Bewegung", betrag); + stringBuffer.append("\nDetectionReport = " + detectionReport) + .append("\nAlarm an" + betrag + event.timestamp); + //logger.log("Alarm an"); + //logger.log("Betrag: " + betrag + event.timestamp); + logger.clearLog(); + logger.log(stringBuffer.toString()); + stringBuffer.delete(0, stringBuffer.length()); + } + } else { + if (betrag < schwelle) { + stringBuffer.append("\nAlarm noch an; Neuer Betragswert unter Schwellwert:" + betrag); + //logger.log("Alarm ist noch an; Neuer Betragswert unter Schwellwert: " + betrag); + alarm = false; + //logger.log("Alarm" + alarm); + //logger.log("Alarm wieder ausgeschaltet"); + stringBuffer.append("\nAlarm = " + alarm); + } else { + logger.log("Betragswert immer noch über Schwellwert: " + betrag + "; Alarm bleibt an."); + logger.log("Betragswert immer noch über Schwellwert: " + betrag + "; Alarm bleibt an."); + } + logger.clearLog(); + logger.log(stringBuffer.toString()); + stringBuffer.delete(0, stringBuffer.length()); + } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { + } + @Override + public void startDetection() { + // entspricht void start() + if (accelerometer != null) { + sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); + logger.log("Sensor registriert"); + } + } + + @Override + public void stopDetection() { + // entspricht void stop() + sensorManager.unregisterListener(this, accelerometer); + logger.log("Vom Sensor abgemeldet"); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java index d5fc8e2..64b41fa 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java +++ b/app/src/main/java/com/example/ueberwachungssystem/Beschleunigungssensor.java @@ -54,6 +54,7 @@ public class Beschleunigungssensor extends AppCompatActivity implements SensorEv else { sensor = sensorManager.getSensorList(sensorType).get(0); + logger.log("Accelerometer gefunden."); } } @@ -89,7 +90,7 @@ public class Beschleunigungssensor extends AppCompatActivity implements SensorEv y = event.values[1]; z = event.values[2]; betrag = sqrt(x*x + y*y + z*z); - double schwelle = 1.5; + double schwelle = 0.05; if (!alarm) { if (betrag > schwelle) { diff --git a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java index f3ba22b..de11afe 100644 --- a/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java +++ b/app/src/main/java/com/example/ueberwachungssystem/MainActivity.java @@ -5,8 +5,11 @@ import static java.lang.Boolean.TRUE; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; +import android.hardware.SensorEvent; import android.os.Bundle; +import android.text.method.ScrollingMovementMethod; import android.view.View; +import android.widget.Button; import android.widget.TextView; import android.widget.ToggleButton; @@ -14,14 +17,17 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe private Logger logger; private Context context; - //private Accelerometer beschleunigungssensor; - private ThreadDemo threadDemo; + private Accelerometer beschleunigungssensor; + //private ThreadDemo threadDemo; private TextView textViewLog; + private Button button1; private TextView textViewWorkerThread; + SensorEvent event; - //private WorkerUsingThread workerUsingThread; ToggleButton toggleButton1; + boolean currentAlarm; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -35,8 +41,16 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1); //togglebutton um Thread zu steuern toggleButton1.setOnClickListener(this); textViewWorkerThread = (TextView) findViewById(R.id.textViewWorkerThread); //TextView um Thread zu überwachen - // beschleunigungssensor = new Accelerometer(this); - threadDemo = new ThreadDemo(this, textViewWorkerThread); + textViewWorkerThread.setMovementMethod(new ScrollingMovementMethod()); + + //Button to clear Log while Debugging + button1 = (Button) findViewById(R.id.button1); + button1.setOnClickListener(this); + + //Accelerometer Setup + beschleunigungssensor = new Accelerometer(this, logger, textViewWorkerThread); + beschleunigungssensor.getSensor(); + logger.log("onCreate"); } @@ -48,21 +62,30 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe protected void onPause() { super.onPause(); //beschleunigungssensor.stop(); - threadDemo.stop(); + //threadDemo.stop(); } - @Override public void onClick(View v) { logger.log("toggleButton1 is clicked"); - if (toggleButton1.isChecked()) { - logger.log("ToggleButton is ON"); - //beschleunigungssensor.start(); - threadDemo.start(); - } else { - logger.log("ToggleButton is OFF"); - threadDemo.stop(); + if(v == toggleButton1) { + if (toggleButton1.isChecked()) { + logger.log("ToggleButton is ON"); + //beschleunigungssensor.start(); + beschleunigungssensor.startDetection(); + logger.log("Detection started"); + //logger.log(stringBuffer.toString()); + + } else { + logger.log("ToggleButton is OFF"); + //threadDemo.stop(); + //beschleunigungssensor.stop(); + beschleunigungssensor.stopDetection(); + logger.log("Detection stopped"); + } + } else if (v == button1) { + logger.clearLog(); } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0726f26..c3db55a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,17 +4,23 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivityBackup"> + tools:context=".MainActivity"> + app:layout_constraintTop_toBottomOf="@+id/textViewWorkerThread" + app:layout_constraintVertical_bias="0.0" /> +