Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
67de29a
CSSTUDIO-3360 Set minimumSize to 10.
abrahamwolk Aug 8, 2025
2d35f9c
CSSTUDIO-3347 Make concurrency more fine grained with the goal of imp…
abrahamwolk Aug 11, 2025
faaab25
CSSTUDIO-3347 Improve memory usage: re-use buffers when drawing the i…
abrahamwolk Aug 12, 2025
70f00d9
CSSTUDIO-3380 Make it possible to display the current value using a b…
abrahamwolk Aug 12, 2025
d892790
CSSTUDIO-3380 Bugfix: Draw the bar also when the value is larger than…
abrahamwolk Aug 12, 2025
a1a8ce5
index on CSSTUDIO-3360: d8927907a CSSTUDIO-3380 Bugfix: Draw the bar …
abrahamwolk Aug 12, 2025
5a888e6
WIP on CSSTUDIO-3360: d8927907a CSSTUDIO-3380 Bugfix: Draw the bar al…
abrahamwolk Aug 12, 2025
58db7a8
CSSTUDIO-3362 Add the two options "Min & max from PV" and "Limits fro…
abrahamwolk Aug 13, 2025
0d2def8
CSSTUDIO-3347 Add 'readWriteLock'.
abrahamwolk Aug 13, 2025
51b05f4
CSSTUDIO-3347 Remove the field 'currentWarning' and remove the method…
abrahamwolk Aug 13, 2025
a83312f
CSSTUDIO-3347 Remove the field 'currentIndicatorPosition'.
abrahamwolk Aug 13, 2025
5ab8f92
CSSTUDIO-3347 Replace types "AtomicBoolean", "AtomicInteger" and "Ato…
abrahamwolk Aug 13, 2025
c208211
CSSTUDIO-3347 Change getters and determineWarning() to use a writeLoc…
abrahamwolk Aug 13, 2025
d33fb73
CSSTUDIO-3347 Change methods to use the write lock instead of read lo…
abrahamwolk Aug 13, 2025
7feba92
Use a record instead of an ImmutableTriple to represent the image buf…
abrahamwolk Aug 14, 2025
71efd52
CSSTUDIO-3347 Acquire write lock when writing to awtJFXConvertBuffer …
abrahamwolk Aug 14, 2025
9aacd17
CSSTUDIO-3347 Use meter.withWriteLock() instead of synchronized(meter…
abrahamwolk Aug 14, 2025
ef2c60f
Bugfix: Fix display names of enum 'WARNING'.
abrahamwolk Aug 14, 2025
c63fcea
Improve warning messages.
abrahamwolk Aug 14, 2025
8b65da2
CSSTUDIO-3380 Improve drawBar().
abrahamwolk Aug 14, 2025
3adefeb
Remove "No unit defined warning".
abrahamwolk Aug 14, 2025
6feccf2
CSSTUDIO-3380 Fixes to the drawing of the bar.
abrahamwolk Aug 14, 2025
d6e3232
CSSTUDIO-3380 Fix margins.
abrahamwolk Aug 14, 2025
23753bb
Improve drawing.
abrahamwolk Aug 18, 2025
95ceca4
Move labels to messages.properties and fix indentation.
abrahamwolk Aug 19, 2025
a30028d
Improve drawing of the Linear Meter widget.
abrahamwolk Aug 19, 2025
041e094
Bugfix: Set new value after possibly updating alarm ranges.
abrahamwolk Aug 19, 2025
c46f05d
Improve drawing of the Linear Meter widget.
abrahamwolk Aug 19, 2025
729bfa8
Update comments.
abrahamwolk Aug 19, 2025
39ff1fe
Improve comment.
abrahamwolk Aug 19, 2025
fb5ad09
Add spaces around calls to minus.
abrahamwolk Aug 19, 2025
0222e70
Set minimum width and height to 2.
abrahamwolk Aug 19, 2025
1faf078
Increment LinearMeterWidget.METER_VERSION to 3.0.0.
abrahamwolk Aug 19, 2025
4b1efd8
Update widget property label.
abrahamwolk Aug 19, 2025
052baf3
Use Math.round() instead of Math.ceil().
abrahamwolk Aug 19, 2025
279e108
CSSTUDIO-3347 Acquire the write-lock in LinearMeterRepresentation.val…
abrahamwolk Aug 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,24 +42,16 @@ public Pane createJFXNode()
double initialValue = toolkit.isEditMode() ? (model_widget.propMinimum().getValue() + model_widget.propMaximum().getValue()) / 2.0
: Double.NaN;

double minimum, maximum;
double loLo, low, high, hiHi;
if (model_widget.propLimitsFromPV().getValue() && !toolkit.isEditMode()) {
minimum = Double.NaN;
maximum = Double.NaN;
loLo = Double.NaN;
low = Double.NaN;
high = Double.NaN;
hiHi = Double.NaN;
}
else {
minimum = model_widget.propMinimum().getValue();
maximum = model_widget.propMaximum().getValue();
loLo = model_widget.propLevelLoLo().getValue();
low = model_widget.propLevelLow().getValue();
high = model_widget.propLevelHigh().getValue();
hiHi = model_widget.propLevelHiHi().getValue();
}
// Set min, max, and alarm limits according to settings.
// Some or all of these may be overridden by the PV when
// values are received, if the option "Limits from PV"
// is not set to "No limits from PV".
double minimum = model_widget.propMinimum().getValue();
double maximum = model_widget.propMaximum().getValue();
double loLo = model_widget.propLevelLoLo().getValue();
double low = model_widget.propLevelLow().getValue();
double high = model_widget.propLevelHigh().getValue();
double hiHi = model_widget.propLevelHiHi().getValue();

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

Expand All @@ -86,6 +78,7 @@ public Pane createJFXNode()
model_widget.propKnobSize().getValue(),
widgetColorToAWTColor(model_widget.propKnobColor().getValue()),
model_widget.propShowWarnings().getValue());
meter.setDisplayMode(model_widget.propDisplayMode().getValue());
meter.setSize(model_widget.propWidth().getValue(),model_widget.propHeight().getValue());
meter.setHorizontal(model_widget.propDisplayHorizontal().getValue());
meter.setManaged(false);
Expand Down Expand Up @@ -167,26 +160,26 @@ protected void registerListeners()

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

synchronized (meter) {
meter.withWriteLock(() -> {
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);
}
}
});

layoutChanged(null, null, null);
});

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

synchronized (meter) {
meter.withWriteLock(() -> {
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);
}
}
});

layoutChanged(null, null, null);
});
Expand Down Expand Up @@ -229,6 +222,11 @@ protected void registerListeners()
meter.setKnobSize(new_value);
layoutChanged(null, null, null);
});

addWidgetPropertyListener(model_widget.propDisplayMode(), (property, old_value, new_value) -> {
meter.setDisplayMode(new_value);
layoutChanged(null, null, null);
});
}

@Override
Expand All @@ -244,7 +242,7 @@ protected void unregisterListeners()
super.unregisterListeners();
}

int minimumSize = 25;
int minimumSize = 2;
private void widthChanged(WidgetProperty<Integer> prop, Integer old_value, Integer new_value)
{
if (new_value < minimumSize) {
Expand All @@ -267,13 +265,13 @@ private void orientationChanged(WidgetProperty<Boolean> prop, Boolean old, Boole
{
if (toolkit.isEditMode())
{
synchronized(meter) {
meter.withWriteLock(() -> {
int w = model_widget.propWidth().getValue();
int h = model_widget.propHeight().getValue();
model_widget.propWidth().setValue(h);
model_widget.propHeight().setValue(w);
meter.setHorizontal(horizontal);
}
});
layoutChanged(null, null, null);
}
}
Expand All @@ -290,81 +288,88 @@ 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) {
VDouble vDouble = ((VDouble) new_value);
double newValue = vDouble.getValue();
meter.setCurrentValue(newValue);

if (!Double.isNaN(newValue)) {
if (Double.isNaN(observedMin) || newValue < observedMin) {
observedMin = newValue;
newObservedMinAndMaxValues = true;
}

if (Double.isNaN(observedMax) || newValue > observedMax) {
observedMax = newValue;
newObservedMinAndMaxValues = true;
}
}

Display display = vDouble.getDisplay();

// Set the units:
if (model_widget != null && model_widget.propShowUnits().getValue()) {
meter.setUnits(display.getUnit());
}

if (model_widget != null && model_widget.propLimitsFromPV().getValue()) {
Range displayRange = display.getDisplayRange();
if (displayRange != null
&& Double.isFinite(displayRange.getMinimum())
&& Double.isFinite(displayRange.getMaximum())
&& 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);
meter.withWriteLock(() -> {
VDouble vDouble = ((VDouble) new_value);
double newValue = vDouble.getValue();

if (!Double.isNaN(newValue)) {
if (Double.isNaN(observedMin) || newValue < observedMin) {
observedMin = newValue;
newObservedMinAndMaxValues = true;
}
} else {
Range controlRange = display.getControlRange();
if (controlRange != null
&& Double.isFinite(controlRange.getMinimum())
&& Double.isFinite(controlRange.getMaximum())
&& 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);
}
} else if (newObservedMinAndMaxValues && !Double.isNaN(observedMin) && !Double.isNaN(observedMax)) {
meter.setRange(observedMin - 1, observedMax + 1, false);
newObservedMinAndMaxValues = false;
} else if (meter.linearMeterScale.getValueRange().getLow() != 0.0 || meter.linearMeterScale.getValueRange().getHigh() != 100) {
meter.setRange(0.0, 100.0, false);

if (Double.isNaN(observedMax) || newValue > observedMax) {
observedMax = newValue;
newObservedMinAndMaxValues = true;
}
}

{
Range warningRange = display.getWarningRange();
if (warningRange != null) {
if (!Double.isNaN(warningRange.getMinimum()) && meter.getLow() != warningRange.getMinimum()) {
meter.setLow(warningRange.getMinimum());
}
Display display = vDouble.getDisplay();

if (!Double.isNaN(warningRange.getMaximum()) && meter.getHigh() != warningRange.getMaximum()) {
meter.setHigh(warningRange.getMaximum());
// Set the units:
if (model_widget != null && model_widget.propShowUnits().getValue()) {
meter.setUnits(display.getUnit());
}
if (model_widget != null) {
LinearMeterWidget.LimitsFromPV limitsFromPVSetting = model_widget.propLimitsFromPV().getValue();
if (limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.LimitsFromPV) ||
limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.MinAndMaxFromPV)) {
Range displayRange = display.getDisplayRange();
if (displayRange != null
&& Double.isFinite(displayRange.getMinimum())
&& Double.isFinite(displayRange.getMaximum())
&& 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);
}
} else {
Range controlRange = display.getControlRange();
if (controlRange != null
&& Double.isFinite(controlRange.getMinimum())
&& Double.isFinite(controlRange.getMaximum())
&& 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);
}
} else if (newObservedMinAndMaxValues && !Double.isNaN(observedMin) && !Double.isNaN(observedMax)) {
meter.setRange(observedMin - 1, observedMax + 1, false);
newObservedMinAndMaxValues = false;
} else if (meter.linearMeterScale.getValueRange().getLow() != 0.0 || meter.linearMeterScale.getValueRange().getHigh() != 100) {
meter.setRange(0.0, 100.0, false);
}
}
}
}

{
Range alarmRange = display.getAlarmRange();
if (alarmRange != null) {
if (!Double.isNaN(alarmRange.getMinimum()) && meter.getLoLo() != alarmRange.getMinimum()) {
meter.setLoLo(alarmRange.getMinimum());
if (limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.LimitsFromPV) ||
limitsFromPVSetting.equals(LinearMeterWidget.LimitsFromPV.AlarmLimitsFromPV)) {
{
Range warningRange = display.getWarningRange();
if (warningRange != null) {
if (!Double.isNaN(warningRange.getMinimum()) && meter.getLow() != warningRange.getMinimum()) {
meter.setLow(warningRange.getMinimum());
}

if (!Double.isNaN(warningRange.getMaximum()) && meter.getHigh() != warningRange.getMaximum()) {
meter.setHigh(warningRange.getMaximum());
}
}
}

if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) {
meter.setHiHi(alarmRange.getMaximum());
{
Range alarmRange = display.getAlarmRange();
if (alarmRange != null) {
if (!Double.isNaN(alarmRange.getMinimum()) && meter.getLoLo() != alarmRange.getMinimum()) {
meter.setLoLo(alarmRange.getMinimum());
}

if (!Double.isNaN(alarmRange.getMaximum()) && meter.getHiHi() != alarmRange.getMaximum()) {
meter.setHiHi(alarmRange.getMaximum());
}
}
}
}
}
}
meter.setCurrentValue(newValue);
});
}
}

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

if (dirty_look.checkAndClear())
{
synchronized (meter) {
meter.withWriteLock(() -> {
boolean horizontal = model_widget.propDisplayHorizontal().getValue();
int width = model_widget.propWidth().getValue();
int height = model_widget.propHeight().getValue();
Expand All @@ -391,7 +396,7 @@ public void updateChanges()
jfx_node.setPrefSize(width, height);

meter.setSize(width, height);
}
});
}
}

Expand Down
Loading