package at.bakery.kippen.server.objects;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map.Entry;
import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger;
import at.bakery.kippen.common.AbstractData;
import at.bakery.kippen.common.data.AccelerationData;
import at.bakery.kippen.common.data.BarrelOrientationData;
import at.bakery.kippen.common.data.BatteryData;
import at.bakery.kippen.common.data.MoveData;
import at.bakery.kippen.common.data.SensorTripleData;
import at.bakery.kippen.common.data.WifiLevelsData;
import at.bakery.kippen.server.EventTypes;
import at.bakery.kippen.server.KippenServer;
import at.bakery.kippen.server.command.Command;
public class BarrelObject extends AbstractKippenObject {
static Logger log = Logger.getLogger(BarrelObject.class.getName());
double lastBarrelValue = 0;
private static double MIN_VALUE_DELTA = 0.01;
public BarrelObject(String id, int timeout) {
super(id, timeout);
log.setLevel(KippenServer.LOG_LEVEL);
}
@Override
public void processData(AbstractData d) {
super.processData(d);
log.log(Level.FINEST, "BARREL processes " + d.getClass().getSimpleName() + " -> " + d.toString());
if (d instanceof WifiLevelsData) {
processWifiData((WifiLevelsData) d);
} else if (d instanceof BarrelOrientationData) {
processOrientationData((BarrelOrientationData) d);
} else if (d instanceof BatteryData) {
processBatteryData((BatteryData) d);
}
}
@Override
protected void timeout() {
super.timeout();
}
private void processOrientationData(BarrelOrientationData data) {
System.out.println(this.getId().substring(0,4) + " " + data.getValue());
HashMap<String, String> paramMap = new HashMap<String, String>();
double barrelValue = Double.valueOf(data.getValue());
if (Math.abs(barrelValue - lastBarrelValue) > MIN_VALUE_DELTA) {
paramMap.put("value", String.valueOf(barrelValue));
for (Command c : eventsOfObject.get(EventTypes.ROLLCHANGE)) {
try {
c.execute(paramMap);
} catch (Exception e) {
e.printStackTrace();
log.warning("Failed to execute command " + c.getClass().getSimpleName());
}
}
lastBarrelValue = barrelValue;
}
}
private Queue<WifiLevelsData> avgWifiLevel = new LinkedList<>();
private void processWifiData(WifiLevelsData data) {
WifiLevelsData wd = (WifiLevelsData) data;
// add the current measurement to the list
avgWifiLevel.offer(wd);
// compute average
if (avgWifiLevel.size() > 0) {
double avgLevel = 0;
// for each measurement item ...
for (WifiLevelsData w : avgWifiLevel) {
double innerAvgLevel = 0;
// for each measured wifi in the item ...
for (Entry<String, Object> val : w.getNetworks()) {
innerAvgLevel += (double) val.getValue();
}
// ... compute average
avgLevel += (innerAvgLevel / w.getNetworks().size());
}
avgLevel /= avgWifiLevel.size();
// RSSI to meters conversion
double dist = Math.pow(10, ((27.55 - (67.6 + avgLevel)) / 20.0));
log.log(Level.FINEST, "~ " + dist + "m (level: " + avgLevel + ")");
// remember the last to measurements, remove others
if (avgWifiLevel.size() > 10) {
avgWifiLevel.poll();
}
}
}
private void processAccelerationData(AccelerationData data) {
// SensorTripleData sd = (SensorTripleData) data;
// log.info("" + Math.sqrt(sd.getX() * sd.getX() + sd.getY() * sd.getY()
// + sd.getZ() + sd.getZ()));
}
private void processBatteryData(BatteryData data) {
}
private void processMoveData(MoveData data) {
}
}