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" /> +