wifiSta.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. var currAp = "";
  2. var blockScan = 0;
  3. function createInputForAp(ap) {
  4. if (ap.essid=="" && ap.rssi==0) return;
  5. var input = e("input");
  6. input.type = "radio";
  7. input.name = "essid";
  8. input.value=ap.essid;
  9. input.id = "opt-" + ap.essid;
  10. if (currAp == ap.essid) input.checked = "1";
  11. var bars = e("div");
  12. var rssiVal = -Math.floor(ap.rssi/51)*32;
  13. bars.className = "lock-icon";
  14. bars.style.backgroundPosition = "0px "+(rssiVal-1)+"px";
  15. var rssi = e("div");
  16. rssi.innerHTML = "" + ap.rssi +"dB";
  17. var encrypt = e("div");
  18. var encVal = "-65"; //assume wpa/wpa2
  19. if (ap.enc == "0") encVal = "0"; //open
  20. if (ap.enc == "1") encVal = "-33"; //wep
  21. encrypt.className = "lock-icon";
  22. encrypt.style.backgroundPosition = "-32px "+encVal+"px";
  23. var label = e("div");
  24. label.innerHTML = ap.essid;
  25. var div = m('<label for=\"opt-' + ap.essid + '"></label>').childNodes[0];
  26. div.appendChild(input);
  27. div.appendChild(encrypt);
  28. div.appendChild(bars);
  29. div.appendChild(rssi);
  30. div.appendChild(label);
  31. return div;
  32. }
  33. function getSelectedEssid() {
  34. var e = document.forms.wifiform.elements;
  35. for (var i=0; i<e.length; i++) {
  36. if (e[i].type == "radio" && e[i].checked) {
  37. var v = e[i].value;
  38. if (v == "_hidden_ssid_") v = $("#hidden-ssid").value;
  39. return v;
  40. }
  41. }
  42. return currAp;
  43. }
  44. var scanTimeout = null;
  45. var scanReqCnt = 0;
  46. function scanResult() {
  47. if (scanReqCnt > 60) {
  48. return scanAPs();
  49. }
  50. scanReqCnt += 1;
  51. ajaxJson('GET', "/wifi/scan", function(data) {
  52. currAp = getSelectedEssid();
  53. if (data.result.inProgress == "0" && data.result.APs.length > 0) {
  54. $("#aps").innerHTML = "";
  55. var n = 0;
  56. for (var i=0; i<data.result.APs.length; i++) {
  57. if (data.result.APs[i].essid == "" && data.result.APs[i].rssi == 0) continue;
  58. if($("#opt-"+data.result.APs[i].essid) != null) continue; // skip duplicate essids
  59. $("#aps").appendChild(createInputForAp(data.result.APs[i]));
  60. n = n+1;
  61. }
  62. showNotification("Scan found " + n + " networks");
  63. var cb = $("#connect-button");
  64. cb.className = cb.className.replace(" pure-button-disabled", "");
  65. if (scanTimeout != null) clearTimeout(scanTimeout);
  66. // scanTimeout = window.setTimeout(scanAPs, 20000);
  67. } else {
  68. window.setTimeout(scanResult, 1000);
  69. }
  70. }, function(s, st) {
  71. window.setTimeout(scanResult, 5000);
  72. });
  73. }
  74. function scanAPs() {
  75. // console.log("scanning now");
  76. if (blockScan) {
  77. scanTimeout = window.setTimeout(scanAPs, 1000);
  78. return;
  79. }
  80. scanTimeout = null;
  81. scanReqCnt = 0;
  82. ajaxReq('POST', "/wifi/scan", function(data) {
  83. showNotification("Wifi scan started");
  84. window.setTimeout(scanResult, 1000);
  85. }, function(s, st) {
  86. if (s == 400) {
  87. showWarning("Cannot scan in AP mode");
  88. $("#aps").innerHTML =
  89. "Switch to <a href=\"#\" onclick=\"changeWifiMode(3)\">STA+AP mode</a> to scan.";
  90. } else showWarning("Failed to scan: " + st);
  91. //window.setTimeout(scanResult, 1000);
  92. });
  93. }
  94. function getStatus() {
  95. ajaxJsonSpin("GET", "/wifi/connstatus", function(data) {
  96. if (data.status == "idle" || data.status == "connecting") {
  97. $("#aps").innerHTML = "Connecting...";
  98. showNotification("Connecting...");
  99. window.setTimeout(getStatus, 1000);
  100. } else if (data.status == "got IP address") {
  101. var txt = "Connected! Got IP "+data.ip;
  102. showNotification(txt);
  103. showWifiInfo(data);
  104. blockScan = 0;
  105. if (data.modechange == "yes") {
  106. var txt2 = "meta-id will switch to STA-only mode in a few seconds";
  107. window.setTimeout(function() { showNotification(txt2); }, 4000);
  108. }
  109. $("#reconnect").removeAttribute("hidden");
  110. $("#reconnect").innerHTML =
  111. "If you are in the same network, go to <a href=\"http://"+data.ip+
  112. "/\">"+data.ip+"</a>, else connect to network "+data.ssid+" first.";
  113. } else {
  114. blockScan = 0;
  115. showWarning("Connection failed: " + data.status + ", " + data.reason);
  116. $("#aps").innerHTML =
  117. "Check password and selected AP. <a href=\"wifi.tpl\">Go Back</a>";
  118. }
  119. }, function(s, st) {
  120. //showWarning("Can't get status: " + st);
  121. window.setTimeout(getStatus, 2000);
  122. });
  123. }
  124. function changeWifiMode(m) {
  125. blockScan = 1;
  126. hideWarning();
  127. ajaxSpin("POST", "/wifi/setmode?mode=" + m, function(resp) {
  128. showNotification("Mode changed");
  129. window.setTimeout(getWifiInfo, 100);
  130. blockScan = 0;
  131. window.setTimeout(scanAPs, 500);
  132. $("#aps").innerHTML = 'Scanning... <div class="spinner spinner-small"></div>';
  133. }, function(s, st) {
  134. showWarning("Error changing mode: " + st);
  135. window.setTimeout(getWifiInfo, 100);
  136. blockScan = 0;
  137. });
  138. }
  139. function changeWifiAp(e) {
  140. e.preventDefault();
  141. var passwd = $("#wifi-passwd").value;
  142. var essid = getSelectedEssid();
  143. showNotification("Connecting to " + essid);
  144. var url = "/wifi/connect?essid="+encodeURIComponent(essid)+"&passwd="+encodeURIComponent(passwd);
  145. hideWarning();
  146. $("#reconnect").setAttribute("hidden", "");
  147. $("#wifi-passwd").value = "";
  148. var cb = $("#connect-button");
  149. var cn = cb.className;
  150. cb.className += ' pure-button-disabled';
  151. blockScan = 1;
  152. ajaxSpin("POST", url, function(resp) {
  153. $("#spinner").removeAttribute('hidden'); // hack
  154. showNotification("Waiting for network change...");
  155. window.scrollTo(0, 0);
  156. window.setTimeout(getStatus, 2000);
  157. }, function(s, st) {
  158. showWarning("Error switching network: "+st);
  159. cb.className = cn;
  160. window.setTimeout(scanAPs, 1000);
  161. });
  162. }
  163. function changeSpecial(e) {
  164. e.preventDefault();
  165. var url = "/wifi/special";
  166. url += "?dhcp=" + document.querySelector('input[name="dhcp"]:checked').value;
  167. url += "&staticip=" + encodeURIComponent($("#wifi-staticip").value);
  168. url += "&netmask=" + encodeURIComponent($("#wifi-netmask").value);
  169. url += "&gateway=" + encodeURIComponent($("#wifi-gateway").value);
  170. hideWarning();
  171. var cb = $("#special-button");
  172. addClass(cb, 'pure-button-disabled');
  173. ajaxSpin("POST", url, function(resp) {
  174. removeClass(cb, 'pure-button-disabled');
  175. //getWifiInfo(); // it takes 1 second for new settings to be applied
  176. }, function(s, st) {
  177. showWarning("Error: "+st);
  178. removeClass(cb, 'pure-button-disabled');
  179. getWifiInfo();
  180. });
  181. }
  182. function doDhcp() {
  183. $('#dhcp-on').removeAttribute('hidden');
  184. $('#dhcp-off').setAttribute('hidden', '');
  185. }
  186. function doStatic() {
  187. $('#dhcp-off').removeAttribute('hidden');
  188. $('#dhcp-on').setAttribute('hidden', '');
  189. }
  190. //===== MQTT cards
  191. function changeMqtt(e) {
  192. e.preventDefault();
  193. var url = "mqtt?1=1";
  194. var i, inputs = document.querySelectorAll('#mqtt-form input');
  195. for (i = 0; i < inputs.length; i++) {
  196. if (inputs[i].type != "checkbox")
  197. url += "&" + inputs[i].name + "=" + inputs[i].value;
  198. };
  199. hideWarning();
  200. var cb = $("#mqtt-button");
  201. addClass(cb, 'pure-button-disabled');
  202. ajaxSpin("POST", url, function (resp) {
  203. showNotification("MQTT updated");
  204. removeClass(cb, 'pure-button-disabled');
  205. }, function (s, st) {
  206. showWarning("Error: " + st);
  207. removeClass(cb, 'pure-button-disabled');
  208. window.setTimeout(fetchMqtt, 100);
  209. });
  210. }
  211. function displayMqtt(data) {
  212. Object.keys(data).forEach(function (v) {
  213. el = $("#" + v);
  214. if (el != null) {
  215. if (el.nodeName === "INPUT") el.value = data[v];
  216. else el.innerHTML = data[v];
  217. return;
  218. }
  219. el = document.querySelector('input[name="' + v + '"]');
  220. if (el != null) {
  221. if (el.type == "checkbox") el.checked = data[v] > 0;
  222. else el.value = data[v];
  223. }
  224. });
  225. var i, inputs = $("input");
  226. for (i = 0; i < inputs.length; i++) {
  227. if (inputs[i].type == "checkbox")
  228. inputs[i].onclick = function () { setMqtt(this.name, this.checked) };
  229. }
  230. }
  231. function fetchMqtt() {
  232. ajaxJson("GET", "/mqtt", displayMqtt, function () {
  233. window.setTimeout(fetchMqtt, 1000);
  234. });
  235. }
  236. function changeMqttStatus(e) {
  237. e.preventDefault();
  238. var v = document.querySelector('input[name="mqtt-status-topic"]').value;
  239. ajaxSpin("POST", "/mqtt?mqtt-status-topic=" + v, function () {
  240. showNotification("MQTT status settings updated");
  241. }, function (s, st) {
  242. showWarning("Error: " + st);
  243. window.setTimeout(fetchMqtt, 100);
  244. });
  245. }
  246. function changeMqttTest(e) {
  247. e.preventDefault();
  248. var v = document.querySelector('input[name="mqtt-test-topic"]').value;
  249. ajaxSpin("POST", "/mqtt?mqtt-test-topic=" + v, function () {
  250. showNotification("MQTT test settings updated");
  251. }, function (s, st) {
  252. showWarning("Error: " + st);
  253. window.setTimeout(fetchMqtt, 100);
  254. });
  255. }
  256. function setMqtt(name, v) {
  257. ajaxSpin("POST", "/mqtt?" + name + "=" + (v ? 1 : 0), function () {
  258. var n = name.replace("-enable", "");
  259. showNotification(n + " is now " + (v ? "enabled" : "disabled"));
  260. }, function () {
  261. showWarning("Enable/disable failed");
  262. window.setTimeout(fetchMqtt, 100);
  263. });
  264. }