package org.openiot.cupus.mobile.sensors.service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import org.openiot.cupus.artefact.TripletAnnouncement;
import org.openiot.cupus.mobile.data.IntentObjectHolder;
import org.openiot.cupus.mobile.data.Parameters;
import org.openiot.cupus.mobile.sensors.common.PullMultiSensor;
import org.openiot.cupus.mobile.sensors.common.ReadingDefinition;
import org.openiot.cupus.mobile.sensors.common.SensorReading;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Kristijan on 30.01.14..
*/
public class MultiSensorManager extends AbstractSensorManager implements Runnable{
private PullMultiSensor pullMultiSensor;
private MultiSensorServiceBroadcastReceiver sensorServiceBroadcastReceiver;
public MultiSensorManager(LocalBroadcastManager localBroadcastManager) {
super(localBroadcastManager);
this.sensorEventListener = new MultiSensorEventListenerImplement();
IntentFilter sensorControl = new IntentFilter(Parameters.START_STOP_SENSOR);
sensorServiceBroadcastReceiver = new MultiSensorServiceBroadcastReceiver();
localBroadcastManager.registerReceiver(sensorServiceBroadcastReceiver, sensorControl);
}
@Override
public void run() {
while (running) {
try {
Thread.sleep(period);
} catch (InterruptedException e) {
e.printStackTrace();
}
sensorEventListener.sendReading();
}
}
@Override
public void startIt() {
if (!running) {
Thread thread = new Thread(this);
thread.start();
running = true;
}
}
@Override
public void terminate() {
stopIt();
pullMultiSensor.terminate();
Intent intent = new Intent(Parameters.MULTI_TERMINATE);
ArrayList<String> stringReadingDefinitions = new ArrayList<String>();
List<ReadingDefinition> readingDefinitions = pullMultiSensor.getReadingDefinitions();
int index = 0;
for (TripletAnnouncement tripletAnnouncement : pullMultiSensor.getTripletAnnouncements()) {
stringReadingDefinitions.add(readingDefinitions.get(index).getName());
intent.putExtra("tripletAnnouncement" + index, tripletAnnouncement.hashCode());
index++;
}
intent.putStringArrayListExtra("readingDefinitions", stringReadingDefinitions);
localBroadcastManager.sendBroadcast(intent);
}
private class MultiSensorEventListenerImplement implements SensorEventListener {
@Override
public void sendReading() {
Intent intent = new Intent(Parameters.MULTI_PUBLICATION);
List<SensorReading> readings = pullMultiSensor.pullReadings();
int index = 0;
int numOfSuccReadings = 0;
for (SensorReading reading : readings) {
if (reading != null) {
String readingDefinition = pullMultiSensor.getReadingDefinitions().get(index).getName();
IntentObjectHolder.intentObjectMap.put(reading.hashCode(), reading);
intent.putExtra("mapKey" + numOfSuccReadings, reading.hashCode());
intent.putExtra("readingDefinition" + numOfSuccReadings, readingDefinition);
numOfSuccReadings++;
}
index++;
}
intent.putExtra("successfulReadings", numOfSuccReadings);
localBroadcastManager.sendBroadcast(intent);
}
@Override
public void newSensor() {
Intent intent = new Intent(Parameters.MULTI_ANNOUNCEMENT);
ArrayList<String> stringReadingDefinitions = new ArrayList<String>();
List<ReadingDefinition> readingDefinitions = pullMultiSensor.getReadingDefinitions();
int index = 0;
for (TripletAnnouncement tripletAnnouncement : pullMultiSensor.getTripletAnnouncements()) {
stringReadingDefinitions.add(readingDefinitions.get(index).getName());
IntentObjectHolder.readingDefinitionMap.put(tripletAnnouncement.hashCode(), tripletAnnouncement);
intent.putExtra("tripletAnnouncement" + index, tripletAnnouncement.hashCode());
index++;
}
intent.putStringArrayListExtra("readingDefinitions", stringReadingDefinitions);
localBroadcastManager.sendBroadcast(intent);
}
}
public PullMultiSensor getPullMultiSensor() {
return pullMultiSensor;
}
public void setPullMultiSensor(PullMultiSensor pullMultiSensor) {
this.pullMultiSensor = pullMultiSensor;
}
private class MultiSensorServiceBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Parameters.START_STOP_SENSOR)) {
List<String> subscriptions = intent.getStringArrayListExtra("subscriptions");
boolean contains = false;
for (ReadingDefinition readingDefinition : getPullMultiSensor().getReadingDefinitions()) {
if (subscriptions.contains(readingDefinition.getName())) {
contains = true;
}
}
if (contains) {
if (!isRunning()) {
startIt();
}
}
else {
if (isRunning()) {
stopIt();
}
}
}
}
}
}