Skip to content

Commit 9aa864c

Browse files
committed
qt: Use separate thread for read to increase performance
1 parent 0aeda9c commit 9aa864c

File tree

7 files changed

+316
-82
lines changed

7 files changed

+316
-82
lines changed

qt/main_window.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
6363
prog = new Programmer(this);
6464
connect(prog, SIGNAL(writeChipCompleted(int)), this,
6565
SLOT(slotProgWriteCompleted(int)));
66+
connect(prog, SIGNAL(readChipCompleted(int)), this,
67+
SLOT(slotProgReadCompleted(int)));
6668

6769
addChipDB(ui->chipSelectComboBox);
6870
connect(ui->chipSelectComboBox, SIGNAL(currentIndexChanged(int)),
@@ -184,7 +186,7 @@ void MainWindow::slotProgErase()
184186
chipInfo->size);
185187
}
186188

187-
void MainWindow::readChipCb(int status)
189+
void MainWindow::slotProgReadCompleted(int status)
188190
{
189191
QByteArray ba = ui->chipSelectComboBox->currentText().toLatin1();
190192
ChipInfo *chipInfo = chipInfoGetByName(ba.data());
@@ -214,8 +216,7 @@ void MainWindow::slotProgRead()
214216
return;
215217
}
216218

217-
prog->readChip(std::bind(&MainWindow::readChipCb, this,
218-
std::placeholders::_1), buffer, START_ADDRESS, readSize);
219+
prog->readChip(buffer, START_ADDRESS, readSize);
219220
}
220221

221222
void MainWindow::slotProgWriteCompleted(int status)

qt/main_window.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class MainWindow : public QMainWindow
4040
void writeChipCb(int status);
4141

4242
private slots:
43+
void slotProgReadCompleted(int status);
4344
void slotProgWriteCompleted(int status);
4445

4546
public slots:

qt/programmer.cpp

Lines changed: 10 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -239,84 +239,21 @@ void Programmer::eraseChip(std::function<void(void)> callback, uint32_t addr,
239239
this, std::placeholders::_1), &writeData);
240240
}
241241

242-
void Programmer::readRespReadChipCb(int status)
242+
void Programmer::readCb(int ret)
243243
{
244-
uint size;
245-
RespHeader *header;
246-
uint32_t writeOffset = 0, readOffset = 0, bytes_left = 0;
247-
248-
if (status == SerialPortReader::READ_ERROR)
249-
goto Error;
250-
251-
size = readData.size();
252-
while ((bytes_left = size - readOffset))
253-
{
254-
if (readRespHeader(&readData, readOffset, header))
255-
goto Error;
256-
257-
switch (header->code)
258-
{
259-
case RESP_STATUS:
260-
if (header->info == STATUS_OK && header->info == STATUS_BAD_BLOCK)
261-
{
262-
if (handleBadBlock(&readData, readOffset))
263-
goto Error;
264-
readOffset += sizeof(RespBadBlock);
265-
}
266-
else
267-
{
268-
qCritical() << "Programmer error: failed to read chip";
269-
goto Error;
270-
}
271-
break;
272-
case RESP_DATA:
273-
if (header->info > CDC_BUF_SIZE - sizeof(RespHeader) || header->info > bytes_left)
274-
{
275-
qCritical() << "Wrong data length in response header:" << header->info;
276-
goto Error;
277-
}
278-
memcpy(readChipBuf + writeOffset, header->data, header->info);
279-
writeOffset += header->info;
280-
readOffset += sizeof(RespHeader) + header->info;
281-
break;
282-
default:
283-
handleWrongResp(header->code);
284-
goto Error;
285-
}
286-
}
287-
288-
if (readChipLen == writeOffset)
289-
readChipCb(0);
290-
else
291-
{
292-
qCritical() << "Data was partialy received, size:" << writeOffset;
293-
goto Error;
294-
}
295-
296-
return;
297-
298-
Error:
299-
readChipCb(-1);
244+
QObject::disconnect(&reader, SIGNAL(result(int)), this, SLOT(readCb(int)));
245+
serialPortConnect();
246+
emit readChipCompleted(ret);
300247
}
301248

302-
void Programmer::readChip(std::function<void(int)> callback, uint8_t *buf,
303-
uint32_t addr, uint32_t len)
249+
void Programmer::readChip(uint8_t *buf, uint32_t addr, uint32_t len)
304250
{
305-
Cmd cmd = { .code = CMD_NAND_READ };
306-
ReadCmd readCmd = { .cmd = cmd, .addr = addr, .len = len };
251+
QObject::connect(&reader, SIGNAL(result(int)), this, SLOT(readCb(int)));
307252

308-
readData.clear();
309-
serialPortReader->read(std::bind(&Programmer::readRespReadChipCb, this,
310-
std::placeholders::_1), &readData, READ_TIMEOUT_MS,
311-
std::numeric_limits<int>::max());
312-
313-
readChipCb = callback;
314-
readChipBuf = buf;
315-
readChipLen = len;
316-
writeData.clear();
317-
writeData.append((const char *)&readCmd, sizeof(readCmd));
318-
serialPortWriter->write(std::bind(&Programmer::sendCmdCb,
319-
this, std::placeholders::_1), &writeData);
253+
/* Serial port object cannot be used in other thread */
254+
serialPortDisconnect();
255+
reader.init(CDC_DEV_NAME, SERIAL_PORT_SPEED, buf, addr, len);
256+
reader.start();
320257
}
321258

322259
void Programmer::writeCb(int ret)

qt/programmer.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "serial_port_writer.h"
1616
#include "serial_port_reader.h"
1717
#include "writer.h"
18+
#include "reader.h"
1819
#include "cmd.h"
1920

2021
using namespace std;
@@ -25,12 +26,12 @@ class Programmer : public QObject
2526

2627
QSerialPort serialPort;
2728
Writer writer;
29+
Reader reader;
2830
QThread *currThread;
2931
bool isConn;
3032
std::function<void(ChipId)> readChipIdCb;
3133
std::function<void(void)> selectChipCb;
3234
std::function<void(void)> eraseChipCb;
33-
std::function<void(int)> readChipCb;
3435
uint8_t *readChipBuf;
3536
uint32_t readChipLen;
3637
uint8_t *writeChipBuf;
@@ -49,7 +50,6 @@ class Programmer : public QObject
4950
void readRespChipIdCb(int status);
5051
void readRespSelectChipCb(int status);
5152
void readRespEraseChipCb(int status);
52-
void readRespReadChipCb(int status);
5353
int handleStatus(RespHeader *respHead);
5454
int handleWrongResp(uint8_t code);
5555
int handleBadBlock(QByteArray *data, uint32_t offset);
@@ -70,17 +70,18 @@ class Programmer : public QObject
7070
void readChipId(std::function<void(ChipId)> callback);
7171
void eraseChip(std::function<void(void)> callback, uint32_t addr,
7272
uint32_t len);
73-
void readChip(std::function<void(int)> callback, uint8_t *buf,
74-
uint32_t addr, uint32_t len);
73+
void readChip(uint8_t *buf, uint32_t addr, uint32_t len);
7574
void writeChip(uint8_t *buf, uint32_t addr, uint32_t len,
7675
uint32_t pageSize);
7776
void selectChip(std::function<void(void)> callback, uint32_t chipNum);
7877

7978
signals:
8079
void writeChipCompleted(int ret);
80+
void readChipCompleted(int ret);
8181

8282
private slots:
8383
void writeCb(int ret);
84+
void readCb(int ret);
8485
};
8586

8687
#endif // PROGRAMMER_H

qt/qt.pro

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ SOURCES += main.cpp\
2525
serial_port_reader.cpp \
2626
logger.cpp \
2727
buffer_table_model.cpp \
28-
writer.cpp
28+
writer.cpp \
29+
reader.cpp
2930

3031
HEADERS += main_window.h \
3132
programmer.h \
@@ -35,7 +36,8 @@ HEADERS += main_window.h \
3536
logger.h \
3637
buffer_table_model.h \
3738
cmd.h \
38-
writer.h
39+
writer.h \
40+
reader.h
3941

4042
FORMS += main_window.ui
4143

0 commit comments

Comments
 (0)