Skip to content
Snippets Groups Projects
climate-lab-gui.py 6.36 KiB
Newer Older
Martin Killenberg's avatar
Martin Killenberg committed
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QTextEdit
from PyQt5 import uic, QtCore, QtGui, QtWidgets
import sys
import prototype
import json
import analysis
Martin Killenberg's avatar
Martin Killenberg committed

Martin Killenberg's avatar
Martin Killenberg committed
class TestStandMainWindow(QMainWindow):
    def __init__(self, qt_app, *args, **kwargs):
Martin Killenberg's avatar
Martin Killenberg committed
        super().__init__(*args, **kwargs)
        uic.loadUi('climate-lab-main.ui', self)
Martin Killenberg's avatar
Martin Killenberg committed

        self.startButton.clicked.connect(lambda: self.do_measurement())
        self.tempSweepButton.clicked.connect(lambda: self.set_temp_sweep_labels())
        self.humSweepButton.clicked.connect(lambda: self.set_hum_sweep_labels())
        self.start_dir = os.getcwd()

    def set_temp_sweep_labels(self):
        self.parametersGroupBox.setEnabled(True)
        self.startStopStepGroupBox.setTitle('Temperature [degC]')
        self.fixedParameterLabel.setText('Humidity [% r.h.]')

    def set_hum_sweep_labels(self):
        self.parametersGroupBox.setEnabled(True)
        self.startStopStepGroupBox.setTitle('Humidity [% r.h.]')
        self.fixedParameterLabel.setText('Temperature [degC]')
    def check_and_change_dir(self, data_folder):
        if os.path.exists(data_folder):
            if os.path.isdir(data_folder):
                button_reply = QtWidgets.QMessageBox.question(self, 'Warning: \'' + data_folder + '\' already exists',
                                                              'Overwrite data in \'' + data_folder + '\'?',
                                                              QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                                                              QtWidgets.QMessageBox.No)
                if not button_reply == QtWidgets.QMessageBox.Yes:
                    return False
            else:
                QtWidgets.QMessageBox.critical(self, 'Error', '\'' + data_folder + '\' exists but is not a directory!')
                return False
        else:
            try:
                os.makedirs(data_folder)
            except:
                QtWidgets.QMessageBox.critical(self, 'Error', 'Cannot create folder \'' + data_folder + '\'!')
                return False
        os.chdir(data_folder)
        print('changed dir')
        return True

    def do_measurement(self):
        self.setEnabled(False)
        self.qt_app.processEvents();

        os.chdir(self.start_dir)
        with open('test_stand_parameter.json', 'r') as f:
            config_data = json.load(f)
        with open('ext_sensor_channels.json', 'r') as f2:
            ext_sensor_channels = json.load(f2)
        if self.autoNameCheckbox.isChecked():
            output_basename = time.strftime("%Y_%m_%d-%H_%M_%S") + "_results"
        else:
            output_basename = self.baseName.text()
        if not self.check_and_change_dir(config_data['data_folder'] + '/' + output_basename):
            self.setEnabled(True)
            return
        meas = prototype.Measurements(config_data, output_basename,False, ext_sensor_channels)
            if self.tempSweepButton.isChecked():
                temperatures = meas.perform_sweep(self.startParameter.value(), self.stopParameter.value(),
                                                  self.stepParameter.value(), self.fixedParameter.value(),
                                                  self.soakingTime.value(), self.stableReads.value(),
                                                  'temperature')
                temp_extensions = []
                for t in temperatures:
                    temp_extensions.append(str(t) + 'deg_' + str(self.fixedParameter.value()) + 'rh')
                analysis.plot_sweep(temperatures, [self.fixedParameter.value()] * len(temperatures), output_basename,
                                    'temperature', meas.dut.get_measurement_set_names())
                prototype.plot_output(output_basename, temp_extensions, True, config_data, ext_sensor_channels,
                                      meas.dut.get_measurement_set_names(),
                                      output_basename + ': Temperature sweep ' + str(temperatures[0]) + '--' +
                                      str(temperatures[-1]) + ' degC @ ' + str(self.fixedParameter.value()) + ' % r.h.')
            elif self.humSweepButton.isChecked():
                humidities = meas.perform_sweep(self.startParameter.value(), self.stopParameter.value(),
                                                self.stepParameter.value(), self.fixedParameter.value(),
                                                self.soakingTime.value(), self.stableReads.value(),
                                                'humidity')
                hum_extensions = []
                for h in humidities:
                    hum_extensions.append(str(self.fixedParameter.value()) + 'deg_' + str(h) + 'rh')
                analysis.plot_sweep([self.fixedParameter.value()] * len(humidities), humidities, output_basename,
                                    'humidity', meas.dut.get_measurement_set_names())
                prototype.plot_output(output_basename, hum_extensions, True, config_data, ext_sensor_channels,
                                      meas.dut.get_measurement_set_names(),
                                      output_basename + ': Humidity sweep ' + str(humidities[0]) + '--' +
                                      str(humidities[-1]) + ' % r.h. @ ' + str(self.fixedParameter.value()) + ' degC')
            elif self.measurementFileButton.isChecked():
                try:
                    n_measurements = meas.perform_measurements(os.path.join(self.start_dir,
                                                                            self.measurementFile.text()))
                    prototype.plot_output(output_basename, range(n_measurements), True, config_data, ext_sensor_channels,
                                          meas.dut.get_measurement_set_names(),
                                          output_basename)
                except FileNotFoundError as e:
                    QtWidgets.QMessageBox.warning(self, 'Warning', str(e))

        finally:
            meas.chamber.close()
            meas.ext_sensors.close()
            
            self.setEnabled(True)

Martin Killenberg's avatar
Martin Killenberg committed

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = TestStandMainWindow(app)
    mainWindow.show()
    app.exec_()