added chrono-tz filter

This commit is contained in:
2023-11-23 22:50:17 +01:00
parent b268466b89
commit 0a0ac6babf
12 changed files with 664 additions and 45 deletions

View 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>

View 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
View 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";
}

View 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;
}