private SampledValue interpolateBoolean(SampledValue x0, SampledValue x1, long t) { // linear interpolation on booleans is the same as nearest interpolation final long dt0 = Math.abs(t - x0.getTimestamp()); final long dt1 = Math.abs(t - x1.getTimestamp()); if (dt0 <= dt1) return new SampledValue(x0.getValue(), t, x0.getQuality()); else return new SampledValue(x1.getValue(), t, x1.getQuality()); }
@Override public SampledValue interpolate(SampledValue x0, SampledValue x1, long t, Class<? extends Value> valueType) { if (x0 != null) { return new SampledValue(x0.getValue(), t, x0.getQuality()); } else if (x1 != null) { return new SampledValue(x1.getValue(), t, Quality.BAD); } throw new IllegalArgumentException("Cannot perform step interpolation with both support points being null."); }
@Override public SampledValue interpolate(SampledValue x0, SampledValue x1, long t, Class<? extends Value> valueType) { if (x0 == null && x1 == null) { throw new IllegalArgumentException("Cannot interpolate between two null pointers (x0==null, x1==null)."); } if (x0 != null && x0.getTimestamp() == t) { return new SampledValue(x0); } if (x1 != null && x1.getTimestamp() == t) { return new SampledValue(x1); } return (x0 != null) ? new SampledValue(x0.getValue(), t, Quality.BAD) : new SampledValue(x1.getValue(), t, Quality.BAD); }
private static TimeseriesDTO serialize(final ReadOnlyTimeSeries ts) { final TimeseriesDTO dto = new TimeseriesDTO(); final int size = Math.max(4, ts.size()); dto.timestamps = new ArrayList<>(size); dto.values = new ArrayList<>(size); final Iterator<SampledValue> it = ts.iterator(); while (it.hasNext()) { final SampledValue sv = it.next(); if (sv.getQuality() == Quality.BAD) continue; dto.timestamps.add(sv.getTimestamp()); dto.values.add(sv.getValue().getFloatValue()); } return dto; }
@Override public void writeValue(SampledValue v, JsonGenerator jGen) throws IOException { jGen.writeStringField(SINGLEVALUE, v.getValue().getStringValue()); jGen.writeStringField("@type", "SampledString"); } };
private void setModel(DRS485DEResource model, SampledValue value) { int[] values; long result; if (value.getQuality() == Quality.GOOD && value.getValue() != null) { // the response has one integer value per 16bit modbus register values = (int[]) value.getValue().getObjectValue(); // result is in Wh * 10 (two fractional digits) // upper 8bit of the result registers are unused result = ((long) values[0] & 0xFF) << 16; result += ((long) values[1] & 0xFF) << 8; result += (long) values[2] & 0xFF; result *= 10; // Wh result *= 3600; // Joule model.totalEnergy.setValue((float) result); } }
private static final boolean nextIsNewer(SampledValue current, SampledValue next) { if (current == null || next == null) return next != null; if (next == current) return false; return current.getTimestamp() < next.getTimestamp(); }
@Override final public boolean deleteValues(long startTime, long endTime) { final SampledValue min = new SampledValue(null, startTime, Quality.BAD); final SampledValue max = new SampledValue(null, endTime, Quality.BAD); // deleteValues(m_values.subSet(min, max)); m_values.subSet(min, max).clear(); return true; }
/** * Process the case where the interpolation mode of f1 is NONE. */ private void processNone(final ReadOnlyTimeSeries f1, final ReadOnlyTimeSeries f2) { m_mode = InterpolationMode.NONE; for (SampledValue value : f1.getValues(Long.MIN_VALUE)) { if (value.getQuality() == Quality.BAD) continue; final long t = value.getTimestamp(); final SampledValue v2 = f2.getValue(t); if (v2 == null) continue; final Quality q2 = v2.getQuality(); if (q2 == Quality.BAD) continue; m_timestamps.add(t); } }
public float getGradient(SampledValue sv1, SampledValue sv2) { long tDiff = sv2.getTimestamp() - sv1.getTimestamp(); float valDiff = sv2.getValue().getFloatValue() - sv1.getValue().getFloatValue(); return valDiff / ((float) tDiff); }
public void addValue(SampledValue value) { final SampledValue newValue = new SampledValue(value); final long time = value.getTimestamp(); final int oldIndex = getValueIndex(time); if (oldIndex != NO_SUCH_INDEX) { m_values.set(oldIndex, newValue); } else { final boolean doSort = newValueRequiresSorting(newValue); m_values.add(newValue); if (doSort) sort(); } }
private static List<SampledValue> removeQualityBad(List<SampledValue> toReduce) { List<SampledValue> result = new ArrayList<SampledValue>(); for (SampledValue val : toReduce) { if (val.getQuality() != Quality.BAD) { result.add(val); } } return result; }
@Override final public SampledValue getNextValue(long time) { final SampledValue pivot = new SampledValue(null, time, Quality.BAD); final SampledValue element = m_values.ceiling(pivot); return (element != null) ? element.copyDefensively() : null; }
@Override public TimeInterval getPositiveInterval(SampledValue x0, SampledValue x1, Class<? extends Value> valueType) { if (StringValue.class.isAssignableFrom(valueType)) { throw new RuntimeException("Cannot define positive values for StringValues"); } if (x0 == null || x0.getQuality() == Quality.BAD) { return new TimeInterval(0, 0); } final float value = x0.getValue().getFloatValue(); if (value <= 0.) { return new TimeInterval(0, 0); } final long t = x0.getTimestamp(); return new TimeInterval(t, t + 1); } }
@Override public void writeValue(SampledValue v, JsonGenerator jGen) throws IOException { jGen.writeNumberField("value", v.getValue().getFloatValue()); jGen.writeStringField("@type", "SampledFloat"); } },
private static final Object getValue(final SampledValue sv) { if (sv == null || sv.getQuality() == Quality.BAD) return ""; final float value = sv.getValue().getFloatValue(); return Float.isFinite(value) ? value : ""; }
@Override public synchronized ReadOnlyTimeSeries getValue() { if (gapGraph == null) { gapGraph = new TreeTimeSeries(BooleanValue.class); gapGraph.setInterpolationMode(InterpolationMode.STEPS); for (SampledValue sv: gaps) { gapGraph.addValue(new SampledValue(new BooleanValue(true), sv.getTimestamp(), Quality.GOOD)); gapGraph.addValue(new SampledValue(new BooleanValue(false), sv.getTimestamp()+sv.getValue().getLongValue(), Quality.GOOD)); } } return gapGraph; }
private static final boolean nextIsNewer(SampledValue current, SampledValue next) { if (current == null || next == null) return next != null; if (next == current) return false; return current.getTimestamp() < next.getTimestamp(); }
@Override public boolean addValue(long timestamp, Value value) { addValue(new SampledValue(value, timestamp, Quality.GOOD)); return true; }
void write(SampledValue val, JsonGenerator jGen) throws IOException { jGen.writeStartObject(); jGen.writeNumberField("time", val.getTimestamp()); jGen.writeStringField("quality", val.getQuality().name()); writeValue(val, jGen); jGen.writeEndObject(); }