5252import org .phoebus .core .vtypes .VTypeHelper ;
5353import org .phoebus .pv .PV ;
5454import org .phoebus .pv .PVPool ;
55+ import org .phoebus .saveandrestore .util .Utilities ;
5556import org .phoebus .saveandrestore .util .VNoData ;
5657
5758import java .util .ArrayList ;
5859import java .util .Comparator ;
5960import java .util .List ;
6061import java .util .concurrent .TimeUnit ;
62+ import java .util .concurrent .atomic .AtomicInteger ;
6163import java .util .logging .Level ;
6264import java .util .logging .Logger ;
6365
@@ -94,7 +96,23 @@ public class TableComparisonViewController {
9496 @ FXML
9597 private Label pvName ;
9698
99+ @ SuppressWarnings ("unused" )
100+ @ FXML
101+ private Label dimensionStored ;
102+
103+ @ SuppressWarnings ("unused" )
104+ @ FXML
105+ private Label dimensionLive ;
106+
107+ @ SuppressWarnings ("unused" )
108+ @ FXML
109+ private Label nonEqualCount ;
110+
111+
97112 private final StringProperty pvNameProperty = new SimpleStringProperty ();
113+ private final StringProperty dimensionStoredProperty = new SimpleStringProperty ();
114+ private final StringProperty dimensionLiveProperty = new SimpleStringProperty ();
115+ private final StringProperty nonEqualCountProperty = new SimpleStringProperty ("0" );
98116
99117 private PV pv ;
100118
@@ -124,6 +142,10 @@ public void initialize() {
124142 thresholdSpinner .setValueFactory (thresholdSpinnerValueFactory );
125143 thresholdSpinner .getEditor ().setAlignment (Pos .CENTER_RIGHT );
126144 thresholdSpinner .getEditor ().textProperty ().addListener ((a , o , n ) -> parseAndUpdateThreshold (n ));
145+
146+ dimensionLive .textProperty ().bind (dimensionLiveProperty );
147+ dimensionStored .textProperty ().bind (dimensionStoredProperty );
148+ nonEqualCount .textProperty ().bind (nonEqualCountProperty );
127149 }
128150
129151 /**
@@ -137,74 +159,60 @@ public void loadDataAndConnect(VType data, String pvName) {
137159 pvNameProperty .set (pvName );
138160
139161 int arraySize = VTypeHelper .getArraySize (data );
140- if (data instanceof VNumberArray ) {
141- for (int index = 0 ; index < arraySize ; index ++) {
142- List <ColumnEntry > columnEntries = new ArrayList <>();
162+ for (int index = 0 ; index < arraySize ; index ++) {
163+ List <ColumnEntry > columnEntries = new ArrayList <>();
164+ ColumnEntry columnEntry = null ;
165+ if (data instanceof VNumberArray ) {
143166 if (data instanceof VDoubleArray array ) {
144167 double value = array .getData ().getDouble (index );
145- ColumnEntry columnEntry = new ColumnEntry (VDouble .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
146- addRow (index , columnEntries , columnEntry );
168+ columnEntry = new ColumnEntry (VDouble .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
147169 } else if (data instanceof VFloatArray array ) {
148170 float value = array .getData ().getFloat (index );
149- ColumnEntry columnEntry = new ColumnEntry (VFloat .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
150- addRow (index , columnEntries , columnEntry );
171+ columnEntry = new ColumnEntry (VFloat .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
151172 } else if (data instanceof VIntArray array ) {
152173 int value = array .getData ().getInt (index );
153- ColumnEntry columnEntry = new ColumnEntry (VInt .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
154- addRow (index , columnEntries , columnEntry );
174+ columnEntry = new ColumnEntry (VInt .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
155175 } else if (data instanceof VUIntArray array ) {
156176 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 );
177+ columnEntry = new ColumnEntry (VUInt .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
159178 } else if (data instanceof VLongArray array ) {
160179 long value = array .getData ().getLong (index );
161- ColumnEntry columnEntry = new ColumnEntry (VLong .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
162- addRow (index , columnEntries , columnEntry );
180+ columnEntry = new ColumnEntry (VLong .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
163181 } else if (data instanceof VULongArray array ) {
164182 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 );
183+ columnEntry = new ColumnEntry (VULong .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
167184 } else if (data instanceof VShortArray array ) {
168185 short value = array .getData ().getShort (index );
169- ColumnEntry columnEntry = new ColumnEntry (VShort .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
170- addRow (index , columnEntries , columnEntry );
186+ columnEntry = new ColumnEntry (VShort .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
171187 } else if (data instanceof VUShortArray array ) {
172188 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 );
189+ columnEntry = new ColumnEntry (VUShort .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
175190 } else if (data instanceof VByteArray array ) {
176191 byte value = array .getData ().getByte (index );
177- ColumnEntry columnEntry = new ColumnEntry (VByte .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
178- addRow (index , columnEntries , columnEntry );
192+ columnEntry = new ColumnEntry (VByte .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
179193 } else if (data instanceof VUByteArray array ) {
180194 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 );
195+ columnEntry = new ColumnEntry (VUByte .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
183196 }
184197 }
185- } else if (data instanceof VBooleanArray array ) {
186- ListBoolean listBoolean = array .getData ();
187- for (int index = 0 ; index < listBoolean .size (); index ++) {
188- List <ColumnEntry > columnEntries = new ArrayList <>();
198+ else if (data instanceof VBooleanArray array ) {
199+ ListBoolean listBoolean = array .getData ();
189200 boolean value = listBoolean .getBoolean (index );
190- ColumnEntry columnEntry = new ColumnEntry (VBoolean .of (value , array .getAlarm (), array .getTime ()));
191- addRow (index , columnEntries , columnEntry );
201+ columnEntry = new ColumnEntry (VBoolean .of (value , array .getAlarm (), array .getTime ()));
202+ } else if (data instanceof VEnumArray array ) {
203+ List <String > enumValues = array .getData ();
204+ columnEntry = new ColumnEntry (VString .of (enumValues .get (index ), array .getAlarm (), array .getTime ()));
205+ } else if (data instanceof VStringArray array ) {
206+ List <String > stringValues = array .getData ();
207+ columnEntry = new ColumnEntry (VString .of (stringValues .get (index ), array .getAlarm (), array .getTime ()));
192208 }
193- } else if (data instanceof VEnumArray array ) {
194- List <String > enumValues = array .getData ();
195- for (int index = 0 ; index < enumValues .size (); index ++) {
196- List <ColumnEntry > columnEntries = new ArrayList <>();
197- ColumnEntry columnEntry = new ColumnEntry (VString .of (enumValues .get (index ), array .getAlarm (), array .getTime ()));
198- addRow (index , columnEntries , columnEntry );
199- }
200- } else if (data instanceof VStringArray array ) {
201- List <String > stringValues = array .getData ();
202- for (int index = 0 ; index < stringValues .size (); index ++) {
203- List <ColumnEntry > columnEntries = new ArrayList <>();
204- ColumnEntry columnEntry = new ColumnEntry (VString .of (stringValues .get (index ), array .getAlarm (), array .getTime ()));
209+ if (columnEntry != null ){
205210 addRow (index , columnEntries , columnEntry );
206211 }
207212 }
213+
214+ // Hard coded column count until we support VTable
215+ dimensionStoredProperty .set (arraySize + " x 1" );
208216 connect ();
209217 }
210218
@@ -299,103 +307,60 @@ private void updateTable(VType liveData) {
299307 // Live data may have more elements than stored data
300308 if (liveDataArraySize > comparisonTable .getItems ().size ()) {
301309 List <ColumnEntry > columnEntries = new ArrayList <>();
302- if (liveData instanceof VNumberArray ) {
303- if (liveData instanceof VDoubleArray array ) {
304- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
310+ for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
311+ ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
312+ if (liveData instanceof VNumberArray ) {
313+ if (liveData instanceof VDoubleArray array ) {
305314 double value = array .getData ().getDouble (index );
306- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
307315 columnEntry .setLiveVal (VDouble .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
308- addRow (index , columnEntries , columnEntry );
309- }
310- } else if (liveData instanceof VFloatArray array ) {
311- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
316+ } else if (liveData instanceof VFloatArray array ) {
312317 float value = array .getData ().getFloat (index );
313- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
314318 columnEntry .setLiveVal (VFloat .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
315- addRow (index , columnEntries , columnEntry );
316- }
317- } else if (liveData instanceof VIntArray array ) {
318- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
319+ } else if (liveData instanceof VIntArray array ) {
319320 int value = array .getData ().getInt (index );
320- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
321321 columnEntry .setLiveVal (VInt .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
322- addRow (index , columnEntries , columnEntry );
323- }
324- } else if (liveData instanceof VUIntArray array ) {
325- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
322+ } else if (liveData instanceof VUIntArray array ) {
326323 int value = array .getData ().getInt (index );
327- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
328324 columnEntry .setLiveVal (VUInt .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
329- addRow (index , columnEntries , columnEntry );
330- }
331- } else if (liveData instanceof VLongArray array ) {
332- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
325+ } else if (liveData instanceof VLongArray array ) {
333326 long value = array .getData ().getLong (index );
334- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
335327 columnEntry .setLiveVal (VLong .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
336- addRow (index , columnEntries , columnEntry );
337- }
338- } else if (liveData instanceof VULongArray array ) {
339- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
328+ } else if (liveData instanceof VULongArray array ) {
340329 long value = array .getData ().getLong (index );
341- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
342330 columnEntry .setLiveVal (VULong .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
343- addRow (index , columnEntries , columnEntry );
344- }
345- } else if (liveData instanceof VShortArray array ) {
346- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
331+ } else if (liveData instanceof VShortArray array ) {
347332 short value = array .getData ().getShort (index );
348- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
349333 columnEntry .setLiveVal (VShort .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
350- addRow (index , columnEntries , columnEntry );
351- }
352- } else if (liveData instanceof VUShortArray array ) {
353- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
334+ } else if (liveData instanceof VUShortArray array ) {
354335 short value = array .getData ().getShort (index );
355- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
356336 columnEntry .setLiveVal (VUShort .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
357- addRow (index , columnEntries , columnEntry );
358- }
359- } else if (liveData instanceof VByteArray array ) {
360- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
337+ } else if (liveData instanceof VByteArray array ) {
361338 byte value = array .getData ().getByte (index );
362- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
363339 columnEntry .setLiveVal (VByte .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
364- addRow (index , columnEntries , columnEntry );
365- }
366- } else if (liveData instanceof VUByteArray array ) {
367- for (int index = comparisonTable .getItems ().size (); index < liveDataArraySize ; index ++) {
340+ } else if (liveData instanceof VUByteArray array ) {
368341 byte value = array .getData ().getByte (index );
369- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
370342 columnEntry .setLiveVal (VUByte .of (value , array .getAlarm (), array .getTime (), array .getDisplay ()));
371- addRow (index , columnEntries , columnEntry );
372343 }
373344 }
374- } else if (liveData instanceof VBooleanArray array ) {
375- ListBoolean listBoolean = array .getData ();
376- for (int i = 0 ; i < listBoolean .size (); i ++) {
377- boolean value = listBoolean .getBoolean (i );
378- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
345+ else if (liveData instanceof VBooleanArray array ) {
346+ ListBoolean listBoolean = array .getData ();
347+ boolean value = listBoolean .getBoolean (index );
379348 columnEntry .setLiveVal (VBoolean .of (value , array .getAlarm (), array .getTime ()));
380- addRow (i , columnEntries , columnEntry );
381- }
382- } else if (liveData instanceof VEnumArray array ) {
383- List <String > enumValues = array .getData ();
384- for (int i = 0 ; i < enumValues .size (); i ++) {
385- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
386- columnEntry .setLiveVal (VString .of (enumValues .get (i ), array .getAlarm (), array .getTime ()));
387- addRow (i , columnEntries , columnEntry );
388- }
389- } else if (liveData instanceof VStringArray array ) {
390- List <String > stringValues = array .getData ();
391- for (int i = 0 ; i < stringValues .size (); i ++) {
392- ColumnEntry columnEntry = new ColumnEntry (VNoData .INSTANCE );
393- columnEntry .setLiveVal (VString .of (stringValues .get (i ), array .getAlarm (), array .getTime ()));
394- addRow (i , columnEntries , columnEntry );
349+ } else if (liveData instanceof VEnumArray array ) {
350+ List <String > enumValues = array .getData ();
351+ columnEntry .setLiveVal (VString .of (enumValues .get (index ), array .getAlarm (), array .getTime ()));
352+ } else if (liveData instanceof VStringArray array ) {
353+ List <String > stringValues = array .getData ();
354+ columnEntry .setLiveVal (VString .of (stringValues .get (index ), array .getAlarm (), array .getTime ()));
395355 }
356+ addRow (index , columnEntries , columnEntry );
396357 }
397358 }
359+ // Hard coded column count until we support VTable
360+ dimensionLiveProperty .set (liveDataArraySize + " x 1" );
361+ computeNonEqualCount ();
398362 }
363+
399364 }
400365
401366 private void parseAndUpdateThreshold (String value ) {
@@ -418,8 +383,24 @@ private void parseAndUpdateThreshold(String value) {
418383 */
419384 private void updateThreshold (double threshold ) {
420385 double ratio = threshold / 100 ;
386+
421387 comparisonTable .getItems ().forEach (comparisonData -> {
422388 comparisonData .setThreshold (ratio );
423389 });
390+
391+ computeNonEqualCount ();
392+ }
393+
394+ private void computeNonEqualCount (){
395+ AtomicInteger nonEqualCount = new AtomicInteger (0 );
396+ comparisonTable .getItems ().forEach (comparisonData -> {
397+ comparisonData .getColumnEntries ().forEach (columnEntry -> {
398+ if (!Utilities .areValuesEqual (columnEntry .liveValueProperty ().get (), columnEntry .storedValueProperty ().get (), columnEntry .getDelta ().get ().threshold )){
399+ nonEqualCount .incrementAndGet ();
400+ }
401+ });
402+ });
403+
404+ nonEqualCountProperty .set (nonEqualCount .toString ());
424405 }
425406}
0 commit comments