Connection successful
This commit is contained in:
parent
62d91ba584
commit
5fa0a2c935
13 changed files with 8548 additions and 311 deletions
1
dist/web/esp32-Bg65gU8P.js
vendored
1
dist/web/esp32-Bg65gU8P.js
vendored
|
|
@ -1 +0,0 @@
|
|||
var A=1074521560,C="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",g=1074520064,I="GOv8P9jnC0Bx6AtA8+wLQO3oC0CP6AtA7egLQEnpC0AG6gtAeOoLQCHqC0CB5wtAo+kLQPjpC0Bn6QtAmuoLQI7pC0Ca6gtAXegLQLPoC0Dt6AtASekLQHfoC0BM6wtAs+wLQKXmC0DX7AtApeYLQKXmC0Cl5gtApeYLQKXmC0Cl5gtApeYLQKXmC0Dz6gtApeYLQM3rC0Cz7AtA",B=1073605544,Q={entry:A,text:C,text_start:g,data:I,data_start:B};export{I as data,B as data_start,Q as default,A as entry,C as text,g as text_start};
|
||||
1
dist/web/esp32c2-DRxBOVqQ.js
vendored
1
dist/web/esp32c2-DRxBOVqQ.js
vendored
|
|
@ -1 +0,0 @@
|
|||
var A=1077413304,B="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",w=1077411840,E="GGvKP+AIOEAsCThAhAk4QCgKOECUCjhAQgo4QKgHOEDkCThAJAo4QJgJOEBYBzhAzAk4QFgHOEC6CDhA/gg4QCwJOECECThAzAg4QBIIOEBCCDhAyAg4QOYMOEAsCThArAs4QJoMOECkBjhAxAw4QKQGOECkBjhApAY4QKQGOECkBjhApAY4QKQGOECkBjhASAs4QKQGOEDICzhAmgw4QA==",M=1070295976,g={entry:A,text:B,text_start:w,data:E,data_start:M};export{E as data,M as data_start,g as default,A as entry,B as text,w as text_start};
|
||||
1
dist/web/esp32c3-CJ4wClm-.js
vendored
1
dist/web/esp32c3-CJ4wClm-.js
vendored
File diff suppressed because one or more lines are too long
1
dist/web/esp32c6-Cr54H1-S.js
vendored
1
dist/web/esp32c6-Cr54H1-S.js
vendored
File diff suppressed because one or more lines are too long
1
dist/web/esp32h2-Bg5MWDnj.js
vendored
1
dist/web/esp32h2-Bg5MWDnj.js
vendored
File diff suppressed because one or more lines are too long
1
dist/web/esp32s2-BaKBdKll.js
vendored
1
dist/web/esp32s2-BaKBdKll.js
vendored
File diff suppressed because one or more lines are too long
1
dist/web/esp32s3-CePvTjvo.js
vendored
1
dist/web/esp32s3-CePvTjvo.js
vendored
File diff suppressed because one or more lines are too long
1
dist/web/esp8266-BHFbKiuw.js
vendored
1
dist/web/esp8266-BHFbKiuw.js
vendored
File diff suppressed because one or more lines are too long
8204
dist/web/index.js
vendored
8204
dist/web/index.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -34,15 +34,15 @@
|
|||
/>
|
||||
|
||||
<!-- import the webpage's javascript file -->
|
||||
<script module>
|
||||
<!--<script module>
|
||||
window.esptoolPackage = import(
|
||||
// In development we import locally.
|
||||
window.location.hostname === "localhost"
|
||||
? "/dist/web/index.js"
|
||||
: "https://cdn.jsdelivr.net/gh/adafruit/Adafruit_WebSerial_ESPTool@latest/dist/web/index.js"
|
||||
);
|
||||
</script>
|
||||
<script src="js/script.js" module defer></script>
|
||||
</script>-->
|
||||
<script type="module" src="js/script.js" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<header class="header">
|
||||
|
|
@ -69,7 +69,7 @@
|
|||
name="noReset"
|
||||
class="onoffswitch-checkbox"
|
||||
id="noReset"
|
||||
checked="false"
|
||||
checked="false"
|
||||
/>
|
||||
<label class="onoffswitch-label" for="noReset">
|
||||
<span class="onoffswitch-inner"></span>
|
||||
|
|
|
|||
613
js/script.js
613
js/script.js
|
|
@ -1,11 +1,8 @@
|
|||
let espStub;
|
||||
import { ESPLoader, Transport } from "https://unpkg.com/esptool-js/bundle.js";
|
||||
|
||||
const baudRates = [921600, 115200, 230400, 460800];
|
||||
|
||||
const bufferSize = 512;
|
||||
const colors = ["#00a7e9", "#f89521", "#be1e2d"];
|
||||
const measurementPeriodId = "0001";
|
||||
|
||||
const maxLogLength = 100;
|
||||
const log = document.getElementById("log");
|
||||
const butConnect = document.getElementById("butConnect");
|
||||
|
|
@ -23,128 +20,152 @@ const offsets = document.querySelectorAll(".upload .offset");
|
|||
const appDiv = document.getElementById("app");
|
||||
const noReset = document.getElementById("noReset");
|
||||
|
||||
let device = null;
|
||||
let transport = null;
|
||||
let esploader = null;
|
||||
let chip = null;
|
||||
const serialLib = !navigator.serial && navigator.usb ? serial : navigator.serial;
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
butConnect.addEventListener("click", () => {
|
||||
clickConnect().catch(async (e) => {
|
||||
console.error(e);
|
||||
errorMsg(e.message || e);
|
||||
if (espStub) {
|
||||
await espStub.disconnect();
|
||||
}
|
||||
toggleUIConnected(false);
|
||||
butConnect.addEventListener("click", () => {
|
||||
clickConnect().catch(async (e) => {
|
||||
console.error(e);
|
||||
errorMsg(e.message || e);
|
||||
if (espStub) {
|
||||
await espStub.disconnect();
|
||||
}
|
||||
toggleUIConnected(false);
|
||||
});
|
||||
});
|
||||
butClear.addEventListener("click", clickClear);
|
||||
butErase.addEventListener("click", clickErase);
|
||||
butProgram.addEventListener("click", clickProgram);
|
||||
for (let i = 0; i < firmware.length; i++) {
|
||||
firmware[i].addEventListener("change", checkFirmware);
|
||||
}
|
||||
for (let i = 0; i < offsets.length; i++) {
|
||||
offsets[i].addEventListener("change", checkProgrammable);
|
||||
}
|
||||
autoscroll.addEventListener("click", clickAutoscroll);
|
||||
baudRate.addEventListener("change", changeBaudRate);
|
||||
darkMode.addEventListener("click", clickDarkMode);
|
||||
noReset.addEventListener("change", () => {
|
||||
console.log("Checkbox changed:", noReset.checked); // Log checkbox state changes
|
||||
});
|
||||
});
|
||||
butClear.addEventListener("click", clickClear);
|
||||
butErase.addEventListener("click", clickErase);
|
||||
butProgram.addEventListener("click", clickProgram);
|
||||
for (let i = 0; i < firmware.length; i++) {
|
||||
firmware[i].addEventListener("change", checkFirmware);
|
||||
}
|
||||
for (let i = 0; i < offsets.length; i++) {
|
||||
offsets[i].addEventListener("change", checkProgrammable);
|
||||
}
|
||||
autoscroll.addEventListener("click", clickAutoscroll);
|
||||
baudRate.addEventListener("change", changeBaudRate);
|
||||
darkMode.addEventListener("click", clickDarkMode);
|
||||
noReset.addEventListener("change", () => {
|
||||
console.log("Checkbox changed:", noReset.checked); // Log checkbox state changes
|
||||
});
|
||||
|
||||
window.addEventListener("error", function (event) {
|
||||
console.log("Got an uncaught error: ", event.error);
|
||||
});
|
||||
if ("serial" in navigator) {
|
||||
const notSupported = document.getElementById("notSupported");
|
||||
notSupported.classList.add("hidden");
|
||||
}
|
||||
window.addEventListener("error", function (event) {
|
||||
console.log("Got an uncaught error: ", event.error);
|
||||
});
|
||||
if ("serial" in navigator) {
|
||||
const notSupported = document.getElementById("notSupported");
|
||||
notSupported.classList.add("hidden");
|
||||
}
|
||||
|
||||
initBaudRate();
|
||||
loadAllSettings();
|
||||
updateTheme();
|
||||
logMsg("ESP Web Flasher loaded.");
|
||||
initBaudRate();
|
||||
loadAllSettings();
|
||||
updateTheme();
|
||||
logMsg("ESP Web Flasher loaded.");
|
||||
});
|
||||
|
||||
function initBaudRate() {
|
||||
for (let rate of baudRates) {
|
||||
var option = document.createElement("option");
|
||||
option.text = rate + " Baud";
|
||||
option.value = rate;
|
||||
baudRate.add(option);
|
||||
}
|
||||
for (let rate of baudRates) {
|
||||
var option = document.createElement("option");
|
||||
option.text = rate + " Baud";
|
||||
option.value = rate;
|
||||
baudRate.add(option);
|
||||
}
|
||||
}
|
||||
|
||||
function pruneLog() {
|
||||
// Remove old log content
|
||||
if (log.textContent.split("\n").length > maxLogLength + 1) {
|
||||
let logLines = log.innerHTML.replace(/(\n)/gm, "").split("<br>");
|
||||
log.innerHTML = logLines.splice(-maxLogLength).join("<br>\n");
|
||||
}
|
||||
|
||||
if (autoscroll.checked) {
|
||||
log.scrollTop = log.scrollHeight;
|
||||
}
|
||||
}
|
||||
|
||||
function writeLog(text) {
|
||||
log.innerHTML += text;
|
||||
pruneLog();
|
||||
}
|
||||
|
||||
function logMsg(text) {
|
||||
log.innerHTML += text + "<br>";
|
||||
|
||||
// Remove old log content
|
||||
if (log.textContent.split("\n").length > maxLogLength + 1) {
|
||||
let logLines = log.innerHTML.replace(/(\n)/gm, "").split("<br>");
|
||||
log.innerHTML = logLines.splice(-maxLogLength).join("<br>\n");
|
||||
}
|
||||
|
||||
if (autoscroll.checked) {
|
||||
log.scrollTop = log.scrollHeight;
|
||||
}
|
||||
writeLog(text + "<br>");
|
||||
}
|
||||
|
||||
const espLoaderTerminal = {
|
||||
clean() {
|
||||
log.innerHTML = "";
|
||||
},
|
||||
writeLine(data) {
|
||||
logMsg(data + "<br />");
|
||||
},
|
||||
write(data) {
|
||||
writeLog(data);
|
||||
},
|
||||
};
|
||||
|
||||
function debugMsg(...args) {
|
||||
function getStackTrace() {
|
||||
let stack = new Error().stack;
|
||||
//console.log(stack);
|
||||
stack = stack.split("\n").map((v) => v.trim());
|
||||
stack.shift();
|
||||
stack.shift();
|
||||
function getStackTrace() {
|
||||
let stack = new Error().stack;
|
||||
//console.log(stack);
|
||||
stack = stack.split("\n").map((v) => v.trim());
|
||||
stack.shift();
|
||||
stack.shift();
|
||||
|
||||
let trace = [];
|
||||
for (let line of stack) {
|
||||
line = line.replace("at ", "");
|
||||
trace.push({
|
||||
func: line.substr(0, line.indexOf("(") - 1),
|
||||
pos: line.substring(line.indexOf(".js:") + 4, line.lastIndexOf(":")),
|
||||
});
|
||||
let trace = [];
|
||||
for (let line of stack) {
|
||||
line = line.replace("at ", "");
|
||||
trace.push({
|
||||
func: line.substr(0, line.indexOf("(") - 1),
|
||||
pos: line.substring(line.indexOf(".js:") + 4, line.lastIndexOf(":")),
|
||||
});
|
||||
}
|
||||
|
||||
return trace;
|
||||
}
|
||||
|
||||
return trace;
|
||||
}
|
||||
|
||||
let stack = getStackTrace();
|
||||
stack.shift();
|
||||
let top = stack.shift();
|
||||
let prefix =
|
||||
'<span class="debug-function">[' + top.func + ":" + top.pos + "]</span> ";
|
||||
for (let arg of args) {
|
||||
if (arg === undefined) {
|
||||
logMsg(prefix + "undefined");
|
||||
} else if (arg === null) {
|
||||
logMsg(prefix + "null");
|
||||
} else if (typeof arg == "string") {
|
||||
logMsg(prefix + arg);
|
||||
} else if (typeof arg == "number") {
|
||||
logMsg(prefix + arg);
|
||||
} else if (typeof arg == "boolean") {
|
||||
logMsg(prefix + (arg ? "true" : "false"));
|
||||
} else if (Array.isArray(arg)) {
|
||||
logMsg(prefix + "[" + arg.map((value) => toHex(value)).join(", ") + "]");
|
||||
} else if (typeof arg == "object" && arg instanceof Uint8Array) {
|
||||
logMsg(
|
||||
prefix +
|
||||
"[" +
|
||||
Array.from(arg)
|
||||
.map((value) => toHex(value))
|
||||
.join(", ") +
|
||||
"]"
|
||||
);
|
||||
} else {
|
||||
logMsg(prefix + "Unhandled type of argument:" + typeof arg);
|
||||
console.log(arg);
|
||||
let stack = getStackTrace();
|
||||
stack.shift();
|
||||
let top = stack.shift();
|
||||
let prefix = '<span class="debug-function">[' + top.func + ":" + top.pos + "]</span> ";
|
||||
for (let arg of args) {
|
||||
if (arg === undefined) {
|
||||
logMsg(prefix + "undefined");
|
||||
} else if (arg === null) {
|
||||
logMsg(prefix + "null");
|
||||
} else if (typeof arg == "string") {
|
||||
logMsg(prefix + arg);
|
||||
} else if (typeof arg == "number") {
|
||||
logMsg(prefix + arg);
|
||||
} else if (typeof arg == "boolean") {
|
||||
logMsg(prefix + (arg ? "true" : "false"));
|
||||
} else if (Array.isArray(arg)) {
|
||||
logMsg(prefix + "[" + arg.map((value) => toHex(value)).join(", ") + "]");
|
||||
} else if (typeof arg == "object" && arg instanceof Uint8Array) {
|
||||
logMsg(
|
||||
prefix +
|
||||
"[" +
|
||||
Array.from(arg)
|
||||
.map((value) => toHex(value))
|
||||
.join(", ") +
|
||||
"]"
|
||||
);
|
||||
} else {
|
||||
logMsg(prefix + "Unhandled type of argument:" + typeof arg);
|
||||
console.log(arg);
|
||||
}
|
||||
prefix = ""; // Only show for first argument
|
||||
}
|
||||
prefix = ""; // Only show for first argument
|
||||
}
|
||||
}
|
||||
|
||||
function errorMsg(text) {
|
||||
logMsg('<span class="error-message">Error:</span> ' + text);
|
||||
console.error(text);
|
||||
logMsg('<span class="error-message">Error:</span> ' + text);
|
||||
console.error(text);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -152,28 +173,28 @@ function errorMsg(text) {
|
|||
* Sets the theme to Adafruit (dark) mode. Can be refactored later for more themes
|
||||
*/
|
||||
function updateTheme() {
|
||||
// Disable all themes
|
||||
document
|
||||
.querySelectorAll("link[rel=stylesheet].alternate")
|
||||
.forEach((styleSheet) => {
|
||||
enableStyleSheet(styleSheet, false);
|
||||
});
|
||||
// Disable all themes
|
||||
document
|
||||
.querySelectorAll("link[rel=stylesheet].alternate")
|
||||
.forEach((styleSheet) => {
|
||||
enableStyleSheet(styleSheet, false);
|
||||
});
|
||||
|
||||
if (darkMode.checked) {
|
||||
enableStyleSheet(darkSS, true);
|
||||
} else {
|
||||
enableStyleSheet(lightSS, true);
|
||||
}
|
||||
if (darkMode.checked) {
|
||||
enableStyleSheet(darkSS, true);
|
||||
} else {
|
||||
enableStyleSheet(lightSS, true);
|
||||
}
|
||||
}
|
||||
|
||||
function enableStyleSheet(node, enabled) {
|
||||
node.disabled = !enabled;
|
||||
node.disabled = !enabled;
|
||||
}
|
||||
|
||||
function formatMacAddr(macAddr) {
|
||||
return macAddr
|
||||
.map((value) => value.toString(16).toUpperCase().padStart(2, "0"))
|
||||
.join(":");
|
||||
return macAddr
|
||||
.map((value) => value.toString(16).toUpperCase().padStart(2, "0"))
|
||||
.join(":");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -181,38 +202,42 @@ function formatMacAddr(macAddr) {
|
|||
* Click handler for the connect/disconnect button.
|
||||
*/
|
||||
async function clickConnect() {
|
||||
if (espStub) {
|
||||
await espStub.disconnect();
|
||||
await espStub.port.close();
|
||||
toggleUIConnected(false);
|
||||
espStub = undefined;
|
||||
return;
|
||||
}
|
||||
if (transport !== null) {
|
||||
await transport.disconnect();
|
||||
await transport.waitForUnlock(1500);
|
||||
toggleUIConnected(false);
|
||||
transport = null;
|
||||
device = null;
|
||||
chip = null;
|
||||
return;
|
||||
}
|
||||
|
||||
const esploaderMod = await window.esptoolPackage;
|
||||
if (device === null) {
|
||||
device = await serialLib.requestPort({});
|
||||
transport = new Transport(device, true);
|
||||
}
|
||||
|
||||
const esploader = await esploaderMod.connect({
|
||||
log: (...args) => logMsg(...args),
|
||||
debug: (...args) => debugMsg(...args),
|
||||
error: (...args) => errorMsg(...args),
|
||||
});
|
||||
try {
|
||||
await esploader.initialize();
|
||||
try {
|
||||
const loaderOptions = {
|
||||
transport: transport,
|
||||
baudrate: parseInt(baudRate.value),
|
||||
terminal: espLoaderTerminal,
|
||||
debugLogging: false,
|
||||
};
|
||||
|
||||
logMsg("Connected to " + esploader.chipName);
|
||||
logMsg("MAC Address: " + formatMacAddr(esploader.macAddr()));
|
||||
esploader = new ESPLoader(loaderOptions);
|
||||
|
||||
espStub = await esploader.runStub();
|
||||
toggleUIConnected(true);
|
||||
toggleUIToolbar(true);
|
||||
espStub.addEventListener("disconnect", () => {
|
||||
toggleUIConnected(false);
|
||||
espStub = false;
|
||||
});
|
||||
} catch (err) {
|
||||
await esploader.disconnect();
|
||||
throw err;
|
||||
}
|
||||
chip = await esploader.main();
|
||||
|
||||
// Temporarily broken
|
||||
// await esploader.flashId();
|
||||
toggleUIConnected(true);
|
||||
toggleUIToolbar(true);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
errorMsg(e.message);
|
||||
}
|
||||
console.log("Settings done for :" + chip);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -220,13 +245,13 @@ async function clickConnect() {
|
|||
* Change handler for the Baud Rate selector.
|
||||
*/
|
||||
async function changeBaudRate() {
|
||||
saveSetting("baudrate", baudRate.value);
|
||||
if (espStub) {
|
||||
let baud = parseInt(baudRate.value);
|
||||
if (baudRates.includes(baud)) {
|
||||
await espStub.setBaudrate(baud);
|
||||
saveSetting("baudrate", baudRate.value);
|
||||
if (espStub) {
|
||||
let baud = parseInt(baudRate.value);
|
||||
if (baudRates.includes(baud)) {
|
||||
await espStub.setBaudrate(baud);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -234,7 +259,7 @@ async function changeBaudRate() {
|
|||
* Change handler for the Autoscroll checkbox.
|
||||
*/
|
||||
async function clickAutoscroll() {
|
||||
saveSetting("autoscroll", autoscroll.checked);
|
||||
saveSetting("autoscroll", autoscroll.checked);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -242,8 +267,8 @@ async function clickAutoscroll() {
|
|||
* Change handler for the Dark Mode checkbox.
|
||||
*/
|
||||
async function clickDarkMode() {
|
||||
updateTheme();
|
||||
saveSetting("darkmode", darkMode.checked);
|
||||
updateTheme();
|
||||
saveSetting("darkmode", darkMode.checked);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -251,8 +276,8 @@ async function clickDarkMode() {
|
|||
* Change handler for ESP32 co-processor boards
|
||||
*/
|
||||
async function clickNoReset() {
|
||||
console.log("Checkbox state:", noReset.checked); // Debugging output
|
||||
saveSetting("noReset", noReset.checked);
|
||||
console.log("Checkbox state:", noReset.checked); // Debugging output
|
||||
saveSetting("noReset", noReset.checked);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -260,25 +285,25 @@ async function clickNoReset() {
|
|||
* Click handler for the erase button.
|
||||
*/
|
||||
async function clickErase() {
|
||||
if (
|
||||
window.confirm("This will erase the entire flash. Click OK to continue.")
|
||||
) {
|
||||
baudRate.disabled = true;
|
||||
butErase.disabled = true;
|
||||
butProgram.disabled = true;
|
||||
try {
|
||||
logMsg("Erasing flash memory. Please wait...");
|
||||
let stamp = Date.now();
|
||||
await espStub.eraseFlash();
|
||||
logMsg("Finished. Took " + (Date.now() - stamp) + "ms to erase.");
|
||||
} catch (e) {
|
||||
errorMsg(e);
|
||||
} finally {
|
||||
butErase.disabled = false;
|
||||
baudRate.disabled = false;
|
||||
butProgram.disabled = getValidFiles().length == 0;
|
||||
if (
|
||||
window.confirm("This will erase the entire flash. Click OK to continue.")
|
||||
) {
|
||||
baudRate.disabled = true;
|
||||
butErase.disabled = true;
|
||||
butProgram.disabled = true;
|
||||
try {
|
||||
logMsg("Erasing flash memory. Please wait...");
|
||||
let stamp = Date.now();
|
||||
await espStub.eraseFlash();
|
||||
logMsg("Finished. Took " + (Date.now() - stamp) + "ms to erase.");
|
||||
} catch (e) {
|
||||
errorMsg(e);
|
||||
} finally {
|
||||
butErase.disabled = false;
|
||||
baudRate.disabled = false;
|
||||
butProgram.disabled = getValidFiles().length == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -286,75 +311,74 @@ async function clickErase() {
|
|||
* Click handler for the program button.
|
||||
*/
|
||||
async function clickProgram() {
|
||||
const readUploadedFileAsArrayBuffer = (inputFile) => {
|
||||
const reader = new FileReader();
|
||||
const readUploadedFileAsArrayBuffer = (inputFile) => {
|
||||
const reader = new FileReader();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
reader.onerror = () => {
|
||||
reader.abort();
|
||||
reject(new DOMException("Problem parsing input file."));
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
reader.onerror = () => {
|
||||
reader.abort();
|
||||
reject(new DOMException("Problem parsing input file."));
|
||||
};
|
||||
|
||||
reader.onload = () => {
|
||||
resolve(reader.result);
|
||||
};
|
||||
reader.readAsArrayBuffer(inputFile);
|
||||
});
|
||||
};
|
||||
reader.onload = () => {
|
||||
resolve(reader.result);
|
||||
};
|
||||
reader.readAsArrayBuffer(inputFile);
|
||||
});
|
||||
};
|
||||
|
||||
baudRate.disabled = true;
|
||||
butErase.disabled = true;
|
||||
butProgram.disabled = true;
|
||||
for (let i = 0; i < 4; i++) {
|
||||
firmware[i].disabled = true;
|
||||
offsets[i].disabled = true;
|
||||
}
|
||||
for (let file of getValidFiles()) {
|
||||
progress[file].classList.remove("hidden");
|
||||
let binfile = firmware[file].files[0];
|
||||
let contents = await readUploadedFileAsArrayBuffer(binfile);
|
||||
try {
|
||||
let offset = parseInt(offsets[file].value, 16);
|
||||
const progressBar = progress[file].querySelector("div");
|
||||
await espStub.flashData(
|
||||
contents,
|
||||
(bytesWritten, totalBytes) => {
|
||||
progressBar.style.width =
|
||||
Math.floor((bytesWritten / totalBytes) * 100) + "%";
|
||||
},
|
||||
offset
|
||||
);
|
||||
await sleep(100);
|
||||
} catch (e) {
|
||||
errorMsg(e);
|
||||
baudRate.disabled = true;
|
||||
butErase.disabled = true;
|
||||
butProgram.disabled = true;
|
||||
for (let i = 0; i < 4; i++) {
|
||||
firmware[i].disabled = true;
|
||||
offsets[i].disabled = true;
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < 4; i++) {
|
||||
firmware[i].disabled = false;
|
||||
offsets[i].disabled = false;
|
||||
progress[i].classList.add("hidden");
|
||||
progress[i].querySelector("div").style.width = "0";
|
||||
}
|
||||
butErase.disabled = false;
|
||||
baudRate.disabled = false;
|
||||
butProgram.disabled = getValidFiles().length == 0;
|
||||
logMsg("To run the new firmware, please reset your device.");
|
||||
for (let file of getValidFiles()) {
|
||||
progress[file].classList.remove("hidden");
|
||||
let binfile = firmware[file].files[0];
|
||||
let contents = await readUploadedFileAsArrayBuffer(binfile);
|
||||
try {
|
||||
let offset = parseInt(offsets[file].value, 16);
|
||||
const progressBar = progress[file].querySelector("div");
|
||||
await espStub.flashData(
|
||||
contents,
|
||||
(bytesWritten, totalBytes) => {
|
||||
progressBar.style.width = Math.floor((bytesWritten / totalBytes) * 100) + "%";
|
||||
},
|
||||
offset
|
||||
);
|
||||
await sleep(100);
|
||||
} catch (e) {
|
||||
errorMsg(e);
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < 4; i++) {
|
||||
firmware[i].disabled = false;
|
||||
offsets[i].disabled = false;
|
||||
progress[i].classList.add("hidden");
|
||||
progress[i].querySelector("div").style.width = "0";
|
||||
}
|
||||
butErase.disabled = false;
|
||||
baudRate.disabled = false;
|
||||
butProgram.disabled = getValidFiles().length == 0;
|
||||
logMsg("To run the new firmware, please reset your device.");
|
||||
}
|
||||
|
||||
function getValidFiles() {
|
||||
// Get a list of file and offsets
|
||||
// This will be used to check if we have valid stuff
|
||||
// and will also return a list of files to program
|
||||
let validFiles = [];
|
||||
let offsetVals = [];
|
||||
for (let i = 0; i < 4; i++) {
|
||||
let offs = parseInt(offsets[i].value, 16);
|
||||
if (firmware[i].files.length > 0 && !offsetVals.includes(offs)) {
|
||||
validFiles.push(i);
|
||||
offsetVals.push(offs);
|
||||
// Get a list of file and offsets
|
||||
// This will be used to check if we have valid stuff
|
||||
// and will also return a list of files to program
|
||||
let validFiles = [];
|
||||
let offsetVals = [];
|
||||
for (let i = 0; i < 4; i++) {
|
||||
let offs = parseInt(offsets[i].value, 16);
|
||||
if (firmware[i].files.length > 0 && !offsetVals.includes(offs)) {
|
||||
validFiles.push(i);
|
||||
offsetVals.push(offs);
|
||||
}
|
||||
}
|
||||
}
|
||||
return validFiles;
|
||||
return validFiles;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -362,7 +386,7 @@ function getValidFiles() {
|
|||
* Check if the conditions to program the device are sufficient
|
||||
*/
|
||||
async function checkProgrammable() {
|
||||
butProgram.disabled = getValidFiles().length == 0;
|
||||
butProgram.disabled = getValidFiles().length == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -370,22 +394,22 @@ async function checkProgrammable() {
|
|||
* Handler for firmware upload changes
|
||||
*/
|
||||
async function checkFirmware(event) {
|
||||
let filename = event.target.value.split("\\").pop();
|
||||
let label = event.target.parentNode.querySelector("span");
|
||||
let icon = event.target.parentNode.querySelector("svg");
|
||||
if (filename != "") {
|
||||
if (filename.length > 17) {
|
||||
label.innerHTML = filename.substring(0, 14) + "…";
|
||||
let filename = event.target.value.split("\\").pop();
|
||||
let label = event.target.parentNode.querySelector("span");
|
||||
let icon = event.target.parentNode.querySelector("svg");
|
||||
if (filename != "") {
|
||||
if (filename.length > 17) {
|
||||
label.innerHTML = filename.substring(0, 14) + "…";
|
||||
} else {
|
||||
label.innerHTML = filename;
|
||||
}
|
||||
icon.classList.add("hidden");
|
||||
} else {
|
||||
label.innerHTML = filename;
|
||||
label.innerHTML = "Choose a file…";
|
||||
icon.classList.remove("hidden");
|
||||
}
|
||||
icon.classList.add("hidden");
|
||||
} else {
|
||||
label.innerHTML = "Choose a file…";
|
||||
icon.classList.remove("hidden");
|
||||
}
|
||||
|
||||
await checkProgrammable();
|
||||
await checkProgrammable();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -393,71 +417,70 @@ async function checkFirmware(event) {
|
|||
* Click handler for the clear button.
|
||||
*/
|
||||
async function clickClear() {
|
||||
// reset(); Reset function wasnt declared.
|
||||
log.innerHTML = "";
|
||||
// reset(); Reset function wasnt declared.
|
||||
log.innerHTML = "";
|
||||
}
|
||||
|
||||
function convertJSON(chunk) {
|
||||
try {
|
||||
let jsonObj = JSON.parse(chunk);
|
||||
return jsonObj;
|
||||
} catch (e) {
|
||||
return chunk;
|
||||
}
|
||||
try {
|
||||
let jsonObj = JSON.parse(chunk);
|
||||
return jsonObj;
|
||||
} catch (e) {
|
||||
return chunk;
|
||||
}
|
||||
}
|
||||
|
||||
function toggleUIToolbar(show) {
|
||||
isConnected = show;
|
||||
for (let i = 0; i < 4; i++) {
|
||||
progress[i].classList.add("hidden");
|
||||
progress[i].querySelector("div").style.width = "0";
|
||||
}
|
||||
if (show) {
|
||||
appDiv.classList.add("connected");
|
||||
} else {
|
||||
appDiv.classList.remove("connected");
|
||||
}
|
||||
butErase.disabled = !show;
|
||||
for (let i = 0; i < 4; i++) {
|
||||
progress[i].classList.add("hidden");
|
||||
progress[i].querySelector("div").style.width = "0";
|
||||
}
|
||||
if (show) {
|
||||
appDiv.classList.add("connected");
|
||||
} else {
|
||||
appDiv.classList.remove("connected");
|
||||
}
|
||||
butErase.disabled = !show;
|
||||
}
|
||||
|
||||
function toggleUIConnected(connected) {
|
||||
let lbl = "Connect";
|
||||
if (connected) {
|
||||
lbl = "Disconnect";
|
||||
} else {
|
||||
toggleUIToolbar(false);
|
||||
}
|
||||
butConnect.textContent = lbl;
|
||||
let lbl = "Connect";
|
||||
if (connected) {
|
||||
lbl = "Disconnect";
|
||||
} else {
|
||||
toggleUIToolbar(false);
|
||||
}
|
||||
butConnect.textContent = lbl;
|
||||
}
|
||||
|
||||
function loadAllSettings() {
|
||||
// Load all saved settings or defaults
|
||||
autoscroll.checked = loadSetting("autoscroll", true);
|
||||
baudRate.value = loadSetting("baudrate", 115200);
|
||||
darkMode.checked = loadSetting("darkmode", false);
|
||||
noReset.checked = loadSetting("noReset", false);
|
||||
// Load all saved settings or defaults
|
||||
autoscroll.checked = loadSetting("autoscroll", true);
|
||||
baudRate.value = loadSetting("baudrate", 115200);
|
||||
darkMode.checked = loadSetting("darkmode", false);
|
||||
noReset.checked = loadSetting("noReset", false);
|
||||
}
|
||||
|
||||
function loadSetting(setting, defaultValue) {
|
||||
let value = JSON.parse(window.localStorage.getItem(setting));
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
let value = JSON.parse(window.localStorage.getItem(setting));
|
||||
if (value == null) {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
return value;
|
||||
return value;
|
||||
}
|
||||
|
||||
function saveSetting(setting, value) {
|
||||
window.localStorage.setItem(setting, JSON.stringify(value));
|
||||
window.localStorage.setItem(setting, JSON.stringify(value));
|
||||
}
|
||||
|
||||
function ucWords(text) {
|
||||
return text
|
||||
.replace("_", " ")
|
||||
.toLowerCase()
|
||||
.replace(/(?<= )[^\s]|^./g, (a) => a.toUpperCase());
|
||||
return text
|
||||
.replace("_", " ")
|
||||
.toLowerCase()
|
||||
.replace(/(?<= )[^\s]|^./g, (a) => a.toUpperCase());
|
||||
}
|
||||
|
||||
function sleep(ms) {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
|
|
|||
25
package-lock.json
generated
25
package-lock.json
generated
|
|
@ -10,6 +10,7 @@
|
|||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/node": "^22.9.0",
|
||||
"esptool-js": "^0.4.7",
|
||||
"pako": "^2.1.0",
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
|
|
@ -617,6 +618,12 @@
|
|||
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/atob-lite": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz",
|
||||
"integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
|
|
@ -845,10 +852,11 @@
|
|||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"version": "7.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
"shebang-command": "^2.0.0",
|
||||
|
|
@ -897,6 +905,17 @@
|
|||
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/esptool-js": {
|
||||
"version": "0.4.7",
|
||||
"resolved": "https://registry.npmjs.org/esptool-js/-/esptool-js-0.4.7.tgz",
|
||||
"integrity": "sha512-xVwtSVDRsvjXSEvNFrorgJfB71RFFkZkL+hs7O7gW5hgPrKGywZxo2U5LJddzkJ6eE31QinNVyywc0OaSntZCw==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"atob-lite": "^2.0.0",
|
||||
"pako": "^2.1.0",
|
||||
"tslib": "^2.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@types/node": "^22.9.0",
|
||||
"esptool-js": "^0.4.7",
|
||||
"pako": "^2.1.0",
|
||||
"tslib": "^2.8.1"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue