<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> <meta name="apple-mobile-web-app-capable" content="yes" /> <script src="/jquery.js"></script> <link rel="stylesheet" href="/style.css"> <script src="/code.js"></script> <title>esp32-wifi-manager</title> </head> <script> var ws, sel, host, old, once = 0, jso, m; var to = 0, set_int = 0; function get_radio(name) { var s = document.getElementsByName(name), sel; for ( var i = 0; i < s.length; i++) if (s[i].checked) { sel = s[i].value; break; } return sel; } function get_radio_index(name) { var s = document.getElementsByName(name), i; for (i = 0; i < s.length; i++) if (s[i].checked) return i; return -1; } function do_reset() { var s = "{\"reset\":\"1\"}"; try { ws.send(s); } catch(exception) { alert('Sorry, there was a problem' + exception); } ws.close(); alert("Rebooting..."); } function file_change() { document.getElementById('update').disabled = 0; } function do_upload(f) { var xhr = new XMLHttpRequest(); document.getElementById('update').disabled = 1; //ws.close(); document.getElementById("progr").class = "progr-ok"; xhr.upload.addEventListener("progress", function(e) { document.getElementById("progr").value = parseInt(e.loaded / e.total * 100); if (e.loaded == e.total) { // document.getElementById("realpage").style.display = "none"; // document.getElementById("waiting").style.display = "block"; } }, false); xhr.onreadystatechange = function(e) { console.log("rs" + xhr.readyState + " status " + xhr.status); if (xhr.readyState == 4) { /* it completed, for good or for ill */ // document.getElementById("realpage").style.display = "none"; // document.getElementById("waiting").style.display = "block"; document.getElementById("progr").class = "progr-ok"; console.log("upload reached state 4: xhr status " + xhr.status); setTimeout(function() { window.location.href = location.origin + "/"; }, 9000 ); } }; /* kill the heart timer */ clearInterval(set_int); xhr.open("POST", f.action, true); xhr.send(new FormData(f)); return false; } function do_settings(f) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(e) { console.log("do_settings" + xhr.readyState + " status " + xhr.status); if (xhr.readyState == 4) { document.getElementById("updsettings").style.opacity = "1.0"; document.getElementById("updsettings").disabled = 0; } }; xhr.open("POST", f.action, true); document.getElementById("updsettings").style.opacity = "0.3"; document.getElementById("updsettings").disabled = 1; xhr.send(new FormData(f)); return false; } function get_latest(n) { if (n == 0) ws.send("update-ota"); else ws.send("update-factory"); } function heart_timer() { var s; s = Math.round((95 * to) / (40 * 10)) / 100; if (s < 0) { clearInterval(set_int); set_int = 0; ws.close(); document.getElementById("realpage").style.opacity = "0.3"; } to--; document.getElementById("heart").style.opacity = s; } function heartbeat() { to = 40 * 10; if (!set_int) { set_int = setInterval(heart_timer, 100); } } function handleClick(cb) { if (cb.checked) { $("#autoexec-command").show(200); } else { $("#autoexec-command").hide(200); } } </script> <body> <div id="app"> <div id="app-wrap"> <div id="command_line"> <header> <h1>Startup command</h1> </header> <h2> <div id="autoexec" class="toggle"> <label>Run automatically at boot <input id="autoexec-cb" type="checkbox" checked="checked" onclick='handleClick(this);'/><span class="slider"></span> </label> </div> </h2> <div id="autoexec-command"> <h2>Command to run</h2> <section id="command-list"> <textarea id="autoexec1" maxlength="120">squeezelite -o I2S -b 500:2000 -d all=info -M esp32</textarea> </section> </div> <div class="buttons"> <input id="update-command" type="button" value="Update" /> </div> </div> <div id="otadiv"> <header><h1>Firmware upgrade</h1></header> <form name="multipart" action="otaform" method="post" enctype="multipart/form-data" onsubmit="do_upload(this); return false;"> <progress id="progr" value="0" max="100" >Upload Progress</progress> <input type="file" name="ota" id="ota" size="20" accept=".bin" onchange="file_change();" style="font-size: 12pt"> <span id="file_info" style="font-size:12pt;"></span> <input type="submit" id="update" disabled="" value="upload"> <input type="submit" id="factory" disabled="" value="factory"> </form> </div> <div id="wifi"> <header> <h1>Wi-Fi</h1> </header> <div id="wifi-status"> <h2>Connected to:</h2> <section id="connected-to"> <div class="ape"><div class="w0"><div class="pw"><span></span></div></div></div> </section> </div> <h2>Manual connect</h2> <section id="manual_add"> <div class="ape">ADD (HIDDEN) SSID<div> </section> <h2>or choose a network...</h2> <section id="wifi-list"> </section> <div id="pwrdby"><em>Powered by </em><a id="acredits" href="#"><strong>esp32-wifi-manager</strong></a>.</div> </div> <div id="connect_manual"> <header> <h1>Enter Details</h1> </header> <h2>Manual Connection</h2> <section> <input id="manual_ssid" type="text" placeholder="SSID" value=""> <input id="manual_pwd" type="password" placeholder="Password" value=""> </section> <div class="buttons"> <input id="manual_join" type="button" value="Join" data-connect="manual" /> <input id="manual_cancel" type="button" value="Cancel"/> </div> </div> <div id="connect"> <header> <h1>Enter Password</h1> </header> <h2>Password for <span id="ssid-pwd"></span></h2> <section> <input id="pwd" type="password" placeholder="Password" value=""> </section> <div class="buttons"> <input id="join" type="button" value="Join" /> <input id="cancel" type="button" value="Cancel"/> </div> </div> <div id="connect-wait"> <header> <h1>Please wait...</h1> </header> <h2>Connecting to <span id="ssid-wait"></span></h2> <section> <div id="loading"> <div class="spinner"><div class="double-bounce1"></div><div class="double-bounce2"></div></div> <p class="tctr">You may lose wifi access while the esp32 recalibrates its radio. Please wait until your device automatically reconnects. This can take up to 30s.</p> </div> <div id="connect-success"> <h3 class="gr">Success!</h3> </div> <div id="connect-fail"> <h3 class="rd">Connection failed</h3> <p class="tctr">Please double-check wifi password if any and make sure the access point has good signal.</p> </div> </section> <div class="buttons"> <input id="ok-connect" type="button" value="OK" class="ctr" /> </div> </div> <div id="connect-details"> <div id="connect-details-wrap"> <header> <h1></h1> </header> <h2></h2> <section> <div class="buttons"> <input id="disconnect" type="button" value="Disconnect" class="ctr"/> </div> </section> <h2>IP Address</h2> <section> <div class="ape brdb">IP Address:<div id="ip" class="fr"></div></div> <div class="ape brdb">Subnet Mask:<div id="netmask" class="fr"></div></div> <div class="ape">Default Gateway:<div id="gw" class="fr"></div></div> </section> <div class="buttons"> <input id="ok-details" type="button" value="OK" class="ctr" /> </div> </div> <div id="diag-disconnect" class="diag-box"> <div class="diag-box-win"> <p>Are you sure you would like to disconnect from this wifi?</p> <div class="buttons"> <input id="no-disconnect" type="button" value="No" /> <input id="yes-disconnect" type="button" value="Yes" /> </div> </div> </div> </div> </div> </div> <div id="credits"> <header> <h1>About this app...</h1> </header> <h2></h2> <section> <p><strong>esp32-wifi-manager</strong>, © 2017-2019, Tony Pottier<br />Licender under the MIT License.</p> <p> This app would not be possible without the following libraries: </p> <ul> <li>SpinKit, © 2015, Tobias Ahlin. Licensed under the MIT License.</li> <li>jQuery, The jQuery Foundation. Licensed under the MIT License.</li> <li>cJSON, © 2009-2017, Dave Gamble and cJSON contributors. Licensed under the MIT License.</li> </ul> </section> <div class="buttons"> <input id="ok-credits" type="button" value="OK" class="ctr" /> </div> </div> </body> <html>