def __init__(self, parent=None): super(QtGui.QWidget, self).__init__(parent) # Variables. self.GUI_main = self.parent() self.board = None # Pycboard class instance. self.task = None # Task currently uploaded on pyboard. self.task_hash = None # Used to check if file has changed. self.data_dir = None self.connected = False # Whether gui is conencted to pyboard. self.uploaded = False # Whether selected task file is on board. self.fresh_task = None # Whether task has been run or variables edited. self.running = False self.subject_changed = False self.variables_dialog = None # GUI groupbox. self.status_groupbox = QtGui.QGroupBox('Status') self.status_text = QtGui.QLineEdit('Not connected') self.status_text.setReadOnly(True) self.guigroup_layout = QtGui.QHBoxLayout() self.guigroup_layout.addWidget(self.status_text) self.status_groupbox.setLayout(self.guigroup_layout) # Board groupbox self.board_groupbox = QtGui.QGroupBox('Setup') self.board_label = QtGui.QLabel('Select:') self.board_select = QtGui.QComboBox() self.board_select.setEditable(True) self.board_select.setFixedWidth(100) self.connect_button = QtGui.QPushButton('Connect') self.config_button = QtGui.QPushButton('Config') self.boardgroup_layout = QtGui.QHBoxLayout() self.boardgroup_layout.addWidget(self.board_label) self.boardgroup_layout.addWidget(self.board_select) self.boardgroup_layout.addWidget(self.connect_button) self.boardgroup_layout.addWidget(self.config_button) self.board_groupbox.setLayout(self.boardgroup_layout) self.connect_button.clicked.connect( lambda: self.disconnect() if self.connected else self.connect()) self.config_button.clicked.connect(self.open_config_dialog) # File groupbox self.file_groupbox = QtGui.QGroupBox('Data file') self.data_dir_label = QtGui.QLabel('Data dir:') self.data_dir_text = QtGui.QLineEdit(data_dir) self.data_dir_button = QtGui.QPushButton('...') self.data_dir_button.setFixedWidth(30) self.subject_label = QtGui.QLabel('Subject ID:') self.subject_text = QtGui.QLineEdit() self.subject_text.setFixedWidth(80) self.subject_text.setMaxLength(12) self.filegroup_layout = QtGui.QHBoxLayout() self.filegroup_layout.addWidget(self.data_dir_label) self.filegroup_layout.addWidget(self.data_dir_text) self.filegroup_layout.addWidget(self.data_dir_button) self.filegroup_layout.addWidget(self.subject_label) self.filegroup_layout.addWidget(self.subject_text) self.file_groupbox.setLayout(self.filegroup_layout) self.data_dir_text.textChanged.connect(self.test_data_path) self.data_dir_button.clicked.connect(self.select_data_dir) self.subject_text.textChanged.connect(self.test_data_path) # Task groupbox self.task_groupbox = QtGui.QGroupBox('Task') self.task_label = QtGui.QLabel('Task:') self.task_select = QtGui.QComboBox() self.upload_button = QtGui.QPushButton('Upload') self.variables_button = QtGui.QPushButton('Variables') self.taskgroup_layout = QtGui.QHBoxLayout() self.taskgroup_layout.addWidget(self.task_label) self.taskgroup_layout.addWidget(self.task_select) self.taskgroup_layout.addWidget(self.upload_button) self.taskgroup_layout.addWidget(self.variables_button) self.task_groupbox.setLayout(self.taskgroup_layout) self.task_select.currentTextChanged.connect(self.task_changed) self.upload_button.clicked.connect(self.setup_task) # Session groupbox. self.session_groupbox = QtGui.QGroupBox('Session') self.start_button = QtGui.QPushButton('Start') self.stop_button = QtGui.QPushButton('Stop') self.sessiongroup_layout = QtGui.QHBoxLayout() self.sessiongroup_layout.addWidget(self.start_button) self.sessiongroup_layout.addWidget(self.stop_button) self.session_groupbox.setLayout(self.sessiongroup_layout) self.start_button.clicked.connect(self.start_task) self.stop_button.clicked.connect(self.stop_task) # Log text and task plots. self.log_textbox = QtGui.QTextEdit() self.log_textbox.setFont(QtGui.QFont('Courier', 9)) self.log_textbox.setReadOnly(True) self.task_plot = Task_plot() self.data_logger = Data_logger(print_func=self.print_to_log, data_consumers=[self.task_plot]) # Main layout self.vertical_layout = QtGui.QVBoxLayout() self.horizontal_layout_1 = QtGui.QHBoxLayout() self.horizontal_layout_2 = QtGui.QHBoxLayout() self.horizontal_layout_3 = QtGui.QHBoxLayout() self.horizontal_layout_1.addWidget(self.status_groupbox) self.horizontal_layout_1.addWidget(self.board_groupbox) self.horizontal_layout_2.addWidget(self.file_groupbox) self.horizontal_layout_3.addWidget(self.task_groupbox) self.horizontal_layout_3.addWidget(self.session_groupbox) self.vertical_layout.addLayout(self.horizontal_layout_1) self.vertical_layout.addLayout(self.horizontal_layout_2) self.vertical_layout.addLayout(self.horizontal_layout_3) self.vertical_layout.addWidget(self.log_textbox, 20) self.vertical_layout.addWidget(self.task_plot, 80) self.setLayout(self.vertical_layout) # Create timers self.update_timer = QtCore.QTimer( ) # Timer to regularly call update() during run. self.update_timer.timeout.connect(self.update) # Initial setup. self.disconnect() # Set initial state as disconnected.
def __init__(self, parent=None): super(QtGui.QWidget, self).__init__(parent) # Variables. self.GUI_main = self.parent() self.board = None # Pycboard class instance. self.task = None # Task currently uploaded on pyboard. self.task_hash = None # Used to check if file has changed. self.data_dir = None # Folder to save data files. self.custom_dir = False # True if data_dir field has been changed from default. self.connected = False # Whether gui is conencted to pyboard. self.uploaded = False # Whether selected task file is on board. self.fresh_task = None # Whether task has been run or variables edited. self.running = False self.subject_changed = False self.variables_dialog = None # GUI groupbox. self.status_groupbox = QtGui.QGroupBox("Status") self.status_text = QtGui.QLineEdit("Not connected") self.status_text.setReadOnly(True) self.guigroup_layout = QtGui.QHBoxLayout() self.guigroup_layout.addWidget(self.status_text) self.status_groupbox.setLayout(self.guigroup_layout) # Board groupbox self.board_groupbox = QtGui.QGroupBox("Setup") self.board_select = QtGui.QComboBox() self.board_select.addItems(["No setups found"]) self.board_select.setSizeAdjustPolicy(0) self.connect_button = QtGui.QPushButton("Connect") self.connect_button.setIcon(QtGui.QIcon("gui/icons/connect.svg")) self.connect_button.setEnabled(False) self.config_button = QtGui.QPushButton("Config") self.config_button.setIcon(QtGui.QIcon("gui/icons/settings.svg")) self.boardgroup_layout = QtGui.QHBoxLayout() self.boardgroup_layout.addWidget(self.board_select) self.boardgroup_layout.addWidget(self.connect_button) self.boardgroup_layout.addWidget(self.config_button) self.board_groupbox.setLayout(self.boardgroup_layout) self.connect_button.clicked.connect( lambda: self.disconnect() if self.connected else self.connect()) self.config_button.clicked.connect(self.open_config_dialog) # File groupbox self.file_groupbox = QtGui.QGroupBox("Data file") self.data_dir_label = QtGui.QLabel("Data dir:") self.data_dir_label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) self.data_dir_text = QtGui.QLineEdit(dirs["data"]) self.data_dir_button = QtGui.QPushButton() self.data_dir_button.setIcon(QtGui.QIcon("gui/icons/folder.svg")) self.data_dir_button.setFixedWidth(30) self.subject_label = QtGui.QLabel("Subject ID:") self.subject_text = QtGui.QLineEdit() self.filegroup_layout = QtGui.QGridLayout() self.filegroup_layout.addWidget(self.data_dir_label, 0, 0) self.filegroup_layout.addWidget(self.data_dir_text, 0, 1) self.filegroup_layout.addWidget(self.data_dir_button, 0, 2) self.filegroup_layout.addWidget(self.subject_label, 1, 0) self.filegroup_layout.addWidget(self.subject_text, 1, 1) self.file_groupbox.setLayout(self.filegroup_layout) self.data_dir_text.textChanged.connect(self.test_data_path) self.data_dir_text.textEdited.connect( lambda: setattr(self, "custom_dir", True)) self.data_dir_button.clicked.connect(self.select_data_dir) self.subject_text.textChanged.connect(self.test_data_path) # Task groupbox self.task_groupbox = QtGui.QGroupBox("Task") self.task_select = TaskSelectMenu("select task") self.task_select.set_callback(self.task_changed) self.upload_button = QtGui.QPushButton("Upload") self.upload_button.setIcon( QtGui.QIcon("gui/icons/circle-arrow-up.svg")) self.variables_button = QtGui.QPushButton("Variables") self.variables_button.setIcon(QtGui.QIcon("gui/icons/filter.svg")) self.taskgroup_layout = QtGui.QGridLayout() self.taskgroup_layout.addWidget(self.task_select, 0, 0, 1, 2) self.taskgroup_layout.addWidget(self.upload_button, 1, 0) self.taskgroup_layout.addWidget(self.variables_button, 1, 1) self.task_groupbox.setLayout(self.taskgroup_layout) self.upload_button.clicked.connect(self.setup_task) # Session groupbox. self.session_groupbox = QtGui.QGroupBox("Session") self.start_button = QtGui.QPushButton("Start") self.start_button.setIcon(QtGui.QIcon("gui/icons/play.svg")) self.stop_button = QtGui.QPushButton("Stop") self.stop_button.setIcon(QtGui.QIcon("gui/icons/stop.svg")) self.task_info = TaskInfo() self.sessiongroup_layout = QtGui.QGridLayout() self.sessiongroup_layout.addWidget(self.task_info.print_label, 0, 1) self.sessiongroup_layout.addWidget(self.task_info.print_text, 0, 2, 1, 3) self.sessiongroup_layout.addWidget(self.task_info.state_label, 1, 1) self.sessiongroup_layout.addWidget(self.task_info.state_text, 1, 2) self.sessiongroup_layout.addWidget(self.task_info.event_label, 1, 3) self.sessiongroup_layout.addWidget(self.task_info.event_text, 1, 4) self.sessiongroup_layout.addWidget(self.start_button, 0, 0) self.sessiongroup_layout.addWidget(self.stop_button, 1, 0) self.session_groupbox.setLayout(self.sessiongroup_layout) self.start_button.clicked.connect(self.start_task) self.stop_button.clicked.connect(self.stop_task) # Log text and task plots. self.log_textbox = QtGui.QTextEdit() self.log_textbox.setFont(QtGui.QFont("Courier New", log_font_size)) self.log_textbox.setReadOnly(True) self.task_plot = Task_plot() self.data_logger = Data_logger( print_func=self.print_to_log, data_consumers=[self.task_plot, self.task_info]) # Main layout self.vertical_layout = QtGui.QVBoxLayout() self.horizontal_layout_1 = QtGui.QHBoxLayout() self.horizontal_layout_2 = QtGui.QHBoxLayout() self.horizontal_layout_3 = QtGui.QHBoxLayout() self.horizontal_layout_1.addWidget(self.status_groupbox) self.horizontal_layout_1.addWidget(self.board_groupbox) self.horizontal_layout_2.addWidget(self.task_groupbox) self.horizontal_layout_2.addWidget(self.file_groupbox) self.horizontal_layout_3.addWidget(self.session_groupbox) self.vertical_layout.addLayout(self.horizontal_layout_1) self.vertical_layout.addLayout(self.horizontal_layout_2) self.vertical_layout.addLayout(self.horizontal_layout_3) self.vertical_layout.addWidget(self.log_textbox, 20) self.vertical_layout.addWidget(self.task_plot, 80) self.setLayout(self.vertical_layout) # Create timers self.update_timer = QtCore.QTimer( ) # Timer to regularly call update() during run. self.update_timer.timeout.connect(self.update) # Keyboard Shortcuts shortcut_dict = { "t": lambda: self.task_select.showMenu(), "u": lambda: self.setup_task(), "Space": (lambda: self.stop_task() if self.running else self.start_task() if self.uploaded else None), } init_keyboard_shortcuts(self, shortcut_dict) # Initial setup. self.disconnect() # Set initial state as disconnected.