Skip to content

Commit 8dac2fd

Browse files
committed
Fixed async serial port close
1 parent ed19d34 commit 8dac2fd

File tree

7 files changed

+91
-30
lines changed

7 files changed

+91
-30
lines changed

qt/main_window.cpp

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <QStringList>
2222
#include <QMessageBox>
2323
#include <memory>
24+
#include <QTimer>
2425

2526
#define HEADER_ADDRESS_WIDTH 80
2627
#define HEADER_HEX_WIDTH 340
@@ -518,6 +519,30 @@ void MainWindow::slotSelectChip(int selectedChipNum)
518519
prog->confChip(chipInfo);
519520
}
520521

522+
void MainWindow::detectChipDelayed()
523+
{
524+
525+
if (currentChipDb == &spiChipDb)
526+
qInfo() << "Chip not found in database";
527+
else
528+
{
529+
// Search in next DB
530+
detectChip(&spiChipDb);
531+
}
532+
}
533+
534+
void MainWindow::setChipNameDelayed()
535+
{
536+
QString chipName = currentChipDb->getNameByChipId(chipId.makerId,
537+
chipId.deviceId, chipId.thirdId, chipId.fourthId, chipId.fifthId);
538+
539+
for (int i = 0; i < ui->chipSelectComboBox->count(); i++)
540+
{
541+
if (!ui->chipSelectComboBox->itemText(i).compare(chipName))
542+
ui->chipSelectComboBox->setCurrentIndex(i);
543+
}
544+
}
545+
521546
void MainWindow::slotProgDetectChipReadChipIdCompleted(int status)
522547
{
523548
QString idStr;
@@ -545,21 +570,18 @@ void MainWindow::slotProgDetectChipReadChipIdCompleted(int status)
545570

546571
if (chipName.isEmpty())
547572
{
548-
if (currentChipDb == &spiChipDb)
549-
qInfo() << "Chip not found in database";
550-
else
551-
{
552-
// Search in next DB
553-
detectChip(&spiChipDb);
554-
}
573+
QTimer::singleShot(50, this, &MainWindow::detectChipDelayed);
555574
return;
556575
}
557576

558-
for (int i = 0; i < ui->chipSelectComboBox->count(); i++)
559-
{
560-
if (!ui->chipSelectComboBox->itemText(i).compare(chipName))
561-
ui->chipSelectComboBox->setCurrentIndex(i);
562-
}
577+
QTimer::singleShot(50, this, &MainWindow::setChipNameDelayed);
578+
}
579+
580+
void MainWindow::detectChipReadChipIdDelayed()
581+
{
582+
connect(prog, SIGNAL(readChipIdCompleted(int)), this,
583+
SLOT(slotProgDetectChipReadChipIdCompleted(int)));
584+
prog->readChipId(&chipId);
563585
}
564586

565587
void MainWindow::slotProgDetectChipConfCompleted(int status)
@@ -570,15 +592,14 @@ void MainWindow::slotProgDetectChipConfCompleted(int status)
570592
if (status)
571593
return;
572594

573-
connect(prog, SIGNAL(readChipIdCompleted(int)), this,
574-
SLOT(slotProgDetectChipReadChipIdCompleted(int)));
575-
prog->readChipId(&chipId);
595+
QTimer::singleShot(50, this, &MainWindow::detectChipReadChipIdDelayed);
576596
}
577597

578598
void MainWindow::detectChip(ChipDb *chipDb)
579599
{
580600
ChipInfo *chipInfo;
581601

602+
582603
currentChipDb = chipDb;
583604

584605
// Assuming read of ID is the same for all chips thereby use settings of the

qt/main_window.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ class MainWindow : public QMainWindow
4343
void setProgress(unsigned int progress);
4444
void updateProgSettings();
4545
void detectChip(ChipDb *chipDb);
46-
46+
void detectChipReadChipIdDelayed();
47+
void detectChipDelayed();
48+
void setChipNameDelayed();
4749
private slots:
4850
void slotProgConnectCompleted(int status);
4951
void slotProgReadDeviceIdCompleted(int status);
@@ -59,7 +61,6 @@ private slots:
5961
void slotProgDetectChipReadChipIdCompleted(int status);
6062
void slotProgFirmwareUpdateCompleted(int status);
6163
void slotProgFirmwareUpdateProgress(unsigned int progress);
62-
6364
public slots:
6465
void slotFileOpen();
6566
void slotFileSave();

qt/programmer.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "programmer.h"
77
#include <QDebug>
8+
#include <QTimer>
89

910
#ifdef Q_OS_LINUX
1011
#define USB_DEV_NAME "/dev/ttyACM0"
@@ -52,6 +53,7 @@ void Programmer::serialPortDisconnect()
5253

5354
void Programmer::connectCb(int ret)
5455
{
56+
QTimer::singleShot(0, &reader, &Reader::stop);
5557
QObject::disconnect(&reader, SIGNAL(result(int)), this,
5658
SLOT(connectCb(int)));
5759

@@ -134,9 +136,10 @@ void Programmer::setIncSpare(bool isIncSpare)
134136

135137
void Programmer::readChipIdCb(int ret)
136138
{
137-
emit readChipIdCompleted(ret);
139+
QTimer::singleShot(0, &reader, &Reader::stop);
138140
QObject::disconnect(&reader, SIGNAL(result(int)), this,
139141
SLOT(readChipIdCb(int)));
142+
emit readChipIdCompleted(ret);
140143
}
141144

142145
void Programmer::readChipId(ChipId *chipId)
@@ -159,6 +162,7 @@ void Programmer::readChipId(ChipId *chipId)
159162

160163
void Programmer::eraseChipCb(int ret)
161164
{
165+
QTimer::singleShot(0, &reader, &Reader::stop);
162166
QObject::disconnect(&reader, SIGNAL(progress(unsigned int)), this,
163167
SLOT(eraseProgressChipCb(unsigned int)));
164168
QObject::disconnect(&reader, SIGNAL(result(int)), this,
@@ -197,6 +201,7 @@ void Programmer::eraseChip(uint32_t addr, uint32_t len)
197201

198202
void Programmer::readCb(int ret)
199203
{
204+
QTimer::singleShot(0, &reader, &Reader::stop);
200205
QObject::disconnect(&reader, SIGNAL(progress(unsigned int)), this,
201206
SLOT(readProgressCb(unsigned int)));
202207
QObject::disconnect(&reader, SIGNAL(result(int)), this, SLOT(readCb(int)));
@@ -234,6 +239,7 @@ void Programmer::readChip(uint8_t *buf, uint32_t addr, uint32_t len,
234239

235240
void Programmer::writeCb(int ret)
236241
{
242+
QTimer::singleShot(0, &writer, &Writer::stop);
237243
QObject::disconnect(&writer, SIGNAL(progress(unsigned int)), this,
238244
SLOT(writeProgressCb(unsigned int)));
239245
QObject::disconnect(&writer, SIGNAL(result(int)), this, SLOT(writeCb(int)));
@@ -259,6 +265,7 @@ void Programmer::writeChip(uint8_t *buf, uint32_t addr, uint32_t len,
259265

260266
void Programmer::readChipBadBlocksCb(int ret)
261267
{
268+
QTimer::singleShot(0, &reader, &Reader::stop);
262269
QObject::disconnect(&reader, SIGNAL(result(int)), this,
263270
SLOT(readChipBadBlocksCb(int)));
264271
emit readChipBadBlocksCompleted(ret);
@@ -283,6 +290,7 @@ void Programmer::readChipBadBlocks()
283290

284291
void Programmer::confChipCb(int ret)
285292
{
293+
QTimer::singleShot(0, &reader, &Reader::stop);
286294
QObject::disconnect(&reader, SIGNAL(result(int)), this,
287295
SLOT(confChipCb(int)));
288296
emit confChipCompleted(ret);
@@ -412,6 +420,7 @@ void Programmer::firmwareUpdateProgressCb(unsigned int progress)
412420

413421
void Programmer::firmwareUpdateCb(int ret)
414422
{
423+
QTimer::singleShot(0, &writer, &Writer::stop);
415424
QObject::disconnect(&writer, SIGNAL(progress(unsigned int)), this,
416425
SLOT(firmwareUpdateProgressCb(unsigned int)));
417426
QObject::disconnect(&writer, SIGNAL(result(int)), this,
@@ -445,6 +454,7 @@ void Programmer::firmwareUpdateStart()
445454

446455
void Programmer::getActiveImageCb(int ret)
447456
{
457+
QTimer::singleShot(0, &reader, &Reader::stop);
448458
QObject::disconnect(&reader, SIGNAL(result(int)), this,
449459
SLOT(getActiveImageCb(int)));
450460

qt/reader.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@
1515

1616
Q_DECLARE_METATYPE(QtMsgType)
1717

18+
Reader::Reader()
19+
{
20+
}
21+
22+
Reader::~Reader()
23+
{
24+
stop();
25+
}
26+
1827
void Reader::init(const QString &portName, qint32 baudRate, uint8_t *rbuf,
1928
uint32_t rlen, const uint8_t *wbuf, uint32_t wlen, bool isSkipBB,
2029
bool isReadLess)
@@ -209,7 +218,6 @@ void Reader::readCb(int size)
209218
if (size < 0)
210219
{
211220
emit result(-1);
212-
serialPortDestroy();
213221
return;
214222
}
215223

@@ -218,7 +226,6 @@ void Reader::readCb(int size)
218226
if ((offset = handlePackets(pbuf, static_cast<uint32_t>(size))) < 0)
219227
{
220228
emit result(-1);
221-
serialPortDestroy();
222229
return;
223230
}
224231

@@ -233,15 +240,11 @@ void Reader::readCb(int size)
233240
if (read(pbuf + offset, bufSize - offset) < 0)
234241
{
235242
emit result(-1);
236-
serialPortDestroy();
237243
return;
238244
}
239245
}
240246
else
241-
{
242247
emit result(0);
243-
serialPortDestroy();
244-
}
245248
}
246249

247250
int Reader::read(char *pbuf, uint32_t len)
@@ -270,8 +273,11 @@ int Reader::serialPortCreate()
270273

271274
void Reader::serialPortDestroy()
272275
{
276+
if (!serialPort)
277+
return;
273278
serialPort->stop();
274279
delete serialPort;
280+
serialPort = nullptr;
275281
}
276282

277283
void Reader::start()
@@ -300,6 +306,11 @@ void Reader::start()
300306
serialPortDestroy();
301307
}
302308

309+
void Reader::stop()
310+
{
311+
serialPortDestroy();
312+
}
313+
303314
void Reader::logErr(const QString& msg)
304315
{
305316
emit log(QtCriticalMsg, msg);

qt/reader.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,14 @@ class Reader : public QObject
4646
void logErr(const QString& msg);
4747
void logInfo(const QString& msg);
4848
public:
49+
explicit Reader();
50+
~Reader();
51+
4952
void init(const QString &portName, qint32 baudRate, uint8_t *rbuf,
5053
uint32_t rlen, const uint8_t *wbuf, uint32_t wlen, bool isSkipBB,
5154
bool isReadLess);
5255
void start();
56+
void stop();
5357
signals:
5458
void result(int ret);
5559
void progress(unsigned int progress);

qt/writer.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@
1111

1212
#define READ_ACK_TIMEOUT 5000
1313

14+
Writer::Writer()
15+
{
16+
}
17+
18+
Writer::~Writer()
19+
{
20+
stop();
21+
}
22+
1423
void Writer::init(const QString &portName, qint32 baudRate, uint8_t *buf,
1524
uint32_t addr, uint32_t len, uint32_t pageSize, bool skipBB, bool incSpare,
1625
uint8_t startCmd, uint8_t dataCmd, uint8_t endCmd)
@@ -212,17 +221,12 @@ void Writer::readCb(int size)
212221
goto Error;
213222
}
214223
else if (cmd == endCmd)
215-
{
216224
emit result(0);
217-
goto Exit;
218-
}
219225

220226
return;
221227

222228
Error:
223229
emit result(-1);
224-
Exit:
225-
serialPortDestroy();
226230
}
227231

228232
int Writer::writeStart()
@@ -312,8 +316,11 @@ int Writer::serialPortCreate()
312316

313317
void Writer::serialPortDestroy()
314318
{
319+
if (!serialPort)
320+
return;
315321
serialPort->stop();
316322
free(serialPort);
323+
serialPort = nullptr;
317324
}
318325

319326
void Writer::start()
@@ -331,6 +338,11 @@ void Writer::start()
331338
emit result(-1);
332339
}
333340

341+
void Writer::stop()
342+
{
343+
serialPortDestroy();
344+
}
345+
334346
void Writer::logErr(const QString& msg)
335347
{
336348
emit log(QtCriticalMsg, msg);

qt/writer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,14 @@ class Writer : public QObject
5252
void logInfo(const QString& msg);
5353

5454
public:
55+
explicit Writer();
56+
~Writer();
5557
void init(const QString &portName, qint32 baudRate, uint8_t *buf,
5658
uint32_t addr, uint32_t len, uint32_t pageSize,
5759
bool skipBB, bool incSpare, uint8_t startCmd, uint8_t dataCmd,
5860
uint8_t endCmd);
5961
void start();
60-
62+
void stop();
6163
signals:
6264
void result(int ret);
6365
void progress(unsigned int progress);

0 commit comments

Comments
 (0)