Skip to content

Commit fa7bb3c

Browse files
committed
Use VTypeHelper to determine array size
1 parent 357bdd8 commit fa7bb3c

File tree

4 files changed

+89
-26
lines changed

4 files changed

+89
-26
lines changed

app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/compare/TableComparisonViewController.java

Lines changed: 82 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,20 @@
3636
import org.epics.vtype.VString;
3737
import org.epics.vtype.VStringArray;
3838
import org.epics.vtype.VType;
39+
import org.epics.vtype.VUByte;
40+
import org.epics.vtype.VUByteArray;
41+
import org.epics.vtype.VUInt;
42+
import org.epics.vtype.VUIntArray;
43+
import org.epics.vtype.VULong;
44+
import org.epics.vtype.VULongArray;
45+
import org.epics.vtype.VUShort;
46+
import org.epics.vtype.VUShortArray;
3947
import org.phoebus.applications.saveandrestore.Messages;
4048
import org.phoebus.applications.saveandrestore.ui.VTypePair;
4149
import org.phoebus.applications.saveandrestore.ui.snapshot.VDeltaCellEditor;
4250
import org.phoebus.applications.saveandrestore.ui.snapshot.VTypeCellEditor;
4351
import org.phoebus.core.vtypes.VDisconnectedData;
52+
import org.phoebus.core.vtypes.VTypeHelper;
4453
import org.phoebus.pv.PV;
4554
import org.phoebus.pv.PVPool;
4655
import org.phoebus.saveandrestore.util.VNoData;
@@ -49,7 +58,6 @@
4958
import java.util.Comparator;
5059
import java.util.List;
5160
import java.util.concurrent.TimeUnit;
52-
import java.util.concurrent.atomic.AtomicInteger;
5361
import java.util.logging.Level;
5462
import java.util.logging.Logger;
5563

@@ -128,8 +136,8 @@ public void loadDataAndConnect(VType data, String pvName) {
128136

129137
pvNameProperty.set(pvName);
130138

139+
int arraySize = VTypeHelper.getArraySize(data);
131140
if (data instanceof VNumberArray) {
132-
int arraySize = ((VNumberArray) data).getData().size();
133141
for (int index = 0; index < arraySize; index++) {
134142
List<ColumnEntry> columnEntries = new ArrayList<>();
135143
if (data instanceof VDoubleArray array) {
@@ -144,18 +152,34 @@ public void loadDataAndConnect(VType data, String pvName) {
144152
int value = array.getData().getInt(index);
145153
ColumnEntry columnEntry = new ColumnEntry(VInt.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
146154
addRow(index, columnEntries, columnEntry);
155+
} else if (data instanceof VUIntArray array) {
156+
int value = array.getData().getInt(index);
157+
ColumnEntry columnEntry = new ColumnEntry(VUInt.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
158+
addRow(index, columnEntries, columnEntry);
147159
} else if (data instanceof VLongArray array) {
148160
long value = array.getData().getLong(index);
149161
ColumnEntry columnEntry = new ColumnEntry(VLong.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
150162
addRow(index, columnEntries, columnEntry);
163+
} else if (data instanceof VULongArray array) {
164+
long value = array.getData().getLong(index);
165+
ColumnEntry columnEntry = new ColumnEntry(VULong.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
166+
addRow(index, columnEntries, columnEntry);
151167
} else if (data instanceof VShortArray array) {
152168
short value = array.getData().getShort(index);
153169
ColumnEntry columnEntry = new ColumnEntry(VShort.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
154170
addRow(index, columnEntries, columnEntry);
171+
} else if (data instanceof VUShortArray array) {
172+
short value = array.getData().getShort(index);
173+
ColumnEntry columnEntry = new ColumnEntry(VUShort.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
174+
addRow(index, columnEntries, columnEntry);
155175
} else if (data instanceof VByteArray array) {
156176
byte value = array.getData().getByte(index);
157177
ColumnEntry columnEntry = new ColumnEntry(VByte.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
158178
addRow(index, columnEntries, columnEntry);
179+
} else if (data instanceof VUByteArray array) {
180+
byte value = array.getData().getByte(index);
181+
ColumnEntry columnEntry = new ColumnEntry(VUByte.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
182+
addRow(index, columnEntries, columnEntry);
159183
}
160184
}
161185
} else if (data instanceof VBooleanArray array) {
@@ -206,8 +230,8 @@ private void connect() {
206230
/**
207231
* Returns PV to pool, e.g. when UI is dismissed.
208232
*/
209-
public void cleanUp(){
210-
if(pv != null){
233+
public void cleanUp() {
234+
if (pv != null) {
211235
PVPool.releasePV(pv);
212236
}
213237
}
@@ -222,95 +246,130 @@ private void updateTable(VType liveData) {
222246
if (liveData.equals(VDisconnectedData.INSTANCE)) {
223247
comparisonTable.getItems().forEach(i -> i.getColumnEntries().get(0).setLiveVal(VDisconnectedData.INSTANCE));
224248
} else {
225-
AtomicInteger liveDataArraySize = new AtomicInteger(0);
249+
int liveDataArraySize = VTypeHelper.getArraySize(liveData);
226250
comparisonTable.getItems().forEach(i -> {
227251
int index = i.indexProperty().get();
228252
ColumnEntry columnEntry = i.getColumnEntries().get(0);
229253
if (liveData instanceof VNumberArray) {
230-
liveDataArraySize.set(((VNumberArray) liveData).getData().size());
231-
if (index >= liveDataArraySize.get()) { // Live data has fewer elements than stored data
254+
if (index >= liveDataArraySize) { // Live data has fewer elements than stored data
232255
columnEntry.setLiveVal(VNoData.INSTANCE);
233256
} else if (liveData instanceof VDoubleArray array) {
234257
columnEntry.setLiveVal(VDouble.of(array.getData().getDouble(index), array.getAlarm(), array.getTime(), array.getDisplay()));
258+
} else if (liveData instanceof VShortArray array) {
259+
columnEntry.setLiveVal(VShort.of(array.getData().getShort(index), array.getAlarm(), array.getTime(), array.getDisplay()));
235260
} else if (liveData instanceof VIntArray array) {
236261
columnEntry.setLiveVal(VInt.of(array.getData().getInt(index), array.getAlarm(), array.getTime(), array.getDisplay()));
262+
} else if (liveData instanceof VUIntArray array) {
263+
columnEntry.setLiveVal(VUInt.of(array.getData().getInt(index), array.getAlarm(), array.getTime(), array.getDisplay()));
237264
} else if (liveData instanceof VLongArray array) {
238265
columnEntry.setLiveVal(VLong.of(array.getData().getLong(index), array.getAlarm(), array.getTime(), array.getDisplay()));
266+
} else if (liveData instanceof VULongArray array) {
267+
columnEntry.setLiveVal(VULong.of(array.getData().getLong(index), array.getAlarm(), array.getTime(), array.getDisplay()));
239268
} else if (liveData instanceof VFloatArray array) {
240269
columnEntry.setLiveVal(VFloat.of(array.getData().getFloat(index), array.getAlarm(), array.getTime(), array.getDisplay()));
241270
} else if (liveData instanceof VShortArray array) {
271+
columnEntry.setLiveVal(VUShort.of(array.getData().getShort(index), array.getAlarm(), array.getTime(), array.getDisplay()));
272+
} else if (liveData instanceof VUShortArray array) {
242273
columnEntry.setLiveVal(VShort.of(array.getData().getShort(index), array.getAlarm(), array.getTime(), array.getDisplay()));
274+
} else if (liveData instanceof VByteArray array) {
275+
columnEntry.setLiveVal(VByte.of(array.getData().getShort(index), array.getAlarm(), array.getTime(), array.getDisplay()));
276+
} else if (liveData instanceof VUByteArray array) {
277+
columnEntry.setLiveVal(VUByte.of(array.getData().getShort(index), array.getAlarm(), array.getTime(), array.getDisplay()));
243278
}
244279
} else if (liveData instanceof VBooleanArray array) {
245-
liveDataArraySize.set(array.getData().size());
246280
if (index >= array.getData().size()) { // Live data has fewer elements than stored data
247281
columnEntry.setLiveVal(VNoData.INSTANCE);
248282
} else {
249283
columnEntry.setLiveVal(VBoolean.of(array.getData().getBoolean(index), array.getAlarm(), array.getTime()));
250284
}
251-
252285
} else if (liveData instanceof VEnumArray array) {
253-
liveDataArraySize.set(array.getData().size());
254286
if (index >= array.getData().size()) { // Live data has fewer elements than stored data
255287
columnEntry.setLiveVal(VNoData.INSTANCE);
256288
} else {
257-
i.getColumnEntries().get(index).setLiveVal(VString.of(array.getData().get(index), array.getAlarm(), array.getTime()));
289+
columnEntry.setLiveVal(VString.of(array.getData().get(index), array.getAlarm(), array.getTime()));
258290
}
259291
} else if (liveData instanceof VStringArray array) {
260-
liveDataArraySize.set(array.getData().size());
261292
if (index >= array.getData().size()) { // Live data has fewer elements than stored data
262293
columnEntry.setLiveVal(VNoData.INSTANCE);
263294
} else {
264-
i.getColumnEntries().get(index).setLiveVal(VString.of(array.getData().get(index), array.getAlarm(), array.getTime()));
295+
columnEntry.setLiveVal(VString.of(array.getData().get(index), array.getAlarm(), array.getTime()));
265296
}
266297
}
267298
});
268299
// Live data may have more elements than stored data
269-
if (liveDataArraySize.get() > comparisonTable.getItems().size()) {
300+
if (liveDataArraySize > comparisonTable.getItems().size()) {
270301
List<ColumnEntry> columnEntries = new ArrayList<>();
271302
if (liveData instanceof VNumberArray) {
272303
if (liveData instanceof VDoubleArray array) {
273-
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize.get(); index++) {
304+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
274305
double value = array.getData().getDouble(index);
275306
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
276307
columnEntry.setLiveVal(VDouble.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
277308
addRow(index, columnEntries, columnEntry);
278309
}
279310
} else if (liveData instanceof VFloatArray array) {
280-
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize.get(); index++) {
311+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
281312
float value = array.getData().getFloat(index);
282313
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
283314
columnEntry.setLiveVal(VFloat.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
284315
addRow(index, columnEntries, columnEntry);
285316
}
286317
} else if (liveData instanceof VIntArray array) {
287-
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize.get(); index++) {
318+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
288319
int value = array.getData().getInt(index);
289320
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
290321
columnEntry.setLiveVal(VInt.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
291322
addRow(index, columnEntries, columnEntry);
292323
}
324+
} else if (liveData instanceof VUIntArray array) {
325+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
326+
int value = array.getData().getInt(index);
327+
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
328+
columnEntry.setLiveVal(VUInt.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
329+
addRow(index, columnEntries, columnEntry);
330+
}
293331
} else if (liveData instanceof VLongArray array) {
294-
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize.get(); index++) {
332+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
295333
long value = array.getData().getLong(index);
296334
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
297335
columnEntry.setLiveVal(VLong.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
298336
addRow(index, columnEntries, columnEntry);
299337
}
338+
} else if (liveData instanceof VULongArray array) {
339+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
340+
long value = array.getData().getLong(index);
341+
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
342+
columnEntry.setLiveVal(VULong.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
343+
addRow(index, columnEntries, columnEntry);
344+
}
300345
} else if (liveData instanceof VShortArray array) {
301-
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize.get(); index++) {
346+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
302347
short value = array.getData().getShort(index);
303348
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
304349
columnEntry.setLiveVal(VShort.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
305350
addRow(index, columnEntries, columnEntry);
306351
}
352+
} else if (liveData instanceof VUShortArray array) {
353+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
354+
short value = array.getData().getShort(index);
355+
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
356+
columnEntry.setLiveVal(VUShort.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
357+
addRow(index, columnEntries, columnEntry);
358+
}
307359
} else if (liveData instanceof VByteArray array) {
308-
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize.get(); index++) {
360+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
309361
byte value = array.getData().getByte(index);
310362
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
311363
columnEntry.setLiveVal(VByte.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
312364
addRow(index, columnEntries, columnEntry);
313365
}
366+
} else if (liveData instanceof VUByteArray array) {
367+
for (int index = comparisonTable.getItems().size(); index < liveDataArraySize; index++) {
368+
byte value = array.getData().getByte(index);
369+
ColumnEntry columnEntry = new ColumnEntry(VNoData.INSTANCE);
370+
columnEntry.setLiveVal(VUByte.of(value, array.getAlarm(), array.getTime(), array.getDisplay()));
371+
addRow(index, columnEntries, columnEntry);
372+
}
314373
}
315374
} else if (liveData instanceof VBooleanArray array) {
316375
ListBoolean listBoolean = array.getData();
@@ -342,10 +401,8 @@ private void updateTable(VType liveData) {
342401
private void parseAndUpdateThreshold(String value) {
343402
thresholdSpinner.getEditor().getStyleClass().remove("input-error");
344403
thresholdSpinner.setTooltip(null);
345-
346-
double parsedNumber;
347404
try {
348-
parsedNumber = Double.parseDouble(value.trim());
405+
double parsedNumber = Double.parseDouble(value.trim());
349406
updateThreshold(parsedNumber);
350407
} catch (Exception e) {
351408
thresholdSpinner.getEditor().getStyleClass().add("input-error");
@@ -354,8 +411,8 @@ private void parseAndUpdateThreshold(String value) {
354411
}
355412

356413
/**
357-
* Computes thresholds on scalar data types. The threshold is used to indicate that a delta value within threshold
358-
* should not decorate the delta column, i.e. consider saved and live values equal.
414+
* Computes thresholds on the individual elements. The threshold is used to indicate that a delta value within threshold
415+
* should not decorate the delta column.
359416
*
360417
* @param threshold Threshold in percent
361418
*/

app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/snapshot/compare/ComparisonDialogDemo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void start(Stage primaryStage) {
3030
Alarm.none(),
3131
Time.now(), Display.none());
3232
ComparisonDialog comparisonDialog =
33-
new ComparisonDialog(vDoubleArray, "loc://x(1, 1.9, 4, 8)");
33+
new ComparisonDialog(vDoubleArray, "loc://x(3, 2, 1)");
3434
comparisonDialog.show();
3535
}
3636
}

core/vtype/src/main/java/org/phoebus/core/vtypes/VTypeHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ public static int getArraySize(final VType value) {
278278
sizes = ((VEnumArray) value).getSizes();
279279
} else if (value instanceof VStringArray) {
280280
sizes = ((VStringArray) value).getSizes();
281+
} else if (value instanceof VBooleanArray) {
282+
sizes = ((VBooleanArray) value).getSizes();
281283
} else {
282284
return 0;
283285
}

core/vtype/src/test/java/org/phoebus/core/vtypes/VTypeHelperTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ public void testGetArraySize() {
192192
VStringArray stringArray =
193193
VStringArray.of(Arrays.asList("a", "b"), alarm, time);
194194
assertEquals(2, VTypeHelper.getArraySize(stringArray));
195+
196+
VBooleanArray booleanArray =
197+
VBooleanArray.of(ArrayBoolean.of(true, false, true), alarm, time);
198+
assertEquals(3, VTypeHelper.getArraySize(booleanArray));
195199
}
196200

197201
@Test

0 commit comments

Comments
 (0)