3636import org .epics .vtype .VString ;
3737import org .epics .vtype .VStringArray ;
3838import 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 ;
3947import org .phoebus .applications .saveandrestore .Messages ;
4048import org .phoebus .applications .saveandrestore .ui .VTypePair ;
4149import org .phoebus .applications .saveandrestore .ui .snapshot .VDeltaCellEditor ;
4250import org .phoebus .applications .saveandrestore .ui .snapshot .VTypeCellEditor ;
4351import org .phoebus .core .vtypes .VDisconnectedData ;
52+ import org .phoebus .core .vtypes .VTypeHelper ;
4453import org .phoebus .pv .PV ;
4554import org .phoebus .pv .PVPool ;
4655import org .phoebus .saveandrestore .util .VNoData ;
4958import java .util .Comparator ;
5059import java .util .List ;
5160import java .util .concurrent .TimeUnit ;
52- import java .util .concurrent .atomic .AtomicInteger ;
5361import java .util .logging .Level ;
5462import 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 */
0 commit comments