added chrono-tz filter
This commit is contained in:
15
rust/src/webserver/config.html
Normal file
15
rust/src/webserver/config.html
Normal file
@@ -0,0 +1,15 @@
|
||||
<html>
|
||||
<meta>
|
||||
<script src="ota.js"></script>
|
||||
</meta>
|
||||
<body>
|
||||
<h2>firmeware OTA v3</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="file1" id="file1" onchange="uploadFile()"><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>
|
||||
</body>
|
||||
</html>
|
17
rust/src/webserver/initial_config.html
Normal file
17
rust/src/webserver/initial_config.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<html>
|
||||
<meta>
|
||||
<script src="ota.js"></script>
|
||||
</meta>
|
||||
<body>
|
||||
<div>
|
||||
<h2>firmeware OTA v3</h2>
|
||||
<form id="upload_form" method="post">
|
||||
<input type="file" name="file1" id="file1" onchange="uploadFile()"><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>
|
||||
</body>
|
||||
</html>
|
40
rust/src/webserver/ota.js
Normal file
40
rust/src/webserver/ota.js
Normal file
@@ -0,0 +1,40 @@
|
||||
function _(el) {
|
||||
return document.getElementById(el);
|
||||
}
|
||||
|
||||
function uploadFile() {
|
||||
var file = _("file1").files[0];
|
||||
// alert(file.name+" | "+file.size+" | "+file.type);
|
||||
var ajax = new XMLHttpRequest();
|
||||
ajax.upload.addEventListener("progress", progressHandler, false);
|
||||
ajax.addEventListener("load", completeHandler, false);
|
||||
ajax.addEventListener("error", errorHandler, false);
|
||||
ajax.addEventListener("abort", abortHandler, false);
|
||||
ajax.open("POST", "/ota"); // http://www.developphp.com/video/JavaScript/File-Upload-Progress-Bar-Meter-Tutorial-Ajax-PHP
|
||||
//use file_upload_parser.php from above url
|
||||
ajax.send(file);
|
||||
}
|
||||
|
||||
function progressHandler(event) {
|
||||
_("loaded_n_total").innerHTML = "Uploaded " + event.loaded + " bytes of " + event.total;
|
||||
var percent = (event.loaded / event.total) * 100;
|
||||
_("progressBar").value = Math.round(percent);
|
||||
_("status").innerHTML = Math.round(percent) + "%";
|
||||
_("answer").innerHTML = "in progress";
|
||||
}
|
||||
|
||||
function completeHandler(event) {
|
||||
_("status").innerHTML = event.target.responseText;
|
||||
_("answer").innerHTML = "finished";
|
||||
_("progressBar").value = 0; //wil clear progress bar after successful upload
|
||||
}
|
||||
|
||||
function errorHandler(event) {
|
||||
_("status").innerHTML = event.target.responseText;
|
||||
_("answer").innerHTML = "failed";
|
||||
}
|
||||
|
||||
function abortHandler(event) {
|
||||
_("status").innerHTML = event.target.responseText;
|
||||
_("answer").innerHTML = "aborted";
|
||||
}
|
88
rust/src/webserver/webserver.rs
Normal file
88
rust/src/webserver/webserver.rs
Normal file
@@ -0,0 +1,88 @@
|
||||
//offer ota and config mode
|
||||
|
||||
use build_time::build_time_utc;
|
||||
use embedded_svc::http::Method;
|
||||
use esp_idf_svc::http::server::EspHttpServer;
|
||||
use esp_ota::OtaUpdate;
|
||||
|
||||
#[allow(unused_variables)]
|
||||
pub fn httpd(initial_config:bool) -> EspHttpServer<'static> {
|
||||
|
||||
let mut server = EspHttpServer::new(&Default::default()).unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/",Method::Get, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
match initial_config {
|
||||
true => response.write(include_bytes!("initial_config.html"))?,
|
||||
false => response.write(include_bytes!("config.html"))?
|
||||
};
|
||||
return Ok(())
|
||||
}).unwrap();
|
||||
server
|
||||
.fn_handler("/buildtime",Method::Get, |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
response.write(build_time_utc!().as_bytes())?;
|
||||
return Ok(())
|
||||
}).unwrap();
|
||||
server
|
||||
.fn_handler("/ota.js",Method::Get, |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
response.write(include_bytes!("ota.js"))?;
|
||||
return Ok(())
|
||||
}).unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/ota", Method::Post, |mut request| {
|
||||
let ota = OtaUpdate::begin();
|
||||
if ota.is_err(){
|
||||
let error_text = ota.unwrap_err().to_string();
|
||||
request.into_status_response(500)?.write(error_text.as_bytes())?;
|
||||
return Ok(());
|
||||
}
|
||||
let mut ota = ota.unwrap();
|
||||
println!("start ota");
|
||||
|
||||
//having a larger buffer is not really faster, requires more stack and prevents the progress bar from working ;)
|
||||
const BUFFER_SIZE:usize = 512;
|
||||
let mut buffer :[u8;BUFFER_SIZE] = [0;BUFFER_SIZE];
|
||||
let mut total_read: usize = 0;
|
||||
loop {
|
||||
let read = request.read(&mut buffer).unwrap();
|
||||
total_read += read;
|
||||
println!("received {read} bytes ota {total_read}");
|
||||
let to_write = & buffer[0 .. read];
|
||||
|
||||
|
||||
let write_result = ota.write(to_write);
|
||||
if write_result.is_err(){
|
||||
let error_text = write_result.unwrap_err().to_string();
|
||||
request.into_status_response(500)?.write(error_text.as_bytes())?;
|
||||
return Ok(());
|
||||
}
|
||||
println!("wrote {read} bytes ota {total_read}");
|
||||
if read == 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
println!("finish ota");
|
||||
let partition = ota.raw_partition();
|
||||
println!("finalizing and changing boot partition to {partition:?}");
|
||||
|
||||
let finalizer = ota.finalize();
|
||||
if finalizer.is_err(){
|
||||
let error_text = finalizer.err().unwrap().to_string();
|
||||
request.into_status_response(500)?.write(error_text.as_bytes())?;
|
||||
return Ok(());
|
||||
}
|
||||
let mut finalizer = finalizer.unwrap();
|
||||
|
||||
println!("changing boot partition");
|
||||
finalizer.set_as_boot_partition().unwrap();
|
||||
finalizer.restart();
|
||||
|
||||
|
||||
//return Ok(())
|
||||
}).unwrap();
|
||||
return server;
|
||||
}
|
Reference in New Issue
Block a user