Skip to content

Commit

Permalink
Добавлено сохранение состояния окна, правки сообщений об ошибках
Browse files Browse the repository at this point in the history
  • Loading branch information
yuferovalex committed Sep 3, 2018
1 parent 360c51a commit 034d164
Show file tree
Hide file tree
Showing 11 changed files with 270 additions and 73 deletions.
80 changes: 71 additions & 9 deletions src/EventLog.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
#include <QFile>
#include <QCoreApplication>
#include <QDateTime>
#include <QDir>
#include <QFile>
#include <QMessageBox>

#include "Device.h"
#include "Modules.h"
#include "EventLog.h"

struct CannotCreateLogsDir {};
struct CannotCdToLogsDir {};
struct CannotOpenFile
{
public:
CannotOpenFile(QString desc) noexcept
: m_what(desc)
{}
QString qWhat() const noexcept { return m_what; }

private:
QString m_what;
};

EventLog::EventLog(Device &device, QObject *parent)
: QObject(parent)
, m_device(device)
Expand All @@ -15,13 +31,15 @@ EventLog::EventLog(Device &device, QObject *parent)

void EventLog::initialMessage(MDM500M::DeviceErrors log)
{
open();
if (!open()) {
return ;
}
out() << tr("Начало работы с устройством \"%1\"").arg(m_device.name()) << endl;
out() << tr("Модель устройства:") << ' ' << m_device.type() << endl;
out() << tr("Серийный номер:") << ' ' << m_device.serialNumber() << endl;
// Старое устройство не поддерживает перепрошивку и журналирование ошибок
if (!m_device.isMDM500()) {
out() << tr("Версия прошивки:") << m_device.softwareVersion().toString() << endl;
out() << tr("Версия прошивки:") << ' ' << m_device.softwareVersion().toString() << endl;
if (log) {
out() << tr("Со времени последнего подключения произошли следующие ошибки:") << endl;
reportOldErrors(log);
Expand Down Expand Up @@ -82,6 +100,27 @@ void EventLog::reportCurrentErrors()
}
}

QDir EventLog::getLogPath() const
{
QDir path { QFileInfo(QCoreApplication::applicationFilePath()).path() };
if (!path.exists("logs")) {
if (!path.mkdir("logs")) {
throw CannotCreateLogsDir();
}
}
if (!path.cd("logs")) {
throw CannotCdToLogsDir();
}
return path;
}

QString EventLog::getFileName() const
{
return QString("%1_%2.log")
.arg(m_device.serialNumber())
.arg(QDate::currentDate().toString("dd.MM.yyyy"));
}

void EventLog::onModuleErrorsChanged()
{
auto module = static_cast<Module *>(sender());
Expand All @@ -102,15 +141,38 @@ QString EventLog::date() const
return QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss");
}

void EventLog::open()
bool EventLog::open()
{
if (!m_file->isOpen()) {
m_file->setFileName(QString("%1_%2.log")
.arg(m_device.serialNumber())
.arg(QDate::currentDate().toString("dd.MM.yyyy")));
if (m_file->isOpen()) {
return true;
}
static const auto errorMsgTemplate = tr("Во время создания файла журнала "
"устройства произошла ошибка: %1.");

QString caption;
try {
QString fileName = getLogPath().absoluteFilePath(getFileName());
m_file->setFileName(fileName);
if (!m_file->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
return;
throw CannotOpenFile(m_file->errorString());
}
m_out.setDevice(m_file);
return true;
}
catch (CannotCreateLogsDir &) {
caption = errorMsgTemplate
.arg(tr("не удалось создать директорию \"logs\""));
}
catch (CannotCdToLogsDir &) {
caption = errorMsgTemplate
.arg(tr("не удалось открыть директорию \"logs\""));
}
catch (CannotOpenFile &e) {
caption = errorMsgTemplate.arg(e.qWhat());
}
QMessageBox::warning(
nullptr,
tr("Ошибка создания файла журнала"),
caption);
return false;
}
5 changes: 4 additions & 1 deletion src/EventLog.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include <QDir>
#include <QObject>
#include <QTextStream>

Expand All @@ -24,10 +25,12 @@ private slots:
QTextStream &out();
QString date() const;

void open();
bool open();
void subscribe();
void reportOldErrors(MDM500M::DeviceErrors log);
void reportCurrentErrors();
QDir getLogPath() const;
QString getFileName() const;

QTextStream m_out;
Device &m_device;
Expand Down
30 changes: 30 additions & 0 deletions src/MainWindow.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#include <QFile>
#include <QSettings>
#include <QWindowStateChangeEvent>
#include <QDesktopWidget>

#include "Device.h"
#include "Modules.h"
Expand All @@ -21,13 +24,15 @@ MainWindow::MainWindow()
ui->version->setText(QString("v%1").arg(QApplication::applicationVersion()));
onCurrentTabChanged(-1);
connect(ui->tabs, &QTabWidget::currentChanged, this, &MainWindow::onCurrentTabChanged);
readSettings();
createBuilders();
searchDevice();
}

MainWindow::~MainWindow()
{
clearTabs();
writeSettings();
}

void MainWindow::createBuilders()
Expand Down Expand Up @@ -125,3 +130,28 @@ void MainWindow::clearTabs()
ui->tabs->hide();
ui->mainWindowEmptyLbl->show();
}

void MainWindow::readSettings()
{
QSettings settings("settings.ini", QSettings::Format::IniFormat);
auto geometry = settings.value("geometry");
if (geometry.isValid()) {
restoreGeometry(geometry.toByteArray());
}
else {
setGeometry(
QStyle::alignedRect(
Qt::LeftToRight,
Qt::AlignCenter,
size(),
qApp->desktop()->availableGeometry()
)
);
}
}

void MainWindow::writeSettings()
{
QSettings settings("settings.ini", QSettings::Format::IniFormat);
settings.setValue("geometry", saveGeometry());
}
2 changes: 2 additions & 0 deletions src/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class MainWindow : public QWidget
void removeTab(QWidget *settingsView);
void onCurrentTabChanged(int index);
void clearTabs();
void readSettings();
void writeSettings();

std::unordered_map<DeviceType, SettingsViewBuilder> m_builders;
std::unique_ptr<Ui::MainWindow> ui;
Expand Down
69 changes: 46 additions & 23 deletions src/SettingsSerializers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void XmlSerializer::readModuleData(QXmlStreamReader &xml, QVariantMap &data)
while (!xml.atEnd()) {
auto token = xml.readNext();
if (token == QXmlStreamReader::StartElement) {
data[xml.name().toString().toUpper()] = xml.readElementText();
data[xml.name().toString().toLower()] = xml.readElementText();
}
if (token == QXmlStreamReader::EndElement && xml.name() == "module") {
break ;
Expand All @@ -97,10 +97,10 @@ bool XmlSerializer::deserialize(QIODevice &in, Device &device, QString &errors)
while (!xml.atEnd() && !xml.hasError()) {
auto token = xml.readNext();
if (token == QXmlStreamReader::StartElement) {
if (xml.name() == "config") {
if (xml.name().toString().toLower() == QLatin1String("config")) {
isConfig = true;
}
if (xml.name() == "module") {
if (xml.name().toString().toLower() == QLatin1String("module")) {
auto attributes = xml.attributes();
bool slotOk;
int slot = attributes.value("id").toInt(&slotOk);
Expand All @@ -113,7 +113,7 @@ bool XmlSerializer::deserialize(QIODevice &in, Device &device, QString &errors)
continue ;
}

data[slot]["TYPE"] = type;
data[slot]["type"] = type;
readModuleData(xml, data[slot]);
}
}
Expand Down Expand Up @@ -164,7 +164,7 @@ void Get::visit(DM500FM &module)
template <typename T, typename Setter>
void Set::setParam(QString key, int slot, Setter &&setter)
{
auto iter = data.find(key.toUpper());
auto iter = data.find(key.toLower());
if (iter == data.end()) {
stream << QObject::tr("Модуль %1: параметр \"%2\" не найден.")
.arg(slot).arg(key)
Expand All @@ -183,7 +183,7 @@ void Set::setParam(QString key, int slot, Setter &&setter)

#define CHECK_TYPE() \
do { \
if (data["TYPE"].toString() != module.metaObject()->className()) { \
if (data["type"].toString() != module.metaObject()->className()) { \
stream << QObject::tr("Модуль %1: типы модулей не совпадают") \
.arg(module.slot()) \
<< endl; \
Expand Down Expand Up @@ -279,18 +279,38 @@ void CsvSerializer::serialize(QIODevice &out, Device &device)
.arg(MegaHertzReal(module.frequency()).count(), 0, 'f', 2)
.arg(module.isDiagnosticEnabled());
}
text << "0;;" << endl;
text << device.controlModule() << ";;" << endl;
}

bool CsvSerializer::deserialize(QIODevice &in, Device &device, QString &errors)
{
struct Record
{
MegaHertzReal frequency;
bool diagnostic;
};
Record data[kSlotCount];
int control = 0;

bool read = readModuleParams(in, errors, data)
&& readControlSlot(in, control, errors);
if (!read) {
return false;
}
QTextStream e(&errors);
e << QObject::tr("Отчет о восстановлении настроек:") << endl;

for (int slot = 0; slot < kSlotCount; ++slot) {
auto &module = *device.module(slot);
if (!module.isEmpty()) {
if (!module.setFrequency(data[slot].frequency)) {
e << QObject::tr("Модуль %1: неверное значение частоты").arg(slot) << endl;
}
module.setDiagnostic(data[slot].diagnostic);
e << QObject::tr("Модуль %1: восстановление завершено").arg(slot) << endl;
}
}
device.setControlModule(control);
return true;
}

bool CsvSerializer::readModuleParams(QIODevice &in, QString &errors, Record *data)
{
for (size_t lineNumber = 0; !in.atEnd() && lineNumber < kSlotCount; ++lineNumber) {
bool ok;
auto line = in.readLine().split(';');
Expand All @@ -317,20 +337,23 @@ bool CsvSerializer::deserialize(QIODevice &in, Device &device, QString &errors)
}
data[lineNumber].diagnostic = diagnostic;
}
return true;
}

QTextStream e(&errors);
e << QObject::tr("Отчет о восстановлении настроек:") << endl;
bool CsvSerializer::readControlSlot(QIODevice &in, int &control, QString &errors)
{
bool ok;
auto line = in.readLine().split(';');

for (int slot = 0; slot < kSlotCount; ++slot) {
auto &module = *device.module(slot);
if (!module.isEmpty()) {
if (!module.setFrequency(data[slot].frequency)) {
e << QObject::tr("Модуль %1: неверное значение частоты").arg(slot) << endl;
}
module.setDiagnostic(data[slot].diagnostic);
e << QObject::tr("Модуль %1: восстановление завершено").arg(slot) << endl;
}
if (line.size() < 1) {
errors = QObject::tr("не найдено значение контрольного канала (строка 17)");
return false;
}

control = line[0].toInt(&ok);
if (!ok || control < 0 || control >= kSlotCount) {
errors = QObject::tr("неверное значение контрольного канала (строка 17)");
return false;
}
return true;
}
12 changes: 12 additions & 0 deletions src/SettingsSerializers.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

#include <QVariantMap>

#include "Frequency.h"

class Device;
class Module;
class DM500;
Expand Down Expand Up @@ -42,4 +44,14 @@ class CsvSerializer : public Interfaces::SettingsSerializer
QString fileExtension() const override;
void serialize(QIODevice &out, Device &device) override;
bool deserialize(QIODevice &in, Device &device, QString &errors) override;

private:
struct Record
{
MegaHertzReal frequency;
bool diagnostic;
};

bool readModuleParams(QIODevice &in, QString &errors, Record *data);
bool readControlSlot(QIODevice &in, int &device, QString &errors);
};
Loading

0 comments on commit 034d164

Please sign in to comment.