def __init__(self, surf, **kwds): RootWidget.__init__(self, surf, **kwds) self.bg_color = (255,255,255) self.redraw_every_frame = True self.set_timer(50) self.recording_in_progress = False # signal buffer stores 6 seconds of data self.sig_buf = SignalBuffer(768, 14) # add status update callbacks to the device monitor mon.callbacks.append(self.update_device_status) mon.callbacks.append(self.start_device_reader) self.gyrox_label = Label('', width = 80, height = 30, bg_color = (30, 30, 255)) self.gyroy_label = Label('', width = 80, height = 30, bg_color = (30, 30, 255)) self.signal_mag_label = Label('', width = 80, height = 30) small_font = pygame.font.SysFont('Ubuntu', 12) self.renderer = SignalRendererWidget(counter_to_sensor_id, dev, self.sig_buf, Rect(0, 0, 880, 660)) self.add(self.renderer) c = Column([ Button("Start REC", action = self.start_recording, enabled = lambda: not self.recording_in_progress, bg_color = (0, 0, 128), height = 30, margin = 3), Button("Stop REC", action = self.stop_recording, enabled = lambda: self.recording_in_progress, bg_color = (0, 0, 128), height = 30, margin = 3), Widget(height = 70), Label('Gyro Data', height = 30), self.gyrox_label, self.gyroy_label, Button("Cursor", action = self.toggle_cursor_rendering, bg_color = (255, 0, 0), height = 30, margin = 3), # Widget(height = 30), Label('EEG Mag', height = 30), Row( [ Button("+", action = lambda: self.renderer.update_magnification(+0.2), bg_color = (80, 100, 40), width = 30, margin = 5), Button("-", action = lambda: self.renderer.update_magnification(-0.2), bg_color = (80, 100, 40), margin = 5, width = 30) ]), self.signal_mag_label, Button("Clear", action = lambda: self.sig_buf.clear(), bg_color = (255, 0, 0), height = 30, margin = 5), Label('Channels', width = 100, bg_color = (50, 50, 255)), Grid([ [ Button("F3", font = small_font, action = lambda: self.renderer.toggle_channel(0)), Button("FC5", font = small_font, action = lambda: self.renderer.toggle_channel(1)), Button("AF3", font = small_font, action = lambda: self.renderer.toggle_channel(2)), Button("F7", font = small_font, action = lambda: self.renderer.toggle_channel(3)) ], [ Button("T7", font = small_font, action = lambda: self.renderer.toggle_channel(4)), Button("P7", font = small_font, action = lambda: self.renderer.toggle_channel(5)), Button("O1", font = small_font, action = lambda: self.renderer.toggle_channel(6)), Button("O2", font = small_font, action = lambda: self.renderer.toggle_channel(7)) ], [ Button("P8", font = small_font, action = lambda: self.renderer.toggle_channel(8)), Button("T8", font = small_font, action = lambda: self.renderer.toggle_channel(9)), Button("F8", font = small_font, action = lambda: self.renderer.toggle_channel(10)), Button("AF4", font = small_font, action = lambda: self.renderer.toggle_channel(11)) ], [ Button("FC6", font = small_font, action = lambda: self.renderer.toggle_channel(12)), Button("F4", font = small_font, action = lambda: self.renderer.toggle_channel(13)) ] ], row_spacing = 5, column_spacing = 8, width = 100), # Widget(height = 55), Button(" QUIT ", action = self.quit, bg_color = (200, 0, 64), margin = 5 )], align = 'c', spacing = 20, bg_color = (50, 50, 50), rect = Rect(880, 0, 120, 690), height = 690, expand = True, margin = 5) self.stat_label = Label('', 100, margin = 3) self.packet_speed_label = Label('', 100, margin = 3) self.recording_label = Label('NOT RECORDING', 400, margin = 3) self.battery_label = Label('NO DATA', 100, margin = 3) r = Row([ self.stat_label, self.packet_speed_label, self.battery_label, self.recording_label, Widget(width = 50, height = 30) ], rect = Rect(0, 660, 880, 30), width = 880, height = 30, expand = True, margin = 5, spacing = 20, bg_color = (50, 50, 50)) self.add(c) self.add(r) # first update is manual self.update_device_status(mon.check_connected()) # eeg rendering widget self.renderer = SignalRendererWidget(counter_to_sensor_id, dev, self.sig_buf, Rect(0, 0, 880, 660)) self.add(self.renderer) self.update_ps_counter = 0 self.rec = None self.render_cursor = False self.sq_pos = (400, 300)