diff --git a/artwork/icons/oxygen/source_svg/camera_lens.svg b/artwork/icons/oxygen/source_svg/camera_lens.svg
new file mode 100644
index 0000000000..bbf63d5eac
--- /dev/null
+++ b/artwork/icons/oxygen/source_svg/camera_lens.svg
@@ -0,0 +1,102 @@
+
+
+
diff --git a/artwork/icons/qudiTheme/22x22/stop-record-counter.png b/artwork/icons/qudiTheme/22x22/stop-record-counter.png
new file mode 100644
index 0000000000..ad1542e904
Binary files /dev/null and b/artwork/icons/qudiTheme/22x22/stop-record-counter.png differ
diff --git a/artwork/icons/qudiTheme/22x22/trace-snapshot.png b/artwork/icons/qudiTheme/22x22/trace-snapshot.png
new file mode 100644
index 0000000000..cf272877d5
Binary files /dev/null and b/artwork/icons/qudiTheme/22x22/trace-snapshot.png differ
diff --git a/artwork/icons/qudiTheme/source_svg/stop-record-counter.svg b/artwork/icons/qudiTheme/source_svg/stop-record-counter.svg
new file mode 100644
index 0000000000..57082d813e
--- /dev/null
+++ b/artwork/icons/qudiTheme/source_svg/stop-record-counter.svg
@@ -0,0 +1,592 @@
+
+
+
+
diff --git a/artwork/icons/qudiTheme/source_svg/trace-snapshot.svg b/artwork/icons/qudiTheme/source_svg/trace-snapshot.svg
new file mode 100644
index 0000000000..8d9bad1e40
--- /dev/null
+++ b/artwork/icons/qudiTheme/source_svg/trace-snapshot.svg
@@ -0,0 +1,508 @@
+
+
+
+
diff --git a/gui/time_series_gui.py b/gui/time_series_gui.py
index 681eaba817..cac06b15f6 100644
--- a/gui/time_series_gui.py
+++ b/gui/time_series_gui.py
@@ -135,6 +135,8 @@ def on_activate(self):
# Connecting user interactions
self._mw.start_trace_Action.triggered.connect(self.start_clicked)
self._mw.record_trace_Action.triggered.connect(self.record_clicked)
+ self._mw.trace_snapshot_Action.triggered.connect(
+ self._time_series_logic.save_trace_snapshot, QtCore.Qt.QueuedConnection)
self._mw.trace_length_DoubleSpinBox.editingFinished.connect(self.data_window_changed)
self._mw.data_rate_DoubleSpinBox.editingFinished.connect(self.data_rate_changed)
@@ -180,6 +182,7 @@ def on_deactivate(self):
# disconnect signals
self._mw.start_trace_Action.triggered.disconnect()
self._mw.record_trace_Action.triggered.disconnect()
+ self._mw.trace_snapshot_Action.triggered.disconnect()
self._mw.trace_length_DoubleSpinBox.editingFinished.disconnect()
self._mw.data_rate_DoubleSpinBox.editingFinished.disconnect()
self._mw.oversampling_SpinBox.editingFinished.disconnect()
diff --git a/logic/time_series_reader_logic.py b/logic/time_series_reader_logic.py
index 25b2f5342e..a0be1e30e5 100644
--- a/logic/time_series_reader_logic.py
+++ b/logic/time_series_reader_logic.py
@@ -633,31 +633,32 @@ def save_trace_snapshot(self, to_file=True, name_tag='', save_figure=True):
This method saves the already displayed counts to file and does not accumulate them.
"""
- timestamp = dt.datetime.now()
-
- # write the parameters:
- parameters = dict()
- parameters['Time stamp'] = timestamp.strftime('%d.%m.%Y, %H:%M:%S.%f')
- parameters['Data rate (Hz)'] = self._data_rate
- parameters['Oversampling factor (samples)'] = self._oversampling_factor
- parameters['Sampling rate (Hz)'] = self.sampling_rate
+ with self.threadlock:
+ timestamp = dt.datetime.now()
- header = ', '.join('{0} ({1})'.format(ch, prop['unit']) for ch, prop in
- self._streamer.channel_properties.items())
- data = {header: self.trace_data}
+ # write the parameters:
+ parameters = dict()
+ parameters['Time stamp'] = timestamp.strftime('%d.%m.%Y, %H:%M:%S.%f')
+ parameters['Data rate (Hz)'] = self._data_rate
+ parameters['Oversampling factor (samples)'] = self._oversampling_factor
+ parameters['Sampling rate (Hz)'] = self.sampling_rate
- if to_file:
- # time_arr = np.arange(self._trace_window_size) / self._data_rate
- filepath = self._savelogic.get_path_for_module(module_name='TimeSeriesReader')
- filelabel = 'data_trace_snapshot_{0}'.format(
- name_tag) if name_tag else 'data_trace_snapshot'
- self._savelogic.save_data(data=data,
- filepath=filepath,
- parameters=parameters,
- filelabel=filelabel,
- timestamp=timestamp,
- delimiter='\t')
- self.log.info('Time series snapshot saved to: {0}'.format(filepath))
+ header = ', '.join('{0} ({1})'.format(ch, prop['unit']) for ch, prop in
+ self._streamer.channel_properties.items())
+ data = {header: self.trace_data}
+
+ if to_file:
+ # time_arr = np.arange(self._trace_window_size) / self._data_rate
+ filepath = self._savelogic.get_path_for_module(module_name='TimeSeriesReader')
+ filelabel = 'data_trace_snapshot_{0}'.format(
+ name_tag) if name_tag else 'data_trace_snapshot'
+ self._savelogic.save_data(data=data,
+ filepath=filepath,
+ parameters=parameters,
+ filelabel=filelabel,
+ timestamp=timestamp,
+ delimiter='\t')
+ self.log.info('Time series snapshot saved to: {0}'.format(filepath))
return data, parameters
def _stop_reader_wait(self):