Merge branch 'master' into copie

# Conflicts:
#	app/src/main/java/com/example/ueberwachungssystem/Detection/DetectorService.java
#	app/src/main/java/com/example/ueberwachungssystem/MainActivity.java
This commit is contained in:
Miguel Siebenhaar 2023-06-21 13:29:54 +02:00
commit 5a0aab0176
14 changed files with 334 additions and 132 deletions

View File

@ -1,8 +1,13 @@
package com.example.ueberwachungssystem.Detection; package com.example.ueberwachungssystem.Detection;
import android.annotation.SuppressLint;
import android.util.Log; import android.util.Log;
import com.example.ueberwachungssystem.WifiCommunication;
import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date;
/** Detection Report Class */ /** Detection Report Class */
public class DetectionReport { public class DetectionReport {
@ -12,7 +17,11 @@ public class DetectionReport {
public boolean detectionState; public boolean detectionState;
public DetectionReport(boolean detectionState, String detectionType, float detectedAmplitude) { public DetectionReport(boolean detectionState, String detectionType, float detectedAmplitude) {
this.timeStamp = String.valueOf(Calendar.getInstance().getTime()); // New Date Format
@SuppressLint("SimpleDateFormat") SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());
this.timeStamp = formatter.format(curDate);
//Old Date Format: this.timeStamp = String.valueOf(Calendar.getInstance().getTime());
this.detectionType = detectionType; this.detectionType = detectionType;
this.detectedValue = detectedAmplitude; this.detectedValue = detectedAmplitude;
this.detectionState = detectionState; this.detectionState = detectionState;
@ -31,6 +40,16 @@ public class DetectionReport {
return String.join("\t", state, time, type, value); return String.join("\t", state, time, type, value);
} }
public String toMessage() {
String state;
if(detectionState)
state = "An";
else
state = "Aus";
return String.join(",", "1", timeStamp, "Gruppe2", WifiCommunication.getLocalIpAddress(), state, detectionType, String.valueOf(detectedValue));
}
/** Debug Report */ /** Debug Report */
public void log(String tag) { public void log(String tag) {
Log.d(tag, this.toString()); Log.d(tag, this.toString());

View File

@ -22,10 +22,11 @@ public class DetectorService extends LifecycleService {
private DetectorService.OnDetectionListener listener; private DetectorService.OnDetectionListener listener;
private boolean isServiceRunning = false; private boolean isServiceRunning = false;
VideoDetector videoDetector = null; // Used Objects:
AudioRecorder audioRecorder = null; public VideoDetector videoDetector = null;
public AudioRecorder audioRecorder = null;
/** Communication **/ public Accelerometer motionDetector = null;
public MicrophoneDetector audioDetector = null;
WifiCommunication wifiCommunication; WifiCommunication wifiCommunication;
@ -37,7 +38,9 @@ public class DetectorService extends LifecycleService {
return START_NOT_STICKY; return START_NOT_STICKY;
// Setup Service classes:
/** Video Detection/Recorder **/
videoDetector = new VideoDetector(this); videoDetector = new VideoDetector(this);
videoDetector.setOnDetectionListener(new Detector.OnDetectionListener() { videoDetector.setOnDetectionListener(new Detector.OnDetectionListener() {
@Override @Override
@ -45,10 +48,31 @@ public class DetectorService extends LifecycleService {
passToServiceListener(detectionReport); passToServiceListener(detectionReport);
} }
}); });
/** Motion Detection**/
motionDetector = new Accelerometer(this);
motionDetector.getSensor();
motionDetector.setOnDetectionListener(new Detector.OnDetectionListener() {
@Override
public void onDetection(@NonNull DetectionReport detectionReport) {
passToServiceListener(detectionReport);
}
});
/** Audio Detection **/
audioDetector = new MicrophoneDetector(this);
audioDetector.setOnDetectionListener(new Detector.OnDetectionListener() {
@Override
public void onDetection(@NonNull DetectionReport detectionReport) {
passToServiceListener(detectionReport);
}
});
/** Audio Recorder**/
audioRecorder = new AudioRecorder(this); audioRecorder = new AudioRecorder(this);
isServiceRunning = true; isServiceRunning = true;
wifiCommunication = new WifiCommunication (1234); wifiCommunication = new WifiCommunication (1234);
@ -61,6 +85,7 @@ public class DetectorService extends LifecycleService {
}); });
return super.onStartCommand(intent, flags, startId); return super.onStartCommand(intent, flags, startId);
} }
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
@ -82,81 +107,7 @@ public class DetectorService extends LifecycleService {
} }
/** Video Detection */ /** Pass Detection Report to Service Detection Listener and trigger it */
public void startVideoDetection() {
if(videoDetector != null)
videoDetector.startDetection();
}
public void stopVideoDetection() {
if(videoDetector != null)
videoDetector.stopDetection();
}
public boolean isVideoDetectionRunning() {
if(videoDetector != null)
return videoDetector.isDetecting();
return false;
}
public void debugVideoProcessing(ImageView input, ImageView output) {
if(videoDetector != null)
videoDetector.debugProcessing(input, output);
}
/** Audio Detection */
public void startAudioDetection() {
}
public void stopAudioDetection() {
}
/** Motion Detection */
public void startMotionDetection() {
}
public void stopMotionDetection() {
}
/** Video Recording */
public void startVideoRecording() {
if(videoDetector != null)
videoDetector.startRecording();
}
public void stopVideoRecording() {
if(videoDetector != null)
videoDetector.stopRecording();
}
public boolean isVideoRecordingRunning() {
if(videoDetector != null)
return videoDetector.isRecording();
return false;
}
public void setVideoRecordingDir(File outputDir) {
if (videoDetector != null)
videoDetector.setOutputDir(outputDir);
}
/** Audio Recording */
public void startAudioRecording() {
if(audioRecorder != null)
audioRecorder.startRecording();
}
public void stopAudioRecording() {
if(audioRecorder != null)
audioRecorder.stopRecording();
}
public boolean isAudioRecordingRunning() {
if(videoDetector != null)
return audioRecorder.isRecording();
return false;
}
public void setAudioRecordingDir(File outputDir) {
if (audioRecorder != null)
audioRecorder.setOutputDir(outputDir);
}
/** pass Detection Report to Service Detection Listener and trigger it */
public void passToServiceListener(DetectionReport detectionReport) { public void passToServiceListener(DetectionReport detectionReport) {
if (listener != null) { if (listener != null) {
listener.onDetection(detectionReport); listener.onDetection(detectionReport);

View File

@ -2,24 +2,16 @@ package com.example.ueberwachungssystem.Detection;
import static java.lang.Math.*; import static java.lang.Math.*;
import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.media.AudioFormat; import android.media.AudioFormat;
import android.media.AudioRecord; import android.media.AudioRecord;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.example.ueberwachungssystem.Detection.Signalverarbeitung.Complex; import com.example.ueberwachungssystem.Detection.Signalverarbeitung.Complex;
import com.example.ueberwachungssystem.Detection.Signalverarbeitung.FFT; import com.example.ueberwachungssystem.Detection.Signalverarbeitung.FFT;
import com.example.ueberwachungssystem.Detection.DetectionReport;
import com.example.ueberwachungssystem.Detection.Detector;
public class MicrophoneDetector extends Detector { public class MicrophoneDetector extends Detector {
/** /**
@ -28,11 +20,9 @@ public class MicrophoneDetector extends Detector {
* @param context * @param context
*/ */
private static final int RECHTEANFORDERUNG_MIKROFON = 1;
private AufnahmeTask aufnahmeTask; private AufnahmeTask aufnahmeTask;
public boolean armed = false; public boolean armed = false;
public int Schwellwert_Alarm = 100; public int schwellwertAlarm = 100;
private Context context; private Context context;
public MicrophoneDetector(Context context) { public MicrophoneDetector(Context context) {
@ -58,12 +48,17 @@ public class MicrophoneDetector extends Detector {
private final int sampleRateInHz = 44100; private final int sampleRateInHz = 44100;
private final int channelConfig = AudioFormat.CHANNEL_IN_MONO; private final int channelConfig = AudioFormat.CHANNEL_IN_MONO;
private final int audioFormat = AudioFormat.ENCODING_PCM_16BIT; private final int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private final int startDelay = 20000;
private final int threadSleeptime = 10;
private int minPufferGroesseInBytes; private int minPufferGroesseInBytes;
private int pufferGroesseInBytes; private int pufferGroesseInBytes;
private RingPuffer ringPuffer = new RingPuffer(10); private RingPuffer ringPuffer = new RingPuffer(10);
private float kalibierWert; private float kalibierWert;
private com.example.ueberwachungssystem.Detection.DetectionReport detectionReport; private com.example.ueberwachungssystem.Detection.DetectionReport detectionReport;
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
AufnahmeTask() { AufnahmeTask() {
minPufferGroesseInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); minPufferGroesseInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
@ -112,8 +107,6 @@ public class MicrophoneDetector extends Detector {
Log.d("0","Konfiguration: "+ s); Log.d("0","Konfiguration: "+ s);
int pufferGroesseInAnzahlAbtastwerten = pufferGroesseInBytes / anzahlBytesProAbtastwert;
} }
@Override @Override
@ -129,7 +122,7 @@ public class MicrophoneDetector extends Detector {
//Kalibrierung //Kalibrierung
try { try {
Thread.sleep(3000); // Time to lay down the phone Thread.sleep(startDelay); // Time to lay down the phone
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -139,7 +132,7 @@ public class MicrophoneDetector extends Detector {
Verarbeitungsergebnis kalibrierErgebnis = verarbeiten(puffer, n); Verarbeitungsergebnis kalibrierErgebnis = verarbeiten(puffer, n);
kalibierWert += kalibrierErgebnis.maxAmp; kalibierWert += kalibrierErgebnis.maxAmp;
try { try {
Thread.sleep(50); Thread.sleep(threadSleeptime);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -193,7 +186,7 @@ public class MicrophoneDetector extends Detector {
publishProgress(ergebnis); publishProgress(ergebnis);
try { try {
Thread.sleep(10); Thread.sleep(threadSleeptime);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -221,7 +214,7 @@ public class MicrophoneDetector extends Detector {
ringPuffer.hinzufuegen(max); ringPuffer.hinzufuegen(max);
maxAmp = ringPuffer.maximum(); maxAmp = ringPuffer.maximum();
if (maxAmp <= Schwellwert_Alarm+kalibierWert) { if (maxAmp <= schwellwertAlarm + kalibierWert) {
armed = true; armed = true;
} }
} }
@ -234,10 +227,10 @@ public class MicrophoneDetector extends Detector {
super.onProgressUpdate(progress); super.onProgressUpdate(progress);
float maxAmpPrint = round(20*log10(abs(progress[0].maxAmp/1.0))); float maxAmpPrint = round(20*log10(abs(progress[0].maxAmp/1.0)));
float kalibierWertPrint = round(20*log10(abs(kalibierWert))); float kalibierWertPrint = round(20*log10(abs(kalibierWert)));
Log.d("0","VR, Max, Kal:" + progress[0].verarbeitungsrate + ", " + maxAmpPrint Log.d("alarmAudio","VR: " + progress[0].verarbeitungsrate + ", Amp: " + maxAmpPrint
+ " dB, " + kalibierWertPrint + " dB"); + " dB, Kal: " + kalibierWertPrint + " dB");
if (progress[0].maxAmp >= Schwellwert_Alarm+kalibierWert && armed == true) { if (progress[0].maxAmp >= schwellwertAlarm + kalibierWert && armed == true) {
armed = false; armed = false;
detectionReport = new DetectionReport(true, "Audio", maxAmpPrint); detectionReport = new DetectionReport(true, "Audio", maxAmpPrint);
reportViolation("Audio", maxAmpPrint); reportViolation("Audio", maxAmpPrint);
@ -359,16 +352,6 @@ public class MicrophoneDetector extends Detector {
this.wichtungAlterWert = 1 - this.wichtungNeuerWert; this.wichtungAlterWert = 1 - this.wichtungNeuerWert;
} }
float MittelwertPuffer(short[] puffer) {
for (int i = 0; i < puffer.length; i++) {
mittelwert = Math.abs(puffer[i]);
}
mittelwert = mittelwert/puffer.length;
return mittelwert;
}
float mittel(float wert) { float mittel(float wert) {
if (istMittelwertGesetzt) { if (istMittelwertGesetzt) {
mittelwert = wert * wichtungNeuerWert + mittelwert * wichtungAlterWert; mittelwert = wert * wichtungNeuerWert + mittelwert * wichtungAlterWert;

View File

@ -42,8 +42,6 @@ import java.util.concurrent.ExecutionException;
/** /**
* Video Detector inherits some methods from abstract Detector class (more info there) * Video Detector inherits some methods from abstract Detector class (more info there)
* USE FROM MAIN ACTIVITY:
* VideoDetector vd = new VideoDetector(this);
* */ * */
@ -175,7 +173,10 @@ public class VideoDetector extends Detector {
public void stopDetection() { public void stopDetection() {
if (!isDetecting || imageAnalysis == null) if (!isDetecting || imageAnalysis == null)
return; return;
cameraProvider.unbind(imageAnalysis); if (!isRecording)
cameraProvider.unbindAll();
else
cameraProvider.unbind(imageAnalysis);
isDetecting = false; isDetecting = false;
allowReportViolation = false; allowReportViolation = false;
} }
@ -187,7 +188,11 @@ public class VideoDetector extends Detector {
return; return;
videoCapture.stopRecording(); videoCapture.stopRecording();
cameraProvider.unbind(videoCapture);
if (!isDetecting())
cameraProvider.unbindAll();
else
cameraProvider.unbind(videoCapture);
isRecording = false; isRecording = false;
} }
@ -219,10 +224,10 @@ public class VideoDetector extends Detector {
int n = OpenCVHelper.countNonZeroPixels(processed); int n = OpenCVHelper.countNonZeroPixels(processed);
int pixelCount = image.getWidth() * image.getHeight(); int pixelCount = image.getWidth() * image.getHeight();
float percentChanged = (float) n / pixelCount; float percentChanged = ((float) n / pixelCount) * 100;
// Violation Condition // Violation Condition
if (percentChanged * 100 > ALARM_THRESHOLD) { if (percentChanged> ALARM_THRESHOLD) {
if (allowReportViolation) if (allowReportViolation)
reportViolation("Video", percentChanged); reportViolation("Video", percentChanged);
} }
@ -310,7 +315,7 @@ public class VideoDetector extends Detector {
/** Start delay until Violation Report is allowed */ /** Start delay until Violation Report is allowed */
private void startViolationTimer(float setupTime) { private void startViolationTimer(float setupTime) {
new CountDownTimer((long) (START_DELAY), 100) { new CountDownTimer((long) (setupTime), 100) {
@Override @Override
public void onTick(long millisUntilFinished) { public void onTick(long millisUntilFinished) {
} }

View File

@ -0,0 +1,48 @@
package com.example.ueberwachungssystem.Fragments;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
import com.example.ueberwachungssystem.R;
public class Fragment1 extends Fragment {
private String text;
private final static String KEY_TEXT = "KEY_TEXT";
private void log(String nachricht) {
Log.d(this.getClass().getSimpleName(), nachricht);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
log("onCreateView");
View view = inflater.inflate(R.layout.fragment1, container, false);
TextView Sensor = (TextView) view.findViewById(R.id.Sensor);
Sensor.setText(text);
return view;
}
public static Fragment1 erstellen(String text) {
Fragment1 fragment = new Fragment1();
Bundle b = new Bundle();
b.putString(KEY_TEXT, text);
fragment.setArguments(b);
return fragment;
}
@Override
public void onCreate(Bundle bundle) {
super .onCreate(bundle);
Bundle args = getArguments();
if (args != null ) {
text = args.getString(KEY_TEXT);
log("onCreate: text=" + text);
} else {
log("onCreate");
}
}
}

View File

@ -0,0 +1,46 @@
package com.example.ueberwachungssystem.Fragments;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
import com.example.ueberwachungssystem.R;
public class Fragment2 extends Fragment {
private String text;
private final static String KEY_TEXT = "KEY_TEXT" ;
private void log(String nachricht) {
Log.d(this.getClass().getSimpleName(), nachricht);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
log( "onCreateView" );
View view = inflater.inflate(R.layout.fragment2, container, false );
TextView Sensor = (TextView) view.findViewById(R.id.Sensor);
Sensor.setText(text);
return view;
}
public static Fragment2 erstellen(String text) {
Fragment2 fragment = new Fragment2();
Bundle b = new Bundle();
b.putString(KEY_TEXT, text);
fragment.setArguments(b);
return fragment;
}
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
Bundle args = getArguments();
if (args != null) {
text = args.getString(KEY_TEXT);
log("onCreate: text=" + text);
} else {
log("onCreate");
}
}
}

View File

@ -0,0 +1,46 @@
package com.example.ueberwachungssystem.Fragments;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.fragment.app.Fragment;
import com.example.ueberwachungssystem.R;
public class Fragment3 extends Fragment {
private String text;
private final static String KEY_TEXT = "KEY_TEXT" ;
private void log(String nachricht) {
Log.d(this.getClass().getSimpleName(), nachricht);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
log( "onCreateView" );
View view = inflater.inflate(R.layout.fragment2, container, false );
TextView Sensor = (TextView) view.findViewById(R.id.Sensor);
Sensor.setText(text);
return view;
}
public static Fragment3 erstellen(String text) {
Fragment3 fragment = new Fragment3();
Bundle b = new Bundle();
b.putString(KEY_TEXT, text);
fragment.setArguments(b);
return fragment;
}
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
Bundle args = getArguments();
if (args != null) {
text = args.getString(KEY_TEXT);
log("onCreate: text=" + text);
} else {
log("onCreate");
}
}
}

View File

@ -0,0 +1,44 @@
package com.example.ueberwachungssystem.Logger;
import android.util.Log;
import android.widget.TextView;
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();
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>

View File

@ -38,16 +38,4 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
<Button
android:id="@+id/buttonSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout> </LinearLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:background="@android:color/holo_green_light">
<TextView
android:id="@+id/Sensor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView
android:id="@+id/Alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/Sensor"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</RelativeLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:background="@android:color/holo_blue_light" >
<TextView
android:id="@+id/Sensor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView
android:id="@+id/Alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/Sensor"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:background="@android:color/holo_blue_light" >
<TextView
android:id="@+id/Sensor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<TextView
android:id="@+id/Alarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/Sensor"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>

View File

@ -1,4 +1,4 @@
#Thu May 11 15:04:30 CEST 2023 #Thu May 11 15:19:24 CEST 2023
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionPath=wrapper/dists distributionPath=wrapper/dists