@@ -81,18 +81,20 @@ int Programmer::handleWrongResp(uint8_t code)
81
81
return -1 ;
82
82
}
83
83
84
- int Programmer::readRespHeader (const QByteArray *data, RespHeader *&header)
84
+ int Programmer::readRespHeader (const QByteArray *data, uint32_t offset,
85
+ RespHeader *&header)
85
86
{
86
87
uint size = data->size ();
88
+ uint bytes_left = size - offset;
87
89
88
- if (size < sizeof (RespHeader))
90
+ if (bytes_left < sizeof (RespHeader))
89
91
{
90
92
qCritical () << " Programmer error: response header size is wrong:"
91
- << size ;
93
+ << bytes_left ;
92
94
return -1 ;
93
95
}
94
96
95
- header = (RespHeader *)data->data ();
97
+ header = (RespHeader *)( data->data () + offset );
96
98
97
99
return 0 ;
98
100
}
@@ -106,7 +108,7 @@ void Programmer::readRespChipIdCb(int status)
106
108
if (status == SerialPortReader::READ_ERROR)
107
109
return ;
108
110
109
- if (readRespHeader (&readData, header))
111
+ if (readRespHeader (&readData, 0 , header))
110
112
return ;
111
113
112
114
switch (header->code )
@@ -154,19 +156,20 @@ void Programmer::readChipId(std::function<void(ChipId)> callback)
154
156
this , std::placeholders::_1), &writeData);
155
157
}
156
158
157
- int Programmer::handleBadBlock (QByteArray *data)
159
+ int Programmer::handleBadBlock (QByteArray *data, uint32_t offset )
158
160
{
159
161
RespBadBlock *badBlock;
160
162
uint size = data->size ();
163
+ uint bytes_left = size - offset;
161
164
162
- if (size < sizeof (RespBadBlock))
165
+ if (bytes_left < sizeof (RespBadBlock))
163
166
{
164
167
qCritical () << " Header size of bad block response is wrong:"
165
- << size ;
168
+ << bytes_left ;
166
169
return -1 ;
167
170
}
168
171
169
- badBlock = (RespBadBlock *)data->data ();
172
+ badBlock = (RespBadBlock *)( data->data () + offset );
170
173
qInfo () << QString (" Bad block at 0x%1" ).arg (badBlock->addr , 8 ,
171
174
16 , QLatin1Char ( ' 0' ));
172
175
@@ -182,7 +185,7 @@ void Programmer::readRespEraseChipCb(int status)
182
185
183
186
while (readData.size ())
184
187
{
185
- if (readRespHeader (&readData, header))
188
+ if (readRespHeader (&readData, 0 , header))
186
189
return ;
187
190
switch (header->code )
188
191
{
@@ -191,7 +194,7 @@ void Programmer::readRespEraseChipCb(int status)
191
194
eraseChipCb ();
192
195
else if (header->info == STATUS_BAD_BLOCK)
193
196
{
194
- if (!handleBadBlock (&readData))
197
+ if (!handleBadBlock (&readData, 0 ))
195
198
{
196
199
readData.remove (0 , sizeof (RespBadBlock));
197
200
continue ;
@@ -229,24 +232,25 @@ void Programmer::readRespReadChipCb(int status)
229
232
{
230
233
uint size;
231
234
RespHeader *header;
232
- uint32_t offset = 0 ;
235
+ uint32_t writeOffset = 0 , readOffset = 0 , bytes_left = 0 ;
233
236
234
237
if (status == SerialPortReader::READ_ERROR)
235
238
goto Error;
236
239
237
- while ((size = readData.size ()))
240
+ size = readData.size ();
241
+ while ((bytes_left = size - readOffset))
238
242
{
239
- if (readRespHeader (&readData, header))
243
+ if (readRespHeader (&readData, readOffset, header))
240
244
goto Error;
241
245
242
246
switch (header->code )
243
247
{
244
248
case RESP_STATUS:
245
249
if (header->info == STATUS_OK && header->info == STATUS_BAD_BLOCK)
246
250
{
247
- if (handleBadBlock (&readData))
251
+ if (handleBadBlock (&readData, readOffset ))
248
252
goto Error;
249
- readData. remove ( 0 , sizeof (RespBadBlock) );
253
+ readOffset += sizeof (RespBadBlock);
250
254
}
251
255
else
252
256
{
@@ -255,26 +259,26 @@ void Programmer::readRespReadChipCb(int status)
255
259
}
256
260
break ;
257
261
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 )
259
263
{
260
264
qCritical () << " Wrong data length in response header:" << header->info ;
261
265
goto Error;
262
266
}
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 ;
266
270
break ;
267
271
default :
268
272
handleWrongResp (header->code );
269
273
goto Error;
270
274
}
271
275
}
272
276
273
- if (readChipLen == offset )
277
+ if (readChipLen == writeOffset )
274
278
readChipCb (0 );
275
279
else
276
280
{
277
- qCritical () << " Data was partialy received, size:" << offset ;
281
+ qCritical () << " Data was partialy received, size:" << writeOffset ;
278
282
goto Error;
279
283
}
280
284
@@ -311,7 +315,7 @@ void Programmer::readRespWriteEndChipCb(int status)
311
315
if (status == SerialPortReader::READ_ERROR)
312
316
goto Exit;
313
317
314
- if (readRespHeader (&readData, header))
318
+ if (readRespHeader (&readData, 0 , header))
315
319
goto Exit;
316
320
317
321
switch (header->code )
@@ -340,14 +344,14 @@ int Programmer::handleWriteError(QByteArray *data)
340
344
341
345
while (data->size ())
342
346
{
343
- if (readRespHeader (data, header))
347
+ if (readRespHeader (data, 0 , header))
344
348
return -1 ;
345
349
switch (header->code )
346
350
{
347
351
case RESP_STATUS:
348
352
if (header->info == STATUS_BAD_BLOCK)
349
353
{
350
- if (!handleBadBlock (data))
354
+ if (!handleBadBlock (data, 0 ))
351
355
{
352
356
data->remove (0 , sizeof (RespBadBlock));
353
357
continue ;
@@ -441,7 +445,7 @@ void Programmer::readRespWriteStartChipCb(int status)
441
445
if (status != SerialPortReader::READ_OK)
442
446
goto Error;
443
447
444
- if (readRespHeader (&readData, header))
448
+ if (readRespHeader (&readData, 0 , header))
445
449
goto Error;
446
450
447
451
switch (header->code )
@@ -513,7 +517,7 @@ void Programmer::readRespSelectChipCb(int status)
513
517
if (status == SerialPortReader::READ_ERROR)
514
518
return ;
515
519
516
- if (readRespHeader (&readData, header))
520
+ if (readRespHeader (&readData, 0 , header))
517
521
return ;
518
522
519
523
switch (header->code )
0 commit comments