@@ -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