diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Utilities.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Utilities.java index a14d0799e5..4442fb8a65 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Utilities.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/Utilities.java @@ -17,6 +17,8 @@ */ package org.phoebus.applications.saveandrestore.ui; +import org.epics.pva.data.*; +import org.epics.pva.data.nt.PVATable; import org.epics.util.array.*; import org.epics.util.number.*; import org.epics.util.text.NumberFormats; @@ -100,7 +102,7 @@ public double getAbsoluteDelta() { /** * The character code for the greek delta letter */ - public static final char DELTA_CHAR = '\u0394'; + public static final char DELTA_CHAR = 'Δ'; private static final char COMMA = ','; // All formats use thread locals, to avoid problems if any of the static methods are invoked concurrently @@ -145,7 +147,7 @@ public static VType valueFromString(String indata, VType type) throws IllegalArg Time time = Time.now(); if (type instanceof VNumberArray) { ListNumber list = null; - String[] elements = data.split("\\,"); + String[] elements = data.split(","); if (((VNumberArray) type).getData().size() != elements.length) { throw new IllegalArgumentException("The number of array elements is different from the original."); } @@ -213,12 +215,12 @@ public static VType valueFromString(String indata, VType type) throws IllegalArg return VNumberArray.of(list, alarm, time, Display.none()); } else if (type instanceof VStringArray) { - String[] elements = data.split("\\,"); + String[] elements = data.split(","); List list = Arrays.stream(elements).map(String::trim).collect(Collectors.toList()); list = list.stream().map(s -> s.substring(1, s.length() - 1)).collect(Collectors.toList()); return VStringArray.of(list, alarm, time); } else if (type instanceof VBooleanArray) { - String[] elements = data.split("\\,"); + String[] elements = data.split(","); List list = Arrays.stream(elements).map(String::trim).collect(Collectors.toList()); boolean[] booleans = new boolean[list.size()]; for (int i = 0; i < list.size(); i++) { @@ -281,7 +283,7 @@ public static VType valueFromString(String indata, VType type) throws IllegalArg /** * Extracts the raw value from the given data object. The raw value is either one of the primitive wrappers or some - * kind of a list type if the value is an {@link Array}. + * list type if the value is an {@link Array}. * * @param type the value to extract the raw data from * @return the raw data @@ -320,12 +322,20 @@ public static Object toRawValue(VType type) { return ((VString) type).getValue(); } else if (type instanceof VBoolean) { return ((VBoolean) type).getValue(); + } else if (type instanceof VTable) { + VTable vTable = (VTable) type; + int columnCount = vTable.getColumnCount(); + List dataArrays = new ArrayList(); + for (int i = 0; i < columnCount; i++) { + dataArrays.add(toPVArrayType("Col " + i, vTable.getColumnData(i))); + } + return new PVAStructure(PVATable.STRUCT_NAME, "", dataArrays); } return null; } /** - * Transforms the value of the given {@link VType} to a human readable string. This method uses formatting to format + * Transforms the value of the given {@link VType} to a human-readable string. This method uses formatting to format * all values, which may result in the arrays being truncated. * * @param type the data to transform @@ -353,16 +363,16 @@ public static String valueToString(VType type, int arrayLimit) { int size = Math.min(arrayLimit, list.size()); StringBuilder sb = new StringBuilder(size * 15 + 2); sb.append('['); - Pattern pattern = Pattern.compile("\\,"); + Pattern pattern = Pattern.compile(","); NumberFormat formatter = ((SimpleValueFormat) FORMAT.get()).getNumberFormat(); if (type instanceof VDoubleArray) { for (int i = 0; i < size; i++) { - sb.append(pattern.matcher(formatter.format(list.getDouble(i))).replaceAll("\\.")).append(COMMA) + sb.append(pattern.matcher(formatter.format(list.getDouble(i))).replaceAll(".")).append(COMMA) .append(' '); } } else if (type instanceof VFloatArray) { for (int i = 0; i < size; i++) { - sb.append(pattern.matcher(formatter.format(list.getFloat(i))).replaceAll("\\.")).append(COMMA) + sb.append(pattern.matcher(formatter.format(list.getFloat(i))).replaceAll(".")).append(COMMA) .append(' '); } } else if (type instanceof VULongArray) { @@ -451,8 +461,10 @@ public static String valueToString(VType type, int arrayLimit) { return ((VString) type).getValue(); } else if (type instanceof VBoolean) { return String.valueOf(((VBoolean) type).getValue()); + } else if (type instanceof VTable) { + return "[VTable]"; } - // no support for MultiScalars (VMultiDouble, VMultiInt, VMultiString, VMultiEnum), VStatistics, VTable and + // no support for MultiScalars (VMultiDouble, VMultiInt, VMultiString, VMultiEnum), VStatistics and // VImage) return "Type " + VType.typeOf(type).getSimpleName() + " not supported"; } @@ -886,6 +898,9 @@ public static VTypeComparison deltaValueToString(VType value, VType baseValue, O } else if (value instanceof VBooleanArray && baseValue instanceof VBooleanArray) { boolean equal = areValuesEqual(value, baseValue, Optional.empty()); return new VTypeComparison(equal ? "---" : "NOT EQUAL", equal ? 0 : 1, equal); + } else if (value instanceof VTable && baseValue instanceof VTable) { + boolean equal = areValuesEqual(value, baseValue, Optional.empty()); + return new VTypeComparison(equal ? "---" : "NOT EQUAL", equal ? 0 : 1, equal); } else { String str = valueToString(value); boolean valuesEqual = areValuesEqual(value, baseValue, Optional.empty()); @@ -928,7 +943,7 @@ public static String deltaValueToPercentage(VType value, VType baseValue) { } /** - * Checks if the values of the given vtype are equal and returns true if they are or false if they are not. + * Checks if the values of the given {@link VType} are equal and returns true if they are or false if they are not. * Timestamps, alarms and other parameters are ignored. * * @param v1 the first value to check @@ -1115,12 +1130,63 @@ public static boolean areValuesEqual(VType v1, VType v2, Optional> } } return true; + } else if (v1 instanceof VTable && v2 instanceof VTable) { + VTable vTable1 = (VTable) v1; + VTable vTable2 = (VTable) v2; + if (vTable1.getColumnCount() != vTable2.getColumnCount() || + vTable1.getRowCount() != vTable2.getRowCount()) { + return false; + } + for (int i = 0; i < vTable1.getColumnCount(); i++) { + if (!vTable1.getColumnType(i).equals(vTable2.getColumnType(i))) { + return false; + } + if (!vTable1.getColumnName(i).equals(vTable2.getColumnName(i))) { + return false; + } + if (!areVTypeArraysEqual(vTable1.getColumnType(i), vTable1.getColumnData(i), vTable2.getColumnData(i))) { + return false; + } + } + return true; } // no support for MultiScalars (VMultiDouble, VMultiInt, VMultiString, VMultiEnum), VStatistics, VTable, // VImage return false; } + /** + * Compares array objects + * + * @param clazz Class of the input data objects + * @param a1 First object + * @param a2 Second object + * @return true if all elements in arrays are equal. + */ + public static boolean areVTypeArraysEqual(Class clazz, Object a1, Object a2) { + switch (clazz.getName()) { + case "int": + case "long": + case "double": + case "float": + case "short": + case "byte": + return areValuesEqual(VNumberArray.of((ListNumber) a1, Alarm.none(), Time.now(), Display.none()), + VNumberArray.of((ListNumber) a2, Alarm.none(), Time.now(), Display.none()), + Optional.empty()); + case "boolean": + return areValuesEqual(VBooleanArray.of((ListBoolean) a1, Alarm.none(), Time.now()), + VBooleanArray.of((ListBoolean) a2, Alarm.none(), Time.now()), + Optional.empty()); + case "java.lang.String": + return areValuesEqual(VStringArray.of((List) a1, Alarm.none(), Time.now()), + VStringArray.of((List) a2, Alarm.none(), Time.now()), + Optional.empty()); + default: + return false; + } + } + /** * Compares two instances of {@link VType} and returns true if they are identical or false of they are not. Values * are identical if their alarm signatures are identical, timestamps are the same, values are the same and in case @@ -1286,4 +1352,66 @@ private static boolean isAlarmAndTimeEqual(VType a1, VType a2) { } return false; } + + /** + * @param name Data item name + * @param object The object subject to conversion + * @return Converted object + */ + public static Object toPVArrayType(String name, Object object) { + if (object instanceof ListBoolean) { + ListBoolean listBoolean = (ListBoolean) object; + boolean[] booleans = new boolean[listBoolean.size()]; + for (int i = 0; i < listBoolean.size(); i++) { + booleans[i] = listBoolean.getBoolean(i); + } + return new PVABoolArray(name, booleans); + } else if (object instanceof ListNumber) { + ListNumber listNumber = (ListNumber) object; + if (object instanceof ArrayByte || object instanceof ArrayUByte) { + byte[] bytes = new byte[listNumber.size()]; + for (int i = 0; i < listNumber.size(); i++) { + bytes[i] = listNumber.getByte(i); + } + return new PVAByteArray(name, object instanceof ArrayUByte, bytes); + } else if (object instanceof ArrayShort || object instanceof ArrayUShort) { + short[] shorts = new short[listNumber.size()]; + for (int i = 0; i < listNumber.size(); i++) { + shorts[i] = listNumber.getShort(i); + } + return new PVAShortArray(name, object instanceof ArrayUShort, shorts); + } else if (object instanceof ArrayInteger || object instanceof ArrayUInteger) { + int[] ints = new int[listNumber.size()]; + for (int i = 0; i < listNumber.size(); i++) { + ints[i] = listNumber.getInt(i); + } + return new PVAIntArray(name, object instanceof ArrayUInteger, ints); + } else if (object instanceof ArrayLong || object instanceof ArrayULong) { + long[] longs = new long[listNumber.size()]; + for (int i = 0; i < listNumber.size(); i++) { + longs[i] = listNumber.getLong(i); + } + return new PVALongArray(name, object instanceof ArrayULong, longs); + } else if (object instanceof ArrayFloat) { + float[] floats = new float[listNumber.size()]; + for (int i = 0; i < listNumber.size(); i++) { + floats[i] = listNumber.getFloat(i); + } + return new PVAFloatArray(name, floats); + } else if (object instanceof ArrayDouble) { + double[] doubles = new double[listNumber.size()]; + for (int i = 0; i < listNumber.size(); i++) { + doubles[i] = listNumber.getDouble(i); + } + return new PVADoubleArray(name, doubles); + } else { + throw new IllegalArgumentException("Conversion of type " + object.getClass().getCanonicalName() + " not supported"); + } + } else { // Assume this always is for string arrays + Collection list = (Collection) object; + String[] strings = new String[list.size()]; + strings = list.toArray(strings); + return new PVAStringArray(name, strings); + } + } } diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java index 450247cac7..37fd14c6e8 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SaveAndRestorePV.java @@ -73,7 +73,7 @@ protected SaveAndRestorePV(TableEntry snapshotTableEntry) { this.snapshotTableEntry.setReadbackValue(this.readbackValue); }); } else { - // If configuration does not define readback PV, then UI should show "no data" rather than "disconnected" + // If configuration does not define read-back PV, then UI should show "no data" rather than "disconnected" this.snapshotTableEntry.setReadbackValue(VNoData.INSTANCE); } } catch (Exception e) { diff --git a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java index 4c762d7cb5..cc705977e5 100644 --- a/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java +++ b/app/save-and-restore/app/src/main/java/org/phoebus/applications/saveandrestore/ui/snapshot/SnapshotTableViewController.java @@ -371,7 +371,7 @@ public void restore(Snapshot snapshot, Consumer> completion) { } try { - countDownLatch.await(); + countDownLatch.await(10, TimeUnit.MINUTES); } catch (InterruptedException e) { LOGGER.log(Level.INFO, "Encountered InterruptedException", e); } diff --git a/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/UtilitiesTest.java b/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/UtilitiesTest.java index 5df126e743..68b753c8c2 100644 --- a/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/UtilitiesTest.java +++ b/app/save-and-restore/app/src/test/java/org/phoebus/applications/saveandrestore/ui/UtilitiesTest.java @@ -18,12 +18,15 @@ package org.phoebus.applications.saveandrestore.ui; +import org.epics.pva.data.*; import org.epics.util.array.*; import org.epics.vtype.*; import org.junit.jupiter.api.Test; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; @@ -214,7 +217,7 @@ public void testValueFromString() { Utilities.valueFromString("invalid", val); fail("Should throw exception"); } catch (IllegalArgumentException e) { - e.printStackTrace(); + // Ignore } val = VBoolean.of(false, alarm, time); @@ -280,12 +283,12 @@ public void testValueFromString() { val = VLongArray.of(ArrayLong.of(1, 2, 3, 4, 5), alarm, time, display); result = Utilities.valueFromString("1, 2, 3, 4, 5", val); assertTrue(result instanceof VLongArray); - assertTrue(((VLongArray) result).getData() instanceof ListLong); + assertNotNull(((VLongArray) result).getData()); val = VBooleanArray.of(ArrayBoolean.of(true, true, false, true), alarm, time); result = Utilities.valueFromString("[1, 1, 0, 2]", val); assertTrue(result instanceof VBooleanArray); - assertTrue(((VBooleanArray) result).getData() instanceof ListBoolean); + assertNotNull(((VBooleanArray) result).getData()); val = VDisconnectedData.INSTANCE; result = Utilities.valueFromString("5", val); @@ -382,6 +385,29 @@ public void testToRawValue() { assertTrue(((Boolean) d)); assertNull(Utilities.toRawValue(VDisconnectedData.INSTANCE)); + + List> types = Arrays.asList(Integer.TYPE, Integer.TYPE, Integer.TYPE); + List values = Arrays.asList(ArrayInteger.of(-1, 2, 3), ArrayInteger.of(1, 2, 3), ArrayUInteger.of(11, 22, 33)); + List names = Arrays.asList("a", "b", "c"); + VTable vTable = VTable.of(types, names, values); + + d = Utilities.toRawValue(vTable); + assertInstanceOf(PVAStructure.class, d); + PVAStructure pvaStructure = (PVAStructure) d; + assertEquals(3, pvaStructure.get().size()); + assertInstanceOf(PVAIntArray.class, pvaStructure.get().get(0)); + assertInstanceOf(PVAIntArray.class, pvaStructure.get().get(1)); + assertInstanceOf(PVAIntArray.class, pvaStructure.get().get(2)); + + PVAIntArray pvaIntArray = (PVAIntArray) pvaStructure.get().get(0); + assertEquals(3, pvaIntArray.get().length); + assertArrayEquals(new int[]{-1, 2, 3}, pvaIntArray.get()); + pvaIntArray = (PVAIntArray) pvaStructure.get().get(1); + assertArrayEquals(new int[]{1, 2, 3}, pvaIntArray.get()); + assertEquals(3, pvaIntArray.get().length); + pvaIntArray = (PVAIntArray) pvaStructure.get().get(2); + assertArrayEquals(new int[]{11, 22, 33}, pvaIntArray.get()); + assertEquals(3, pvaIntArray.get().length); } @@ -434,7 +460,7 @@ public void testValueToCompareString() { val1 = VDouble.of(5d, alarm, time, display); VType val2 = VDouble.of(6d, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1.0", result.getString()); + assertEquals("5 Δ-1.0", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -442,7 +468,7 @@ public void testValueToCompareString() { val1 = VDouble.of(15d, alarm, time, display); val2 = VDouble.of(6d, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("15 \u0394+9.0", result.getString()); + assertEquals("15 Δ+9.0", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -450,7 +476,7 @@ public void testValueToCompareString() { val1 = VFloat.of(15f, alarm, time, display); val2 = VFloat.of(6f, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("15 \u0394+9.0", result.getString()); + assertEquals("15 Δ+9.0", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -458,7 +484,7 @@ public void testValueToCompareString() { val1 = VDouble.of(6d, alarm, time, display); val2 = VDouble.of(6d, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u03940.0", result.getString()); + assertEquals("6 Δ0.0", result.getString()); assertEquals(0, result.getValuesEqual()); assertTrue(result.isWithinThreshold()); assertEquals(0, result.getAbsoluteDelta(), 0.0); @@ -466,7 +492,7 @@ public void testValueToCompareString() { val1 = VFloat.of(5f, alarm, time, display); val2 = VFloat.of(6f, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1.0", result.getString()); + assertEquals("5 Δ-1.0", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -474,7 +500,7 @@ public void testValueToCompareString() { val1 = VFloat.of(5f, alarm, time, display); val2 = VFloat.of(6f, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("5 \u0394-1.0", result.getString()); + assertEquals("5 Δ-1.0", result.getString()); assertTrue(result.getValuesEqual() < 0); assertFalse(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -482,7 +508,7 @@ public void testValueToCompareString() { val1 = VFloat.of(5f, alarm, time, display); val2 = VFloat.of(6f, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("5 \u0394-1.0", result.getString()); + assertEquals("5 Δ-1.0", result.getString()); assertTrue(result.getValuesEqual() < 0); assertFalse(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -491,14 +517,14 @@ public void testValueToCompareString() { val1 = VLong.of(15L, alarm, time, display); val2 = VDouble.of(6d, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("15 \u0394+9", result.getString()); + assertEquals("15 Δ+9", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); val1 = VLong.of(15L, alarm, time, display); val2 = VDouble.of(6d, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("15 \u0394+9", result.getString()); + assertEquals("15 Δ+9", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -506,7 +532,7 @@ public void testValueToCompareString() { val1 = VULong.of(15L, alarm, time, display); val2 = VULong.of(6L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("15 \u0394+9", result.getString()); + assertEquals("15 Δ+9", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -514,7 +540,7 @@ public void testValueToCompareString() { val1 = VULong.of(5L, alarm, time, display); val2 = VULong.of(6L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertFalse(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -522,7 +548,7 @@ public void testValueToCompareString() { val1 = VUInt.of(15, alarm, time, display); val2 = VUInt.of(6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("15 \u0394+9", result.getString()); + assertEquals("15 Δ+9", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -530,7 +556,7 @@ public void testValueToCompareString() { val1 = VUInt.of(15, alarm, time, display); val2 = VUInt.of(6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("15 \u0394+9", result.getString()); + assertEquals("15 Δ+9", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -538,7 +564,7 @@ public void testValueToCompareString() { val1 = VInt.of(15, alarm, time, display); val2 = VInt.of(6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("15 \u0394+9", result.getString()); + assertEquals("15 Δ+9", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -546,7 +572,7 @@ public void testValueToCompareString() { val1 = VDouble.of(15d, alarm, time, display); val2 = VLong.of(6L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("15 \u0394+9.0", result.getString()); + assertEquals("15 Δ+9.0", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -554,7 +580,7 @@ public void testValueToCompareString() { val1 = VDouble.of(15d, alarm, time, display); val2 = VLong.of(6L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("15 \u0394+9.0", result.getString()); + assertEquals("15 Δ+9.0", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(9, result.getAbsoluteDelta(), 0.0); @@ -562,7 +588,7 @@ public void testValueToCompareString() { val1 = VDouble.of(15d, alarm, time, display); val2 = VLong.of(15L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("15 \u03940.0", result.getString()); + assertEquals("15 Δ0.0", result.getString()); assertEquals(0, result.getValuesEqual()); assertTrue(result.isWithinThreshold()); assertEquals(0, result.getAbsoluteDelta(), 0.0); @@ -595,7 +621,7 @@ public void testValueToCompareString() { val1 = VLong.of(6L, alarm, time, display); val2 = VLong.of(6L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u03940", result.getString()); + assertEquals("6 Δ0", result.getString()); assertEquals(0, result.getValuesEqual()); assertTrue(result.isWithinThreshold()); assertEquals(0, result.getAbsoluteDelta(), 0.0); @@ -603,7 +629,7 @@ public void testValueToCompareString() { val1 = VLong.of(5L, alarm, time, display); val2 = VLong.of(6L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -611,7 +637,7 @@ public void testValueToCompareString() { val1 = VLong.of(6L, alarm, time, display); val2 = VLong.of(5L, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -620,7 +646,7 @@ public void testValueToCompareString() { val1 = VInt.of(6, alarm, time, display); val2 = VInt.of(6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u03940", result.getString()); + assertEquals("6 Δ0", result.getString()); assertEquals(0, result.getValuesEqual()); assertTrue(result.isWithinThreshold()); assertEquals(0, result.getAbsoluteDelta(), 0.0); @@ -628,7 +654,7 @@ public void testValueToCompareString() { val1 = VInt.of(5, alarm, time, display); val2 = VInt.of(6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -636,7 +662,7 @@ public void testValueToCompareString() { val1 = VInt.of(6, alarm, time, display); val2 = VInt.of(5, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertTrue(result.isWithinThreshold()); @@ -644,14 +670,14 @@ public void testValueToCompareString() { val1 = VShort.of((short) 6, alarm, time, display); val2 = VShort.of((short) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u03940", result.getString()); + assertEquals("6 Δ0", result.getString()); assertEquals(0, result.getValuesEqual()); assertTrue(result.isWithinThreshold()); val1 = VShort.of((short) 5, alarm, time, display); val2 = VShort.of((short) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -659,7 +685,7 @@ public void testValueToCompareString() { val1 = VShort.of((short) 6, alarm, time, display); val2 = VShort.of((short) 5, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -667,7 +693,7 @@ public void testValueToCompareString() { val1 = VUShort.of((short) 6, alarm, time, display); val2 = VUShort.of((short) 5, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -675,7 +701,7 @@ public void testValueToCompareString() { val1 = VUShort.of((short) 6, alarm, time, display); val2 = VUShort.of((short) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u03940", result.getString()); + assertEquals("6 Δ0", result.getString()); assertEquals(0, result.getValuesEqual()); assertTrue(result.isWithinThreshold()); assertEquals(0, result.getAbsoluteDelta(), 0.0); @@ -683,7 +709,7 @@ public void testValueToCompareString() { val1 = VUShort.of((short) 5, alarm, time, display); val2 = VUShort.of((short) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -691,7 +717,7 @@ public void testValueToCompareString() { val1 = VShort.of((short) 5, alarm, time, display); val2 = VShort.of((short) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertFalse(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -699,7 +725,7 @@ public void testValueToCompareString() { val1 = VUShort.of((short) 5, alarm, time, display); val2 = VUShort.of((short) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertFalse(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -734,7 +760,7 @@ public void testValueToCompareString() { val1 = VByte.of((byte) 5, alarm, time, display); val2 = VByte.of((byte) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -742,7 +768,7 @@ public void testValueToCompareString() { val1 = VByte.of((byte) 6, alarm, time, display); val2 = VByte.of((byte) 5, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -750,7 +776,7 @@ public void testValueToCompareString() { val1 = VByte.of((byte) 6, alarm, time, display); val2 = VByte.of((byte) 5, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -758,7 +784,7 @@ public void testValueToCompareString() { val1 = VUByte.of((byte) 5, alarm, time, display); val2 = VUByte.of((byte) 6, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("5 \u0394-1", result.getString()); + assertEquals("5 Δ-1", result.getString()); assertTrue(result.getValuesEqual() < 0); assertTrue(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -766,14 +792,14 @@ public void testValueToCompareString() { val1 = VUByte.of((byte) 6, alarm, time, display); val2 = VUByte.of((byte) 5, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, threshold); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertTrue(result.isWithinThreshold()); val1 = VUByte.of((byte) 6, alarm, time, display); val2 = VUByte.of((byte) 5, alarm, time, display); result = Utilities.valueToCompareString(val1, val2, Optional.empty()); - assertEquals("6 \u0394+1", result.getString()); + assertEquals("6 Δ+1", result.getString()); assertTrue(result.getValuesEqual() > 0); assertFalse(result.isWithinThreshold()); assertEquals(1, result.getAbsoluteDelta(), 0.0); @@ -1491,4 +1517,157 @@ public void testAreValuesEqual() { val2 = VStringArray.of(Arrays.asList("a", "b", "c"), alarm, time); assertTrue(Utilities.areValuesEqual(val1, val2, Optional.empty())); } + + @Test + public void testAreVTablesEqual() { + + VTable vTable1 = VTable.of(List.of(Integer.TYPE, Double.TYPE), + List.of("a", "b"), + List.of(ArrayInteger.of(1, 2, 3), ArrayDouble.of(7.0, 8.0, 9.0))); + VTable vTable2 = VTable.of(List.of(Integer.TYPE, Double.TYPE), + List.of("a", "b"), + List.of(ArrayInteger.of(1, 2, 3), ArrayDouble.of(7.0, 8.0, 9.0))); + + assertTrue(Utilities.areValuesEqual(vTable1, vTable2, Optional.empty())); + + vTable2 = VTable.of(List.of(Integer.TYPE, Integer.TYPE), + List.of("a", "b"), + List.of(ArrayInteger.of(1, 2, 3), ArrayInteger.of(7, 8, 9))); + + assertFalse(Utilities.areValuesEqual(vTable1, vTable2, Optional.empty())); + + vTable2 = VTable.of(List.of(Integer.TYPE, Double.TYPE), + List.of("a", "b"), + List.of(ArrayInteger.of(1, 2, 3), ArrayDouble.of(7.0, 8.0))); + + assertFalse(Utilities.areValuesEqual(vTable1, vTable2, Optional.empty())); + + vTable1 = VTable.of(List.of(String.class, Double.TYPE), + List.of("a", "b"), + List.of(List.of("AAA", "BBB", "CCC"), ArrayDouble.of(7.0, 8.0, 9.0))); + + vTable2 = VTable.of(List.of(String.class, Double.TYPE), + List.of("a", "b"), + List.of(List.of("AAA", "BBB", "CCC"), ArrayDouble.of(7.0, 8.0, 9.0))); + + assertTrue(Utilities.areValuesEqual(vTable1, vTable2, Optional.empty())); + } + + @Test + public void testAreVTypeArraysEqual() { + assertTrue(Utilities.areVTypeArraysEqual(Integer.TYPE, ArrayInteger.of(1, 2, 3), ArrayInteger.of(1, 2, 3))); + assertTrue(Utilities.areVTypeArraysEqual(Integer.TYPE, ArrayUInteger.of(1, 2, 3), ArrayUInteger.of(1, 2, 3))); + assertTrue(Utilities.areVTypeArraysEqual(Long.TYPE, ArrayLong.of(1L, 2L, 3L), ArrayLong.of(1L, 2L, 3L))); + assertTrue(Utilities.areVTypeArraysEqual(Long.TYPE, ArrayULong.of(1L, 2L, 3L), ArrayULong.of(1L, 2L, 3L))); + assertTrue(Utilities.areVTypeArraysEqual(Double.TYPE, ArrayDouble.of(7.0, 8.0, 9.0), ArrayDouble.of(7.0, 8.0, 9.0))); + assertTrue(Utilities.areVTypeArraysEqual(Float.TYPE, ArrayFloat.of(7.0f, 8.0f, 9.0f), ArrayFloat.of(7.0f, 8.0f, 9.0f))); + assertTrue(Utilities.areVTypeArraysEqual(Short.TYPE, ArrayShort.of((short) 7.0, (short) 8.0, (short) 9.0), ArrayShort.of((short) 7.0, (short) 8.0, (short) 9.0))); + assertTrue(Utilities.areVTypeArraysEqual(Short.TYPE, ArrayUShort.of((short) 7.0, (short) 8.0, (short) 9.0), ArrayUShort.of((short) 7.0, (short) 8.0, (short) 9.0))); + assertTrue(Utilities.areVTypeArraysEqual(Byte.TYPE, ArrayByte.of((byte) 7, (byte) 8, (byte) 9), ArrayByte.of((byte) 7, (byte) 8, (byte) 9))); + assertTrue(Utilities.areVTypeArraysEqual(Byte.TYPE, ArrayUByte.of((byte) 7, (byte) 8, (byte) 9), ArrayUByte.of((byte) 7, (byte) 8, (byte) 9))); + assertTrue(Utilities.areVTypeArraysEqual(Boolean.TYPE, ArrayBoolean.of(true, false), ArrayBoolean.of(true, false))); + + assertTrue(Utilities.areVTypeArraysEqual(String.class, List.of("AAA", "BBB", "CCC"), List.of("AAA", "BBB", "CCC"))); + + assertFalse(Utilities.areVTypeArraysEqual(Byte.TYPE, ArrayShort.of((byte) 7, (byte) 8, (byte) 9), ArrayShort.of((byte) 7, (byte) 8, (byte) 10))); + } + + @Test + public void testToPVArrayType() { + + boolean[] bools = new boolean[]{true, false, true}; + Object converted = Utilities.toPVArrayType("bools", ArrayBoolean.of(bools)); + assertInstanceOf(PVABoolArray.class, converted); + assertEquals(3, ((PVABoolArray) converted).get().length); + assertArrayEquals(bools, ((PVABoolArray) converted).get()); + assertEquals("bools", ((PVABoolArray) converted).getName()); + + byte[] bytes = new byte[]{(byte) -1, (byte) 2, (byte) 3}; + converted = Utilities.toPVArrayType("bytes", ArrayByte.of(bytes)); + assertInstanceOf(PVAByteArray.class, converted); + assertEquals(3, ((PVAByteArray) converted).get().length); + assertArrayEquals(bytes, ((PVAByteArray) converted).get()); + assertEquals("bytes", ((PVAByteArray) converted).getName()); + assertFalse(((PVAByteArray) converted).isUnsigned()); + + bytes = new byte[]{(byte) 1, (byte) 2, (byte) 3}; + converted = Utilities.toPVArrayType("ubytes", ArrayUByte.of(bytes)); + assertInstanceOf(PVAByteArray.class, converted); + assertEquals(3, ((PVAByteArray) converted).get().length); + assertArrayEquals(bytes, ((PVAByteArray) converted).get()); + assertEquals("ubytes", ((PVAByteArray) converted).getName()); + assertTrue(((PVAByteArray) converted).isUnsigned()); + + short[] shorts = new short[]{(short) -1, (short) 2, (short) 3}; + converted = Utilities.toPVArrayType("shorts", ArrayShort.of(shorts)); + assertInstanceOf(PVAShortArray.class, converted); + assertEquals(3, ((PVAShortArray) converted).get().length); + assertArrayEquals(shorts, ((PVAShortArray) converted).get()); + assertEquals("shorts", ((PVAShortArray) converted).getName()); + assertFalse(((PVAShortArray) converted).isUnsigned()); + + shorts = new short[]{(short) 1, (short) 2, (short) 3}; + converted = Utilities.toPVArrayType("ushorts", ArrayUShort.of(shorts)); + assertInstanceOf(PVAShortArray.class, converted); + assertEquals(3, ((PVAShortArray) converted).get().length); + assertArrayEquals(shorts, ((PVAShortArray) converted).get()); + assertEquals("ushorts", ((PVAShortArray) converted).getName()); + assertTrue(((PVAShortArray) converted).isUnsigned()); + + int[] ints = new int[]{-1, 2, 3}; + converted = Utilities.toPVArrayType("ints", ArrayInteger.of(ints)); + assertInstanceOf(PVAIntArray.class, converted); + assertEquals(3, ((PVAIntArray) converted).get().length); + assertArrayEquals(ints, ((PVAIntArray) converted).get()); + assertEquals("ints", ((PVAIntArray) converted).getName()); + assertFalse(((PVAIntArray) converted).isUnsigned()); + + ints = new int[]{1, 2, 3}; + converted = Utilities.toPVArrayType("uints", ArrayUInteger.of(ints)); + assertInstanceOf(PVAIntArray.class, converted); + assertEquals(3, ((PVAIntArray) converted).get().length); + assertArrayEquals(ints, ((PVAIntArray) converted).get()); + assertEquals("uints", ((PVAIntArray) converted).getName()); + assertTrue(((PVAIntArray) converted).isUnsigned()); + + long[] longs = new long[]{-1L, 2L, 3L}; + converted = Utilities.toPVArrayType("longs", ArrayLong.of(longs)); + assertInstanceOf(PVALongArray.class, converted); + assertEquals(3, ((PVALongArray) converted).get().length); + assertArrayEquals(longs, ((PVALongArray) converted).get()); + assertEquals("longs", ((PVALongArray) converted).getName()); + assertFalse(((PVALongArray) converted).isUnsigned()); + + longs = new long[]{1L, 2L, 3L}; + converted = Utilities.toPVArrayType("ulongs", ArrayULong.of(longs)); + assertInstanceOf(PVALongArray.class, converted); + assertEquals(3, ((PVALongArray) converted).get().length); + assertArrayEquals(longs, ((PVALongArray) converted).get()); + assertEquals("ulongs", ((PVALongArray) converted).getName()); + assertTrue(((PVALongArray) converted).isUnsigned()); + + float[] floats = new float[]{-1.0f, 2.0f, 3.0f}; + converted = Utilities.toPVArrayType("floats", ArrayFloat.of(floats)); + assertInstanceOf(PVAFloatArray.class, converted); + assertEquals(3, ((PVAFloatArray) converted).get().length); + assertArrayEquals(floats, ((PVAFloatArray) converted).get()); + assertEquals("floats", ((PVAFloatArray) converted).getName()); + + double[] doubles = new double[]{-1.0, 2.0, 3.0}; + converted = Utilities.toPVArrayType("doubles", ArrayDouble.of(doubles)); + assertInstanceOf(PVADoubleArray.class, converted); + assertEquals(3, ((PVADoubleArray) converted).get().length); + assertArrayEquals(doubles, ((PVADoubleArray) converted).get()); + assertEquals("doubles", ((PVADoubleArray) converted).getName()); + + List strings = new ArrayList<>(); + strings.add("a"); + strings.add("b"); + strings.add("c"); + converted = Utilities.toPVArrayType("strings", strings); + assertInstanceOf(PVAStringArray.class, converted); + assertEquals(3, ((PVAStringArray) converted).get().length); + assertArrayEquals(new String[]{"a", "b", "c"}, ((PVAStringArray) converted).get()); + assertEquals("strings", ((PVAStringArray) converted).getName()); + } } diff --git a/app/save-and-restore/model/pom.xml b/app/save-and-restore/model/pom.xml index f4c49c5eb7..94cf9c26e8 100644 --- a/app/save-and-restore/model/pom.xml +++ b/app/save-and-restore/model/pom.xml @@ -57,6 +57,13 @@ javax.json 1.1.4 + + + diff --git a/app/save-and-restore/model/src/main/java/org/phoebus/applications/saveandrestore/model/json/VTypeSerializer.java b/app/save-and-restore/model/src/main/java/org/phoebus/applications/saveandrestore/model/json/VTypeSerializer.java index 16b22018c5..28ab8f3a79 100644 --- a/app/save-and-restore/model/src/main/java/org/phoebus/applications/saveandrestore/model/json/VTypeSerializer.java +++ b/app/save-and-restore/model/src/main/java/org/phoebus/applications/saveandrestore/model/json/VTypeSerializer.java @@ -36,6 +36,7 @@ public class VTypeSerializer extends JsonSerializer { @Override public void serialize(VType vType, JsonGenerator gen, SerializerProvider serializers) throws IOException { - gen.writeRawValue(VTypeToJson.toJson(vType).toString()); + String s = VTypeToJson.toJson(vType).toString(); + gen.writeRawValue(s); } } diff --git a/core/pv/src/main/java/org/phoebus/pv/pva/PVAStructureHelper.java b/core/pv/src/main/java/org/phoebus/pv/pva/PVAStructureHelper.java index 55c78b734c..3d5f8d4d74 100644 --- a/core/pv/src/main/java/org/phoebus/pv/pva/PVAStructureHelper.java +++ b/core/pv/src/main/java/org/phoebus/pv/pva/PVAStructureHelper.java @@ -247,7 +247,7 @@ else if (column instanceof PVABoolArray) // Convert to boxed Integer to add to List values.add(range(0, data.length).mapToObj(i -> data[i]).collect(toList())); } - else + else { throw new IllegalArgumentException("Could not decode table column of type: " + column.getClass()); } diff --git a/core/pva/src/main/java/org/epics/pva/client/PutRequest.java b/core/pva/src/main/java/org/epics/pva/client/PutRequest.java index 5a5443f637..23ee9d4149 100644 --- a/core/pva/src/main/java/org/epics/pva/client/PutRequest.java +++ b/core/pva/src/main/java/org/epics/pva/client/PutRequest.java @@ -164,6 +164,15 @@ public void encodeRequest(final byte version, final ByteBuffer buffer) throws Ex // Bitset to describe which field we're about to write //final BitSet changed = new BitSet(); changed.set(data.getIndex(field)); + if (field instanceof PVAStructure) { + final PVAStructure struct = (PVAStructure) field; + List elements = struct.get(); + if(elements != null){ + for(int i = 0; i < elements.size(); i++){ + changed.set(data.getIndex(elements.get(i))); + } + } + } logger.log(Level.FINE, () -> "Updated structure elements: " + changed); PVABitSet.encodeBitSet(changed, buffer); diff --git a/core/pva/src/main/java/org/epics/pva/data/PVABitSet.java b/core/pva/src/main/java/org/epics/pva/data/PVABitSet.java index b51ffbea2f..64f2ee6206 100644 --- a/core/pva/src/main/java/org/epics/pva/data/PVABitSet.java +++ b/core/pva/src/main/java/org/epics/pva/data/PVABitSet.java @@ -22,7 +22,8 @@ public static void encodeBitSet(final BitSet bits, final ByteBuffer buffer) { final byte[] bytes = bits.toByteArray(); PVASize.encodeSize(bytes.length, buffer); - buffer.put(bits.toByteArray()); + byte[] b = bits.toByteArray(); + buffer.put(b); } /** @param buffer Source buffer diff --git a/core/pva/src/test/java/org/epics/pva/data/BitSetTest.java b/core/pva/src/test/java/org/epics/pva/data/BitSetTest.java index 37ac5d02b2..64892be4b0 100644 --- a/core/pva/src/test/java/org/epics/pva/data/BitSetTest.java +++ b/core/pva/src/test/java/org/epics/pva/data/BitSetTest.java @@ -58,6 +58,13 @@ public void testBitSet() buffer.flip(); System.out.println(Hexdump.toHexdump(buffer)); + bits.clear(); + bits.set(14); + buffer.clear(); + PVABitSet.encodeBitSet(bits, buffer); + buffer.flip(); + System.out.println(Hexdump.toHexdump(buffer)); + final BitSet copy = PVABitSet.decodeBitSet(buffer); assertThat(copy, equalTo(bits)); } diff --git a/core/pva/src/test/java/org/epics/pva/server/TableDemo.java b/core/pva/src/test/java/org/epics/pva/server/TableDemo.java index 95badcb168..42aba1bdb6 100644 --- a/core/pva/src/test/java/org/epics/pva/server/TableDemo.java +++ b/core/pva/src/test/java/org/epics/pva/server/TableDemo.java @@ -7,6 +7,7 @@ ******************************************************************************/ package org.epics.pva.server; +import java.util.BitSet; import java.util.concurrent.TimeUnit; import java.util.logging.LogManager; @@ -37,7 +38,7 @@ public static void main(String[] args) throws Exception final PVAStringArray labels = new PVAStringArray("labels", "sec", "nano", "M1X", "M1Y"); final PVAIntArray sec = new PVAIntArray("secondsPastEpoch", true, 1, 2); final PVAIntArray nano = new PVAIntArray("nanoseconds", true, 3, 4); - final PVADoubleArray m1x = new PVADoubleArray("m1x", 3.13, 3.15); + final PVADoubleArray m1x = new PVADoubleArray("m1x", 2.13, 3.15); final PVADoubleArray m1y = new PVADoubleArray("m1y", 31.15, 32.14); final PVAStructure data = new PVAStructure("demo", "epics:nt/NTTable:1.0", labels, @@ -49,7 +50,12 @@ public static void main(String[] args) throws Exception time); // Create PVs - final ServerPV pv1 = server.createPV("demo", data); + final ServerPV pv1 = server.createPV("demo", data, new WriteEventHandler() { + @Override + public void handleWrite(ServerPV pv, BitSet changes, PVAStructure written) throws Exception { + System.out.println(); + } + }); TimeUnit.DAYS.sleep(1); }