package pl.llp.aircasting.tracking;
import com.google.common.eventbus.EventBus;
import pl.llp.aircasting.helper.MetadataHelper;
import pl.llp.aircasting.helper.SettingsHelper;
import pl.llp.aircasting.model.*;
import pl.llp.aircasting.model.events.MeasurementEvent;
import pl.llp.aircasting.model.events.FixedSessionsMeasurementEvent;
import pl.llp.aircasting.storage.DatabaseTaskQueue;
import pl.llp.aircasting.storage.repository.SessionRepository;
import pl.llp.aircasting.sync.FixedSessionUploader;
import java.util.Map;
import java.util.UUID;
import static com.google.common.collect.Maps.newHashMap;
public class FixedSessionTracker extends ActualSessionTracker
{
private final FixedSessionUploader fixedSessionUploader;
private Map<String, MeasurementsBuffer> pendingMeasurements = newHashMap();
FixedSessionTracker(EventBus eventBus, final Session session, DatabaseTaskQueue dbQueue, SettingsHelper settingsHelper, MetadataHelper metadataHelper, SessionRepository sessions, FixedSessionUploader fixedSessionUploader, boolean locationLess)
{
super(eventBus, session, dbQueue, settingsHelper, metadataHelper, sessions, locationLess);
session.setEnd(session.getStart());
this.fixedSessionUploader = fixedSessionUploader;
}
@Override
public void addMeasurement(Sensor sensor, MeasurementStream stream, Measurement measurement)
{
MeasurementsBuffer measurementsBuffer = getMeasurementBuffer(stream.getSensorName());
measurementsBuffer.add(measurement.getValue());
if(measurementsBuffer.isGettable()) {
Double average = measurementsBuffer.get();
measurement.setValue(average);
measurement.setMeasuredValue(average);
addActualMeasurement(sensor, stream, measurement);
}
}
@Override
protected boolean beforeSave(final Session session)
{
if (fixedSessionUploader.create(session))
return true;
else
return false;
}
private MeasurementsBuffer getMeasurementBuffer(String sensorName) {
if(!pendingMeasurements.containsKey(sensorName))
pendingMeasurements.put(sensorName, new MeasurementsBuffer());
return pendingMeasurements.get(sensorName);
}
private void addActualMeasurement(Sensor sensor, MeasurementStream stream, Measurement measurement) {
measurementTracker.add(stream, measurement);
recentMeasurements.put(stream.getSensorName(), measurement.getValue());
eventBus.post(new MeasurementEvent(measurement, sensor));
streamMeasurement(this.session.getUUID(), stream, measurement);
}
private void streamMeasurement(UUID sessionUUID, MeasurementStream stream, Measurement measurement)
{
FixedSessionsMeasurement fixedSessionsMeasurement = new FixedSessionsMeasurement(sessionUUID, stream, measurement);
eventBus.post(new FixedSessionsMeasurementEvent(fixedSessionsMeasurement));
}
}