Skip to content

Commit 9fe6a2b

Browse files
committed
qt: implemented thread safe logging in reader & writer via signal
1 parent 4951009 commit 9fe6a2b

File tree

6 files changed

+91
-42
lines changed

6 files changed

+91
-42
lines changed

qt/programmer.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
Programmer::Programmer(QObject *parent) : QObject(parent)
1717
{
1818
usbDevName = USB_DEV_NAME;
19+
QObject::connect(&reader, SIGNAL(log(QtMsgType, QString)), this,
20+
SLOT(logCb(QtMsgType, QString)));
21+
QObject::connect(&writer, SIGNAL(log(QtMsgType, QString)), this,
22+
SLOT(logCb(QtMsgType, QString)));
1923
}
2024

2125
Programmer::~Programmer()
@@ -190,4 +194,25 @@ void Programmer::selectChip(uint32_t chipNum)
190194
reader.start();
191195
}
192196

197+
void Programmer::logCb(QtMsgType msgType, QString msg)
198+
{
199+
switch (msgType)
200+
{
201+
case QtDebugMsg:
202+
qDebug() << msg;
203+
break;
204+
case QtInfoMsg:
205+
qInfo() << msg;
206+
break;
207+
case QtWarningMsg:
208+
qWarning() << msg;
209+
break;
210+
case QtCriticalMsg:
211+
qCritical() << msg;
212+
break;
213+
default:
214+
break;
215+
}
216+
}
217+
193218

qt/programmer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ private slots:
5959
void readCb(int ret);
6060
void eraseChipCb(int ret);
6161
void selectChipCb(int ret);
62+
void logCb(QtMsgType msgType, QString msg);
6263
};
6364

6465
#endif // PROGRAMMER_H

qt/reader.cpp

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
#define READ_TIMEOUT 5000
1313
#define BUF_SIZE 1024
1414

15-
Q_DECLARE_METATYPE(QTextBlock)
16-
Q_DECLARE_METATYPE(QTextCursor)
15+
Q_DECLARE_METATYPE(QtMsgType)
1716

1817
void Reader::init(const QString &portName, qint32 baudRate, uint8_t *rbuf,
1918
uint32_t rlen, uint8_t *wbuf, uint32_t wlen)
@@ -34,13 +33,13 @@ int Reader::write(uint8_t *data, uint32_t len)
3433
ret = serialPort->write((char *)data, len);
3534
if (ret < 0)
3635
{
37-
qCritical() << "Failed to write: " << serialPort->errorString();
36+
logErr(QString("Failed to write: %1").arg(serialPort->errorString()));
3837
return -1;
3938
}
4039
else if ((uint32_t)ret < len)
4140
{
42-
qCritical() << "Data was partialy written, returned " << ret <<
43-
", expected " << len;
41+
logErr(QString("Data was partialy written, returned %1, expected %2")
42+
.arg(ret).arg(len));
4443
return -1;
4544
}
4645

@@ -58,14 +57,14 @@ int Reader::read(uint8_t *pbuf, uint32_t len)
5857

5958
if (!serialPort->waitForReadyRead(READ_TIMEOUT))
6059
{
61-
qCritical() << "Read data timeout";
60+
logErr("Read data timeout");
6261
return -1;
6362
}
6463

6564
ret = serialPort->read((char *)pbuf, len);
6665
if (ret < 0)
6766
{
68-
qCritical() << "Failed to read data";
67+
logErr("Failed to read data");
6968
return -1;
7069
}
7170

@@ -80,8 +79,8 @@ int Reader::handleBadBlock(uint8_t *pbuf, uint32_t len)
8079
if (len < size)
8180
return 0;
8281

83-
qInfo() << QString("Bad block at 0x%1").arg(badBlock->addr, 8,
84-
16, QLatin1Char( '0' ));
82+
logInfo(QString("Bad block at 0x%1").arg(badBlock->addr, 8, 16,
83+
QLatin1Char('0')));
8584

8685
return size;
8786
}
@@ -93,7 +92,7 @@ int Reader::handleStatus(uint8_t *pbuf, uint32_t len)
9392
switch (header->info)
9493
{
9594
case STATUS_ERROR:
96-
qCritical() << "Programmer sent error";
95+
logErr("Programmer sent error");
9796
return -1;
9897
case STATUS_BAD_BLOCK:
9998
return handleBadBlock(pbuf, len);
@@ -103,7 +102,7 @@ int Reader::handleStatus(uint8_t *pbuf, uint32_t len)
103102
readOffset = 1;
104103
break;
105104
default:
106-
qCritical() << "Wrong response header info " << header->info;
105+
logErr(QString("Wrong response header info %1").arg(header->info));
107106
return -1;
108107
}
109108

@@ -118,7 +117,8 @@ int Reader::handleData(uint8_t *pbuf, uint32_t len)
118117

119118
if (!dataSize || packetSize > BUF_SIZE)
120119
{
121-
qCritical() << "Wrong data length in response header:" << dataSize;
120+
logErr(QString("Wrong data length in response header: %1")
121+
.arg(dataSize));
122122
return -1;
123123
}
124124

@@ -127,7 +127,7 @@ int Reader::handleData(uint8_t *pbuf, uint32_t len)
127127

128128
if (dataSize + readOffset > this->rlen)
129129
{
130-
qCritical() << "Read buffer overflow";
130+
logErr("Read buffer overflow");
131131
return -1;
132132
}
133133

@@ -151,8 +151,8 @@ int Reader::handlePacket(uint8_t *pbuf, uint32_t len)
151151
case RESP_DATA:
152152
return handleData(pbuf, len);
153153
default:
154-
qCritical() << "Programmer returned wrong response code: " <<
155-
header->code;
154+
logErr(QString("Programmer returned wrong response code: %1")
155+
.arg(header->code));
156156
return -1;
157157
}
158158

@@ -163,7 +163,6 @@ int Reader::handlePackets(uint8_t *pbuf, uint32_t len)
163163
{
164164
int ret;
165165
uint32_t offset = 0;
166-
167166
do
168167
{
169168
if ((ret = handlePacket(pbuf + offset, len - offset)) < 0)
@@ -213,8 +212,8 @@ int Reader::serialPortCreate()
213212

214213
if (!serialPort->open(QIODevice::ReadWrite))
215214
{
216-
qCritical() << "Failed to open serial port: " <<
217-
serialPort->errorString();
215+
logErr(QString("Failed to open serial port: %1")
216+
.arg(serialPort->errorString()));
218217
return -1;
219218
}
220219

@@ -232,8 +231,7 @@ void Reader::run()
232231
int ret = -1;
233232

234233
/* Required for logger */
235-
qRegisterMetaType<QTextBlock>();
236-
qRegisterMetaType<QTextCursor>();
234+
qRegisterMetaType<QtMsgType>();
237235

238236
if (serialPortCreate())
239237
goto Exit;
@@ -250,3 +248,13 @@ void Reader::run()
250248
emit result(ret);
251249
}
252250

251+
void Reader::logErr(const QString& msg)
252+
{
253+
emit log(QtCriticalMsg, msg);
254+
}
255+
256+
void Reader::logInfo(const QString& msg)
257+
{
258+
emit log(QtInfoMsg, msg);
259+
}
260+

qt/reader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,15 @@ class Reader : public QThread
3434
int handlePackets(uint8_t *pbuf, uint32_t len);
3535
int readData();
3636
void run() override;
37+
void logErr(const QString& msg);
38+
void logInfo(const QString& msg);
3739

3840
public:
3941
void init(const QString &portName, qint32 baudRate, uint8_t *rbuf,
4042
uint32_t rlen, uint8_t *wbuf, uint32_t wlen);
4143
signals:
4244
void result(int ret);
45+
void log(QtMsgType msgType, QString msg);
4346
};
4447

4548
#endif // READER_H

qt/writer.cpp

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
#define READ_ACK_TIMEOUT 5000
1212
#define BUF_SIZE 64
1313

14-
Q_DECLARE_METATYPE(QTextBlock)
15-
Q_DECLARE_METATYPE(QTextCursor)
14+
Q_DECLARE_METATYPE(QtMsgType)
1615

1716
void Writer::init(const QString &portName, qint32 baudRate, uint8_t *buf,
1817
uint32_t addr, uint32_t len, uint32_t pageSize)
@@ -32,13 +31,13 @@ int Writer::write(uint8_t *data, uint32_t dataLen)
3231
ret = serialPort->write((char *)data, dataLen);
3332
if (ret < 0)
3433
{
35-
qCritical() << "Failed to write: " << serialPort->errorString();
34+
logErr(QString("Failed to write: %1").arg(serialPort->errorString()));
3635
return -1;
3736
}
3837
else if ((uint32_t)ret < dataLen)
3938
{
40-
qCritical() << "Data was partialy written, returned " << ret <<
41-
", expected " << dataLen;
39+
logErr(QString("Data was partialy written, returned %1, expected %2")
40+
.arg(ret).arg(dataLen));
4241
return -1;
4342
}
4443

@@ -49,7 +48,7 @@ int Writer::handleWriteAck(RespHeader *header, uint32_t len, void *ackData)
4948
{
5049
if (len != sizeof(RespWriteAck))
5150
{
52-
qCritical() << "Write ack response is too short " << len;
51+
logErr(QString("Write ack response is too short %1").arg(len));
5352
return -1;
5453
}
5554

@@ -64,12 +63,12 @@ int Writer::handleBadBlock(RespHeader *header, uint32_t len)
6463

6564
if (len != sizeof(RespBadBlock))
6665
{
67-
qCritical() << "Bad block response is too short " << len;
66+
logErr(QString("Bad block response is too short %1").arg(len));
6867
return -1;
6968
}
7069

71-
qInfo() << QString("Bad block at 0x%1").arg(badBlock->addr, 8,
72-
16, QLatin1Char( '0' ));
70+
logInfo(QString("Bad block at 0x%1").arg(badBlock->addr, 8, 16,
71+
QLatin1Char('0')));
7372

7473
return 0;
7574
}
@@ -83,7 +82,7 @@ int Writer::handleStatus(RespHeader *header, uint32_t len, void *ackData)
8382
case STATUS_OK:
8483
break;
8584
case STATUS_ERROR:
86-
qCritical() << "Programmer send error";
85+
logErr("Programmer send error");
8786
return -1;
8887
case STATUS_BAD_BLOCK:
8988
handleBadBlock(header, len);
@@ -93,7 +92,7 @@ int Writer::handleStatus(RespHeader *header, uint32_t len, void *ackData)
9392
return -1;
9493
break;
9594
default:
96-
qCritical() << "Wrong status received " << status;
95+
logErr(QString("Wrong status received %1").arg(status));
9796
return -1;
9897
}
9998

@@ -104,7 +103,7 @@ int Writer::handleAck(RespHeader *header, uint32_t len, void *ackData)
104103
{
105104
if (header->code != RESP_STATUS)
106105
{
107-
qCritical() << "Wrong response code " << header->code;
106+
logErr(QString("Wrong response code %1").arg(header->code));
108107
return -1;
109108
}
110109

@@ -119,20 +118,20 @@ int Writer::readAck(void *ackData)
119118

120119
if (!serialPort->waitForReadyRead(READ_ACK_TIMEOUT))
121120
{
122-
qCritical() << "Write ACK was not received";
121+
logErr("Write ACK was not received");
123122
return -1;
124123
}
125124

126125
ret = serialPort->read((char *)pbuf, BUF_SIZE);
127126
if (ret < 0)
128127
{
129-
qCritical() << "Failed to read ACK";
128+
logErr("Failed to read ACK");
130129
return -1;
131130
}
132131
else if ((uint32_t)ret < dataLen)
133132
{
134-
qCritical() << "Response is too short, expected " << dataLen <<
135-
", received " << ret;
133+
logErr(QString("Response is too short, expected %1, received %2")
134+
.arg(dataLen).arg(ret));
136135
return -1;
137136
}
138137

@@ -190,8 +189,8 @@ int Writer::writeData()
190189

191190
if (ack != bytesWritten)
192191
{
193-
qCritical() << "Received wrong ack " << ack << ", expected " <<
194-
bytesWritten;
192+
logErr(QString("Received wrong ack %1, expected%2 ").arg(ack)
193+
.arg(bytesWritten));
195194
return -1;
196195
}
197196
bytesAcked = ack;
@@ -224,8 +223,8 @@ int Writer::serialPortCreate()
224223

225224
if (!serialPort->open(QIODevice::ReadWrite))
226225
{
227-
qCritical() << "Failed to open serial port: " <<
228-
serialPort->errorString();
226+
logErr(QString("Failed to open serial port: %1")
227+
.arg(serialPort->errorString()));
229228
return -1;
230229
}
231230

@@ -243,8 +242,7 @@ void Writer::run()
243242
int ret = -1;
244243

245244
/* Required for logger */
246-
qRegisterMetaType<QTextBlock>();
247-
qRegisterMetaType<QTextCursor>();
245+
qRegisterMetaType<QtMsgType>();
248246

249247
if (serialPortCreate())
250248
goto Exit;
@@ -262,3 +260,13 @@ void Writer::run()
262260
emit result(ret);
263261
}
264262

263+
void Writer::logErr(const QString& msg)
264+
{
265+
emit log(QtCriticalMsg, msg);
266+
}
267+
268+
void Writer::logInfo(const QString& msg)
269+
{
270+
emit log(QtInfoMsg, msg);
271+
}
272+

qt/writer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,15 @@ class Writer : public QThread
3333
int serialPortCreate();
3434
void serialPortDestroy();
3535
void run() override;
36+
void logErr(const QString& msg);
37+
void logInfo(const QString& msg);
38+
3639
public:
3740
void init(const QString &portName, qint32 baudRate, uint8_t *buf,
3841
uint32_t addr, uint32_t len, uint32_t pageSize);
3942
signals:
4043
void result(int ret);
44+
void log(QtMsgType msgType, QString msg);
4145
};
4246

4347
#endif // WRITER_H

0 commit comments

Comments
 (0)