package pl.llp.aircasting.model; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; import pl.llp.aircasting.model.internal.MeasurementLevel; import pl.llp.aircasting.model.events.SensorEvent; import com.google.common.base.Strings; import java.io.Serializable; import java.util.Map; import static com.google.common.collect.Maps.newHashMap; public class Sensor implements Serializable { @Expose @SerializedName("sensor_name") private String sensorName; @Expose @SerializedName("sensor_package_name") private String packageName; private String measurementType; private String shortType; private String unit; private String symbol; private final Map<MeasurementLevel, Integer> thresholds = newHashMap(); protected boolean enabled = true; private String address = "none"; public Sensor(SensorEvent event) { this(event.getPackageName(), event.getSensorName(), event.getMeasurementType(), event.getShortType(), event.getUnit(), event.getSymbol(), event.getVeryLow(), event.getLow(), event.getMid(), event.getHigh(), event.getVeryHigh(), event.getAddress()); } public Sensor(MeasurementStream stream) { this(stream.getPackageName(), stream.getSensorName(), stream.getMeasurementType(), stream.getShortType(), stream.getUnit(), stream.getSymbol(), stream.getThresholdVeryLow(), stream.getThresholdLow(), stream.getThresholdMedium(), stream.getThresholdHigh(), stream.getThresholdVeryHigh(), stream.getAddress()); } public Sensor(String packageName, String name, String type, String shortType, String unit, String symbol, int veryLow, int low, int mid, int high, int veryHigh) { this(packageName, name, type, shortType, unit, symbol, veryLow, low, mid, high, veryHigh, "none"); } public Sensor(String packageName, String name, String type, String shortType, String unit, String symbol, int veryLow, int low, int mid, int high, int veryHigh, String address) { this.packageName = packageName; this.sensorName = name; this.measurementType = type; this.shortType = shortType; this.unit = unit; this.symbol = symbol; thresholds.put(MeasurementLevel.VERY_HIGH, veryHigh); thresholds.put(MeasurementLevel.HIGH, high); thresholds.put(MeasurementLevel.MID, mid); thresholds.put(MeasurementLevel.LOW, low); thresholds.put(MeasurementLevel.VERY_LOW, veryLow); this.address = address; } public Sensor(String name) { sensorName = name; } public String getSensorName() { return sensorName; } public String getMeasurementType() { return measurementType; } public String getShortType() { return shortType; } public String getUnit() { return unit; } public String getSymbol() { return symbol; } public boolean isEnabled() { return enabled; } public int getThreshold(MeasurementLevel level) { return thresholds.get(level); } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Sensor)) return false; Sensor sensor = (Sensor) o; if (sensorName != null ? !sensorName.equals(sensor.sensorName) : sensor.sensorName != null) return false; return true; } @Override public int hashCode() { return sensorName != null ? sensorName.hashCode() : 0; } @Override public String toString() { return new StringBuilder() .append(getMeasurementType()) .append(" - ") .append(getSensorName()) .append(" (") .append(getSymbol()) .append(")") .toString(); } public String getPackageName() { return packageName; } public boolean matches(Sensor sensor) { return sensor != null && Strings.nullToEmpty(sensor.getSensorName()).equals(getSensorName()) && Strings.nullToEmpty(sensor.getMeasurementType()).equals(getMeasurementType()); } public String getAddress() { return address; } public MeasurementLevel level(double value) { for (MeasurementLevel measurementLevel : MeasurementLevel.OBTAINABLE_LEVELS) { if (value > getThreshold(measurementLevel)) { return measurementLevel; } } return MeasurementLevel.TOO_LOW; } void toggle() { enabled = !enabled; } void disable() { enabled = false; } void enable() { enabled = true; } }