#include "MainWindow.h" #include "./ui_MainWindow.h" #include "LogParser.h" #include #include #include #include #include #include MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , logParser(new LogParser) , logItemModel(new QStandardItemModel) , inputChart(new QtCharts::QChart) , outputChart(new QtCharts::QChart) , adcChart(new QtCharts::QChart) { ui->setupUi(this); for (const auto& volume: QStorageInfo::mountedVolumes()) { if (volume.displayName().contains("Drive")) { logParser->setLogFolder(volume.rootPath()); } qDebug() << volume.device() << volume.displayName() << volume.fileSystemType() << volume.name() << volume.rootPath() << volume.subvolume(); } if (logParser->getLogFolder().isEmpty()) { logParser->setLogFolder(QDir::homePath()); } ui->startDateTimeEdit->setDateTime(QDateTime::currentDateTime().addMonths(-3)); ui->endDateTimeEdit->setDateTime(QDateTime::currentDateTime()); logParser->setStartDateTime(ui->startDateTimeEdit->dateTime()); logParser->setEndDateTime(ui->endDateTimeEdit->dateTime()); const QStringList labels = { tr("Date"), tr("Startup time"), tr("Type"), tr("F1"), tr("F2"), tr("F3"), tr("F4"), tr("Description") }; logItemModel->setHorizontalHeaderLabels(labels); ui->logTableView->setModel(logItemModel.get()); ui->logTableView->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->logTableView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->logTableView->setSelectionMode(QAbstractItemView::SingleSelection); ui->inputChartView->setRenderHint(QPainter::Antialiasing); ui->inputChartView->setChart(inputChart.data()); ui->inputChartView->setRubberBand(QtCharts::QChartView::RectangleRubberBand); ui->outputChartView->setRenderHint(QPainter::Antialiasing); ui->outputChartView->setChart(outputChart.data()); ui->outputChartView->setRubberBand(QtCharts::QChartView::RectangleRubberBand); ui->adcChartView->setRenderHint(QPainter::Antialiasing); ui->adcChartView->setChart(adcChart.data()); ui->adcChartView->setRubberBand(QtCharts::QChartView::RectangleRubberBand); ui->pathLineEdit->setText(logParser->getLogFolder()); ui->pathLineEdit->setReadOnly(true); connect(ui->applyDateTimeButton, &QPushButton::clicked, this, &MainWindow::applyDateTimeFilter); connect(ui->browseButton, &QPushButton::clicked, this, &MainWindow::changePath); updateLogMessages(); } MainWindow::~MainWindow() { } void MainWindow::changePath() { const auto directory = QFileDialog::getExistingDirectory(this, tr("Choose log folder")); if (directory.isEmpty()) { return; } ui->pathLineEdit->setText(directory); logParser->setLogFolder(directory); updateLogMessages(); } void MainWindow::applyDateTimeFilter() { logParser->setStartDateTime(ui->startDateTimeEdit->dateTime()); logParser->setEndDateTime(ui->endDateTimeEdit->dateTime()); updateLogMessages(); } void MainWindow::updateLogMessages() { logMessages = logParser->logMessagesByDateTime(); updateLogTable(); updateCharts(); } void MainWindow::updateLogTable() { logItemModel->removeRows(0, logItemModel->rowCount()); for (const auto& message: qAsConst(logMessages)) { if (!DataTypes::isErrorMessage(message.type)) { continue; } auto dateItem = new QStandardItem(); dateItem->setData(message.dateTime, Qt::DisplayRole); auto startupItem = new QStandardItem(); startupItem->setData(message.startupTime, Qt::DisplayRole); auto typeItem = new QStandardItem(); typeItem->setData(static_cast(message.type), Qt::DisplayRole); auto f1Item = new QStandardItem(); f1Item->setData(message.f1, Qt::DisplayRole); auto f2Item = new QStandardItem(); f2Item->setData(message.f2, Qt::DisplayRole); auto f3Item = new QStandardItem(); f3Item->setData(message.f3, Qt::DisplayRole); auto f4Item = new QStandardItem(); f4Item->setData(message.f4, Qt::DisplayRole); auto descriptionItem = new QStandardItem(); descriptionItem->setData(DataTypes::messageString(message.type), Qt::DisplayRole); logItemModel->appendRow({dateItem, startupItem, typeItem, f1Item, f2Item, f3Item, f4Item, descriptionItem}); } ui->logTableView->resizeColumnsToContents(); } void MainWindow::updateCharts() { updateChart(inputChart.get(), [](const DataTypes::LogMessage& message){ return message.type == DataTypes::MessageType::LTM_PARAMS_MSG; }); updateChart(outputChart.get(), [](const DataTypes::LogMessage& message){ return message.type == DataTypes::MessageType::LTM_PARAMS_OUT; }); updateChart(adcChart.get(), [](const DataTypes::LogMessage& message){ return message.type == DataTypes::MessageType::LTM_PARAMS_ADC; }); } void MainWindow::updateChart(QtCharts::QChart* chart, std::function condition) { QList voltagePoints; QList currentPoints; for (const auto& message: qAsConst(logMessages)) { if (condition(message)) { voltagePoints.append({static_cast(message.startupTime), static_cast(message.f1)}); currentPoints.append({static_cast(message.startupTime), static_cast(message.f2)}); } } QPen yellowPen(Qt::yellow); yellowPen.setWidth(3); QPen redPen(Qt::red); redPen.setWidth(3); auto voltageSeries = new QtCharts::QLineSeries(); voltageSeries->setPen(yellowPen); voltageSeries->append(voltagePoints); voltageSeries->setName(tr("Voltage")); auto currentSeries = new QtCharts::QLineSeries(); currentSeries->setPen(redPen); currentSeries->append(currentPoints); currentSeries->setName(tr("Current")); clearChart(chart); chart->addSeries(voltageSeries); chart->addSeries(currentSeries); chart->createDefaultAxes(); } void MainWindow::clearChart(QtCharts::QChart* chart) { for (auto series: chart->series()) { chart->removeSeries(series); delete series; } for (auto axis: chart->axes()) { chart->removeAxis(axis); delete axis; } }