212 lines
6.4 KiB
C++
212 lines
6.4 KiB
C++
#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;
|
|
}
|
|
}
|