Skip to content

Commit f088186

Browse files
committed
qt: optimized parsing of read buffer
1 parent ffd2d4e commit f088186

File tree

2 files changed

+34
-29
lines changed

2 files changed

+34
-29
lines changed

qt/programmer.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,20 @@ int Programmer::handleWrongResp(uint8_t code)
8181
return -1;
8282
}
8383

84-
int Programmer::readRespHeader(const QByteArray *data, RespHeader *&header)
84+
int Programmer::readRespHeader(const QByteArray *data, uint32_t offset,
85+
RespHeader *&header)
8586
{
8687
uint size = data->size();
88+
uint bytes_left = size - offset;
8789

88-
if (size < sizeof(RespHeader))
90+
if (bytes_left < sizeof(RespHeader))
8991
{
9092
qCritical() << "Programmer error: response header size is wrong:"
91-
<< size;
93+
<< bytes_left;
9294
return -1;
9395
}
9496

95-
header = (RespHeader *)data->data();
97+
header = (RespHeader *)(data->data() + offset);
9698

9799
return 0;
98100
}
@@ -106,7 +108,7 @@ void Programmer::readRespChipIdCb(int status)
106108
if (status == SerialPortReader::READ_ERROR)
107109
return;
108110

109-
if (readRespHeader(&readData, header))
111+
if (readRespHeader(&readData, 0, header))
110112
return;
111113

112114
switch (header->code)
@@ -154,19 +156,20 @@ void Programmer::readChipId(std::function<void(ChipId)> callback)
154156
this, std::placeholders::_1), &writeData);
155157
}
156158

157-
int Programmer::handleBadBlock(QByteArray *data)
159+
int Programmer::handleBadBlock(QByteArray *data, uint32_t offset)
158160
{
159161
RespBadBlock *badBlock;
160162
uint size = data->size();
163+
uint bytes_left = size - offset;
161164

162-
if (size < sizeof(RespBadBlock))
165+
if (bytes_left < sizeof(RespBadBlock))
163166
{
164167
qCritical() << "Header size of bad block response is wrong:"
165-
<< size;
168+
<< bytes_left;
166169
return -1;
167170
}
168171

169-
badBlock = (RespBadBlock *)data->data();
172+
badBlock = (RespBadBlock *)(data->data() + offset);
170173
qInfo() << QString("Bad block at 0x%1").arg(badBlock->addr, 8,
171174
16, QLatin1Char( '0' ));
172175

@@ -182,7 +185,7 @@ void Programmer::readRespEraseChipCb(int status)
182185

183186
while (readData.size())
184187
{
185-
if (readRespHeader(&readData, header))
188+
if (readRespHeader(&readData, 0, header))
186189
return;
187190
switch (header->code)
188191
{
@@ -191,7 +194,7 @@ void Programmer::readRespEraseChipCb(int status)
191194
eraseChipCb();
192195
else if (header->info == STATUS_BAD_BLOCK)
193196
{
194-
if (!handleBadBlock(&readData))
197+
if (!handleBadBlock(&readData, 0))
195198
{
196199
readData.remove(0, sizeof(RespBadBlock));
197200
continue;
@@ -229,24 +232,25 @@ void Programmer::readRespReadChipCb(int status)
229232
{
230233
uint size;
231234
RespHeader *header;
232-
uint32_t offset = 0;
235+
uint32_t writeOffset = 0, readOffset = 0, bytes_left = 0;
233236

234237
if (status == SerialPortReader::READ_ERROR)
235238
goto Error;
236239

237-
while ((size = readData.size()))
240+
size = readData.size();
241+
while ((bytes_left = size - readOffset))
238242
{
239-
if (readRespHeader(&readData, header))
243+
if (readRespHeader(&readData, readOffset, header))
240244
goto Error;
241245

242246
switch (header->code)
243247
{
244248
case RESP_STATUS:
245249
if (header->info == STATUS_OK && header->info == STATUS_BAD_BLOCK)
246250
{
247-
if (handleBadBlock(&readData))
251+
if (handleBadBlock(&readData, readOffset))
248252
goto Error;
249-
readData.remove(0, sizeof(RespBadBlock));
253+
readOffset += sizeof(RespBadBlock);
250254
}
251255
else
252256
{
@@ -255,26 +259,26 @@ void Programmer::readRespReadChipCb(int status)
255259
}
256260
break;
257261
case RESP_DATA:
258-
if (header->info > CDC_BUF_SIZE - sizeof(RespHeader) || header->info > size)
262+
if (header->info > CDC_BUF_SIZE - sizeof(RespHeader) || header->info > bytes_left)
259263
{
260264
qCritical() << "Wrong data length in response header:" << header->info;
261265
goto Error;
262266
}
263-
memcpy(readChipBuf + offset, header->data, header->info);
264-
offset += header->info;
265-
readData.remove(0, sizeof(RespHeader) + header->info);
267+
memcpy(readChipBuf + writeOffset, header->data, header->info);
268+
writeOffset += header->info;
269+
readOffset += sizeof(RespHeader) + header->info;
266270
break;
267271
default:
268272
handleWrongResp(header->code);
269273
goto Error;
270274
}
271275
}
272276

273-
if (readChipLen == offset)
277+
if (readChipLen == writeOffset)
274278
readChipCb(0);
275279
else
276280
{
277-
qCritical() << "Data was partialy received, size:" << offset;
281+
qCritical() << "Data was partialy received, size:" << writeOffset;
278282
goto Error;
279283
}
280284

@@ -311,7 +315,7 @@ void Programmer::readRespWriteEndChipCb(int status)
311315
if (status == SerialPortReader::READ_ERROR)
312316
goto Exit;
313317

314-
if (readRespHeader(&readData, header))
318+
if (readRespHeader(&readData, 0, header))
315319
goto Exit;
316320

317321
switch (header->code)
@@ -340,14 +344,14 @@ int Programmer::handleWriteError(QByteArray *data)
340344

341345
while (data->size())
342346
{
343-
if (readRespHeader(data, header))
347+
if (readRespHeader(data, 0, header))
344348
return -1;
345349
switch (header->code)
346350
{
347351
case RESP_STATUS:
348352
if (header->info == STATUS_BAD_BLOCK)
349353
{
350-
if (!handleBadBlock(data))
354+
if (!handleBadBlock(data, 0))
351355
{
352356
data->remove(0, sizeof(RespBadBlock));
353357
continue;
@@ -441,7 +445,7 @@ void Programmer::readRespWriteStartChipCb(int status)
441445
if (status != SerialPortReader::READ_OK)
442446
goto Error;
443447

444-
if (readRespHeader(&readData, header))
448+
if (readRespHeader(&readData, 0, header))
445449
goto Error;
446450

447451
switch (header->code)
@@ -513,7 +517,7 @@ void Programmer::readRespSelectChipCb(int status)
513517
if (status == SerialPortReader::READ_ERROR)
514518
return;
515519

516-
if (readRespHeader(&readData, header))
520+
if (readRespHeader(&readData, 0, header))
517521
return;
518522

519523
switch (header->code)

qt/programmer.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ class Programmer : public QObject
131131
QTimer writeSchedTimer;
132132

133133
void sendCmdCb(int status);
134-
int readRespHeader(const QByteArray *data, RespHeader *&header);
134+
int readRespHeader(const QByteArray *data, uint32_t offset,
135+
RespHeader *&header);
135136
void readRespChipIdCb(int status);
136137
void readRespSelectChipCb(int status);
137138
void readRespEraseChipCb(int status);
@@ -143,7 +144,7 @@ class Programmer : public QObject
143144
void sendWriteStartCmdCb(int status);
144145
int handleStatus(RespHeader *respHead);
145146
int handleWrongResp(uint8_t code);
146-
int handleBadBlock(QByteArray *data);
147+
int handleBadBlock(QByteArray *data, uint32_t offset);
147148
int handleWriteError(QByteArray *data);
148149

149150
public:

0 commit comments

Comments
 (0)