@@ -417,48 +417,57 @@ def on_packet_corrupted(self):
417
417
self .packets_corrupted_flag = True
418
418
self .last_packet_corrupted_timestamp = ts
419
419
420
+
421
+ def reset_ts (self , data , reset ):
422
+ n = len (data )
423
+ if reset or len (self ._buffer_data ) != len (data ) or self .reset_ts_trace :
424
+ self .reset_ts_trace = False
425
+ # Init legend
426
+ if hasattr (self .instrument , 'widget_active_timeseries_variables_selected' ):
427
+ legend = self .instrument .widget_active_timeseries_variables_selected [
428
+ :] # Shallow copy to prevent update
429
+ else :
430
+ legend = [f"{ name } ({ units } )" for name , units in
431
+ zip (self .instrument .variable_names , self .instrument .variable_units )]
432
+ # Check data is correct length
433
+ if len (legend ) != n :
434
+ # Possible in rare instance widget_active_timeseries_variables_selected is updated by user after the data is received and updated
435
+ logger .warning ('Variables selected do not match data received. Skip timeseries update.' )
436
+ self .reset_ts_trace = True
437
+ return
438
+ # Init buffers
439
+ self ._buffer_timestamp = RingBuffer (self .BUFFER_LENGTH )
440
+ self ._buffer_data = [RingBuffer (self .BUFFER_LENGTH ) for i in range (len (data ))]
441
+ # Re-initialize Plot (need to do so when number of curve changes)
442
+ self .timeseries_plot_widget .clear ()
443
+ # Init curves
444
+ for i in range (n ):
445
+ self .timeseries_plot_widget .plotItem .addItem (
446
+ pg .PlotCurveItem (pen = pg .mkPen (color = self .PEN_COLORS [i % len (self .PEN_COLORS )], width = 2 ),
447
+ name = legend [i ])
448
+ )
449
+
420
450
@QtCore .pyqtSlot (list , float )
421
451
@QtCore .pyqtSlot (np .ndarray , float )
422
452
@QtCore .pyqtSlot (list , float , bool )
423
453
@QtCore .pyqtSlot (np .ndarray , float , bool )
424
454
def on_new_ts_data (self , data , timestamp , reset = False ):
425
- if self .instrument .active_timeseries_variables_lock .acquire (timeout = 0.25 ):
426
- try :
427
- n = len (data )
455
+ if self .instrument .widget_select_channel_enabled :
456
+ # Select channel widget enabled, hence user can change channels while receiving data
457
+ if self .instrument .active_timeseries_variables_lock .acquire (timeout = 0.25 ):
458
+ try :
459
+ self .reset_ts (data , reset )
460
+ finally :
461
+ self .instrument .active_timeseries_variables_lock .release ()
462
+ else :
428
463
if reset or len (self ._buffer_data ) != len (data ) or self .reset_ts_trace :
429
- self .reset_ts_trace = False
430
- # Init legend
431
- if hasattr (self .instrument , 'widget_active_timeseries_variables_selected' ):
432
- legend = self .instrument .widget_active_timeseries_variables_selected [
433
- :] # Shallow copy to prevent update
434
- else :
435
- legend = [f"{ name } ({ units } )" for name , units in
436
- zip (self .instrument .variable_names , self .instrument .variable_units )]
437
- # Check data is correct length
438
- if len (legend ) != n :
439
- # Possible in rare instance widget_active_timeseries_variables_selected is updated by user after the data is received and updated
440
- logger .warning ('Variables selected do not match data received. Skip timeseries update.' )
441
- self .reset_ts_trace = True
442
- return
443
- # Init buffers
444
- self ._buffer_timestamp = RingBuffer (self .BUFFER_LENGTH )
445
- self ._buffer_data = [RingBuffer (self .BUFFER_LENGTH ) for i in range (len (data ))]
446
- # Re-initialize Plot (need to do so when number of curve changes)
447
- self .timeseries_plot_widget .clear ()
448
- # Init curves
449
- for i in range (n ):
450
- self .timeseries_plot_widget .plotItem .addItem (
451
- pg .PlotCurveItem (pen = pg .mkPen (color = self .PEN_COLORS [i % len (self .PEN_COLORS )], width = 2 ),
452
- name = legend [i ])
453
- )
454
- finally :
455
- self .instrument .active_timeseries_variables_lock .release ()
464
+ logger .warning ('Unable to acquire lock to update timeseries variables.' )
465
+ self .reset_ts_trace = True
466
+ return
456
467
else :
457
- if reset or len (self ._buffer_data ) != len (data ) or self .reset_ts_trace :
458
- logger .warning ('Unable to acquire lock to update timeseries variables.' )
459
- self .reset_ts_trace = True
460
- return
461
- n = len (data )
468
+ # No select channel widget, hence user can't change channels while receiving data
469
+ self .reset_ts (data , reset )
470
+ n = len (data )
462
471
# Update buffers
463
472
self ._buffer_timestamp .extend (timestamp )
464
473
for i in range (n ):
@@ -973,9 +982,11 @@ def act_save(self):
973
982
self .notification ('No data will be logged.' )
974
983
elif self .cfg ['module' ] == 'dataq' :
975
984
self .cfg ['channels_enabled' ] = []
985
+ self .cfg ['channels_names' ] = [None ] * 8
976
986
for c in range (8 ):
977
987
if getattr (self , 'checkbox_channel%d_enabled' % (c + 1 )).isChecked ():
978
988
self .cfg ['channels_enabled' ].append (c )
989
+ self .cfg ['channels_names' ][c ] = getattr (self , 'optional_le_channel%d_name' % (c + 1 )).text ()
979
990
if not self .cfg ['channels_enabled' ]:
980
991
self .notification ('At least one channel must be enabled.' , 'Nothing to log if no channels are enabled.' )
981
992
return
@@ -1146,6 +1157,10 @@ def __init__(self, uuid, parent=None):
1146
1157
if self .cfg ['module' ] == 'dataq' :
1147
1158
for c in self .cfg ['channels_enabled' ]:
1148
1159
getattr (self , 'checkbox_channel%d_enabled' % (c + 1 )).setChecked (True )
1160
+ if 'channels_names' in self .cfg :
1161
+ for c , name in enumerate (self .cfg ['channels_names' ]):
1162
+ if name is not None :
1163
+ getattr (self , 'optional_le_channel%d_name' % (c + 1 )).setText (name )
1149
1164
# Handle legacy configuration
1150
1165
for k in [k for k in self .cfg .keys () if k .startswith ('variable_' )]:
1151
1166
if len (self .cfg [k ]) == 1 and self .cfg [k ][0 ] == '' :
@@ -1157,15 +1172,15 @@ def __init__(self, uuid, parent=None):
1157
1172
.index (self .cfg ['model' ]))
1158
1173
except ValueError :
1159
1174
logger .warning ('Configured model not available in GUI. Interface set to GUI default.' )
1160
- self .act_activate_fields_for_adu_model ()
1161
1175
for r in range (4 ):
1162
1176
try :
1163
1177
cb_relay_mode = getattr (self , f'combobox_relay{ r } _mode' )
1164
1178
cb_relay_mode .setCurrentIndex ([cb_relay_mode .itemText (i ) for i in range (cb_relay_mode .count ())]
1165
1179
.index (self .cfg [f'relay{ r } _mode' ]))
1166
1180
except ValueError :
1167
1181
logger .warning (f'Configured relay{ r } _mode not available in GUI. Interface set to GUI default.' )
1168
- getattr (self , f'checkbox_relay{ r } _enabled' ).setChecked (self .cfg [f'relay{ r } _enabled' ])
1182
+ getattr (self , f'checkbox_relay{ r } _enabled' ).setChecked (
1183
+ self .cfg [f'relay{ r } _enabled' ] if f'relay{ r } _enabled' in self .cfg .keys () else False )
1169
1184
for c , g in zip (self .cfg ['event_counter_channels_enabled' ], self .cfg ['event_counter_k_factors' ]):
1170
1185
getattr (self , 'checkbox_event_counter_channel%d_enabled' % (c )).setChecked (True )
1171
1186
getattr (self , 'spinbox_event_counter_channel%d_k_factor' % (c )).setValue (g )
@@ -1174,6 +1189,7 @@ def __init__(self, uuid, parent=None):
1174
1189
for c , g in zip (self .cfg ['analog_channels_enabled' ], self .cfg ['analog_channels_gains' ]):
1175
1190
getattr (self , 'checkbox_analog_channel%d_enabled' % (c )).setChecked (True )
1176
1191
getattr (self , 'spinbox_analog_channel%d_gain' % (c )).setValue (g )
1192
+ self .act_activate_fields_for_adu_model ()
1177
1193
if hasattr (self , 'combobox_interface' ):
1178
1194
if 'interface' in self .cfg .keys ():
1179
1195
try :
0 commit comments