diff --git a/ESPLoader.js b/ESPLoader.js index 12a2d22..ac2c341 100644 --- a/ESPLoader.js +++ b/ESPLoader.js @@ -1254,6 +1254,7 @@ class ESPLoader { await this.run_stub(); await this.change_baud(); + return chip; } diff --git a/assets/esp-logo.png b/assets/esp-logo.png new file mode 100644 index 0000000..e4cb438 Binary files /dev/null and b/assets/esp-logo.png differ diff --git a/index.html b/index.html index 3118f90..3bd78d5 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,7 @@ ESP Tool + + + -

ESP Tool

-
+

ESP Tool

+

A Serial Flasher utility for Espressif chips

+
+
-

Program

- +

Program

+ + - - + + + + +

+ + +
-
- -
- - - -
- - - -
- - - -
- + + + + + + + + + + + + + + + +
Flash AddressSelected FileRemove
+ +
-

-

Console

- - - +

Console

+ + + + +
+
-
+ diff --git a/index.js b/index.js index a99aea5..6b8ebef 100644 --- a/index.js +++ b/index.js @@ -10,7 +10,11 @@ const filesDiv = document.getElementById("files"); const terminal = document.getElementById("terminal"); const programDiv = document.getElementById("program"); const consoleDiv = document.getElementById("console"); - +const lblBaudrate = document.getElementById("lblBaudrate"); +const lblConnTo = document.getElementById("lblConnTo"); +const tableBody = document.getElementById("tableBody"); +const table = document.getElementById('fileTable'); +const alertDiv = document.getElementById('alertDiv'); //import { Transport } from './cp210x-webusb.js' import { Transport } from './webserial.js' @@ -21,12 +25,14 @@ term.open(terminal); let device = null; let transport; -let chip; +let chip = "deFault"; let esploader; -let file1 = null, file2 = null, file3 = null; +let file1 = null; let connected = false; +let index = 1; disconnectButton.style.display = "none"; +eraseButton.style.display = "none"; consoleStopButton.style.display = "none"; filesDiv.style.display = "none"; @@ -47,52 +53,23 @@ function convertBinaryStringToUint8Array(bStr) { return u8_array; } -function handleFileSelect1(evt) { +function handleFileSelect(evt) { var file = evt.target.files[0]; - console.log(file); var reader = new FileReader(); reader.onload = (function(theFile) { return function(e) { file1 = e.target.result; - + evt.target.data = file1; }; })(file); reader.readAsBinaryString(file); } -function handleFileSelect2(evt) { - var file = evt.target.files[0]; - console.log(file); - var reader = new FileReader(); - reader.onload = (function(theFile) { - return function(e) { - file2 = e.target.result; - }; - })(file); +document.getElementById('selectFile1').addEventListener('change', handleFileSelect, false); - reader.readAsBinaryString(file); -} - -function handleFileSelect3(evt) { - var file = evt.target.files[0]; - console.log(file); - var reader = new FileReader(); - - reader.onload = (function(theFile) { - return function(e) { - file3 = e.target.result; - }; - })(file); - - reader.readAsBinaryString(file); -} - -document.getElementById('selectFile1').addEventListener('change', handleFileSelect1, false); -document.getElementById('selectFile2').addEventListener('change', handleFileSelect2, false); -document.getElementById('selectFile3').addEventListener('change', handleFileSelect3, false); function _sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -113,15 +90,20 @@ connectButton.onclick = async () => { esploader = new ESPLoader(transport, baudrates.value, term); connected = true; - await esploader.main_fn(); + chip = await esploader.main_fn(); + await esploader.flash_id(); } catch(e) { } - console.log("Settings done"); + console.log("Settings done for :" + chip); + lblBaudrate.style.display = "none"; + lblConnTo.innerHTML = "Connected to device: " + chip; + lblConnTo.style.display = "block"; baudrates.style.display = "none"; connectButton.style.display = "none"; disconnectButton.style.display = "initial"; + eraseButton.style.display = "initial"; filesDiv.style.display = "initial"; consoleDiv.style.display = "none"; } @@ -141,11 +123,57 @@ resetButton.onclick = async () => { eraseButton.onclick = async () => { eraseButton.disabled = true; - console.log("Erase Flash"); await esploader.erase_flash(); eraseButton.disabled = false; } +addFile.onclick = async () => { + var rowCount = table.rows.length; + var row = table.insertRow(rowCount); + + //Column 1 - Offset + var cell1 = row.insertCell(0); + var element1 = document.createElement("input"); + element1.type = "text"; + element1.id = "offset" + rowCount; + element1.setAttribute('value', '0x8000'); + cell1.appendChild(element1); + + // Column 2 - File selector + var cell2 = row.insertCell(1); + var element2 = document.createElement("input"); + element2.type = "file"; + element2.id = "selectFile" + rowCount; + element2.name = "selected_File" + rowCount; + element2.addEventListener('change', handleFileSelect, false); + cell2.appendChild(element2); + + // Column 3 - Remove File + var cell3 = row.insertCell(2); + var element3 = document.createElement("input"); + element3.type = "button"; + var btnName = "button" + rowCount; + element3.name = btnName; + element3.setAttribute('class', "btn"); + element3.setAttribute('value', 'Remove'); // or element1.value = "button"; + element3.onclick = function() { + removeRow(btnName); + } + cell3.appendChild(element3); +} + +function removeRow(btnName) { + var rowCount = table.rows.length; + for (var i = 0; i < rowCount; i++) { + var row = table.rows[i]; + var rowObj = row.cells[2].childNodes[0]; + if (rowObj.name == btnName) { + table.deleteRow(i); + rowCount--; + } + } +} + disconnectButton.onclick = async () => { await transport.disconnect(); term.clear(); @@ -153,7 +181,10 @@ disconnectButton.onclick = async () => { baudrates.style.display = "initial"; connectButton.style.display = "initial"; disconnectButton.style.display = "none"; + eraseButton.style.display = "none"; + lblConnTo.style.display = "none"; filesDiv.style.display = "none"; + alertDiv.style.display = "none"; consoleDiv.style.display = "initial"; }; @@ -164,7 +195,7 @@ consoleStartButton.onclick = async () => { }); transport = new Transport(device); } - + lblConsoleFor.style.display = "block"; consoleStartButton.style.display = "none"; consoleStopButton.style.display = "initial"; programDiv.style.display = "none"; @@ -190,19 +221,61 @@ consoleStopButton.onclick = async () => { programDiv.style.display = "initial"; } -programButton.onclick = async () => { - let fileArr = []; - if (file1 != null) { - let offset1 = parseInt(document.getElementById("offset1").value); - fileArr.push({data:file1, address:offset1}); +function validate_program_inputs() { + let offsetArr = [] + var rowCount = table.rows.length; + var row; + let offset = 0; + let fileData = null; + + // check for mandatory fields + for (let index = 1; index < rowCount; index ++) { + row = table.rows[index]; + + //offset fields checks + var offSetObj = row.cells[0].childNodes[0]; + offset = parseInt(offSetObj.value); + + // Non-numeric or blank offset + if (Number.isNaN(offset)) + return "Offset field in row " + index + " is not a valid address!" + // Repeated offset used + else if (offsetArr.includes(offset)) + return "Offset field in row " + index + " is already in use!"; + else + offsetArr.push(offset); + + var fileObj = row.cells[1].childNodes[0]; + fileData = fileObj.data; + if (fileData == null) + return "No file selected for row: " + index + "!"; + } - if (file2 != null) { - let offset2 = parseInt(document.getElementById("offset2").value); - fileArr.push({data:file2, address:offset2}); - } - if (file3 != null) { - let offset3 = parseInt(document.getElementById("offset3").value); - fileArr.push({data:file3, address:offset3}); - } - await esploader.write_flash({fileArray: fileArr, flash_size: 'keep'}); + return "success" +} + +programButton.onclick = async () => { + var err = validate_program_inputs(); + if (err != "success") { + const alertMsg = document.getElementById("alertmsg"); + alertMsg.innerHTML = "" + err + ""; + alertDiv.style.display = "block"; + return; + } + + let fileArr = []; + let offset = 0x1000; + var rowCount = table.rows.length; + var row; + for (let index = 1; index < rowCount; index ++) { + row = table.rows[index]; + var offSetObj = row.cells[0].childNodes[0]; + offset = parseInt(offSetObj.value); + + var fileObj = row.cells[1].childNodes[0]; + + fileArr.push({data:fileObj.data, address:offset}); + } + esploader.write_flash({fileArray: fileArr, flash_size: 'keep'}); + }