Skip to content

Commit 279e108

Browse files
committed
CSSTUDIO-3347 Acquire the write-lock in LinearMeterRepresentation.valueChanged().
1 parent 052baf3 commit 279e108

File tree

1 file changed

+67
-65
lines changed

1 file changed

+67
-65
lines changed

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

Lines changed: 67 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -288,86 +288,88 @@ private void layoutChanged(WidgetProperty<?> property, Object old_value, Object
288288

289289
private void valueChanged(WidgetProperty<?> property, Object old_value, Object new_value) {
290290
if (new_value instanceof VDouble) {
291-
VDouble vDouble = ((VDouble) new_value);
292-
double newValue = vDouble.getValue();
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;
299+
}
293300

294-
if (!Double.isNaN(newValue)) {
295-
if (Double.isNaN(observedMin) || newValue < observedMin) {
296-
observedMin = newValue;
297-
newObservedMinAndMaxValues = true;
301+
if (Double.isNaN(observedMax) || newValue > observedMax) {
302+
observedMax = newValue;
303+
newObservedMinAndMaxValues = true;
304+
}
298305
}
299306

300-
if (Double.isNaN(observedMax) || newValue > observedMax) {
301-
observedMax = newValue;
302-
newObservedMinAndMaxValues = true;
307+
Display display = vDouble.getDisplay();
308+
309+
// Set the units:
310+
if (model_widget != null && model_widget.propShowUnits().getValue()) {
311+
meter.setUnits(display.getUnit());
303312
}
304-
}
305-
306-
Display display = vDouble.getDisplay();
307-
308-
// Set the units:
309-
if (model_widget != null && model_widget.propShowUnits().getValue()) {
310-
meter.setUnits(display.getUnit());
311-
}
312-
if (model_widget != null) {
313-
LinearMeterWidget.LimitsFromPV limitsFromPVSetting = model_widget.propLimitsFromPV().getValue();
314-
if (limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.LimitsFromPV) ||
315-
limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.MinAndMaxFromPV)) {
316-
Range displayRange = display.getDisplayRange();
317-
if (displayRange != null
318-
&& Double.isFinite(displayRange.getMinimum())
319-
&& Double.isFinite(displayRange.getMaximum())
320-
&& displayRange.getMaximum() - displayRange.getMinimum() > 0.0) {
321-
if (meter.linearMeterScale.getValueRange().getLow() != displayRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != displayRange.getMaximum() || !meter.getValidRange()) {
322-
meter.setRange(displayRange.getMinimum(), displayRange.getMaximum(), true);
323-
}
324-
} else {
325-
Range controlRange = display.getControlRange();
326-
if (controlRange != null
327-
&& Double.isFinite(controlRange.getMinimum())
328-
&& Double.isFinite(controlRange.getMaximum())
329-
&& controlRange.getMaximum() - controlRange.getMinimum() > 0.0) {
330-
if (meter.linearMeterScale.getValueRange().getLow() != controlRange.getMinimum() || meter.linearMeterScale.getValueRange().getHigh() != controlRange.getMaximum() || !meter.getValidRange()) {
331-
meter.setRange(controlRange.getMinimum(), controlRange.getMaximum(), true);
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);
332339
}
333-
} else if (newObservedMinAndMaxValues && !Double.isNaN(observedMin) && !Double.isNaN(observedMax)) {
334-
meter.setRange(observedMin - 1, observedMax + 1, false);
335-
newObservedMinAndMaxValues = false;
336-
} else if (meter.linearMeterScale.getValueRange().getLow() != 0.0 || meter.linearMeterScale.getValueRange().getHigh() != 100) {
337-
meter.setRange(0.0, 100.0, false);
338340
}
339341
}
340-
}
341-
if (limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.LimitsFromPV) ||
342-
limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.AlarmLimitsFromPV)) {
343-
{
344-
Range warningRange = display.getWarningRange();
345-
if (warningRange != null) {
346-
if (!Double.isNaN(warningRange.getMinimum()) && meter.getLow() != warningRange.getMinimum()) {
347-
meter.setLow(warningRange.getMinimum());
348-
}
349-
350-
if (!Double.isNaN(warningRange.getMaximum()) && meter.getHigh() != warningRange.getMaximum()) {
351-
meter.setHigh(warningRange.getMaximum());
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+
}
352354
}
353355
}
354-
}
355356

356-
{
357-
Range alarmRange = display.getAlarmRange();
358-
if (alarmRange != null) {
359-
if (!Double.isNaN(alarmRange.getMinimum()) && meter.getLoLo() != alarmRange.getMinimum()) {
360-
meter.setLoLo(alarmRange.getMinimum());
361-
}
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+
}
362363

363-
if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) {
364-
meter.setHiHi(alarmRange.getMaximum());
364+
if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) {
365+
meter.setHiHi(alarmRange.getMaximum());
366+
}
365367
}
366368
}
367369
}
368370
}
369-
}
370-
meter.setCurrentValue(newValue);
371+
meter.setCurrentValue(newValue);
372+
});
371373
}
372374
}
373375

0 commit comments

Comments
 (0)