Skip to content

Commit f386cf8

Browse files
committed
qt: Erase operation refactored to use read thread
1 parent d1a44ff commit f386cf8

File tree

5 files changed

+35
-71
lines changed

5 files changed

+35
-71
lines changed

qt/main_window.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,24 @@ void MainWindow::slotProgReadDeviceId()
175175
prog->readChipId(&chipId);
176176
}
177177

178-
void MainWindow::eraseChipCb()
178+
void MainWindow::slotProgEraseCompleted(int status)
179179
{
180-
qInfo() << "Chip has been erased successfully";
180+
disconnect(prog, SIGNAL(eraseChipCompleted(int)), this,
181+
SLOT(slotProgEraseCompleted(int)));
182+
183+
if (!status)
184+
qInfo() << "Chip has been erased successfully";
181185
}
182186

183187
void MainWindow::slotProgErase()
184188
{
185189
QByteArray ba = ui->chipSelectComboBox->currentText().toLatin1();
186190
ChipInfo *chipInfo = chipInfoGetByName(ba.data());
187191

188-
prog->eraseChip(std::bind(&MainWindow::eraseChipCb, this), START_ADDRESS,
189-
chipInfo->size);
192+
connect(prog, SIGNAL(eraseChipCompleted(int)), this,
193+
SLOT(slotProgEraseCompleted(int)));
194+
195+
prog->eraseChip(START_ADDRESS, chipInfo->size);
190196
}
191197

192198
void MainWindow::slotProgReadCompleted(int status)

qt/main_window.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ private slots:
4444
void slotProgReadDeviceIdCompleted(int status);
4545
void slotProgReadCompleted(int status);
4646
void slotProgWriteCompleted(int status);
47+
void slotProgEraseCompleted(int status);
4748

4849
public slots:
4950
void slotFileOpen();

qt/programmer.cpp

Lines changed: 13 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -141,77 +141,29 @@ void Programmer::readChipId(ChipId *chipId)
141141
reader.start();
142142
}
143143

144-
int Programmer::handleBadBlock(QByteArray *data, uint32_t offset)
144+
void Programmer::eraseChipCb(int ret)
145145
{
146-
RespBadBlock *badBlock;
147-
uint size = data->size();
148-
uint bytes_left = size - offset;
149-
150-
if (bytes_left < sizeof(RespBadBlock))
151-
{
152-
qCritical() << "Header size of bad block response is wrong:"
153-
<< bytes_left;
154-
return -1;
155-
}
156-
157-
badBlock = (RespBadBlock *)(data->data() + offset);
158-
qInfo() << QString("Bad block at 0x%1").arg(badBlock->addr, 8,
159-
16, QLatin1Char( '0' ));
160-
161-
return 0;
162-
}
163-
164-
void Programmer::readRespEraseChipCb(int status)
165-
{
166-
RespHeader *header;
167-
168-
if (status == SerialPortReader::READ_ERROR)
169-
return;
170-
171-
while (readData.size())
172-
{
173-
if (readRespHeader(&readData, 0, header))
174-
return;
175-
switch (header->code)
176-
{
177-
case RESP_STATUS:
178-
if (header->info == STATUS_OK)
179-
eraseChipCb();
180-
else if (header->info == STATUS_BAD_BLOCK)
181-
{
182-
if (!handleBadBlock(&readData, 0))
183-
{
184-
readData.remove(0, sizeof(RespBadBlock));
185-
continue;
186-
}
187-
}
188-
else
189-
qCritical() << "Programmer error: failed to erase chip";
190-
break;
191-
default:
192-
handleWrongResp(header->code);
193-
break;
194-
}
195-
readData.clear();
196-
}
146+
QObject::disconnect(&reader, SIGNAL(result(int)), this,
147+
SLOT(eraseChipCb(int)));
148+
serialPortConnect();
149+
emit eraseChipCompleted(ret);
197150
}
198151

199-
void Programmer::eraseChip(std::function<void(void)> callback, uint32_t addr,
200-
uint32_t len)
152+
void Programmer::eraseChip(uint32_t addr, uint32_t len)
201153
{
202154
Cmd cmd = { .code = CMD_NAND_ERASE };
203155
EraseCmd eraseCmd = { .cmd = cmd, .addr = addr, .len = len };
204156

205-
readData.clear();
206-
serialPortReader->read(std::bind(&Programmer::readRespEraseChipCb, this,
207-
std::placeholders::_1), &readData, ERASE_TIMEOUT_MS,
208-
sizeof(RespHeader));
157+
QObject::connect(&reader, SIGNAL(result(int)), this,
158+
SLOT(eraseChipCb(int)));
209159

210-
eraseChipCb = callback;
160+
/* Serial port object cannot be used in other thread */
161+
serialPortDisconnect();
211162
writeData.clear();
212163
writeData.append((const char *)&eraseCmd, sizeof(eraseCmd));
213-
serialPortWriter->write(std::bind(&Programmer::sendCmdCb,
214-
this, std::placeholders::_1), &writeData);
164+
reader.init(CDC_DEV_NAME, SERIAL_PORT_SPEED, NULL, 0,
165+
(uint8_t *)writeData.constData(), writeData.size());
166+
reader.start();
215167
}
216168

217169
void Programmer::readCb(int ret)

qt/programmer.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ class Programmer : public QObject
3030
QThread *currThread;
3131
bool isConn;
3232
std::function<void(void)> selectChipCb;
33-
std::function<void(void)> eraseChipCb;
3433
uint8_t *readChipBuf;
3534
uint32_t readChipLen;
3635
uint8_t *writeChipBuf;
@@ -47,7 +46,6 @@ class Programmer : public QObject
4746
int readRespHeader(const QByteArray *data, uint32_t offset,
4847
RespHeader *&header);
4948
void readRespSelectChipCb(int status);
50-
void readRespEraseChipCb(int status);
5149
int handleStatus(RespHeader *respHead);
5250
int handleWrongResp(uint8_t code);
5351
int handleBadBlock(QByteArray *data, uint32_t offset);
@@ -66,8 +64,7 @@ class Programmer : public QObject
6664
void disconnect();
6765
bool isConnected();
6866
void readChipId(ChipId *chipId);
69-
void eraseChip(std::function<void(void)> callback, uint32_t addr,
70-
uint32_t len);
67+
void eraseChip(uint32_t addr, uint32_t len);
7168
void readChip(uint8_t *buf, uint32_t addr, uint32_t len);
7269
void writeChip(uint8_t *buf, uint32_t addr, uint32_t len,
7370
uint32_t pageSize);
@@ -77,11 +74,13 @@ class Programmer : public QObject
7774
void readChipIdCompleted(int ret);
7875
void writeChipCompleted(int ret);
7976
void readChipCompleted(int ret);
77+
void eraseChipCompleted(int ret);
8078

8179
private slots:
8280
void readChipIdCb(int ret);
8381
void writeCb(int ret);
8482
void readCb(int ret);
83+
void eraseChipCb(int ret);
8584
};
8685

8786
#endif // PROGRAMMER_H

qt/reader.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,10 @@ int Reader::handleStatus(uint8_t *pbuf, uint32_t len)
9898
case STATUS_BAD_BLOCK:
9999
return handleBadBlock(pbuf, len);
100100
case STATUS_OK:
101-
/* Not expected */
101+
// Exit read loop
102+
if (!rlen)
103+
readOffset = 1;
104+
break;
102105
default:
103106
qCritical() << "Wrong response header info " << header->info;
104107
return -1;
@@ -192,8 +195,11 @@ int Reader::readData()
192195

193196
if ((offset = handlePackets(pbuf, len)) < 0)
194197
return -1;
198+
199+
if (!readOffset)
200+
continue;
195201
}
196-
while (readOffset != this->rlen);
202+
while (rlen && rlen != readOffset);
197203

198204
return 0;
199205
}

0 commit comments

Comments
 (0)