From a3cad8d05fef0b7f618f612bd6f9d90458d702c8 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 13 Mar 2024 13:14:17 +0100 Subject: [PATCH 1/4] CSSTUDIO-2228 Add the widget property "Min/Max tolerance" to the Linear Meter. --- .../LinearMeterRepresentation.java | 8 ++++++++ .../linearmeter/LinearMeterWidget.java | 11 ++++++++++ .../widgets/linearmeter/RTLinearMeter.java | 20 +++++++++++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) 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 a7e9aca9ed..44f9fe0389 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 @@ -61,11 +61,14 @@ public Pane createJFXNode() hiHi = model_widget.propLevelHiHi().getValue(); } + double minMaxTolerance = model_widget.propMinMaxTolerance().getValue(); + meter = new RTLinearMeter(initialValue, model_widget.propWidth().getValue(), model_widget.propHeight().getValue(), minimum, maximum, + minMaxTolerance, loLo, low, high, @@ -182,6 +185,11 @@ protected void registerListeners() layoutChanged(null, null, null); }); + addWidgetPropertyListener(model_widget.propMinMaxTolerance(), (property, old_value, new_value) -> { + meter.setMinMaxTolerance(new_value); + layoutChanged(null, null, null); + }); + addWidgetPropertyListener(model_widget.propLevelLoLo(), (property, old_value, new_value) -> { meter.setLoLo(new_value); layoutChanged(null, null, null); diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java index cbac432785..956640037d 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java @@ -130,6 +130,11 @@ else if (xml_version.getMajor() < 3) public static WidgetPropertyDescriptor propLevelLow = newDoublePropertyDescriptor (WidgetPropertyCategory.BEHAVIOR, "level_low", Messages.WidgetProperties_LevelLow); + + /** 'min_max_tolerance' property: Treat the value range [min - min_max_tolerance, max + min_max_tolerance] as the valid value range for the widget (can be used to avoid warnings due to precision errors in cases such as when a PV sends -0.0000001 when the value is actually 0.0. */ + public static final WidgetPropertyDescriptor propMinMaxTolerance = + newDoublePropertyDescriptor(WidgetPropertyCategory.BEHAVIOR, "min_max_tolerance", "Min/Max Tolerance"); + public static StructuredWidgetProperty.Descriptor colorsStructuredWidget_descriptor = new StructuredWidgetProperty.Descriptor(WidgetPropertyCategory.DISPLAY, "colors", "Colors"); @@ -168,6 +173,7 @@ else if (xml_version.getMajor() < 3) private WidgetProperty level_hihi; private WidgetProperty level_lolo; private WidgetProperty level_low; + private WidgetProperty minMaxTolerance; private WidgetProperty displayHorizontal; private StructuredWidgetProperty colorsStructuredWidget; @@ -230,6 +236,7 @@ protected void defineProperties(List> properties) properties.add(level_low = propLevelLow.createProperty(this, 20.0)); properties.add(level_high = propLevelHigh.createProperty(this, 80.0)); properties.add(level_hihi = propLevelHiHi.createProperty(this, 90.0)); + properties.add(minMaxTolerance = propMinMaxTolerance.createProperty(this, 0.0)); } /** @return 'foreground_color' property */ @@ -324,6 +331,10 @@ public WidgetProperty propLevelLow ( ) { return level_low; } + public WidgetProperty propMinMaxTolerance ( ) { + return minMaxTolerance; + } + public WidgetProperty propIsGradientEnabled () { return isGradientEnabled; } 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 8e6a35f1a6..cee62591ba 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 @@ -57,6 +57,7 @@ public RTLinearMeter(double initialValue, int height, double min, double max, + double minMaxTolerance, double loLo, double low, double high, @@ -98,6 +99,7 @@ public RTLinearMeter(double initialValue, min, max); + this.minMaxTolerance = minMaxTolerance; this.loLo = loLo; this.low = low; this.high = high; @@ -177,6 +179,7 @@ public void refreshPlotPart(PlotPart plotPart) { } }; private boolean validRange; + private double minMaxTolerance; public boolean getValidRange() { return validRange; @@ -391,6 +394,12 @@ public synchronized void setRange(double minimum, double maximum, boolean validR redrawIndicator(currentValue, currentWarning); } + public synchronized void setMinMaxTolerance(double minMaxTolerance) { + this.minMaxTolerance = minMaxTolerance; + determineWarning(); + redrawIndicator(currentValue, currentWarning); + } + public double getLoLo() { return loLo; } @@ -547,6 +556,13 @@ private void drawNewValue(double newValue) { double oldValue = currentValue; currentValue = newValue; + if (newValue > linearMeterScale.getValueRange().getHigh() && newValue < linearMeterScale.getValueRange().getHigh() + minMaxTolerance) { + newValue = linearMeterScale.getValueRange().getHigh(); + } + if (newValue < linearMeterScale.getValueRange().getLow() && newValue > linearMeterScale.getValueRange().getLow() - minMaxTolerance) { + newValue = linearMeterScale.getValueRange().getLow(); + } + if (oldValue != newValue) { if (!Double.isNaN(newValue)){ int newIndicatorPosition; @@ -577,10 +593,10 @@ else if (showUnits && units == "") { else if (!validRange) { return WARNING.MIN_AND_MAX_NOT_DEFINED; } - else if (currentValue < linearMeterScale.getValueRange().getLow()) { + else if (currentValue < linearMeterScale.getValueRange().getLow() - minMaxTolerance) { return WARNING.VALUE_LESS_THAN_MIN; } - else if (currentValue > linearMeterScale.getValueRange().getHigh()) { + else if (currentValue > linearMeterScale.getValueRange().getHigh() + minMaxTolerance) { return WARNING.VALUE_GREATER_THAN_MAX; } else { From 8de967c005330ac96b03674bb8ede4971b8879fc Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 13 Mar 2024 15:10:49 +0100 Subject: [PATCH 2/4] CSSTUDIO-2228 Add label to messages.properties. --- .../display/extra/widgets/linearmeter/LinearMeterWidget.java | 2 +- .../main/java/org/csstudio/display/builder/model/Messages.java | 1 + .../org/csstudio/display/builder/model/messages.properties | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java index 956640037d..79357b4ae9 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java @@ -133,7 +133,7 @@ else if (xml_version.getMajor() < 3) /** 'min_max_tolerance' property: Treat the value range [min - min_max_tolerance, max + min_max_tolerance] as the valid value range for the widget (can be used to avoid warnings due to precision errors in cases such as when a PV sends -0.0000001 when the value is actually 0.0. */ public static final WidgetPropertyDescriptor propMinMaxTolerance = - newDoublePropertyDescriptor(WidgetPropertyCategory.BEHAVIOR, "min_max_tolerance", "Min/Max Tolerance"); + newDoublePropertyDescriptor(WidgetPropertyCategory.BEHAVIOR, "min_max_tolerance", Messages.WidgetProperties_MinMaxTolerance); public static StructuredWidgetProperty.Descriptor colorsStructuredWidget_descriptor = new StructuredWidgetProperty.Descriptor(WidgetPropertyCategory.DISPLAY, "colors", "Colors"); diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java index f2c07a5a33..ebc0bbb6db 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java @@ -249,6 +249,7 @@ public class Messages WidgetProperties_Maximum, WidgetProperties_MediumTickVisible, WidgetProperties_Minimum, + WidgetProperties_MinMaxTolerance, WidgetProperties_MinorTickSpace, WidgetProperties_MinorTickVisible, WidgetProperties_MinuteColor, diff --git a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties index bc11431af0..c511703e5c 100644 --- a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties +++ b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties @@ -232,6 +232,7 @@ WidgetProperties_MajorTickVisible=Major Ticks Visible WidgetProperties_Maximum=Maximum WidgetProperties_MediumTickVisible=Medium Ticks Visible WidgetProperties_Minimum=Minimum +WidgetProperties_MinMaxTolerance=Min/Max Tolerance WidgetProperties_MinorTickSpace=Minor Ticks Space WidgetProperties_MinorTickVisible=Minor Ticks Visible WidgetProperties_MinuteColor=Minute Color From 9c9e4a6a716f9adc6e9de52c98f78f287ceb74be Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Wed, 13 Mar 2024 15:28:13 +0100 Subject: [PATCH 3/4] CSSTUDIO-2228 Bugfix: use String.equals() instead of '==' when comparing two strings. --- .../display/extra/widgets/linearmeter/RTLinearMeter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cee62591ba..05c604f1c4 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 @@ -587,7 +587,7 @@ private WARNING determineWarning() { if (lag) { return WARNING.LAG; } - else if (showUnits && units == "") { + else if (showUnits && units.equals("")) { return WARNING.NO_UNIT; } else if (!validRange) { From 466114563ccc493eb579a1d46559c929671b5af7 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 14 Mar 2024 09:56:48 +0100 Subject: [PATCH 4/4] CSSTUDIO-2228 Bugfix: use '<=' and '>=' instead of '<' and '>', respectively. --- .../display/extra/widgets/linearmeter/RTLinearMeter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 05c604f1c4..2658beee8b 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 @@ -556,10 +556,10 @@ private void drawNewValue(double newValue) { double oldValue = currentValue; currentValue = newValue; - if (newValue > linearMeterScale.getValueRange().getHigh() && newValue < linearMeterScale.getValueRange().getHigh() + minMaxTolerance) { + if (newValue > linearMeterScale.getValueRange().getHigh() && newValue <= linearMeterScale.getValueRange().getHigh() + minMaxTolerance) { newValue = linearMeterScale.getValueRange().getHigh(); } - if (newValue < linearMeterScale.getValueRange().getLow() && newValue > linearMeterScale.getValueRange().getLow() - minMaxTolerance) { + if (newValue < linearMeterScale.getValueRange().getLow() && newValue >= linearMeterScale.getValueRange().getLow() - minMaxTolerance) { newValue = linearMeterScale.getValueRange().getLow(); }