Added first project implementation

This commit is contained in:
Yury Shuvakin
2024-01-22 18:45:09 +09:00
parent 065decd584
commit 9e957f29fe
12 changed files with 893 additions and 0 deletions

211
MainWindow.cpp Normal file
View File

@@ -0,0 +1,211 @@
#include "MainWindow.h"
#include "./ui_MainWindow.h"
#include "LogParser.h"
#include <QStandardItemModel>
#include <QStorageInfo>
#include <QFileDialog>
#include <QChart>
#include <QLineSeries>
#include <QDebug>
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<int>(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<bool (const DataTypes::LogMessage&)> condition)
{
QList<QPointF> voltagePoints;
QList<QPointF> currentPoints;
for (const auto& message: qAsConst(logMessages))
{
if (condition(message))
{
voltagePoints.append({static_cast<qreal>(message.startupTime), static_cast<qreal>(message.f1)});
currentPoints.append({static_cast<qreal>(message.startupTime), static_cast<qreal>(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;
}
}