diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java index 66b461401e..4081cee78c 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java @@ -170,7 +170,7 @@ protected void registerListeners() boolean validRange = Double.isFinite(new_value) && Double.isFinite(model_widget.propMaximum().getValue()); meter.setRange(new_value, model_widget.propMaximum().getValue(), validRange); if (toolkit.isEditMode() && validRange) { - meter.setCurrentValue((new_value + model_widget.propMaximum().getValue()) / 2.0); + meter.setCurrentValue((new_value + model_widget.propMaximum().getValue()) / 2.0, true); } }); @@ -183,7 +183,7 @@ protected void registerListeners() boolean validRange = Double.isFinite(new_value) && Double.isFinite(model_widget.propMinimum().getValue()); meter.setRange(model_widget.propMinimum().getValue(), new_value, validRange); if (toolkit.isEditMode() && validRange) { - meter.setCurrentValue((new_value + model_widget.propMinimum().getValue()) / 2.0); + meter.setCurrentValue((new_value + model_widget.propMinimum().getValue()) / 2.0, true); } }); @@ -295,6 +295,7 @@ private void layoutChanged(WidgetProperty property, Object old_value, Object private void valueChanged(WidgetProperty property, Object old_value, Object new_value) { if (new_value instanceof VDouble) { meter.withWriteLock(() -> { + boolean linearMeterScaleHasChanged = false; VDouble vDouble = ((VDouble) new_value); double newValue = vDouble.getValue(); @@ -327,6 +328,7 @@ private void valueChanged(WidgetProperty property, Object old_value, Object n && displayRange.getMaximum() - displayRange.getMinimum() > 0.0) { if (meter.linearMeterScale.getValueRange().getLow() != displayRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != displayRange.getMaximum() || !meter.getValidRange()) { meter.setRange(displayRange.getMinimum(), displayRange.getMaximum(), true); + linearMeterScaleHasChanged = true; } } else { Range controlRange = display.getControlRange(); @@ -336,12 +338,15 @@ private void valueChanged(WidgetProperty property, Object old_value, Object n && controlRange.getMaximum() - controlRange.getMinimum() > 0.0) { if (meter.linearMeterScale.getValueRange().getLow() != controlRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != controlRange.getMaximum() || !meter.getValidRange()) { meter.setRange(controlRange.getMinimum(), controlRange.getMaximum(), true); + linearMeterScaleHasChanged = true; } } else if (newObservedMinAndMaxValues && !Double.isNaN(observedMin) && !Double.isNaN(observedMax)) { meter.setRange(observedMin - 1, observedMax + 1, false); newObservedMinAndMaxValues = false; + linearMeterScaleHasChanged = true; } else if (meter.linearMeterScale.getValueRange().getLow() != 0.0 || meter.linearMeterScale.getValueRange().getHigh() != 100) { meter.setRange(0.0, 100.0, false); + linearMeterScaleHasChanged = true; } } } @@ -352,10 +357,12 @@ private void valueChanged(WidgetProperty property, Object old_value, Object n if (warningRange != null) { if (!Double.isNaN(warningRange.getMinimum()) && meter.getLow() != warningRange.getMinimum()) { meter.setLow(warningRange.getMinimum()); + linearMeterScaleHasChanged = true; } if (!Double.isNaN(warningRange.getMaximum()) && meter.getHigh() != warningRange.getMaximum()) { meter.setHigh(warningRange.getMaximum()); + linearMeterScaleHasChanged = true; } } } @@ -365,16 +372,18 @@ private void valueChanged(WidgetProperty property, Object old_value, Object n if (alarmRange != null) { if (!Double.isNaN(alarmRange.getMinimum()) && meter.getLoLo() != alarmRange.getMinimum()) { meter.setLoLo(alarmRange.getMinimum()); + linearMeterScaleHasChanged = true; } if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) { meter.setHiHi(alarmRange.getMaximum()); + linearMeterScaleHasChanged = true; } } } } } - meter.setCurrentValue(newValue); + meter.setCurrentValue(newValue, linearMeterScaleHasChanged); }); } } diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java index a65717d6b7..9be5f78c26 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java @@ -735,7 +735,7 @@ public void setShowWarnings(boolean showWarnings) { private boolean isValueWaitingToBeDrawn = false; private double valueWaitingToBeDrawn = Double.NaN; /** @param newValue Current value */ - public void setCurrentValue(double newValue) + public void setCurrentValue(double newValue, boolean forceRedraw) { withWriteLock(() -> { valueWaitingToBeDrawn = newValue; @@ -746,7 +746,7 @@ public void setCurrentValue(double newValue) else { isValueWaitingToBeDrawn = true; - drawNewValue(valueWaitingToBeDrawn); + drawNewValue(valueWaitingToBeDrawn, forceRedraw); isValueWaitingToBeDrawn = false; lag = false; } @@ -777,7 +777,7 @@ private Optional computeIndicatorPosition(double value) { }); } - private void drawNewValue(double newValue) { + private void drawNewValue(double newValue, boolean forceRedraw) { withWriteLock(() -> { WARNING oldWarning = determineWarning(); AtomicReference newValueAtomicReference = new AtomicReference<>(newValue); // Workaround, since captured variables need to be effectively final in Java. @@ -795,15 +795,15 @@ private void drawNewValue(double newValue) { WARNING newWarning = determineWarning(); logNewWarningIfDifferent(oldWarning, newWarning); - if (oldValue != newValueAtomicReference.get()) { - if (!Double.isNaN(newValueAtomicReference.get())){ + if (forceRedraw || oldValue != newValueAtomicReference.get()) { + if (forceRedraw || !Double.isNaN(newValueAtomicReference.get())){ Optional maybeNewIndicatorPosition = computeIndicatorPosition(newValue); boolean indicatorPositionHasChanged = maybeNewIndicatorPosition.isPresent() != maybeOldIndicatorPosition.isPresent() || maybeOldIndicatorPosition.isPresent() && maybeNewIndicatorPosition.isPresent() && maybeOldIndicatorPosition.get() != maybeNewIndicatorPosition.get(); - if (indicatorPositionHasChanged || determineWarning() != newWarning) { + if (forceRedraw || indicatorPositionHasChanged || determineWarning() != newWarning) { redrawIndicator(newValueAtomicReference.get(), newWarning); } } - else if (!Double.isNaN(oldValue)) { + else if (forceRedraw || !Double.isNaN(oldValue)) { redrawIndicator(newValueAtomicReference.get(), newWarning); } }