示例#1
0
    def __init__(self, parent_win, event):
        BaseWidget.__init__(self, 'Edit frame', parent_win=parent_win)

        self.event = event
        self._widget = parent_win

        self.set_margin(5)

        self._applybtn = ControlButton('Apply', default=self.__apply_evt)
        self._label = ControlText('Label', default=event.title)
        self._begin = ControlNumber(
            'Begin',
            default=event.begin,
            minimum=0,
            maximum=100000000000000,
            changed_event=self.__begin_changed_event
        )
        self._end   = ControlNumber(
            'End',
            default=event.end,
            minimum=0,
            maximum=100000000000000,
            changed_event=self.__end_changed_event
        )
        self._color = ControlButton(str(event.color.name()), default=self.__pick_color_evt)
        self._lock  = ControlCheckBox('Locked', default=event.lock)

        self.formset = [
            '_label',
            ('_begin', '_end'),
            ('_color', '_lock'),
            '_applybtn'
        ]
    def __init__(self, timeline=None):
        super(GraphsEventsGenerator, self).__init__('Apply a function to the graph values', parent_win=timeline)
        self.setContentsMargins(10, 10, 10, 10)
        self._timeline = timeline


        # Definition of the forms fields
        self._graphs_list = ControlList('Graphs list (try double click)', readonly=False, select_entire_row=True)
        self._equation    = ControlTextArea('Equation')
        self._graphname   = ControlText('Graph name')
        self._genevts_btn = ControlButton('Generate graph')

        
        self._formset = [
            (
                ['_graphs_list'],
                '||', 
                [
                    '_graphname',
                    '_equation',
                    '_genevts_btn',
                ]
            ),
        ]

        self._graphs_list.cell_double_clicked_event = self.__cell_double_clicked_evt 
        self._graphs_list.readonly = True
        self._graphs_list.select_entire_row = True
        self._genevts_btn.value = self.__generage_events_evt
示例#3
0
    def __init__(self, timeline=None):
        super(Graph2Event, self).__init__('Graph to event',
                                          parent_win=timeline)
        self.setContentsMargins(10, 10, 10, 10)
        self._timeline = timeline

        # Definition of the forms fields
        self._graphs_list = ControlList('Graphs list (try double click)')
        self._equation = ControlTextArea('Equation')
        self._eventname = ControlText('Event name', 'New event')
        self._rownumber = ControlNumber('Row number', 0, 0, 1000)
        self._mindiff = ControlNumber('Minimum of frames', 0, 0, 1000000)
        self._genevts_btn = ControlButton('Generate events')

        self._formset = [
            (['_graphs_list'], '||', [
                ('_eventname', '_rownumber', '_mindiff'),
                '_equation',
                '_genevts_btn',
            ]),
        ]

        self._graphs_list.cell_double_clicked_event = self.__cell_double_clicked_evt
        self._graphs_list.readonly = True
        self._graphs_list.select_entire_row = True
        self._genevts_btn.value = self.__generage_events_evt
示例#4
0
    def __init__(self, parent_win=None, win_flag=None):
        BaseWidget.__init__(self, 'Load sound panel', parent_win=parent_win, win_flag=win_flag)

        self._loaded = False

        self._filename = ControlText('Sound file', '')
        self._read_btn = ControlButton('Browse', default=self.__prompt_read_file_evt)

        self._wave_int = []

        self.formset = [
            ('_filename', '_read_btn')
        ]

        self.set_margin(10)
示例#5
0
    def __init__(self, parent_win, label, begin, end):
        BaseWidget.__init__(self, 'Edit frame', parent_win=parent_win)

        self.set_margin(5)

        self._label = ControlText('Label', default=label)
        self._begin = ControlNumber('Begin',
                                    default=begin,
                                    minimum=0,
                                    maximum=100000000000000)
        self._end = ControlNumber('End',
                                  default=end,
                                  minimum=0,
                                  maximum=100000000000000)

        self._applybtn = ControlButton('Apply')

        self.formset = ['_label', ('_begin', '_end'), '_applybtn']

        self._begin.changed_event = self.__begin_changed_event
        self._end.changed_event = self.__end_changed_event
示例#6
0
    def __init__(self, timelineWidget=None, parent_win=None):
        super(GraphsProperties, self).__init__('Graphs properties',
                                               parent_win=parent_win)
        self.setContentsMargins(10, 10, 10, 10)
        self._mainwindow = parent_win
        self._timeline = timelineWidget

        #self.setMaximumWidth(300)

        # Definition of the forms fields
        self._graphs_list = ControlList('Graphs list')
        self._name = ControlText('Name')
        self._min_value = ControlNumber('Min',
                                        default=0,
                                        minimum=-sys.float_info.max,
                                        maximum=sys.float_info.max)
        self._max_value = ControlNumber('Max',
                                        default=0,
                                        minimum=-sys.float_info.max,
                                        maximum=sys.float_info.max)
        self._values_zoom = ControlSlider('Amplitude',
                                          default=100,
                                          minimum=60,
                                          maximum=400)
        self._values_top = ControlNumber('Bottom',
                                         default=0,
                                         minimum=-1000,
                                         maximum=1000)
        self._remove_graph_btn = ControlButton('Remove graph')
        self._value = ControlLabel()
        self._pickcolor = ControlButton('Pick color',
                                        default=self.__pickcolor_evt)

        self._graphs_list.readonly = True

        self._formset = [
            (['_graphs_list', '_remove_graph_btn'], '||', [
                ' ', '_name', ('_min_value', '_max_value', ' '),
                ('_values_top', '_pickcolor'), '_values_zoom',
                'info:Choose one graph and move the mouse over \nthe timeline to visualize the coordenates.',
                '_value'
            ]),
        ]

        self._graphs_list.select_entire_row = True
        self._graphs_list.item_selection_changed_event = self.__graphs_list_selection_changed

        self._loaded = False
        self._current_selected_graph = None

        self._name.changed_event = self.__save_graphs_changes
        self._min_value.changed_event = self.__save_graphs_changes
        self._max_value.changed_event = self.__save_graphs_changes
        self._values_zoom.changed_event = self.__save_graphs_changes
        self._values_top.changed_event = self.__save_graphs_changes

        self._name.enabled = False
        self._min_value.enabled = False
        self._max_value.enabled = False
        self._values_zoom.enabled = False
        self._values_top.enabled = False
        self._remove_graph_btn.enabled = False
        self._pickcolor.enabled = False

        self._remove_graph_btn.value = self.__remove_chart
示例#7
0
    def __init__(self, parent_win=None, win_flag=None):
        BaseWidget.__init__(self, 'Sound Generation panel', parent_win=parent_win, win_flag=win_flag)

        self._generated = False

        self._save_file_checkbox = ControlCheckBox('Write sound to file',
                                                   default=False,
                                                   changed_event=self.__save_file_checkbox_evt)

        self._filename = ControlText('Sound filename', '', changed_event=self.__filename_changed_evt, enabled=False)
        self._saveas_btn = ControlButton('Save As...', default=self.__prompt_save_file_evt, enabled=False)

        self._freq_label = ControlLabel('Frequency (Hz)', style='margin-left:0')
        self._freq_left = ControlNumber('Left channel', default=1000, minimum=0, maximum=20000)
        self._freq_right = ControlNumber('Right channel', default=1000, minimum=0, maximum=20000)
        self._duration = ControlNumber('Duration (s)', default=1, minimum=0, maximum=10000, decimals=2)

        self._sample_rate = ControlCombo('Sample rate')
        self._sample_rate.add_item('96 KHz', SampleRate._96000HZ)
        self._sample_rate.add_item('192 KHz', SampleRate._192000HZ)

        self._create_window = ControlCheckBox('Create window',
                                              default=True,
                                              changed_event=self.__create_window_checkbox_evt)

        self._left_window_duration = ControlNumber(default=100, minimum=0, maximum=20000)
        self._right_window_duration = ControlNumber(default=100, minimum=0, maximum=20000)
        self._left_apply_window_start = ControlCheckBox(default=True)
        self._right_apply_window_start = ControlCheckBox(default=True)
        self._left_apply_window_end = ControlCheckBox(default=True)
        self._right_apply_window_end = ControlCheckBox(default=True)

        self._left_window_functions = ControlCombo('Left channel window')
        self._left_window_functions.add_item('Hanning', 'Hanning')
        self._left_window_functions.add_item('Hamming', 'Hamming')
        self._left_window_functions.add_item('Blackman', 'Blackman')
        self._left_window_functions.add_item('Bartlett', 'Bartlett')

        self._right_window_functions = ControlCombo('Right channel window')
        self._right_window_functions.add_item('Hanning', 'Hanning')
        self._right_window_functions.add_item('Hamming', 'Hamming')
        self._right_window_functions.add_item('Blackman', 'Blackman')
        self._right_window_functions.add_item('Bartlett', 'Bartlett')

        self._gen_btn = ControlButton('Generate sound',
                                      default=self.__generate_sound_and_save)

        self._wave_int = []

        # Define the organization of the forms
        self.formset = [
            (
                ['_save_file_checkbox',
                    ('_filename', '_saveas_btn'),
                    ['_duration', '_sample_rate'],
                    ('h5:Frequency',  ['_freq_left', '_freq_right'])],
                '    ',
                ['_create_window',
                    ('', 'Left channel', 'Right channel'),
                    ('Duration (ms)', '_left_window_duration', '_right_window_duration'),
                    ('Apply window to start', '_left_apply_window_start', '_right_apply_window_start'),
                    ('Apply window to end', '_left_apply_window_end', '_right_apply_window_end'),
                    '_left_window_functions',
                    '_right_window_functions']
            ),
            '_gen_btn'
        ]

        self.set_margin(10)
示例#8
0
    def __init__(self, parent_win=None):
        BaseWidget.__init__(self, self.TITLE, parent_win=parent_win)

        self._msg_duration = 3000

        self._usb_port = ControlCombo('USB port', changed_event=self.__combo_usb_ports_changed_evt)
        self._refresh_usb_ports = ControlButton('',
                                                icon=QtGui.QIcon(conf.REFRESH_SMALL_ICON),
                                                default=self.__refresh_usb_ports_btn_pressed,
                                                helptext="Press here to refresh the list of available devices.")
        self._connect_btn = ControlButton('Connect', default=self.__connect_btn_pressed)

        # Send data
        self._send_btn = ControlButton('Send to sound card', default=self.__send_btn_pressed, enabled=False)
        self._index_to_send = ControlNumber('Index to send', default=2, minimum=2, maximum=32)
        self._user_metadata_send = ControlTextArea('User metadata (optional)')
        self._description_send = ControlTextArea('Description (optional)')

        self._send_panel = ControlEmptyWidget()
        self._send_panel.value = [self._index_to_send,
                                  self._user_metadata_send,
                                  self._description_send,
                                  self._send_btn]
        self._send_panel.setContentsMargins(10, 10, 10, 10)

        # Receive data
        self._index_to_read = ControlNumber('Index to read', default=2, minimum=2, maximum=32)
        self._read_all_checkbox = ControlCheckBox('Read all indexes',
                                                  default=False,
                                                  changed_event=self.__read_all_checkbox_evt)
        self._clear_folder_checkbox = ControlCheckBox('Clear destination folder', default=False)
        self._dest_folder = ControlText('Destination folder', '', changed_event=self.__folder_changed_evt)
        self._browse_btn = ControlButton('Browse', default=self.__prompt_browse_file_evt)
        self._read_btn = ControlButton('Read data', default=self.__read_btn_pressed, enabled=False)

        self._receive_panel = ControlEmptyWidget()
        self._receive_panel.value = [self._read_all_checkbox,
                                     self._index_to_read,
                                     self._clear_folder_checkbox,
                                     self._dest_folder,
                                     self._browse_btn,
                                     self._read_btn]

        self._receive_panel.setContentsMargins(10, 10, 10, 10)

        self._sound_generation = SoundGenerationPanel(parent_win=self)
        self._sound_generation.sound_generated = self._sound_generated_evt
        self._sound_gen_panel = ControlEmptyWidget()
        self._sound_gen_panel.value = self._sound_generation

        self._sound_load = LoadSoundPanel(parent_win=self)
        self._sound_load.sound_loaded = self._sound_loaded_evt
        self._sound_load_panel = ControlEmptyWidget()
        self._sound_load_panel.value = self._sound_load

        self._sound_card = SoundCardModule()
        self._wave_int = []

        self.formset = [
            ('_usb_port', '_refresh_usb_ports', '_connect_btn'),
            {
                'a:Generate sound': ['_sound_gen_panel'],
                'b:Load sound from disk': ['_sound_load_panel'],
            },
            ' ',
            {
                'a:Send data': ['_send_panel'],
                'b:Receive data': ['_receive_panel']
            }
        ]

        self._fill_usb_ports()

        self.set_margin(10)

        self._status_bar = QStatusBar(parent=self)
示例#9
0
    def __init__(self, parent_win=None):
        self.setup = parent_win
        self.started_correctly = False

        title = 'Emulator for setup: ' + self.setup.name

        BaseWidget.__init__(self, title, parent_win=parent_win)

        self.CHECKED_ICON = conf.EMULATOR_CHECKED_ICON
        self.UNCHECKED_ICON = conf.EMULATOR_UNCHECKED_ICON

        self._currentSetup = ControlLabel(self.setup.name)
        self._selectedBoard = ControlLabel(self.setup.board.name)
        self._selectedProtocol = ControlLabel(self.setup.task.name)

        self._run_task_btn = ControlButton('Run protocol',
                                           default=self.__run_protocol_btn_evt,
                                           checkable=True,
                                           helptext="When a task is running, you can skip all remaining trials by pressing this button. <br/> <b>NOTE:</b> This means that you will need to break the cycle in your task code when the run_state_machine method returns False.")
        self._kill_task_btn = ControlButton('Kill',
                                            default=self.__kill_btn_evt,
                                            style="background-color:rgb(255,0,0);font-weight:bold;",
                                            helptext="<b>NOTE:</b>This will exit the task process abruptly. The code you might have after the trial loop won't execute.")

        self._kill_task_btn.enabled = False

        self._stop_trial_btn = ControlButton('Skip trial',
                                             default=self.__stop_trial_btn_evt,
                                             enabled=False)
        self._pause_btn = ControlButton('Pause',
                                        default=self.__pause_btn_evt,
                                        checkable=True,
                                        enabled=False)

        try:
            bpod = Bpod(self.setup.board.serial_port)
        except SerialException:
            self.critical('No Bpod device connected, cannot continue until one is connected.', 'Bpod not connected')
            return
        except Exception:
            # NOTE: try again in case of the first connection attempt where we always get the utf-8 exception
            bpod = Bpod(self.setup.board.serial_port)

        number_ports = bpod.hardware.inputs.count('P')
        number_bnc = bpod.hardware.outputs.count('B')
        number_wire_in = bpod.hardware.inputs.count('W')
        number_wire_out = bpod.hardware.outputs.count('W')

        self._valve_buttons = []
        self._valve_label = ControlLabel("Valve")
        self._led_buttons = []
        self._led_label = ControlLabel("LED")
        self._poke_buttons = []
        self._poke_label = ControlLabel("Poke")
        
        self._time_control = ControlText()   # HH

        for n in range(1, number_ports + 1):
            btn_valve = ControlButton(str(n), icon=self.UNCHECKED_ICON, checkable=True)
            btn_led = ControlButton(str(n), icon=self.UNCHECKED_ICON, checkable=True)
            btn_poke = ControlButton(str(n), icon=self.UNCHECKED_ICON, checkable=True)

            btn_valve.value = make_lambda_func(self.__button_on_click_evt, btn=btn_valve)
            btn_led.value = make_lambda_func(self.__button_on_click_evt, btn=btn_led)
            btn_poke.value = make_lambda_func(self.__button_on_click_evt, btn=btn_poke)

            setattr(self, f'_btn_Valve{n}', btn_valve)
            setattr(self, f'_btn_PWM{n}', btn_led)
            setattr(self, f'_btn_Port{n}', btn_poke)
            self._valve_buttons.append(btn_valve)
            self._led_buttons.append(btn_led)
            self._poke_buttons.append(btn_poke)

        self._bnc_in_buttons = []
        self._bnc_in_label = ControlLabel("BNC In")
        self._bnc_out_buttons = []
        self._bnc_out_label = ControlLabel("BNC Out")

        for n in range(1, number_bnc + 1):
            btn_bnc_in = ControlButton(str(n), icon=self.UNCHECKED_ICON, checkable=True)
            btn_bnc_out = ControlButton(str(n), icon=self.UNCHECKED_ICON, checkable=True)

            btn_bnc_in.value = make_lambda_func(self.__button_on_click_evt, btn=btn_bnc_in)
            btn_bnc_out.value = make_lambda_func(self.__button_on_click_evt, btn=btn_bnc_out)

            setattr(self, f'_btn_BNC_in{n}', btn_bnc_in)
            setattr(self, f'_btn_BNC_out{n}', btn_bnc_out)
            self._bnc_in_buttons.append(btn_bnc_in)
            self._bnc_out_buttons.append(btn_bnc_out)

        self._wire_in_buttons = []
        self._wire_in_label = ControlLabel("Wire In")
        self._wire_out_buttons = []
        self._wire_out_label = ControlLabel("Wire Out")

        for n in range(1, number_wire_in + 1):
            btn_wire_in = ControlButton(str(n), icon=self.UNCHECKED_ICON, checkable=True)
            btn_wire_in.value = make_lambda_func(self.__button_on_click_evt, btn=btn_wire_in)

            setattr(self, f'_btn_Wire_in{n}', btn_wire_in)
            self._wire_in_buttons.append(btn_wire_in)

        for n in range(1, number_wire_out + 1):
            btn_wire_out = ControlButton(str(n), icon=self.UNCHECKED_ICON, checkable=True)
            btn_wire_out.value = make_lambda_func(self.__button_on_click_evt, btn=btn_wire_out)

            setattr(self, f'_btn_Wire_out{n}', btn_wire_out)
            self._wire_out_buttons.append(btn_wire_out)

        self._modules_indexes_loaded = []

        for idx, mod in enumerate(bpod.modules):
            n = mod.serial_port
            self._modules_indexes_loaded.append(n)
            module_label = ControlLabel(f'{mod.name}')
            control_text_bytes_msg = ControlText()

            btn_send_msg_module = ControlButton(f'Send bytes')
            btn_send_msg_module.value = make_lambda_func(self.__send_msg_btn_evt,
                                                         btn=btn_send_msg_module,
                                                         control_text=control_text_bytes_msg)

            setattr(self, f'_module_label{n}', module_label)
            setattr(self, f'_control_text_bytes_msg{n}', control_text_bytes_msg)
            setattr(self, f'_btn_send_msg_module{n}', btn_send_msg_module)

        if bpod:
            bpod.close()

        self.formset = [
            ([('Current setup:', '_currentSetup'),
              ('Selected board:', '_selectedBoard'),
              ('Selected protocol:', '_selectedProtocol')],
             '',
             ['_run_task_btn', '_kill_task_btn', '_stop_trial_btn', '_pause_btn']),
            '',
            'Behaviour Ports',
            ('_valve_label', tuple([f'_btn_Valve{n.label}' for n in self._valve_buttons])),
            ('_led_label', tuple([f'_btn_PWM{n.label}' for n in self._led_buttons])),
            ('_poke_label', tuple([f'_btn_Port{n.label}' for n in self._poke_buttons])),
            '',
            ('Time Control (sec)', '_time_control'),
            '',
            'BNC',
            ('_bnc_in_label',
             tuple([f'_btn_BNC_in{n.label}' for n in self._bnc_in_buttons]),
             '_bnc_out_label',
             tuple([f'_btn_BNC_out{n.label}' for n in self._bnc_out_buttons])
             ),
            'Wire' if number_wire_in != 0 else '',
            ('_wire_in_label' if number_wire_in != 0 else '',
             tuple([f'_btn_Wire_in{n.label}' for n in self._wire_in_buttons]),
             '_wire_out_label' if number_wire_out != 0 else '',
             tuple([f'_btn_Wire_out{n.label}' for n in self._wire_out_buttons])
             ),
            '',
            'Send bytes to modules' if self._modules_indexes_loaded else '',
            [(f'_module_label{n}', f'_control_text_bytes_msg{n}', f'_btn_send_msg_module{n}') for n in self._modules_indexes_loaded]
        ]

        self.set_margin(10)
        self.started_correctly = True