import enum import csv import time from typing import cast from PySide6.QtCore import QTimer from PySide6.QtWidgets import ( QWidget, QGridLayout, QHBoxLayout, QVBoxLayout, QLabel, QPushButton, QFileDialog, ) from PySide6.QtCharts import QChart, QChartView, QLineSeries from .profile_handler import ProfileHandler, ProfileState class GUI(QWidget): _profile_handler: ProfileHandler _update_timer: QTimer def __init__(self, profile_handler: ProfileHandler): super().__init__(None) profile_label = QLabel("Profile:") self.profile = QLabel("None") self.profile.setStyleSheet("font-style: italic") self.profile_chooser = QPushButton("Choose") self.profile_chooser.clicked.connect(self._choose_profile) profile_choice = QHBoxLayout() profile_choice.addWidget(profile_label) profile_choice.addWidget(self.profile) profile_choice.addWidget(self.profile_chooser) chart_view = QChartView() self.chart = QChart() chart_view.setChart(self.chart) self.start_pause = QPushButton("START") self.start_pause.setDisabled(True) self.start_pause.clicked.connect(self._start_pause) self.stop = QPushButton("STOP") self.stop.setDisabled(True) self.stop.clicked.connect(self._stop) profile_buttons = QHBoxLayout() profile_buttons.addWidget(self.start_pause) profile_buttons.addWidget(self.stop) profile_layout = QVBoxLayout() profile_layout.addLayout(profile_choice) profile_layout.addWidget(chart_view) profile_layout.addLayout(profile_buttons) current_label = QLabel("Current [A]:") self.current = QLabel("0") time_label = QLabel("Time [min]:") self.time = QLabel("00:00 / 00:00") self.time.setStyleSheet("font-family: monospace") voltage_label = QLabel("Voltage [V]:") self.voltage = QLabel("[0.00, 0.00]") temperature_label = QLabel("Temperature [°C]:") self.temperature = QLabel("[00.0, 00.0]") info_layout = QGridLayout() info_layout.addWidget(current_label, 0, 0) info_layout.addWidget(self.current, 0, 1) info_layout.addWidget(time_label, 1, 0) info_layout.addWidget(self.time, 1, 1) info_layout.addWidget(voltage_label, 2, 0) info_layout.addWidget(self.voltage, 2, 1) info_layout.addWidget(temperature_label, 3, 0) info_layout.addWidget(self.temperature, 3, 1) layout = QHBoxLayout() layout.addLayout(profile_layout) layout.addLayout(info_layout) self.setLayout(layout) self.setWindowTitle("Load Controller") self._profile_handler = profile_handler self._profile_handler.current_changed.connect(self._update_current) self._profile_handler.finished.connect(self._stop) self._update_timer = QTimer() self._update_timer.timeout.connect(self._update) self._update_timer.start(100) def _choose_profile(self): dlg = QFileDialog(parent=self) dlg.setFileMode(QFileDialog.FileMode.ExistingFile) dlg.setNameFilter("Profiles (*.csv)") if not dlg.exec(): return profile_path = dlg.selectedFiles()[0] print(f"Profile: {profile_path}") self.profile.setText(profile_path) self.profile.setStyleSheet("font-style: normal") series = QLineSeries() for t, i in self._profile_handler.load_profile(profile_path): series.append(t, i) # with open(profile_path) as fh: # t = 0 # for l in csv.reader(fh): # i = float(l[0]) # series.append(t, i) # t += float(l[1]) # series.append(t, i) # series.append() self.chart.removeAllSeries() self.chart.addSeries(series) self.chart.createDefaultAxes() self.start_pause.setDisabled(False) def _update_current(self, current: float): self.current.setText(f"{current:02.1f}") def _start_pause(self): if self._profile_handler.state == ProfileState.STOPPED: self._profile_handler.start() self.start_pause.setText("PAUSE") self.stop.setDisabled(False) self.profile_chooser.setDisabled(True) # TODO: Start logging elif self._profile_handler.state == ProfileState.RUNNING: self._profile_handler.pause() self.start_pause.setText("RESUME") else: self._profile_handler.resume() self.start_pause.setText("PAUSE") def _stop(self): self.start_pause.setText("START") self.stop.setDisabled(True) self.profile_chooser.setDisabled(False) def _update(self): if self._profile_handler.state == ProfileState.RUNNING: dt = time.time() - self._profile_handler.profile_start if len(self.chart.series()) == 1: series = QLineSeries() series.append(dt, 0) series.append(dt, 100) self.chart.addSeries(series) self.chart.createDefaultAxes() else: series = cast(QLineSeries, self.chart.series()[-1]) series.removePoints(0, 2) series.append(dt, 0) series.append(dt, 100)