package de.tu.darmstadt.seemoo.ansian.control.threads;
import android.content.Context;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Vibrator;
import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;
import de.tu.darmstadt.seemoo.ansian.MainActivity;
import de.tu.darmstadt.seemoo.ansian.control.events.FFTDataEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.RecordingEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.RequestRecordingEvent;
import de.tu.darmstadt.seemoo.ansian.model.FFTSample;
import de.tu.darmstadt.seemoo.ansian.model.preferences.AlarmPreferences;
import de.tu.darmstadt.seemoo.ansian.model.preferences.Preferences;
/**
* Alarm thread gets started with the AnsianService.
*
* @author Markus Grau
*
*/
public class Alarm {
private int volume = 100;
private int vibrationDuration = 100;
private ToneGenerator toneGenerator;
private Vibrator vibrator;
private AlarmPreferences preferences;
private long last;
public Alarm(MainActivity activity) {
last = System.currentTimeMillis();
preferences = Preferences.ALARM_PREFERENCE;
setActive(true);
toneGenerator = new ToneGenerator(AudioManager.STREAM_ALARM, volume);
vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE);
}
private void setActive(boolean b) {
if (b)
if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this);
else if (EventBus.getDefault().isRegistered(this))
EventBus.getDefault().unregister(this);
}
private void check(FFTSample fftSample) {
float[] values = fftSample.getMagnitudes();
int length = values.length;
if (values[length / 2] > preferences.getAlarmThreshold()) {
alarm();
}
}
private void alarm() {
if (preferences.isAlarmVibration())
vibrator.vibrate(vibrationDuration);
if (preferences.isAlarmSound())
toneGenerator.startTone(preferences.getToneType());
if (preferences.isRecording())
new RequestRecordingEvent(preferences.getPlannedRecording());
}
public void start() {
setActive(preferences.isAlarmActive());
}
public void stop() {
setActive(false);
}
@Subscribe
public void onEvent(FFTDataEvent event) {
if (System.currentTimeMillis() - last > preferences.getAlarmInterval()) {
last = System.currentTimeMillis();
if (!preferences.isAlarmActive())
return;
check(event.getSample());
}
}
@Subscribe
public void onEvent(RecordingEvent event) {
if (event.getRecording() == preferences.getPlannedRecording())
preferences.setRecording(false);
}
}