Skip to content

Commit 84d0e93

Browse files
authored
Merge pull request #3514 from ControlSystemStudio/CSSTUDIO-3360
Improvements to the Linear Meter widget
2 parents 53f9365 + 279e108 commit 84d0e93

File tree

5 files changed

+1116
-770
lines changed

5 files changed

+1116
-770
lines changed

app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java

Lines changed: 95 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -42,24 +42,16 @@ public Pane createJFXNode()
4242
double initialValue = toolkit.isEditMode() ? (model_widget.propMinimum().getValue() + model_widget.propMaximum().getValue()) / 2.0
4343
: Double.NaN;
4444

45-
double minimum, maximum;
46-
double loLo, low, high, hiHi;
47-
if (model_widget.propLimitsFromPV().getValue() && !toolkit.isEditMode()) {
48-
minimum = Double.NaN;
49-
maximum = Double.NaN;
50-
loLo = Double.NaN;
51-
low = Double.NaN;
52-
high = Double.NaN;
53-
hiHi = Double.NaN;
54-
}
55-
else {
56-
minimum = model_widget.propMinimum().getValue();
57-
maximum = model_widget.propMaximum().getValue();
58-
loLo = model_widget.propLevelLoLo().getValue();
59-
low = model_widget.propLevelLow().getValue();
60-
high = model_widget.propLevelHigh().getValue();
61-
hiHi = model_widget.propLevelHiHi().getValue();
62-
}
45+
// Set min, max, and alarm limits according to settings.
46+
// Some or all of these may be overridden by the PV when
47+
// values are received, if the option "Limits from PV"
48+
// is not set to "No limits from PV".
49+
double minimum = model_widget.propMinimum().getValue();
50+
double maximum = model_widget.propMaximum().getValue();
51+
double loLo = model_widget.propLevelLoLo().getValue();
52+
double low = model_widget.propLevelLow().getValue();
53+
double high = model_widget.propLevelHigh().getValue();
54+
double hiHi = model_widget.propLevelHiHi().getValue();
6355

6456
double minMaxTolerance = model_widget.propMinMaxTolerance().getValue();
6557

@@ -86,6 +78,7 @@ public Pane createJFXNode()
8678
model_widget.propKnobSize().getValue(),
8779
widgetColorToAWTColor(model_widget.propKnobColor().getValue()),
8880
model_widget.propShowWarnings().getValue());
81+
meter.setDisplayMode(model_widget.propDisplayMode().getValue());
8982
meter.setSize(model_widget.propWidth().getValue(),model_widget.propHeight().getValue());
9083
meter.setHorizontal(model_widget.propDisplayHorizontal().getValue());
9184
meter.setManaged(false);
@@ -167,26 +160,26 @@ protected void registerListeners()
167160

168161
addWidgetPropertyListener(model_widget.propMinimum(), (property, old_value, new_value) -> {
169162

170-
synchronized (meter) {
163+
meter.withWriteLock(() -> {
171164
boolean validRange = Double.isFinite(new_value) && Double.isFinite(model_widget.propMaximum().getValue());
172165
meter.setRange(new_value, model_widget.propMaximum().getValue(), validRange);
173166
if (toolkit.isEditMode() && validRange) {
174167
meter.setCurrentValue((new_value + model_widget.propMaximum().getValue()) / 2.0);
175168
}
176-
}
169+
});
177170

178171
layoutChanged(null, null, null);
179172
});
180173

181174
addWidgetPropertyListener(model_widget.propMaximum(), (property, old_value, new_value) -> {
182175

183-
synchronized (meter) {
176+
meter.withWriteLock(() -> {
184177
boolean validRange = Double.isFinite(new_value) && Double.isFinite(model_widget.propMinimum().getValue());
185178
meter.setRange(model_widget.propMinimum().getValue(), new_value, validRange);
186179
if (toolkit.isEditMode() && validRange) {
187180
meter.setCurrentValue((new_value + model_widget.propMinimum().getValue()) / 2.0);
188181
}
189-
}
182+
});
190183

191184
layoutChanged(null, null, null);
192185
});
@@ -229,6 +222,11 @@ protected void registerListeners()
229222
meter.setKnobSize(new_value);
230223
layoutChanged(null, null, null);
231224
});
225+
226+
addWidgetPropertyListener(model_widget.propDisplayMode(), (property, old_value, new_value) -> {
227+
meter.setDisplayMode(new_value);
228+
layoutChanged(null, null, null);
229+
});
232230
}
233231

234232
@Override
@@ -244,7 +242,7 @@ protected void unregisterListeners()
244242
super.unregisterListeners();
245243
}
246244

247-
int minimumSize = 25;
245+
int minimumSize = 2;
248246
private void widthChanged(WidgetProperty<Integer> prop, Integer old_value, Integer new_value)
249247
{
250248
if (new_value < minimumSize) {
@@ -267,13 +265,13 @@ private void orientationChanged(WidgetProperty<Boolean> prop, Boolean old, Boole
267265
{
268266
if (toolkit.isEditMode())
269267
{
270-
synchronized(meter) {
268+
meter.withWriteLock(() -> {
271269
int w = model_widget.propWidth().getValue();
272270
int h = model_widget.propHeight().getValue();
273271
model_widget.propWidth().setValue(h);
274272
model_widget.propHeight().setValue(w);
275273
meter.setHorizontal(horizontal);
276-
}
274+
});
277275
layoutChanged(null, null, null);
278276
}
279277
}
@@ -290,81 +288,88 @@ private void layoutChanged(WidgetProperty<?> property, Object old_value, Object
290288

291289
private void valueChanged(WidgetProperty<?> property, Object old_value, Object new_value) {
292290
if (new_value instanceof VDouble) {
293-
VDouble vDouble = ((VDouble) new_value);
294-
double newValue = vDouble.getValue();
295-
meter.setCurrentValue(newValue);
296-
297-
if (!Double.isNaN(newValue)) {
298-
if (Double.isNaN(observedMin) || newValue < observedMin) {
299-
observedMin = newValue;
300-
newObservedMinAndMaxValues = true;
301-
}
302-
303-
if (Double.isNaN(observedMax) || newValue > observedMax) {
304-
observedMax = newValue;
305-
newObservedMinAndMaxValues = true;
306-
}
307-
}
308-
309-
Display display = vDouble.getDisplay();
310-
311-
// Set the units:
312-
if (model_widget != null && model_widget.propShowUnits().getValue()) {
313-
meter.setUnits(display.getUnit());
314-
}
315-
316-
if (model_widget != null && model_widget.propLimitsFromPV().getValue()) {
317-
Range displayRange = display.getDisplayRange();
318-
if (displayRange != null
319-
&& Double.isFinite(displayRange.getMinimum())
320-
&& Double.isFinite(displayRange.getMaximum())
321-
&& displayRange.getMaximum() - displayRange.getMinimum() > 0.0) {
322-
if (meter.linearMeterScale.getValueRange().getLow() != displayRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != displayRange.getMaximum() || !meter.getValidRange()) {
323-
meter.setRange(displayRange.getMinimum(), displayRange.getMaximum(), true);
291+
meter.withWriteLock(() -> {
292+
VDouble vDouble = ((VDouble) new_value);
293+
double newValue = vDouble.getValue();
294+
295+
if (!Double.isNaN(newValue)) {
296+
if (Double.isNaN(observedMin) || newValue < observedMin) {
297+
observedMin = newValue;
298+
newObservedMinAndMaxValues = true;
324299
}
325-
} else {
326-
Range controlRange = display.getControlRange();
327-
if (controlRange != null
328-
&& Double.isFinite(controlRange.getMinimum())
329-
&& Double.isFinite(controlRange.getMaximum())
330-
&& controlRange.getMaximum() - controlRange.getMinimum() > 0.0) {
331-
if (meter.linearMeterScale.getValueRange().getLow() != controlRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != controlRange.getMaximum() || !meter.getValidRange()) {
332-
meter.setRange(controlRange.getMinimum(), controlRange.getMaximum(), true);
333-
}
334-
} else if (newObservedMinAndMaxValues && !Double.isNaN(observedMin) && !Double.isNaN(observedMax)) {
335-
meter.setRange(observedMin - 1, observedMax + 1, false);
336-
newObservedMinAndMaxValues = false;
337-
} else if (meter.linearMeterScale.getValueRange().getLow() != 0.0 || meter.linearMeterScale.getValueRange().getHigh() != 100) {
338-
meter.setRange(0.0, 100.0, false);
300+
301+
if (Double.isNaN(observedMax) || newValue > observedMax) {
302+
observedMax = newValue;
303+
newObservedMinAndMaxValues = true;
339304
}
340305
}
341306

342-
{
343-
Range warningRange = display.getWarningRange();
344-
if (warningRange != null) {
345-
if (!Double.isNaN(warningRange.getMinimum()) && meter.getLow() != warningRange.getMinimum()) {
346-
meter.setLow(warningRange.getMinimum());
347-
}
307+
Display display = vDouble.getDisplay();
348308

349-
if (!Double.isNaN(warningRange.getMaximum()) && meter.getHigh() != warningRange.getMaximum()) {
350-
meter.setHigh(warningRange.getMaximum());
309+
// Set the units:
310+
if (model_widget != null && model_widget.propShowUnits().getValue()) {
311+
meter.setUnits(display.getUnit());
312+
}
313+
if (model_widget != null) {
314+
LinearMeterWidget.LimitsFromPV limitsFromPVSetting = model_widget.propLimitsFromPV().getValue();
315+
if (limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.LimitsFromPV) ||
316+
limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.MinAndMaxFromPV)) {
317+
Range displayRange = display.getDisplayRange();
318+
if (displayRange != null
319+
&& Double.isFinite(displayRange.getMinimum())
320+
&& Double.isFinite(displayRange.getMaximum())
321+
&& displayRange.getMaximum() - displayRange.getMinimum() > 0.0) {
322+
if (meter.linearMeterScale.getValueRange().getLow() != displayRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != displayRange.getMaximum() || !meter.getValidRange()) {
323+
meter.setRange(displayRange.getMinimum(), displayRange.getMaximum(), true);
324+
}
325+
} else {
326+
Range controlRange = display.getControlRange();
327+
if (controlRange != null
328+
&& Double.isFinite(controlRange.getMinimum())
329+
&& Double.isFinite(controlRange.getMaximum())
330+
&& controlRange.getMaximum() - controlRange.getMinimum() > 0.0) {
331+
if (meter.linearMeterScale.getValueRange().getLow() != controlRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != controlRange.getMaximum() || !meter.getValidRange()) {
332+
meter.setRange(controlRange.getMinimum(), controlRange.getMaximum(), true);
333+
}
334+
} else if (newObservedMinAndMaxValues && !Double.isNaN(observedMin) && !Double.isNaN(observedMax)) {
335+
meter.setRange(observedMin - 1, observedMax + 1, false);
336+
newObservedMinAndMaxValues = false;
337+
} else if (meter.linearMeterScale.getValueRange().getLow() != 0.0 || meter.linearMeterScale.getValueRange().getHigh() != 100) {
338+
meter.setRange(0.0, 100.0, false);
339+
}
351340
}
352341
}
353-
}
354-
355-
{
356-
Range alarmRange = display.getAlarmRange();
357-
if (alarmRange != null) {
358-
if (!Double.isNaN(alarmRange.getMinimum()) && meter.getLoLo() != alarmRange.getMinimum()) {
359-
meter.setLoLo(alarmRange.getMinimum());
342+
if (limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.LimitsFromPV) ||
343+
limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.AlarmLimitsFromPV)) {
344+
{
345+
Range warningRange = display.getWarningRange();
346+
if (warningRange != null) {
347+
if (!Double.isNaN(warningRange.getMinimum()) && meter.getLow() != warningRange.getMinimum()) {
348+
meter.setLow(warningRange.getMinimum());
349+
}
350+
351+
if (!Double.isNaN(warningRange.getMaximum()) && meter.getHigh() != warningRange.getMaximum()) {
352+
meter.setHigh(warningRange.getMaximum());
353+
}
354+
}
360355
}
361356

362-
if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) {
363-
meter.setHiHi(alarmRange.getMaximum());
357+
{
358+
Range alarmRange = display.getAlarmRange();
359+
if (alarmRange != null) {
360+
if (!Double.isNaN(alarmRange.getMinimum()) && meter.getLoLo() != alarmRange.getMinimum()) {
361+
meter.setLoLo(alarmRange.getMinimum());
362+
}
363+
364+
if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) {
365+
meter.setHiHi(alarmRange.getMaximum());
366+
}
367+
}
364368
}
365369
}
366370
}
367-
}
371+
meter.setCurrentValue(newValue);
372+
});
368373
}
369374
}
370375

@@ -375,7 +380,7 @@ public void updateChanges()
375380

376381
if (dirty_look.checkAndClear())
377382
{
378-
synchronized (meter) {
383+
meter.withWriteLock(() -> {
379384
boolean horizontal = model_widget.propDisplayHorizontal().getValue();
380385
int width = model_widget.propWidth().getValue();
381386
int height = model_widget.propHeight().getValue();
@@ -391,7 +396,7 @@ public void updateChanges()
391396
jfx_node.setPrefSize(width, height);
392397

393398
meter.setSize(width, height);
394-
}
399+
});
395400
}
396401
}
397402

0 commit comments

Comments
 (0)