From f337e0335d3e96da0d90853351b0e54e45c82c93 Mon Sep 17 00:00:00 2001
From: Alex Janka <alex@alexjanka.com>
Date: Sat, 28 Dec 2024 09:18:26 +1100
Subject: [PATCH] webapp: formatting

---
 webapp/index.html           |   2 +-
 webapp/info/index.html      |   2 +-
 webapp/pid/index.html       |   2 +-
 webapp/regulator/index.html |   2 +-
 webapp/script.js            | 638 +++++++++++++++++++-----------------
 webapp/shutoff/index.html   |   2 +-
 webapp/style.css            | 115 ++++---
 7 files changed, 397 insertions(+), 366 deletions(-)

diff --git a/webapp/index.html b/webapp/index.html
index e0da197..f368d35 100644
--- a/webapp/index.html
+++ b/webapp/index.html
@@ -41,4 +41,4 @@
 	</div>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/webapp/info/index.html b/webapp/info/index.html
index 8358971..e19994e 100644
--- a/webapp/info/index.html
+++ b/webapp/info/index.html
@@ -20,4 +20,4 @@
 	</div>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/webapp/pid/index.html b/webapp/pid/index.html
index fae88ce..0818cc7 100644
--- a/webapp/pid/index.html
+++ b/webapp/pid/index.html
@@ -30,4 +30,4 @@
 	</div>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/webapp/regulator/index.html b/webapp/regulator/index.html
index 9ee579d..7e53657 100644
--- a/webapp/regulator/index.html
+++ b/webapp/regulator/index.html
@@ -31,4 +31,4 @@
 	</div>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/webapp/script.js b/webapp/script.js
index b3b0738..3a60c7f 100644
--- a/webapp/script.js
+++ b/webapp/script.js
@@ -1,89 +1,92 @@
-const api_url = window.location.protocol + "//" + window.location.hostname + ":" + window.location.port;
+const api_url =
+  window.location.protocol +
+  "//" +
+  window.location.hostname +
+  ":" +
+  window.location.port;
 
 Object.prototype.disable = function () {
-	var that = this;
-	for (var i = 0, len = that.length; i < len; i++) {
-		that[i].disabled = true;
-	}
-	return that;
+  var that = this;
+  for (var i = 0, len = that.length; i < len; i++) {
+    that[i].disabled = true;
+  }
+  return that;
 };
 
 Object.prototype.enable = function () {
-	var that = this;
-	for (var i = 0, len = that.length; i < len; i++) {
-		that[i].disabled = false;
-	}
-	return that;
+  var that = this;
+  for (var i = 0, len = that.length; i < len; i++) {
+    that[i].disabled = false;
+  }
+  return that;
 };
 
-
 function init_main() {
-	refresh_interval = register(refresh);
+  refresh_interval = register(refresh);
 
-	refresh();
-	document.addEventListener("visibilitychange", () => {
-		if (document.hidden) {
-			clearInterval(refresh_interval);
-		} else {
-			refresh();
-			refresh_interval = register(refresh);
-		}
-	});
+  refresh();
+  document.addEventListener("visibilitychange", () => {
+    if (document.hidden) {
+      clearInterval(refresh_interval);
+    } else {
+      refresh();
+      refresh_interval = register(refresh);
+    }
+  });
 }
 
 function init_pid() {
-	refresh_gains();
-	document.addEventListener("visibilitychange", () => {
-		if (!document.hidden) {
-			refresh_gains();
-		}
-	});
+  refresh_gains();
+  document.addEventListener("visibilitychange", () => {
+    if (!document.hidden) {
+      refresh_gains();
+    }
+  });
 }
 
 function init_shutoff() {
-	refresh_shutoff();
-	document.addEventListener("visibilitychange", () => {
-		if (!document.hidden) {
-			refresh_shutoff();
-		}
-	});
+  refresh_shutoff();
+  document.addEventListener("visibilitychange", () => {
+    if (!document.hidden) {
+      refresh_shutoff();
+    }
+  });
 }
 
 function init_info() {
-	refresh_interval = register(refresh_info);
+  refresh_interval = register(refresh_info);
 
-	refresh_info();
-	document.addEventListener("visibilitychange", () => {
-		if (document.hidden) {
-			clearInterval(refresh_interval);
-		} else {
-			refresh_info();
-			refresh_interval = register(refresh_info);
-		}
-	});
+  refresh_info();
+  document.addEventListener("visibilitychange", () => {
+    if (document.hidden) {
+      clearInterval(refresh_interval);
+    } else {
+      refresh_info();
+      refresh_interval = register(refresh_info);
+    }
+  });
 }
 
 function init_regulator() {
+  refresh_interval = register(refresh_regulator_state);
 
-	refresh_interval = register(refresh_regulator_state);
-
-	refresh_regulator_state();
-	document.addEventListener("visibilitychange", () => {
-		if (document.hidden) {
-			clearInterval(refresh_interval);
-		} else {
-			refresh_regulator_state();
-			refresh_interval = register(refresh_regulator_state);
-		}
-	});
+  refresh_regulator_state();
+  document.addEventListener("visibilitychange", () => {
+    if (document.hidden) {
+      clearInterval(refresh_interval);
+    } else {
+      refresh_regulator_state();
+      refresh_interval = register(refresh_regulator_state);
+    }
+  });
 }
 
 function register(func) {
-	return setInterval(func, 5000);
+  return setInterval(func, 5000);
 }
 
 function flash() {
-	fetch(api_url + "/flash", { method: "POST" });
+  fetch(api_url + "/flash", { method: "POST" });
 }
 
 var is_automatic_control;
@@ -91,351 +94,380 @@ var current_min_rate;
 var current_max_rate;
 
 const delay = (time) => {
-	return new Promise(resolve => setTimeout(resolve, time));
+  return new Promise((resolve) => setTimeout(resolve, time));
 };
 
 function set_minimum() {
-	var set_button = document.getElementById("set-minimum");
-	var number_input = document.getElementById("min-rate");
-	if (!isNaN(number_input.value)) {
-		set_button.disabled = true;
-		number_input.disabled = true;
-		fetch(api_url + "/set-min/" + number_input.value, { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_buttons();
-			});
-	}
+  var set_button = document.getElementById("set-minimum");
+  var number_input = document.getElementById("min-rate");
+  if (!isNaN(number_input.value)) {
+    set_button.disabled = true;
+    number_input.disabled = true;
+    fetch(api_url + "/set-min/" + number_input.value, { method: "POST" }).then(
+      async (response) => {
+        let delayres = await delay(100);
+        refresh_buttons();
+      }
+    );
+  }
 }
 
 function change_min() {
-	var set_button = document.getElementById("set-minimum");
-	var number_input = document.getElementById("min-rate");
-	set_button.disabled = (number_input.value == current_min_rate);
+  var set_button = document.getElementById("set-minimum");
+  var number_input = document.getElementById("min-rate");
+  set_button.disabled = number_input.value == current_min_rate;
 }
 
 function set_maximum() {
-	var set_button = document.getElementById("set-maximum");
-	var number_input = document.getElementById("max-rate");
-	if (!isNaN(number_input.value)) {
-		set_button.disabled = true;
-		number_input.disabled = true;
-		fetch(api_url + "/set-max/" + number_input.value, { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_buttons();
-			});
-	}
+  var set_button = document.getElementById("set-maximum");
+  var number_input = document.getElementById("max-rate");
+  if (!isNaN(number_input.value)) {
+    set_button.disabled = true;
+    number_input.disabled = true;
+    fetch(api_url + "/set-max/" + number_input.value, { method: "POST" }).then(
+      async (response) => {
+        let delayres = await delay(100);
+        refresh_buttons();
+      }
+    );
+  }
 }
 
 function change_max() {
-	var set_button = document.getElementById("set-maximum");
-	var number_input = document.getElementById("max-rate");
-	set_button.disabled = (number_input.value == current_max_rate);
+  var set_button = document.getElementById("set-maximum");
+  var number_input = document.getElementById("max-rate");
+  set_button.disabled = number_input.value == current_max_rate;
 }
 
 function set_proportional() {
-	var set_button = document.getElementById("set-proportional");
-	var number_input = document.getElementById("proportional-gain");
-	if (!isNaN(number_input.value)) {
-		set_button.disabled = true;
-		number_input.disabled = true;
-		fetch(api_url + "/pid-settings/proportional/" + number_input.value, { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_gains();
-			});
-	}
+  var set_button = document.getElementById("set-proportional");
+  var number_input = document.getElementById("proportional-gain");
+  if (!isNaN(number_input.value)) {
+    set_button.disabled = true;
+    number_input.disabled = true;
+    fetch(api_url + "/pid-settings/proportional/" + number_input.value, {
+      method: "POST",
+    }).then(async (response) => {
+      let delayres = await delay(100);
+      refresh_gains();
+    });
+  }
 }
 
 function set_derivative() {
-	var set_button = document.getElementById("set-derivative");
-	var number_input = document.getElementById("derivative-gain");
-	if (!isNaN(number_input.value)) {
-		set_button.disabled = true;
-		number_input.disabled = true;
-		fetch(api_url + "/pid-settings/derivative/" + number_input.value, { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_gains();
-			});
-	}
+  var set_button = document.getElementById("set-derivative");
+  var number_input = document.getElementById("derivative-gain");
+  if (!isNaN(number_input.value)) {
+    set_button.disabled = true;
+    number_input.disabled = true;
+    fetch(api_url + "/pid-settings/derivative/" + number_input.value, {
+      method: "POST",
+    }).then(async (response) => {
+      let delayres = await delay(100);
+      refresh_gains();
+    });
+  }
 }
 
 function set_shutoff_voltage() {
-	var set_button = document.getElementById("set-shutoff-voltage");
-	var number_input = document.getElementById("shutoff-voltage");
-	if (!isNaN(number_input.value)) {
-		set_button.disabled = true;
-		number_input.disabled = true;
-		fetch(api_url + "/shutoff/voltage/" + number_input.value, { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_shutoff();
-			});
-	}
+  var set_button = document.getElementById("set-shutoff-voltage");
+  var number_input = document.getElementById("shutoff-voltage");
+  if (!isNaN(number_input.value)) {
+    set_button.disabled = true;
+    number_input.disabled = true;
+    fetch(api_url + "/shutoff/voltage/" + number_input.value, {
+      method: "POST",
+    }).then(async (response) => {
+      let delayres = await delay(100);
+      refresh_shutoff();
+    });
+  }
 }
 
 function set_shutoff_time() {
-	var set_button = document.getElementById("set-shutoff-time");
-	var number_input = document.getElementById("shutoff-time");
-	if (!isNaN(number_input.value)) {
-		set_button.disabled = true;
-		number_input.disabled = true;
-		fetch(api_url + "/shutoff/time/" + number_input.value, { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_shutoff();
-			});
-	}
+  var set_button = document.getElementById("set-shutoff-time");
+  var number_input = document.getElementById("shutoff-time");
+  if (!isNaN(number_input.value)) {
+    set_button.disabled = true;
+    number_input.disabled = true;
+    fetch(api_url + "/shutoff/time/" + number_input.value, {
+      method: "POST",
+    }).then(async (response) => {
+      let delayres = await delay(100);
+      refresh_shutoff();
+    });
+  }
 }
 
 function set_regulator_state() {
-	var set_button = document.getElementById("set-regulator-state");
-	var state_input = document.getElementById("regstate");
+  var set_button = document.getElementById("set-regulator-state");
+  var state_input = document.getElementById("regstate");
 
-	set_button.disabled = true;
-	state_input.disabled = true;
-
-	fetch(api_url + "/set-regulator-state/" + state_input.value, { method: "POST" })
-		.then(async (response) => {
-			let delayres = await delay(300);
-			refresh_regulator_state();
-		});
+  set_button.disabled = true;
+  state_input.disabled = true;
 
+  fetch(api_url + "/set-regulator-state/" + state_input.value, {
+    method: "POST",
+  }).then(async (response) => {
+    let delayres = await delay(300);
+    refresh_regulator_state();
+  });
 }
 
 function set_load_divisor() {
-	var set_button = document.getElementById("set-load-divisor");
-	var number_input = document.getElementById("load-divisor");
-	if (!isNaN(number_input.value)) {
-		set_button.disabled = true;
-		number_input.disabled = true;
-		fetch(api_url + "/pid-settings/load_divisor/" + number_input.value, { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_gains();
-			});
-	}
+  var set_button = document.getElementById("set-load-divisor");
+  var number_input = document.getElementById("load-divisor");
+  if (!isNaN(number_input.value)) {
+    set_button.disabled = true;
+    number_input.disabled = true;
+    fetch(api_url + "/pid-settings/load_divisor/" + number_input.value, {
+      method: "POST",
+    }).then(async (response) => {
+      let delayres = await delay(100);
+      refresh_gains();
+    });
+  }
 }
 
 function disable_automatic_control() {
-	if (is_automatic_control) {
-		document.getElementById('control-disabled').checked = true;
-		document.body.classList.add("loading");
+  if (is_automatic_control) {
+    document.getElementById("control-disabled").checked = true;
+    document.body.classList.add("loading");
 
-		fetch(api_url + "/disable-control", { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_buttons();
-			});
-	}
+    fetch(api_url + "/disable-control", { method: "POST" }).then(
+      async (response) => {
+        let delayres = await delay(100);
+        refresh_buttons();
+      }
+    );
+  }
 }
 
 function enable_automatic_control() {
-	if (!is_automatic_control) {
-		document.getElementById('control-enabled').checked = true;
-		document.body.classList.add("loading");
-		fetch(api_url + "/enable-control", { method: "POST" })
-			.then(async (response) => {
-				let delayres = await delay(100);
-				refresh_buttons();
-			});
-	}
+  if (!is_automatic_control) {
+    document.getElementById("control-enabled").checked = true;
+    document.body.classList.add("loading");
+    fetch(api_url + "/enable-control", { method: "POST" }).then(
+      async (response) => {
+        let delayres = await delay(100);
+        refresh_buttons();
+      }
+    );
+  }
 }
 
 function update_control_buttons(data) {
-	current_max_rate = data.max_rate;
-	current_min_rate = data.min_rate;
+  current_max_rate = data.max_rate;
+  current_min_rate = data.min_rate;
 
-	var number_input_min = document.getElementById("min-rate");
-	if (number_input_min.disabled || number_input_min.value == "") {
-		number_input_min.value = data.min_rate;
-		number_input_min.disabled = false;
-	}
-	document.getElementById("set-minimum").disabled = (number_input_min.value == current_min_rate);
+  var number_input_min = document.getElementById("min-rate");
+  if (number_input_min.disabled || number_input_min.value == "") {
+    number_input_min.value = data.min_rate;
+    number_input_min.disabled = false;
+  }
+  document.getElementById("set-minimum").disabled =
+    number_input_min.value == current_min_rate;
 
-	var number_input_max = document.getElementById("max-rate");
-	if (number_input_max.disabled || number_input_max.value == "") {
-		number_input_max.value = data.max_rate;
-		number_input_max.disabled = false;
-	}
-	document.getElementById("set-maximum").disabled = (number_input_max.value == current_max_rate);
+  var number_input_max = document.getElementById("max-rate");
+  if (number_input_max.disabled || number_input_max.value == "") {
+    number_input_max.value = data.max_rate;
+    number_input_max.disabled = false;
+  }
+  document.getElementById("set-maximum").disabled =
+    number_input_max.value == current_max_rate;
 
-	document.body.classList.remove("loading");
-	is_automatic_control = data.control_enable;
-	if (data.control_enable) {
-		document.getElementById('control-enabled').checked = true;
-	} else {
-		document.getElementById('control-disabled').checked = true;
-	}
+  document.body.classList.remove("loading");
+  is_automatic_control = data.control_enable;
+  if (data.control_enable) {
+    document.getElementById("control-enabled").checked = true;
+  } else {
+    document.getElementById("control-disabled").checked = true;
+  }
 
-	var control_selector = document.getElementById("control-selector");
-	if (data.is_charging) {
-		if (control_selector.classList.contains('disabled')) {
-			control_selector.classList.remove('disabled');
-		}
-		document.getElementsByName('control').enable();
-	}
-	else {
-		if (!control_selector.classList.contains('disabled')) {
-			control_selector.classList.add('disabled');
-		}
-		document.getElementsByName('control').disable();
-	}
+  var control_selector = document.getElementById("control-selector");
+  if (data.is_charging) {
+    if (control_selector.classList.contains("disabled")) {
+      control_selector.classList.remove("disabled");
+    }
+    document.getElementsByName("control").enable();
+  } else {
+    if (!control_selector.classList.contains("disabled")) {
+      control_selector.classList.add("disabled");
+    }
+    document.getElementsByName("control").disable();
+  }
 }
 
 function refresh_gains() {
-	fetch(api_url + "/pid-settings/status")
-		.then((response) => response.json())
-		.then((json) => update_gains(json));
+  fetch(api_url + "/pid-settings/status")
+    .then((response) => response.json())
+    .then((json) => update_gains(json));
 }
 
 function update_gains(data) {
-	var proportional_set_button = document.getElementById("set-proportional");
-	var proportional_number_input = document.getElementById("proportional-gain");
-	proportional_set_button.disabled = false;
-	proportional_number_input.disabled = false;
-	proportional_number_input.value = data.proportional_gain;
-	var derivative_set_button = document.getElementById("set-derivative");
-	var derivative_number_input = document.getElementById("derivative-gain");
-	derivative_set_button.disabled = false;
-	derivative_number_input.disabled = false;
-	derivative_number_input.value = data.derivative_gain;
-	var load_divisor_button = document.getElementById("set-load-divisor");
-	var load_divisor_input = document.getElementById("load-divisor");
-	load_divisor_button.disabled = false;
-	load_divisor_input.disabled = false;
-	load_divisor_input.value = data.load_divisor;
+  var proportional_set_button = document.getElementById("set-proportional");
+  var proportional_number_input = document.getElementById("proportional-gain");
+  proportional_set_button.disabled = false;
+  proportional_number_input.disabled = false;
+  proportional_number_input.value = data.proportional_gain;
+  var derivative_set_button = document.getElementById("set-derivative");
+  var derivative_number_input = document.getElementById("derivative-gain");
+  derivative_set_button.disabled = false;
+  derivative_number_input.disabled = false;
+  derivative_number_input.value = data.derivative_gain;
+  var load_divisor_button = document.getElementById("set-load-divisor");
+  var load_divisor_input = document.getElementById("load-divisor");
+  load_divisor_button.disabled = false;
+  load_divisor_input.disabled = false;
+  load_divisor_input.value = data.load_divisor;
 }
 
 function refresh_shutoff() {
-	fetch(api_url + "/shutoff/status")
-		.then((response) => response.json())
-		.then((json) => update_shutoff(json));
+  fetch(api_url + "/shutoff/status")
+    .then((response) => response.json())
+    .then((json) => update_shutoff(json));
 }
 
 function refresh_regulator_state() {
-	var set_button = document.getElementById("set-regulator-state");
-	var state_input = document.getElementById("regstate");
+  var set_button = document.getElementById("set-regulator-state");
+  var state_input = document.getElementById("regstate");
 
-	set_button.disabled = false;
-	state_input.disabled = false;
+  set_button.disabled = false;
+  state_input.disabled = false;
 
-	fetch(api_url + "/regulator-state")
-		.then((response) => response.json())
-		.catch(() => null)
-		.then((json) => update_regulator_state(json));
+  fetch(api_url + "/regulator-state")
+    .then((response) => response.json())
+    .catch(() => null)
+    .then((json) => update_regulator_state(json));
 }
 
 function update_shutoff(data) {
-	var voltage_set_button = document.getElementById("set-shutoff-voltage");
-	var voltage_number_input = document.getElementById("shutoff-voltage");
-	voltage_set_button.disabled = false;
-	voltage_number_input.disabled = false;
-	voltage_number_input.value = data.voltage;
-	var time_set_button = document.getElementById("set-shutoff-time");
-	var time_number_input = document.getElementById("shutoff-time");
-	time_set_button.disabled = false;
-	time_number_input.disabled = false;
-	time_number_input.value = data.time;
+  var voltage_set_button = document.getElementById("set-shutoff-voltage");
+  var voltage_number_input = document.getElementById("shutoff-voltage");
+  voltage_set_button.disabled = false;
+  voltage_number_input.disabled = false;
+  voltage_number_input.value = data.voltage;
+  var time_set_button = document.getElementById("set-shutoff-time");
+  var time_number_input = document.getElementById("shutoff-time");
+  time_set_button.disabled = false;
+  time_number_input.disabled = false;
+  time_number_input.value = data.time;
 }
 
 function update_regulator_state(state) {
-	console.log(state);
-	if (state == null) { var cur = "Unknown" } else { var cur = state.regulator_state }
+  console.log(state);
+  if (state == null) {
+    var cur = "Unknown";
+  } else {
+    var cur = state.regulator_state;
+  }
 
-	var current_state = document.getElementById("current-state");
-	current_state.textContent = "Current state: " + cur;
+  var current_state = document.getElementById("current-state");
+  current_state.textContent = "Current state: " + cur;
 }
 
 function refresh_buttons() {
-	fetch(api_url + "/control-state")
-		.then((response) => response.json())
-		.then((json) => update_control_buttons(json));
+  fetch(api_url + "/control-state")
+    .then((response) => response.json())
+    .then((json) => update_control_buttons(json));
 }
 
 function refresh() {
-	set_favicon(null);
+  set_favicon(null);
 
-	refresh_buttons();
+  refresh_buttons();
 
-	fetch(api_url + "/car-state")
-		.then((response) => response.json())
-		.then((json) => update_state(json));
+  fetch(api_url + "/car-state")
+    .then((response) => response.json())
+    .then((json) => update_state(json));
 }
 
 function refresh_info() {
-	set_favicon(null);
+  set_favicon(null);
 
-	fetch(api_url + "/car-state")
-		.then((response) => response.json())
-		.then((json) => update_info(json));
+  fetch(api_url + "/car-state")
+    .then((response) => response.json())
+    .then((json) => update_info(json));
 }
 
 function update_info(state) {
-	set_favicon(state.charge_state);
+  set_favicon(state.charge_state);
 
-	var info_div = document.getElementById("info");
-	while (info_div.childElementCount > 0) { info_div.removeChild(info_div.firstChild) }
+  var info_div = document.getElementById("info");
+  while (info_div.childElementCount > 0) {
+    info_div.removeChild(info_div.firstChild);
+  }
 
-	el = document.createElement('p');
+  el = document.createElement("p");
 
-	state_json = document.createElement('pre');
-	state_json.appendChild(document.createTextNode(JSON.stringify(state, null, '\t')));
-	el.appendChild(state_json);
-	info_div.appendChild(el);
+  state_json = document.createElement("pre");
+  state_json.appendChild(
+    document.createTextNode(JSON.stringify(state, null, "\t"))
+  );
+  el.appendChild(state_json);
+  info_div.appendChild(el);
 }
 
 function update_state(state) {
-	set_favicon(state.charge_state);
+  set_favicon(state.charge_state);
 
-	var info_div = document.getElementById("info");
-	while (info_div.childElementCount > 0) { info_div.removeChild(info_div.firstChild) }
+  var info_div = document.getElementById("info");
+  while (info_div.childElementCount > 0) {
+    info_div.removeChild(info_div.firstChild);
+  }
 
-	el = document.createElement('p');
+  el = document.createElement("p");
 
-	var charging_state_info = "";
+  var charging_state_info = "";
 
-	switch (state.charge_state.charging_state) {
-		case "Charging":
-			charging_state_info = "charging at " + state.charge_state.charge_rate + "A";
-			break;
-		case "Stopped":
-			charging_state_info = "charge stopped";
-			break;
-		case "Disconnected":
-			charging_state_info = "disconnected"
-			break;
-	}
+  switch (state.charge_state.charging_state) {
+    case "Charging":
+      charging_state_info =
+        "charging at " + state.charge_state.charge_rate + "A";
+      break;
+    case "Stopped":
+      charging_state_info = "charge stopped";
+      break;
+    case "Disconnected":
+      charging_state_info = "disconnected";
+      break;
+  }
 
-	if (state.location_data.home) {
-		if (state.charge_state.charging_state == "Charging") {
-			charging_state_info = "set at " + state.charge_state.charge_current_request + "A, " + charging_state_info;
-		}
-		charging_state_info = "At home; " + charging_state_info;
-	} else {
-		charging_state_info = "Not home; " + charging_state_info;
-	}
+  if (state.location_data.home) {
+    if (state.charge_state.charging_state == "Charging") {
+      charging_state_info =
+        "set at " +
+        state.charge_state.charge_current_request +
+        "A, " +
+        charging_state_info;
+    }
+    charging_state_info = "At home; " + charging_state_info;
+  } else {
+    charging_state_info = "Not home; " + charging_state_info;
+  }
 
-	el.appendChild(document.createTextNode(charging_state_info));
+  el.appendChild(document.createTextNode(charging_state_info));
 
-	info_div.appendChild(el);
+  info_div.appendChild(el);
 }
 
 function set_favicon(charge_state) {
-	let favicon = document.getElementById("favicon");
+  let favicon = document.getElementById("favicon");
 
-	favicon.setAttribute("href", "data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>" + get_emoji(charge_state) + "</text></svg>");
+  favicon.setAttribute(
+    "href",
+    "data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>" +
+      get_emoji(charge_state) +
+      "</text></svg>"
+  );
 }
 
 function get_emoji(charge_state) {
-	if (charge_state == null) {
-		return "âŗ";
-	}
-	else if (charge_state.charge_rate > 0) {
-		return "🔌";
-	} else if (charge_state.battery_level < 60) {
-		return "đŸĒĢ"
-	} else return "🔋";
-}
\ No newline at end of file
+  if (charge_state == null) {
+    return "âŗ";
+  } else if (charge_state.charge_rate > 0) {
+    return "🔌";
+  } else if (charge_state.battery_level < 60) {
+    return "đŸĒĢ";
+  } else return "🔋";
+}
diff --git a/webapp/shutoff/index.html b/webapp/shutoff/index.html
index 77b66ca..74e6ea6 100644
--- a/webapp/shutoff/index.html
+++ b/webapp/shutoff/index.html
@@ -27,4 +27,4 @@
 	</div>
 </body>
 
-</html>
\ No newline at end of file
+</html>
diff --git a/webapp/style.css b/webapp/style.css
index 71cb8ba..f19cd5a 100644
--- a/webapp/style.css
+++ b/webapp/style.css
@@ -1,102 +1,101 @@
 body {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
-	background-color: #333;
-	color: #333;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
+    Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+  background-color: #333;
+  color: #333;
 }
 
 .container {
-	max-width: 40rem;
-	margin: auto;
-	padding: 0.5rem 2rem;
-	border-radius: 10px;
-	background-color: #faf9fd;
+  max-width: 40rem;
+  margin: auto;
+  padding: 0.5rem 2rem;
+  border-radius: 10px;
+  background-color: #faf9fd;
 }
 
 .outlink {
-	display: block;
-	font-weight: bold;
-	margin-top: 0.5rem;
+  display: block;
+  font-weight: bold;
+  margin-top: 0.5rem;
 }
 
 a.outlink {
-	text-decoration: none;
-	color: rgb(52, 52, 246);
+  text-decoration: none;
+  color: rgb(52, 52, 246);
 }
 
 a.outlink:hover {
-	color: rgb(110, 100, 255);
+  color: rgb(110, 100, 255);
 }
 
 .loading,
 .loading * {
-	cursor: progress;
+  cursor: progress;
 }
 
 .disabled,
 .disabled * {
-	cursor: not-allowed;
+  cursor: not-allowed;
 }
 
 .selector {
-	padding: 1rem;
-	background-color: gray;
-	color: #333;
-	width: max-content;
-	border: 0.2rem;
-	border-radius: 6px;
-
+  padding: 1rem;
+  background-color: gray;
+  color: #333;
+  width: max-content;
+  border: 0.2rem;
+  border-radius: 6px;
 }
 
 label {
-	padding: 0.5rem 1rem;
-	margin: 0.5rem;
-	font-weight: bold;
-	transition: all .2s 0s ease;
-	border-radius: 4px;
-	text-align: center;
+  padding: 0.5rem 1rem;
+  margin: 0.5rem;
+  font-weight: bold;
+  transition: all 0.2s 0s ease;
+  border-radius: 4px;
+  text-align: center;
 }
 
-input[type=radio] {
-	display: none;
+input[type="radio"] {
+  display: none;
 }
 
-input[type=radio]:checked+label {
-	background-color: white;
+input[type="radio"]:checked + label {
+  background-color: white;
 }
 
-input[type=radio]:checked:disabled+label {
-	background-color: #ddd;
+input[type="radio"]:checked:disabled + label {
+  background-color: #ddd;
 }
 
-input[type=radio]:disabled+label {
-	color: #666;
+input[type="radio"]:disabled + label {
+  color: #666;
 }
 
 @media (width > 600px) {
-	.container {
-		margin-top: 2rem;
-	}
+  .container {
+    margin-top: 2rem;
+  }
 }
 
-
 @media (prefers-color-scheme: dark) {
-	body {
-		background-color: #191919;
-	}
+  body {
+    background-color: #191919;
+  }
 
-	.container {
-		background-color: #444;
-		color: #f0f0f0;
-	}
+  .container {
+    background-color: #444;
+    color: #f0f0f0;
+  }
 
-	a.outlink {
-		text-decoration: none;
-		/* color: rgb(152, 152, 242); */
-		color: rgb(125, 125, 250);
-		/* color: rgb(94, 94, 252); */
-	}
+  a.outlink {
+    text-decoration: none;
+    /* color: rgb(152, 152, 242); */
+    color: rgb(125, 125, 250);
+    /* color: rgb(94, 94, 252); */
+  }
 
-	a.outlink:hover {
-		color: rgb(130, 120, 255);
-	}
-}
\ No newline at end of file
+  a.outlink:hover {
+    color: rgb(130, 120, 255);
+  }
+}