move to central config, make TZ compile time const, confgureable later!
This commit is contained in:
@@ -17,17 +17,23 @@
|
||||
<p id="loaded_n_total"></p>
|
||||
</form>
|
||||
|
||||
<h2>Battery Firmeware (bq34z100 may be R2)</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="battery_flash_file" id="battery_flash_file"><br>
|
||||
<progress id="battery_flash_progressBar" value="0" max="100" style="width:300px;"></progress>
|
||||
<input type="button" name="battery_flash_button" id="battery_flash_button"><br>
|
||||
<h3 id="battery_flash_status"></h3>
|
||||
<p id="battery_flash_loaded_n_total"></p>
|
||||
<div style="height: 100px; display: block; overflow-y: auto;" id = "battery_flash_message"></div>
|
||||
</form>
|
||||
<div>
|
||||
<h2>WIFI</h2>
|
||||
<input type="button" id="scan" value="Scan">
|
||||
<br>
|
||||
<label for="ap_ssid">AP SSID:</label>
|
||||
<input type="text" id="ap_ssid" list="ssidlist">
|
||||
|
||||
|
||||
<label for="ssid">SSID:</label>
|
||||
<input type="text" id="ssid" list="ssidlist">
|
||||
<datalist id="ssidlist">
|
||||
<option value="Not scanned yet">
|
||||
</datalist>
|
||||
<label for="ssid">Password:</label>
|
||||
<input type="text" id="password">
|
||||
</div>
|
||||
|
||||
|
||||
<h2>config</h2>
|
||||
|
||||
<div id="configform">
|
||||
@@ -83,6 +89,16 @@
|
||||
<input type="checkbox" id="night_lamp_only_when_dark">
|
||||
Light only when dark
|
||||
</div>
|
||||
|
||||
<h2>Battery Firmeware (bq34z100 may be R2)</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="battery_flash_file" id="battery_flash_file"><br>
|
||||
<progress id="battery_flash_progressBar" value="0" max="100" style="width:300px;"></progress>
|
||||
<input type="button" name="battery_flash_button" id="battery_flash_button"><br>
|
||||
<h3 id="battery_flash_status"></h3>
|
||||
<p id="battery_flash_loaded_n_total"></p>
|
||||
<div style="height: 100px; display: block; overflow-y: auto;" id = "battery_flash_message"></div>
|
||||
</form>
|
||||
|
||||
<h3>Plants:</h3>
|
||||
|
||||
|
@@ -1,47 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
<input type="button" id="test" value="Test">
|
||||
<h2>Current Firmware</h2>
|
||||
<div>
|
||||
<div id="firmware_buildtime">Buildtime loading</div>
|
||||
<div id="firmware_githash">Build githash loading</div>
|
||||
</div>
|
||||
<div>
|
||||
<h2>firmeware OTA v3</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="file1" id="file1"><br>
|
||||
<progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
|
||||
<h3 id="status"></h3>
|
||||
<h3 id="answer"></h3>
|
||||
<p id="loaded_n_total"></p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<h2>Battery Firmeware (bq34z100 may be R2)</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="battery_flash_file" id="battery_flash_file"><br>
|
||||
<progress id="battery_flash_progressBar" value="0" max="100" style="width:300px;"></progress>
|
||||
<input type="button" name="battery_flash_button" id="battery_flash_button"><br>
|
||||
<h3 id="battery_flash_status"></h3>
|
||||
<p id="battery_flash_loaded_n_total"></p>
|
||||
<div style="height: 100px; display: block; overflow-y: auto;" id = "battery_flash_message"></div>
|
||||
</form>
|
||||
|
||||
<div>
|
||||
<h2>WIFI</h2>
|
||||
<input type="button" id="scan" value="Scan">
|
||||
<br>
|
||||
<label for="ssid">SSID:</label>
|
||||
<input type="text" id="ssid" list="ssidlist">
|
||||
<datalist id="ssidlist">
|
||||
<option value="Not scanned yet">
|
||||
</datalist>
|
||||
<label for="ssid">Password:</label>
|
||||
<input type="text" id="password">
|
||||
<input type="button" id="save" value="Save & Restart">
|
||||
<div id="wifistatus"></div>
|
||||
<br>
|
||||
</div>
|
||||
<script src="bundle.js"></script>
|
||||
</body>
|
||||
</html>
|
@@ -15,10 +15,7 @@ use esp_idf_svc::http::server::{Configuration, EspHttpServer};
|
||||
use heapless::String;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
config::{Config, WifiConfig},
|
||||
plant_hal::PlantCtrlBoardInteraction,
|
||||
};
|
||||
use crate::config::Config;
|
||||
|
||||
#[derive(Serialize, Debug)]
|
||||
struct SSIDList<'a> {
|
||||
@@ -36,138 +33,9 @@ pub struct TestPump {
|
||||
pump: usize,
|
||||
}
|
||||
|
||||
pub fn httpd_initial(reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
let mut server = shared();
|
||||
server
|
||||
.fn_handler("/", Method::Get, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
response.write(include_bytes!("initial_config.html"))?;
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/wifiscan", Method::Post, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
match board.wifi_scan() {
|
||||
Err(error) => {
|
||||
response.write(format!("Error scanning wifi: {}", error).as_bytes())?;
|
||||
}
|
||||
Ok(scan_result) => {
|
||||
let mut ssids: Vec<&String<32>> = Vec::new();
|
||||
scan_result.iter().for_each(|s| ssids.push(&s.ssid));
|
||||
let ssid_json = serde_json::to_string(&SSIDList { ssids })?;
|
||||
println!("Sending ssid list {}", &ssid_json);
|
||||
response.write(ssid_json.as_bytes())?;
|
||||
}
|
||||
}
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/wifisave", Method::Post, move |mut request| {
|
||||
let mut buf = [0_u8; 2048];
|
||||
let read = request.read(&mut buf);
|
||||
if read.is_err() {
|
||||
let error_text = read.unwrap_err().to_string();
|
||||
println!("Could not parse wificonfig {}", error_text);
|
||||
request
|
||||
.into_status_response(500)?
|
||||
.write(error_text.as_bytes())?;
|
||||
return anyhow::Ok(());
|
||||
}
|
||||
let actual_data = &buf[0..read.unwrap()];
|
||||
println!("raw {:?}", actual_data);
|
||||
println!("Raw data {}", from_utf8(actual_data).unwrap());
|
||||
let wifi_config: Result<WifiConfig, serde_json::Error> =
|
||||
serde_json::from_slice(actual_data);
|
||||
if wifi_config.is_err() {
|
||||
let error_text = wifi_config.unwrap_err().to_string();
|
||||
println!("Could not parse wificonfig {}", error_text);
|
||||
request
|
||||
.into_status_response(500)?
|
||||
.write(error_text.as_bytes())?;
|
||||
return anyhow::Ok(());
|
||||
}
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
board.set_wifi(&wifi_config.unwrap())?;
|
||||
let mut response = request.into_status_response(202)?;
|
||||
response.write("saved".as_bytes())?;
|
||||
reboot_now.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
}
|
||||
|
||||
pub fn httpd(reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
let mut server = shared();
|
||||
|
||||
server
|
||||
.fn_handler("/", Method::Get, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
response.write(include_bytes!("config.html"))?;
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/get_config", Method::Get, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
match board.get_config() {
|
||||
Ok(config) => {
|
||||
let config_json = serde_json::to_string(&config)?;
|
||||
response.write(config_json.as_bytes())?;
|
||||
}
|
||||
Err(_) => {
|
||||
let config_json = serde_json::to_string(&Config::default())?;
|
||||
response.write(config_json.as_bytes())?;
|
||||
}
|
||||
}
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/set_config", Method::Post, move |mut request| {
|
||||
let mut buf = [0_u8; 3072];
|
||||
let read = request.read(&mut buf);
|
||||
if read.is_err() {
|
||||
let error_text = read.unwrap_err().to_string();
|
||||
println!("Could not parse config {}", error_text);
|
||||
request
|
||||
.into_status_response(500)?
|
||||
.write(error_text.as_bytes())?;
|
||||
return anyhow::Ok(());
|
||||
}
|
||||
let actual_data = &buf[0..read.unwrap()];
|
||||
println!("Raw data {}", from_utf8(actual_data).unwrap());
|
||||
let config: Result<Config, serde_json::Error> = serde_json::from_slice(actual_data);
|
||||
if config.is_err() {
|
||||
let error_text = config.unwrap_err().to_string();
|
||||
println!("Could not parse config {}", error_text);
|
||||
request
|
||||
.into_status_response(500)?
|
||||
.write(error_text.as_bytes())?;
|
||||
return Ok(());
|
||||
}
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
board.set_config(&config.unwrap())?;
|
||||
let mut response = request.into_status_response(202)?;
|
||||
response.write("saved".as_bytes())?;
|
||||
reboot_now.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||
Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
}
|
||||
|
||||
pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
let server_config = Configuration {
|
||||
stack_size: 8192,
|
||||
stack_size: 32768,
|
||||
..Default::default()
|
||||
};
|
||||
let mut server: Box<EspHttpServer<'static>> =
|
||||
@@ -293,6 +161,7 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/flashbattery", Method::Post, move |mut request| {
|
||||
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
let mut buffer: [u8; 128] = [0; 128];
|
||||
let mut line_buffer: VecDeque<u8> = VecDeque::new();
|
||||
@@ -302,6 +171,7 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
|
||||
let mut toggle = true;
|
||||
let delay = Delay::new(1);
|
||||
todo!("Write to storage before attempting to flash!");
|
||||
loop {
|
||||
delay.delay_us(2);
|
||||
let read = request.read(&mut buffer).unwrap();
|
||||
@@ -313,7 +183,7 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
line_buffer.read_to_string(&mut line).unwrap();
|
||||
let msg = format!("Finished reading, but there is still some leftover in buffer and no full line {line}<br>");
|
||||
println!("{}", msg);
|
||||
let mut response = request.into_status_response(400_u16).unwrap();
|
||||
let mut response = request.into_status_response(400_u16).unwrap();
|
||||
response.write(msg.as_bytes()).unwrap();
|
||||
response.flush().unwrap();
|
||||
return anyhow::Ok(())
|
||||
@@ -321,11 +191,10 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
break;
|
||||
}
|
||||
let to_write = &buffer[0..read];
|
||||
|
||||
|
||||
line_buffer.write_all(to_write).unwrap();
|
||||
board.general_fault(toggle);
|
||||
toggle = !toggle;
|
||||
|
||||
loop {
|
||||
let has_line = line_buffer.contains(&b'\n');
|
||||
if !has_line {
|
||||
@@ -338,7 +207,7 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
let validate = board.flash_bq34_z100(&line2, is_dry_run);
|
||||
delay.delay_us(2);
|
||||
if validate.is_err() {
|
||||
let mut response = request.into_status_response(400_u16).unwrap();
|
||||
let mut response = request.into_status_response(400_u16).unwrap();
|
||||
let err = validate.unwrap_err();
|
||||
let err_str = err.to_string();
|
||||
let err_msg = err_str.as_bytes();
|
||||
@@ -350,12 +219,89 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut response = request.into_status_response(200_u16).unwrap();
|
||||
let mut response = request.into_status_response(200_u16).unwrap();
|
||||
let msg = format!("Finished writing {total_read} bytes<br>");
|
||||
response.write(msg.as_bytes()).unwrap();
|
||||
board.general_fault(false);
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/wifiscan", Method::Post, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
match board.wifi_scan() {
|
||||
Err(error) => {
|
||||
response.write(format!("Error scanning wifi: {}", error).as_bytes())?;
|
||||
}
|
||||
Ok(scan_result) => {
|
||||
let mut ssids: Vec<&String<32>> = Vec::new();
|
||||
scan_result.iter().for_each(|s| ssids.push(&s.ssid));
|
||||
let ssid_json = serde_json::to_string(&SSIDList { ssids })?;
|
||||
println!("Sending ssid list {}", &ssid_json);
|
||||
response.write(ssid_json.as_bytes())?;
|
||||
}
|
||||
}
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/", Method::Get, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
response.write(include_bytes!("config.html"))?;
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/get_config", Method::Get, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
match board.get_config() {
|
||||
Ok(config) => {
|
||||
let config_json = serde_json::to_string(&config)?;
|
||||
response.write(config_json.as_bytes())?;
|
||||
}
|
||||
Err(_) => {
|
||||
let config_json = serde_json::to_string(&Config::default())?;
|
||||
response.write(config_json.as_bytes())?;
|
||||
}
|
||||
}
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/set_config", Method::Post, move |mut request| {
|
||||
let mut buf = [0_u8; 3072];
|
||||
let read = request.read(&mut buf);
|
||||
if read.is_err() {
|
||||
let error_text = read.unwrap_err().to_string();
|
||||
println!("Could not parse config {}", error_text);
|
||||
request
|
||||
.into_status_response(500)?
|
||||
.write(error_text.as_bytes())?;
|
||||
return anyhow::Ok(());
|
||||
}
|
||||
let actual_data = &buf[0..read.unwrap()];
|
||||
println!("Raw data {}", from_utf8(actual_data).unwrap());
|
||||
let config: Result<Config, serde_json::Error> = serde_json::from_slice(actual_data);
|
||||
if config.is_err() {
|
||||
let error_text = config.unwrap_err().to_string();
|
||||
println!("Could not parse config {}", error_text);
|
||||
request
|
||||
.into_status_response(500)?
|
||||
.write(error_text.as_bytes())?;
|
||||
return Ok(());
|
||||
}
|
||||
let mut board = BOARD_ACCESS.lock().unwrap();
|
||||
board.set_config(&config.unwrap())?;
|
||||
let mut response = request.into_status_response(202)?;
|
||||
response.write("saved".as_bytes())?;
|
||||
reboot_now.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||
Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
}
|
||||
|
Reference in New Issue
Block a user