Skip to content

Commit d1a44ff

Browse files
committed
qt: Read ID moved to thread to align with regular read
1 parent 9aa864c commit d1a44ff

File tree

6 files changed

+72
-75
lines changed

6 files changed

+72
-75
lines changed

qt/main_window.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
6161
initBufTable();
6262

6363
prog = new Programmer(this);
64-
connect(prog, SIGNAL(writeChipCompleted(int)), this,
65-
SLOT(slotProgWriteCompleted(int)));
66-
connect(prog, SIGNAL(readChipCompleted(int)), this,
67-
SLOT(slotProgReadCompleted(int)));
6864

6965
addChipDB(ui->chipSelectComboBox);
7066
connect(ui->chipSelectComboBox, SIGNAL(currentIndexChanged(int)),
@@ -157,19 +153,26 @@ void MainWindow::slotProgConnect()
157153
}
158154
}
159155

160-
void MainWindow::readChipIdCb(ChipId id)
156+
void MainWindow::slotProgReadDeviceIdCompleted(int status)
161157
{
162158
QString idStr;
163159

164-
idStr.sprintf("0x%02X 0x%02X 0x%02X 0x%02X", id.makerId, id.deviceId,
165-
id.thirdId, id.fourthId);
160+
disconnect(prog, SIGNAL(readChipCompleted(int)), this,
161+
SLOT(slotProgReadDeviceIdCompleted(int)));
162+
163+
if (status)
164+
return;
165+
166+
idStr.sprintf("0x%02X 0x%02X 0x%02X 0x%02X", chipId.makerId,
167+
chipId.deviceId, chipId.thirdId, chipId.fourthId);
166168
ui->deviceValueLabel->setText(idStr);
167169
}
168170

169171
void MainWindow::slotProgReadDeviceId()
170172
{
171-
prog->readChipId(std::bind(&MainWindow::readChipIdCb, this,
172-
std::placeholders::_1));
173+
connect(prog, SIGNAL(readChipIdCompleted(int)), this,
174+
SLOT(slotProgReadDeviceIdCompleted(int)));
175+
prog->readChipId(&chipId);
173176
}
174177

175178
void MainWindow::eraseChipCb()
@@ -192,6 +195,9 @@ void MainWindow::slotProgReadCompleted(int status)
192195
ChipInfo *chipInfo = chipInfoGetByName(ba.data());
193196
uint32_t readSize = chipInfo->size;
194197

198+
disconnect(prog, SIGNAL(readChipCompleted(int)), this,
199+
SLOT(slotProgReadCompleted(int)));
200+
195201
if (status)
196202
{
197203
delete buffer;
@@ -208,6 +214,9 @@ void MainWindow::slotProgRead()
208214
ChipInfo *chipInfo = chipInfoGetByName(ba.data());
209215
uint32_t readSize = chipInfo->size;
210216

217+
connect(prog, SIGNAL(readChipCompleted(int)), this,
218+
SLOT(slotProgReadCompleted(int)));
219+
211220
resetBufTable();
212221
buffer = new (std::nothrow) uint8_t[readSize];
213222
if (!buffer)
@@ -221,6 +230,9 @@ void MainWindow::slotProgRead()
221230

222231
void MainWindow::slotProgWriteCompleted(int status)
223232
{
233+
disconnect(prog, SIGNAL(writeChipCompleted(int)), this,
234+
SLOT(slotProgWriteCompleted(int)));
235+
224236
if (!status)
225237
qInfo() << "Data has been successfully written";
226238
}
@@ -235,18 +247,21 @@ void MainWindow::slotProgWrite()
235247
return;
236248
}
237249

238-
if (chipId == CHIP_ID_NONE)
250+
if (selectedChipNum == CHIP_ID_NONE)
239251
{
240252
qInfo() << "Chip is not selected";
241253
return;
242254
}
243255

244-
if (!(pageSize = chipPageSizeGet(chipId)))
256+
if (!(pageSize = chipPageSizeGet(selectedChipNum)))
245257
{
246258
qInfo() << "Chip page size is unknown";
247259
return;
248260
}
249261

262+
connect(prog, SIGNAL(writeChipCompleted(int)), this,
263+
SLOT(slotProgWriteCompleted(int)));
264+
250265
prog->writeChip(buffer, START_ADDRESS, bufferSize, pageSize);
251266
}
252267

@@ -257,7 +272,7 @@ void MainWindow::selectChipCb()
257272

258273
void MainWindow::slotSelectChip(int selectedChipNum)
259274
{
260-
chipId = selectedChipNum;
275+
this->selectedChipNum = selectedChipNum;
261276
prog->selectChip(std::bind(&MainWindow::selectChipCb, this),
262277
selectedChipNum);
263278
}

qt/main_window.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ class MainWindow : public QMainWindow
2828
uint8_t *buffer;
2929
uint32_t bufferSize;
3030
BufferTableModel bufferTableModel;
31-
uint32_t chipId;
31+
uint32_t selectedChipNum;
32+
ChipId chipId;
3233

3334
void initBufTable();
3435
void resetBufTable();
@@ -40,6 +41,7 @@ class MainWindow : public QMainWindow
4041
void writeChipCb(int status);
4142

4243
private slots:
44+
void slotProgReadDeviceIdCompleted(int status);
4345
void slotProgReadCompleted(int status);
4446
void slotProgWriteCompleted(int status);
4547

qt/programmer.cpp

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -108,39 +108,6 @@ int Programmer::readRespHeader(const QByteArray *data, uint32_t offset,
108108
return 0;
109109
}
110110

111-
void Programmer::readRespChipIdCb(int status)
112-
{
113-
uint size;
114-
RespHeader *header;
115-
RespId *respId;
116-
117-
if (status == SerialPortReader::READ_ERROR)
118-
return;
119-
120-
if (readRespHeader(&readData, 0, header))
121-
return;
122-
123-
switch (header->code)
124-
{
125-
case RESP_DATA:
126-
size = readData.size();
127-
if (size < (int)sizeof(RespId))
128-
{
129-
qCritical() << "Size of chip ID response is wrong:" << size;
130-
return;
131-
}
132-
respId = (RespId *)readData.data();
133-
readChipIdCb(respId->nandId);
134-
break;
135-
case RESP_STATUS:
136-
handleStatus(header);
137-
break;
138-
default:
139-
handleWrongResp(header->code);
140-
break;
141-
}
142-
}
143-
144111
void Programmer::sendCmdCb(int status)
145112
{
146113
if (status != SerialPortWriter::WRITE_OK)
@@ -150,20 +117,28 @@ void Programmer::sendCmdCb(int status)
150117
}
151118
}
152119

153-
void Programmer::readChipId(std::function<void(ChipId)> callback)
120+
void Programmer::readChipIdCb(int ret)
121+
{
122+
emit readChipIdCompleted(ret);
123+
serialPortConnect();
124+
QObject::disconnect(&reader, SIGNAL(result(int)), this,
125+
SLOT(readChipIdCb(int)));
126+
}
127+
128+
void Programmer::readChipId(ChipId *chipId)
154129
{
155130
Cmd cmd = { .code = CMD_NAND_READ_ID };
156131

157-
readData.clear();
158-
serialPortReader->read(std::bind(&Programmer::readRespChipIdCb, this,
159-
std::placeholders::_1), &readData, READ_TIMEOUT_MS,
160-
sizeof(RespHeader));
132+
QObject::connect(&reader, SIGNAL(result(int)), this,
133+
SLOT(readChipIdCb(int)));
161134

162-
readChipIdCb = callback;
135+
/* Serial port object cannot be used in other thread */
136+
serialPortDisconnect();
163137
writeData.clear();
164138
writeData.append((const char *)&cmd, sizeof(cmd));
165-
serialPortWriter->write(std::bind(&Programmer::sendCmdCb,
166-
this, std::placeholders::_1), &writeData);
139+
reader.init(CDC_DEV_NAME, SERIAL_PORT_SPEED, (uint8_t *)chipId,
140+
sizeof(ChipId), (uint8_t *)writeData.constData(), writeData.size());
141+
reader.start();
167142
}
168143

169144
int Programmer::handleBadBlock(QByteArray *data, uint32_t offset)
@@ -248,11 +223,17 @@ void Programmer::readCb(int ret)
248223

249224
void Programmer::readChip(uint8_t *buf, uint32_t addr, uint32_t len)
250225
{
226+
Cmd cmd = { .code = CMD_NAND_READ };
227+
ReadCmd readCmd = { .cmd = cmd, .addr = addr, .len = len };
228+
251229
QObject::connect(&reader, SIGNAL(result(int)), this, SLOT(readCb(int)));
252230

253231
/* Serial port object cannot be used in other thread */
254232
serialPortDisconnect();
255-
reader.init(CDC_DEV_NAME, SERIAL_PORT_SPEED, buf, addr, len);
233+
writeData.clear();
234+
writeData.append((const char *)&readCmd, sizeof(readCmd));
235+
reader.init(CDC_DEV_NAME, SERIAL_PORT_SPEED, buf, len,
236+
(uint8_t *)writeData.constData(), writeData.size());
256237
reader.start();
257238
}
258239

qt/programmer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class Programmer : public QObject
2929
Reader reader;
3030
QThread *currThread;
3131
bool isConn;
32-
std::function<void(ChipId)> readChipIdCb;
3332
std::function<void(void)> selectChipCb;
3433
std::function<void(void)> eraseChipCb;
3534
uint8_t *readChipBuf;
@@ -47,7 +46,6 @@ class Programmer : public QObject
4746
void sendCmdCb(int status);
4847
int readRespHeader(const QByteArray *data, uint32_t offset,
4948
RespHeader *&header);
50-
void readRespChipIdCb(int status);
5149
void readRespSelectChipCb(int status);
5250
void readRespEraseChipCb(int status);
5351
int handleStatus(RespHeader *respHead);
@@ -67,7 +65,7 @@ class Programmer : public QObject
6765
int connect();
6866
void disconnect();
6967
bool isConnected();
70-
void readChipId(std::function<void(ChipId)> callback);
68+
void readChipId(ChipId *chipId);
7169
void eraseChip(std::function<void(void)> callback, uint32_t addr,
7270
uint32_t len);
7371
void readChip(uint8_t *buf, uint32_t addr, uint32_t len);
@@ -76,10 +74,12 @@ class Programmer : public QObject
7674
void selectChip(std::function<void(void)> callback, uint32_t chipNum);
7775

7876
signals:
77+
void readChipIdCompleted(int ret);
7978
void writeChipCompleted(int ret);
8079
void readChipCompleted(int ret);
8180

8281
private slots:
82+
void readChipIdCb(int ret);
8383
void writeCb(int ret);
8484
void readCb(int ret);
8585
};

qt/reader.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
Q_DECLARE_METATYPE(QTextBlock)
1616
Q_DECLARE_METATYPE(QTextCursor)
1717

18-
void Reader::init(const QString &portName, qint32 baudRate, uint8_t *buf,
19-
uint32_t addr, uint32_t len)
18+
void Reader::init(const QString &portName, qint32 baudRate, uint8_t *rbuf,
19+
uint32_t rlen, uint8_t *wbuf, uint32_t wlen)
2020
{
2121
this->portName = portName;
2222
this->baudRate = baudRate;
23-
this->buf = buf;
24-
this->addr = addr;
25-
this->len = len;
23+
this->rbuf = rbuf;
24+
this->rlen = rlen;
25+
this->wbuf = wbuf;
26+
this->wlen = wlen;
2627
readOffset = 0;
2728
}
2829

@@ -48,10 +49,7 @@ int Reader::write(uint8_t *data, uint32_t len)
4849

4950
int Reader::readStart()
5051
{
51-
Cmd cmd = { .code = CMD_NAND_READ };
52-
ReadCmd readCmd = { .cmd = cmd, .addr = addr, .len = len };
53-
54-
return write((uint8_t *)&readCmd, sizeof(readCmd));
52+
return write(wbuf, wlen);
5553
}
5654

5755
int Reader::read(uint8_t *pbuf, uint32_t len)
@@ -124,13 +122,13 @@ int Reader::handleData(uint8_t *pbuf, uint32_t len)
124122
if (len < packetSize)
125123
return 0;
126124

127-
if (dataSize + readOffset > this->len)
125+
if (dataSize + readOffset > this->rlen)
128126
{
129127
qCritical() << "Read buffer overflow";
130128
return -1;
131129
}
132130

133-
memcpy(buf + readOffset, header->data, dataSize);
131+
memcpy(rbuf + readOffset, header->data, dataSize);
134132
readOffset += dataSize;
135133

136134
return packetSize;
@@ -195,7 +193,7 @@ int Reader::readData()
195193
if ((offset = handlePackets(pbuf, len)) < 0)
196194
return -1;
197195
}
198-
while (readOffset != this->len);
196+
while (readOffset != this->rlen);
199197

200198
return 0;
201199
}

qt/reader.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ class Reader : public QThread
1616
QSerialPort *serialPort;
1717
QString portName;
1818
qint32 baudRate;
19-
uint8_t *buf;
20-
uint32_t addr;
21-
uint32_t len;
19+
uint8_t *rbuf;
20+
uint32_t rlen;
21+
uint8_t *wbuf;
22+
uint32_t wlen;
2223
uint32_t readOffset;
2324

2425
int serialPortCreate();
@@ -35,8 +36,8 @@ class Reader : public QThread
3536
void run() override;
3637

3738
public:
38-
void init(const QString &portName, qint32 baudRate, uint8_t *buf,
39-
uint32_t addr, uint32_t len);
39+
void init(const QString &portName, qint32 baudRate, uint8_t *rbuf,
40+
uint32_t rlen, uint8_t *wbuf, uint32_t wlen);
4041
signals:
4142
void result(int ret);
4243
};

0 commit comments

Comments
 (0)