(offset, size)
| 319 | return result; |
| 320 | } |
| 321 | async readPart(offset, size) { |
| 322 | // ROM loader is limited to sector boundaries but RAM loader supports arbitrary offsets |
| 323 | // if ((offset % 4096) || (size % 4096)) |
| 324 | // throw new Error("must be aligned to sectors"); |
| 325 | |
| 326 | const payload = new DataView(new ArrayBuffer(4 * 4)); |
| 327 | payload.setUint32(0, offset, 1); |
| 328 | payload.setUint32(4, size, 1); |
| 329 | payload.setUint32(8, 4096, 1); |
| 330 | payload.setUint32(12, 1, 1); // max-in-flight |
| 331 | await this.command(Bootloader.READ_FLASH, new Uint8Array(payload.buffer)); |
| 332 | |
| 333 | let initial; |
| 334 | let reply = await this.getReply(); |
| 335 | this.parseReply(reply, Bootloader.READ_FLASH); |
| 336 | const position = reply.indexOf(0xC0, 1); |
| 337 | if (position < (reply.length - 1)) |
| 338 | initial = reply.slice(position + 1); |
| 339 | |
| 340 | let result = new Uint8Array; |
| 341 | let buffered = new Uint8Array; |
| 342 | let progress = new DataView(new ArrayBuffer(1 * 4)); |
| 343 | while (result.byteLength < size) { |
| 344 | const data = initial ?? this.#serial.read(); |
| 345 | if (!data) { |
| 346 | const readPromise = new Promise(resolve => { |
| 347 | this.#readable = resolve; |
| 348 | }); |
| 349 | await Promise.race([readPromise, new Promise(resolve => setTimeout(resolve, 100))]); |
| 350 | continue; |
| 351 | } |
| 352 | |
| 353 | initial = undefined; |
| 354 | let t = new Uint8Array(buffered.byteLength + data.byteLength); |
| 355 | t.set(buffered, 0); |
| 356 | t.set(new Uint8Array(data), buffered.byteLength); |
| 357 | buffered = t; |
| 358 | |
| 359 | if (0xC0 !== buffered[0]) |
| 360 | throw new Error("bad data received"); |
| 361 | const end = buffered.indexOf(0xC0, 1); |
| 362 | if (end < 0) |
| 363 | continue; |
| 364 | |
| 365 | const slipPacket = this.unescapeSLIP(buffered.slice(0, end + 1)); |
| 366 | if ((size + 2) !== slipPacket.byteLength) |
| 367 | throw new Error("bad packet size"); |
| 368 | buffered = buffered.slice(end + 1); |
| 369 | |
| 370 | t = new Uint8Array(result.byteLength + slipPacket.byteLength - 2); |
| 371 | t.set(result, 0); |
| 372 | t.set(new Uint8Array(slipPacket.buffer, 1, slipPacket.byteLength - 2), result.byteLength); |
| 373 | result = t; |
| 374 | |
| 375 | progress.setUint32(0, result.byteLength, 1); |
| 376 | this.writeSLIP(progress.buffer, false); |
| 377 | } |
| 378 |
no test coverage detected