Отрисовка графиков в реальном времени в приложении kivy

Рейтинг: 1Ответов: 0Опубликовано: 11.07.2023

В приложении есть функция подключения по bluetooth к усилителю биопотенциалов. Подключение уже настроено. При запуске отображаются 4 пустых графика (то есть просто 4 набора осей), вот их код:

# Макет для графиков ЭЭГ
        graph_layout = BoxLayout(orientation='vertical', size=(500, 1600))
        layout.add_widget(graph_layout)
        self.fig = plt.figure(figsize=(10, 25), facecolor='grey', layout='tight')
        self.canvas = FigureCanvas(self.fig)
        graph_layout.add_widget(self.canvas)
        self.reset_graphs()

функция обновления до пустых осей:

    def reset_graphs(self):
        self.fig.clear()
        for i in range(self.channels):
            self.ax = self.fig.add_subplot(self.channels, 1, i + 1)
            self.ax.set_ylim([-20, 20])
            self.ax.set_xticklabels([])
            self.ax.yaxis.grid(True)
            self.ax.plot([], [], color='red')
        self.canvas.draw_idle()

От усилителя приложение должно получать массив данных (запись ЭЭГ в реальном времени). Когда сопряжение установлено, надо нажать на кнопку "старт", которая вызывает следующую функцию в корректности которой я не уверена

    def on_st(self, instance):
        op = -1
        omission_count = 0
        while not BluetoothPopup().err:
            try:
                self.chunk_data = self.socket.recv(1024)
                i = 0
                while i < len(self.chunk_data):
                    if (op == -1) and (self.chunk_data[i] & 128) == 128:
                        self.data = []
                        op = 0
                        omission_count = 3
                    elif op == 0:
                        omission_count -= 1
                        if omission_count == 0:
                            op = 1
                    elif op == 1:
                        self.data.append(self.chunk_data[i])
                        if len(self.data) == self.len_data:
                            data = []
                            for j in range(self.channels):
                                data.append(((self.data[2 * j + 1] + (self.data[2 * j] << 7)) - 2048) * 0.10417)
                            self.buff.append(data)
                            for k in range(0, self.channels):
                                self.data_queue[k].append(data[k])
                            op = -1
                            self.data.extend(data)
                    i = i + 1
            except:
                self.error = True
        self.draw_plots()

BluetoothPopup() это класс, наследованный от kivy popup, внутри которого осуществляется подключение к усилителю. draw_plots() это функция отрисовки графиков в тех пустых осях. Их 4 потому что каналов записи ЭЭГ у усилителя тоже 4. Когда линия доходит до конца доступного места, она стирается и начинается сначала. Трудность возникает как раз в этом, в отображении получаемых от усилителя данных в виде графиков. У меня есть некоторые наброски, но пока они не работают, если будут нужны, напишите, и я дополню ими вопрос.

Ответы

Ответов пока нет.