mirror of
https://github.com/pybricks/pybricks-code.git
synced 2026-09-12 01:23:52 +00:00
fix timeout when firmware size is 10x packet size
When the firmware blob is exactly a multiple of 10 times the packet size, the last checksum request causes the reply to the last program request to be missed (there is only a response from the hub to the very last program request). The program response is received, then the checksum response is received. Since the saga is waiting for the checksum response first, the program response is discarded. Fix by breaking out of the loop when the firmware has been fully transferred before making the checksum request. Fixes: pybricks/support#178
This commit is contained in:
@@ -280,7 +280,7 @@ function* flashFirmware(action: FlashFirmwareFlashAction): Generator {
|
||||
throw Error('Missing hub type in MaxProgramFlashSize');
|
||||
}
|
||||
|
||||
for (let offset = 0; offset < firmware.length; offset += maxDataSize) {
|
||||
for (let offset = 0; ; ) {
|
||||
const payload = firmware.slice(offset, offset + maxDataSize);
|
||||
const programAction = (yield put(
|
||||
programRequest(info[0].startAddress + offset, payload.buffer),
|
||||
@@ -289,6 +289,13 @@ function* flashFirmware(action: FlashFirmwareFlashAction): Generator {
|
||||
|
||||
yield put(progress(offset, firmware.length));
|
||||
|
||||
// we don't want to request checksum if this is the last packet since
|
||||
// the bootloader will send a response to the program request already.
|
||||
offset += maxDataSize;
|
||||
if (offset >= firmware.length) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (connectResult.canWriteWithoutResponse) {
|
||||
// Request checksum every 10 packets to prevent buffer overrun on
|
||||
// the hub because of sending too much data at once. The actual
|
||||
|
||||
Reference in New Issue
Block a user