Skip to content

Commit 516128d

Browse files
committed
qt: Implemented logger class to redirect error and info messages to program log widget
1 parent 175e602 commit 516128d

File tree

5 files changed

+141
-29
lines changed

5 files changed

+141
-29
lines changed

qt/logger.cpp

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/* Copyright (C) 2017 Bogdan Bogush <[email protected]>
2+
* This program is free software; you can redistribute it and/or modify
3+
* it under the terms of the GNU General Public License version 3.
4+
*/
5+
6+
#include "logger.h"
7+
#include <QDebug>
8+
9+
Logger *Logger::logger;
10+
QTextEdit *Logger::logTextEdit;
11+
int Logger::refCount;
12+
13+
void Logger::logHandler(QtMsgType type, const QMessageLogContext &context ,
14+
const QString &msg)
15+
{
16+
const char *prefix;
17+
QString formatMsg;
18+
19+
(void)context;
20+
21+
switch (type) {
22+
case QtDebugMsg:
23+
prefix = "Debug: ";
24+
break;
25+
case QtInfoMsg:
26+
prefix = "Info: ";
27+
break;
28+
case QtWarningMsg:
29+
prefix = "Warning: ";
30+
break;
31+
case QtCriticalMsg:
32+
prefix = "Error: ";
33+
break;
34+
case QtFatalMsg:
35+
prefix = "Fatal error: ";
36+
break;
37+
}
38+
39+
formatMsg = QString("%1%2\n").arg(prefix).arg(msg);
40+
41+
if (type == QtFatalMsg || !logTextEdit)
42+
{
43+
QByteArray ba = formatMsg.toLatin1();
44+
fputs(ba.data(), stderr);
45+
if (type == QtFatalMsg)
46+
abort();
47+
}
48+
else
49+
logTextEdit->insertPlainText(formatMsg);
50+
}
51+
52+
Logger::Logger()
53+
{
54+
qInstallMessageHandler(logHandler);
55+
}
56+
57+
Logger::~Logger()
58+
{
59+
qInstallMessageHandler(0);
60+
}
61+
62+
Logger *Logger::getInstance()
63+
{
64+
if (!logger)
65+
logger = new Logger();
66+
refCount++;
67+
68+
return logger;
69+
}
70+
71+
void Logger::putInstance()
72+
{
73+
if (!refCount)
74+
{
75+
qWarning() << "Logger is released without being allocated";
76+
return;
77+
}
78+
79+
if (!--refCount && logger)
80+
{
81+
delete logger;
82+
logger = 0;
83+
logTextEdit = 0;
84+
}
85+
}
86+
87+
void Logger::setTextEdit(QTextEdit *textEdit)
88+
{
89+
logTextEdit = textEdit;
90+
}
91+

qt/logger.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/* Copyright (C) 2017 Bogdan Bogush <[email protected]>
2+
* This program is free software; you can redistribute it and/or modify
3+
* it under the terms of the GNU General Public License version 3.
4+
*/
5+
6+
#ifndef LOGGER_H
7+
#define LOGGER_H
8+
9+
#include <QTextEdit>
10+
11+
class Logger
12+
{
13+
static QTextEdit *logTextEdit;
14+
static Logger *logger;
15+
static int refCount;
16+
17+
explicit Logger();
18+
~Logger();
19+
20+
static void logHandler(QtMsgType type, const QMessageLogContext &context,
21+
const QString &msg);
22+
public:
23+
static Logger *getInstance();
24+
static void putInstance();
25+
static void setTextEdit(QTextEdit *textEdit);
26+
};
27+
28+
#endif // LOGGER_H

qt/main_window.cpp

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "main_window.h"
77
#include "ui_main_window.h"
88
#include "chip_db.h"
9+
#include "logger.h"
910
#include <QDebug>
1011
#include <QFileDialog>
1112
#include <QFile>
@@ -57,8 +58,12 @@ static void addChipDB(QComboBox *chipSelectComboBox)
5758
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
5859
ui(new Ui::MainWindow)
5960
{
61+
Logger *logger = Logger::getInstance();
62+
6063
ui->setupUi(this);
6164

65+
logger->setTextEdit(ui->logTextEdit);
66+
6267
initBufferTable(ui->bufferTableWidget);
6368

6469
prog = new Programmer(this);
@@ -83,14 +88,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
8388

8489
MainWindow::~MainWindow()
8590
{
91+
Logger::putInstance();
8692
delete ui;
8793
}
8894

89-
void MainWindow::log(QString logMsg)
90-
{
91-
ui->logTextEdit->insertPlainText(logMsg);
92-
}
93-
9495
void MainWindow::insertBufferRow(quint8 *readBuf, quint32 size, quint32 rowNum,
9596
quint32 address)
9697
{
@@ -153,20 +154,18 @@ void MainWindow::slotProgConnect()
153154
{
154155
if (!prog->isConnected())
155156
{
156-
if (prog->connect())
157-
{
158-
log(tr("Failed to connect to programmer\n"));
159-
return;
160-
}
157+
if (!prog->connect())
158+
qInfo() << "Connected to programmer";
161159
else
162-
log(tr("Connected to programmer\n"));
160+
return;
161+
163162
ui->actionConnect->setText(tr("Disconnect"));
164163
}
165164
else
166165
{
167166
prog->disconnect();
168167
ui->actionConnect->setText(tr("Connect"));
169-
log(tr("Disconnected from programmer\n"));
168+
qInfo() << "Disconnected from programmer";
170169
}
171170
}
172171

@@ -190,10 +189,8 @@ void MainWindow::slotProgErase()
190189
QByteArray ba = ui->chipSelectComboBox->currentText().toLatin1();
191190
ChipInfo *chipInfo = getChipInfoByName(ba.data());
192191

193-
if (prog->eraseChip(START_ADDRESS, chipInfo->size))
194-
log(tr("Failed to erase chip\n"));
195-
else
196-
log(tr("Chip has been erased successfully\n"));
192+
if (!prog->eraseChip(START_ADDRESS, chipInfo->size))
193+
qInfo() << "Chip has been erased successfully";
197194
}
198195

199196
void MainWindow::slotProgRead()
@@ -214,12 +211,9 @@ void MainWindow::slotProgRead()
214211
ui->bufferTableWidget->setRowCount(HEADER_ROW_NUM);
215212

216213
if (prog->readChip(buf.get(), START_ADDRESS, chipInfo->size))
217-
{
218-
log(tr("Failed to read chip\n"));
219214
return;
220-
}
221215
else
222-
log(tr("Data has been successfully read\n"));
216+
qInfo() << "Data has been successfully read";
223217

224218
for (uint32_t i = 0; i < chipInfo->size; i += ROW_DATA_SIZE)
225219
{
@@ -267,14 +261,12 @@ void MainWindow::slotProgWrite()
267261
}
268262
}
269263

270-
if (prog->writeChip(buf.get(), START_ADDRESS, bufIter))
271-
log(tr("Failed to write chip\n"));
272-
else
273-
log(tr("Data has been successfully written\n"));
264+
if (!prog->writeChip(buf.get(), START_ADDRESS, bufIter))
265+
qInfo() << "Data has been successfully written";
274266
}
275267

276268
void MainWindow::slotSelectChip(int selectedChipNum)
277269
{
278-
if (prog->selectChip(selectedChipNum))
279-
log(tr("Failed to select chip"));
270+
if (!prog->selectChip(selectedChipNum))
271+
qInfo() << "Chip successfully set";
280272
}

qt/main_window.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ class MainWindow : public QMainWindow
2121
public:
2222
explicit MainWindow(QWidget *parent = 0);
2323
~MainWindow();
24-
void log(QString logMsg);
2524

2625
private:
2726
Ui::MainWindow *ui;

qt/qt.pro

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ SOURCES += main.cpp\
2222
programmer.cpp \
2323
chip_db.cpp \
2424
serial_port_writer.cpp \
25-
serial_port_reader.cpp
25+
serial_port_reader.cpp \
26+
logger.cpp
2627

2728
HEADERS += main_window.h \
2829
programmer.h \
2930
chip_db.h \
3031
serial_port_writer.h \
31-
serial_port_reader.h
32+
serial_port_reader.h \
33+
logger.h
3234

3335
FORMS += main_window.ui
3436

0 commit comments

Comments
 (0)