Spaces:
Build error
Build error
Yann Bouteiller
commited on
Commit
·
11677c4
1
Parent(s):
20a3666
Added ability to pause stimulation and changed default duration
Browse files- portiloop/capture.py +36 -3
- portiloop/stimulation.py +1 -2
portiloop/capture.py
CHANGED
|
@@ -436,7 +436,7 @@ class Capture:
|
|
| 436 |
self._p_capture = None
|
| 437 |
self.__capture_on = False
|
| 438 |
self.frequency = 250
|
| 439 |
-
self.duration =
|
| 440 |
self.power_line = 60
|
| 441 |
self.polyak_mean = 0.1
|
| 442 |
self.polyak_std = 0.001
|
|
@@ -472,6 +472,9 @@ class Capture:
|
|
| 472 |
self._test_stimulus_lock = Lock()
|
| 473 |
self._test_stimulus = False
|
| 474 |
|
|
|
|
|
|
|
|
|
|
| 475 |
try:
|
| 476 |
mixers = alsaaudio.mixers()
|
| 477 |
if len(mixers) <= 0:
|
|
@@ -582,6 +585,14 @@ class Capture:
|
|
| 582 |
tooltips=['Stop capture', 'Start capture'],
|
| 583 |
)
|
| 584 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 585 |
self.b_clock = widgets.ToggleButtons(
|
| 586 |
options=['Coral', 'ADS'],
|
| 587 |
description='Clock:',
|
|
@@ -783,6 +794,7 @@ class Capture:
|
|
| 783 |
self.b_radio_ch5.observe(self.on_b_radio_ch5, 'value')
|
| 784 |
self.b_radio_ch6.observe(self.on_b_radio_ch6, 'value')
|
| 785 |
self.b_radio_ch7.observe(self.on_b_radio_ch7, 'value')
|
|
|
|
| 786 |
self.b_channel_detect.observe(self.on_b_channel_detect, 'value')
|
| 787 |
self.b_power_line.observe(self.on_b_power_line, 'value')
|
| 788 |
self.b_custom_fir.observe(self.on_b_custom_fir, 'value')
|
|
@@ -793,6 +805,7 @@ class Capture:
|
|
| 793 |
self.b_epsilon.observe(self.on_b_epsilon, 'value')
|
| 794 |
self.b_volume.observe(self.on_b_volume, 'value')
|
| 795 |
self.b_test_stimulus.on_click(self.on_b_test_stimulus)
|
|
|
|
| 796 |
|
| 797 |
self.display_buttons()
|
| 798 |
|
|
@@ -811,7 +824,8 @@ class Capture:
|
|
| 811 |
widgets.HBox([self.b_threshold, self.b_test_stimulus]),
|
| 812 |
self.b_volume,
|
| 813 |
self.b_accordion_filter,
|
| 814 |
-
self.b_capture
|
|
|
|
| 815 |
|
| 816 |
def enable_buttons(self):
|
| 817 |
self.b_frequency.disabled = False
|
|
@@ -829,6 +843,7 @@ class Capture:
|
|
| 829 |
self.b_radio_ch5.disabled = False
|
| 830 |
self.b_radio_ch6.disabled = False
|
| 831 |
self.b_radio_ch7.disabled = False
|
|
|
|
| 832 |
self.b_power_line.disabled = False
|
| 833 |
self.b_channel_detect.disabled = False
|
| 834 |
self.b_polyak_mean.disabled = False
|
|
@@ -842,6 +857,7 @@ class Capture:
|
|
| 842 |
self.b_custom_fir_cutoff.disabled = not self.custom_fir
|
| 843 |
self.b_stimulate.disabled = not self.detect
|
| 844 |
self.b_threshold.disabled = not self.detect
|
|
|
|
| 845 |
self.b_test_stimulus.disabled = True # only enabled when running
|
| 846 |
|
| 847 |
def disable_buttons(self):
|
|
@@ -862,6 +878,7 @@ class Capture:
|
|
| 862 |
self.b_radio_ch5.disabled = True
|
| 863 |
self.b_radio_ch6.disabled = True
|
| 864 |
self.b_radio_ch7.disabled = True
|
|
|
|
| 865 |
self.b_channel_detect.disabled = True
|
| 866 |
self.b_power_line.disabled = True
|
| 867 |
self.b_polyak_mean.disabled = True
|
|
@@ -893,6 +910,9 @@ class Capture:
|
|
| 893 |
|
| 894 |
def on_b_radio_ch7(self, value):
|
| 895 |
self.channel_states[6] = value['new']
|
|
|
|
|
|
|
|
|
|
| 896 |
|
| 897 |
def on_b_channel_detect(self, value):
|
| 898 |
self.channel_detection = value['new']
|
|
@@ -934,6 +954,8 @@ class Capture:
|
|
| 934 |
self._t_capture.join()
|
| 935 |
self._t_capture = None
|
| 936 |
self.enable_buttons()
|
|
|
|
|
|
|
| 937 |
|
| 938 |
def on_b_custom_fir(self, value):
|
| 939 |
val = value['new']
|
|
@@ -1068,6 +1090,15 @@ class Capture:
|
|
| 1068 |
with self._test_stimulus_lock:
|
| 1069 |
self._test_stimulus = True
|
| 1070 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1071 |
def open_recording_file(self):
|
| 1072 |
nb_signals = self.nb_signals
|
| 1073 |
samples_per_datarecord_array = self.samples_per_datarecord_array
|
|
@@ -1197,7 +1228,9 @@ class Capture:
|
|
| 1197 |
|
| 1198 |
filtered_point = n_array.tolist()
|
| 1199 |
|
| 1200 |
-
|
|
|
|
|
|
|
| 1201 |
detection_signal = detector.detect(filtered_point)
|
| 1202 |
if stimulator is not None:
|
| 1203 |
stimulator.stimulate(detection_signal)
|
|
|
|
| 436 |
self._p_capture = None
|
| 437 |
self.__capture_on = False
|
| 438 |
self.frequency = 250
|
| 439 |
+
self.duration = 28800
|
| 440 |
self.power_line = 60
|
| 441 |
self.polyak_mean = 0.1
|
| 442 |
self.polyak_std = 0.001
|
|
|
|
| 472 |
self._test_stimulus_lock = Lock()
|
| 473 |
self._test_stimulus = False
|
| 474 |
|
| 475 |
+
self._pause_detect_lock = Lock()
|
| 476 |
+
self._pause_detect = True
|
| 477 |
+
|
| 478 |
try:
|
| 479 |
mixers = alsaaudio.mixers()
|
| 480 |
if len(mixers) <= 0:
|
|
|
|
| 585 |
tooltips=['Stop capture', 'Start capture'],
|
| 586 |
)
|
| 587 |
|
| 588 |
+
self.b_pause = widgets.ToggleButtons(
|
| 589 |
+
options=['Paused', 'Active'],
|
| 590 |
+
description='Detection',
|
| 591 |
+
disabled=True,
|
| 592 |
+
button_style='', # 'success', 'info', 'warning', 'danger' or ''
|
| 593 |
+
tooltips=['Detector and stimulator active', 'Detector and stimulator paused'],
|
| 594 |
+
)
|
| 595 |
+
|
| 596 |
self.b_clock = widgets.ToggleButtons(
|
| 597 |
options=['Coral', 'ADS'],
|
| 598 |
description='Clock:',
|
|
|
|
| 794 |
self.b_radio_ch5.observe(self.on_b_radio_ch5, 'value')
|
| 795 |
self.b_radio_ch6.observe(self.on_b_radio_ch6, 'value')
|
| 796 |
self.b_radio_ch7.observe(self.on_b_radio_ch7, 'value')
|
| 797 |
+
self.b_radio_ch8.observe(self.on_b_radio_ch8, 'value')
|
| 798 |
self.b_channel_detect.observe(self.on_b_channel_detect, 'value')
|
| 799 |
self.b_power_line.observe(self.on_b_power_line, 'value')
|
| 800 |
self.b_custom_fir.observe(self.on_b_custom_fir, 'value')
|
|
|
|
| 805 |
self.b_epsilon.observe(self.on_b_epsilon, 'value')
|
| 806 |
self.b_volume.observe(self.on_b_volume, 'value')
|
| 807 |
self.b_test_stimulus.on_click(self.on_b_test_stimulus)
|
| 808 |
+
self.b_pause.observe(self.on_b_pause, 'value')
|
| 809 |
|
| 810 |
self.display_buttons()
|
| 811 |
|
|
|
|
| 824 |
widgets.HBox([self.b_threshold, self.b_test_stimulus]),
|
| 825 |
self.b_volume,
|
| 826 |
self.b_accordion_filter,
|
| 827 |
+
self.b_capture,
|
| 828 |
+
self.b_pause]))
|
| 829 |
|
| 830 |
def enable_buttons(self):
|
| 831 |
self.b_frequency.disabled = False
|
|
|
|
| 843 |
self.b_radio_ch5.disabled = False
|
| 844 |
self.b_radio_ch6.disabled = False
|
| 845 |
self.b_radio_ch7.disabled = False
|
| 846 |
+
self.b_radio_ch8.disabled = False
|
| 847 |
self.b_power_line.disabled = False
|
| 848 |
self.b_channel_detect.disabled = False
|
| 849 |
self.b_polyak_mean.disabled = False
|
|
|
|
| 857 |
self.b_custom_fir_cutoff.disabled = not self.custom_fir
|
| 858 |
self.b_stimulate.disabled = not self.detect
|
| 859 |
self.b_threshold.disabled = not self.detect
|
| 860 |
+
self.b_pause.disabled = not self.detect
|
| 861 |
self.b_test_stimulus.disabled = True # only enabled when running
|
| 862 |
|
| 863 |
def disable_buttons(self):
|
|
|
|
| 878 |
self.b_radio_ch5.disabled = True
|
| 879 |
self.b_radio_ch6.disabled = True
|
| 880 |
self.b_radio_ch7.disabled = True
|
| 881 |
+
self.b_radio_ch8.disabled = True
|
| 882 |
self.b_channel_detect.disabled = True
|
| 883 |
self.b_power_line.disabled = True
|
| 884 |
self.b_polyak_mean.disabled = True
|
|
|
|
| 910 |
|
| 911 |
def on_b_radio_ch7(self, value):
|
| 912 |
self.channel_states[6] = value['new']
|
| 913 |
+
|
| 914 |
+
def on_b_radio_ch8(self, value):
|
| 915 |
+
self.channel_states[7] = value['new']
|
| 916 |
|
| 917 |
def on_b_channel_detect(self, value):
|
| 918 |
self.channel_detection = value['new']
|
|
|
|
| 954 |
self._t_capture.join()
|
| 955 |
self._t_capture = None
|
| 956 |
self.enable_buttons()
|
| 957 |
+
|
| 958 |
+
|
| 959 |
|
| 960 |
def on_b_custom_fir(self, value):
|
| 961 |
val = value['new']
|
|
|
|
| 1090 |
with self._test_stimulus_lock:
|
| 1091 |
self._test_stimulus = True
|
| 1092 |
|
| 1093 |
+
def on_b_pause(self, value):
|
| 1094 |
+
val = value['new']
|
| 1095 |
+
if val == 'Active':
|
| 1096 |
+
with self._pause_detect_lock:
|
| 1097 |
+
self._pause_detect = False
|
| 1098 |
+
elif val == 'Paused':
|
| 1099 |
+
with self._pause_detect_lock:
|
| 1100 |
+
self._pause_detect = True
|
| 1101 |
+
|
| 1102 |
def open_recording_file(self):
|
| 1103 |
nb_signals = self.nb_signals
|
| 1104 |
samples_per_datarecord_array = self.samples_per_datarecord_array
|
|
|
|
| 1228 |
|
| 1229 |
filtered_point = n_array.tolist()
|
| 1230 |
|
| 1231 |
+
with self._pause_detect_lock:
|
| 1232 |
+
pause = self._pause_detect
|
| 1233 |
+
if detector is not None and not pause:
|
| 1234 |
detection_signal = detector.detect(filtered_point)
|
| 1235 |
if stimulator is not None:
|
| 1236 |
stimulator.stimulate(detection_signal)
|
portiloop/stimulation.py
CHANGED
|
@@ -75,8 +75,7 @@ class SleepSpindleRealTimeStimulator(Stimulator):
|
|
| 75 |
self.wav_list = [data]
|
| 76 |
while data:
|
| 77 |
self.wav_list.append(data)
|
| 78 |
-
data = f.readframes(self.periodsize)
|
| 79 |
-
|
| 80 |
|
| 81 |
def play_sound(self):
|
| 82 |
'''
|
|
|
|
| 75 |
self.wav_list = [data]
|
| 76 |
while data:
|
| 77 |
self.wav_list.append(data)
|
| 78 |
+
data = f.readframes(self.periodsize)
|
|
|
|
| 79 |
|
| 80 |
def play_sound(self):
|
| 81 |
'''
|