package pl.llp.aircasting.sensor; import pl.llp.aircasting.event.sensor.ThresholdSetEvent; import pl.llp.aircasting.helper.SettingsHelper; import pl.llp.aircasting.model.Sensor; import pl.llp.aircasting.model.internal.MeasurementLevel; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import com.google.inject.Inject; import com.google.inject.Singleton; import java.util.HashMap; import java.util.Map; import static com.google.common.collect.Maps.newHashMap; /** * Created by ags on 01/04/2013 at 13:22 */ @Singleton public class ThresholdsHolder { @Inject SettingsHelper settings; @Inject EventBus eventBus; Map<Sensor, Map<MeasurementLevel, Integer>> thresholds = newHashMap(); @Inject public void init() { eventBus.register(this); } @Subscribe public void onEvent(ThresholdSetEvent event) { Sensor sensor = event.getSensor(); Map<MeasurementLevel, Integer> levels = getValues(sensor); levels.put(event.getLevel(), event.getValue()); } private HashMap<MeasurementLevel, Integer> initLevels(Sensor sensor) { HashMap<MeasurementLevel, Integer> values = new HashMap<MeasurementLevel, Integer>(); for (MeasurementLevel level : MeasurementLevel.OBTAINABLE_LEVELS) { int threshold = settings.getThreshold(sensor, level); values.put(level, threshold); } thresholds.put(sensor, values); return values; } public MeasurementLevel getLevel(Sensor sensor, double value) { Map<MeasurementLevel, Integer> levels = getValues(sensor); for (MeasurementLevel level : MeasurementLevel.OBTAINABLE_LEVELS) { if (value >= levels.get(level)) { return level; } } return MeasurementLevel.TOO_LOW; } private Map<MeasurementLevel, Integer> getValues(Sensor sensor) { Map<MeasurementLevel, Integer> levels = thresholds.get(sensor); if(levels == null) { levels = initLevels(sensor); } return levels; } public int getValue(Sensor sensor, MeasurementLevel level) { return getValues(sensor).get(level); } }