MCPcopy Index your code
hub / github.com/Moddable-OpenSource/moddable / readPart

Method readPart

tools/xsbug/esptool.js:321–390  ·  view source on GitHub ↗
(offset, size)

Source from the content-addressed store, hash-verified

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

Callers 1

readMethod · 0.95

Calls 8

commandMethod · 0.95
getReplyMethod · 0.95
parseReplyMethod · 0.95
unescapeSLIPMethod · 0.95
writeSLIPMethod · 0.95
sliceMethod · 0.65
readMethod · 0.65
setMethod · 0.65

Tested by

no test coverage detected