esp32tool 1.6.3 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/apple-touch-icon.png +0 -0
- package/css/style.css +23 -0
- package/dist/cli.js +13 -2
- package/dist/esp_loader.js +12 -0
- package/dist/web/index.js +1 -1
- package/icons/icon-128.png +0 -0
- package/icons/icon-144.png +0 -0
- package/icons/icon-152.png +0 -0
- package/icons/icon-192.png +0 -0
- package/icons/icon-384.png +0 -0
- package/icons/icon-512.png +0 -0
- package/icons/icon-72.png +0 -0
- package/icons/icon-96.png +0 -0
- package/index.html +1 -0
- package/js/modules/esptool.js +1 -1
- package/js/script.js +3 -0
- package/js/util/console-color.js +29 -2
- package/package.cli.json +2 -2
- package/package.json +15 -11
- package/screenshots/desktop.png +0 -0
- package/screenshots/mobile.png +0 -0
- package/src/cli.ts +13 -2
- package/src/esp_loader.ts +24 -0
- package/sw.js +1 -1
package/README.md
CHANGED
|
@@ -137,6 +137,8 @@ January 2026 – Added Android mobile devices support, standalone CLI.
|
|
|
137
137
|
|
|
138
138
|
February 2026 - Added IMPROV support, NEW Features: Flash Hex Editor and NVS Parser / Editor
|
|
139
139
|
|
|
140
|
+
March 2026 – Auto-detect partition table, flash read speed/time logging, flash erase animation
|
|
141
|
+
|
|
140
142
|
---
|
|
141
143
|
|
|
142
144
|
© Adafruit, Nabu Casa & Johann Obermeier
|
package/apple-touch-icon.png
CHANGED
|
Binary file
|
package/css/style.css
CHANGED
|
@@ -472,6 +472,29 @@ div.clear {
|
|
|
472
472
|
width: 0;
|
|
473
473
|
}
|
|
474
474
|
|
|
475
|
+
.progress-bar.indeterminate > div {
|
|
476
|
+
width: 100% !important;
|
|
477
|
+
background: repeating-linear-gradient(
|
|
478
|
+
-45deg,
|
|
479
|
+
#71ae1e,
|
|
480
|
+
#71ae1e 10px,
|
|
481
|
+
#5a8c18 10px,
|
|
482
|
+
#5a8c18 20px
|
|
483
|
+
);
|
|
484
|
+
background-size: 28px 28px;
|
|
485
|
+
animation: indeterminate-stripes 0.6s linear infinite;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
@keyframes indeterminate-stripes {
|
|
489
|
+
0% { background-position: 0 0; }
|
|
490
|
+
100% { background-position: 28px 0; }
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
#eraseProgress {
|
|
494
|
+
width: 400px;
|
|
495
|
+
margin: 10px auto;
|
|
496
|
+
}
|
|
497
|
+
|
|
475
498
|
#commands .buttons {
|
|
476
499
|
display: flex;
|
|
477
500
|
justify-content: center;
|
package/dist/cli.js
CHANGED
|
@@ -291,8 +291,19 @@ async function cmdEraseFlash(esploader) {
|
|
|
291
291
|
cliLogger.log("Erasing entire flash chip...");
|
|
292
292
|
// Use stub for erasing
|
|
293
293
|
const stub = await esploader.runStub();
|
|
294
|
-
//
|
|
295
|
-
|
|
294
|
+
// Show animated progress while erasing
|
|
295
|
+
const frames = ["|", "/", "-", "\\"];
|
|
296
|
+
let frameIdx = 0;
|
|
297
|
+
const spinner = setInterval(() => {
|
|
298
|
+
process.stdout.write(`\rErasing... ${frames[frameIdx++ % frames.length]}`);
|
|
299
|
+
}, 200);
|
|
300
|
+
try {
|
|
301
|
+
await stub.eraseFlash();
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
clearInterval(spinner);
|
|
305
|
+
process.stdout.write("\r \r");
|
|
306
|
+
}
|
|
296
307
|
cliLogger.log("Erase complete!");
|
|
297
308
|
}
|
|
298
309
|
async function cmdEraseRegion(esploader, offset, size) {
|
package/dist/esp_loader.js
CHANGED
|
@@ -3491,6 +3491,7 @@ export class ESPLoader extends EventTarget {
|
|
|
3491
3491
|
}
|
|
3492
3492
|
// Flush serial buffers before flash read operation
|
|
3493
3493
|
await this.flushSerialBuffers();
|
|
3494
|
+
const readStartTime = Date.now();
|
|
3494
3495
|
this.logger.log(`Reading ${size} bytes from flash at address 0x${addr.toString(16)}...`);
|
|
3495
3496
|
// Initialize adaptive speed multipliers for WebUSB devices
|
|
3496
3497
|
if (this.isWebUSB()) {
|
|
@@ -3571,6 +3572,7 @@ export class ESPLoader extends EventTarget {
|
|
|
3571
3572
|
maxInFlight = base * 130; // 63 * 130 = 8190 (close to blockSize * 2)
|
|
3572
3573
|
}
|
|
3573
3574
|
const pkt = pack("<IIII", currentAddr, chunkSize, blockSize, maxInFlight);
|
|
3575
|
+
const chunkStartTime = Date.now();
|
|
3574
3576
|
const [res] = await this.checkCommand(ESP_READ_FLASH, pkt);
|
|
3575
3577
|
if (res != 0) {
|
|
3576
3578
|
throw new Error("Failed to read memory: " + res);
|
|
@@ -3634,6 +3636,11 @@ export class ESPLoader extends EventTarget {
|
|
|
3634
3636
|
newAllData.set(resp, allData.length);
|
|
3635
3637
|
allData = newAllData;
|
|
3636
3638
|
chunkSuccess = true;
|
|
3639
|
+
const chunkDuration = Date.now() - chunkStartTime;
|
|
3640
|
+
const speedKBs = (resp.length /
|
|
3641
|
+
1024 /
|
|
3642
|
+
(chunkDuration / 1000)).toFixed(1);
|
|
3643
|
+
this.logger.debug(`Chunk read took ${chunkDuration} ms (${resp.length} bytes, ${speedKBs} KB/s)`);
|
|
3637
3644
|
// ADAPTIVE SPEED ADJUSTMENT: Only for CDC devices
|
|
3638
3645
|
// Non-CDC devices (CH340, CP2102) stay at fixed blockSize=31, maxInFlight=31
|
|
3639
3646
|
if (this.isWebUSB() && this._isCDCDevice && retryCount === 0) {
|
|
@@ -3734,6 +3741,11 @@ export class ESPLoader extends EventTarget {
|
|
|
3734
3741
|
remainingSize -= chunkSize;
|
|
3735
3742
|
this.logger.debug(`Total progress: 0x${allData.length.toString(16)} from 0x${size.toString(16)} bytes`);
|
|
3736
3743
|
}
|
|
3744
|
+
const totalDuration = Date.now() - readStartTime;
|
|
3745
|
+
const totalSpeedKBs = (allData.length /
|
|
3746
|
+
1024 /
|
|
3747
|
+
(totalDuration / 1000)).toFixed(1);
|
|
3748
|
+
this.logger.log(`Read complete: ${allData.length} bytes in ${(totalDuration / 1000).toFixed(1)} s (${totalSpeedKBs} KB/s)`);
|
|
3737
3749
|
return allData;
|
|
3738
3750
|
}
|
|
3739
3751
|
}
|