firmware streaming

This commit is contained in:
2024-08-11 18:44:24 +02:00
committed by Empire Phoenix
parent 3ece894592
commit 65e5d0d753
13 changed files with 3143 additions and 2851 deletions

View File

@@ -18,8 +18,15 @@
</form>
<h2>Battery Firmeware (bq34z100 may be R2)</h2>
<button id="flash5ah12vlifepo">Flash 6AH 12V Lifepo replacement (built in)</button>
<div style="height: 100px; display: block; overflow-y: auto;" id = "flash_message"></div>
<form id="upload_form" method="post">
<input type="file" name="battery_flash_file" id="battery_flash_file"><br>
<progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
<input type="button" name="battery_flash_button" id="battery_flash_button"><br>
<h3 id="status"></h3>
<div style="height: 100px; display: block; overflow-y: auto;" id = "battery_flash_message"></div>
</form>
<h2>config</h2>
<div id="configform">

View File

@@ -17,6 +17,16 @@
</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">

View File

@@ -1,14 +1,18 @@
//offer ota and config mode
use std::{
io::BufRead, str::from_utf8, sync::{atomic::AtomicBool, Arc}
collections::VecDeque,
io::{BufRead, Read, Write},
str::from_utf8,
sync::{atomic::AtomicBool, Arc},
};
use crate::{espota::OtaUpdate, BOARD_ACCESS};
use core::result::Result::Ok;
use embedded_svc::http::Method;
use esp_idf_hal::{delay::Delay, io::Write};
use embedded_svc::http::{Method};
use esp_idf_hal::delay::Delay;
use esp_idf_svc::http::server::{Configuration, EspHttpServer};
use esp_idf_sys::vTaskDelay;
use heapless::String;
use serde::{Deserialize, Serialize};
@@ -289,46 +293,82 @@ pub fn shared() -> Box<EspHttpServer<'static>> {
})
.unwrap();
server
.fn_handler("/flashbattery", Method::Post, move |request| {
let mut board = BOARD_ACCESS.lock().unwrap();
let mut response = request.into_ok_response().unwrap();
.fn_handler("/flashbattery", Method::Post, move |mut request| {
let mut board = BOARD_ACCESS.lock().unwrap();
let mut buffer: [u8; 32] = [0; 32];
let mut line_buffer: VecDeque<u8> = VecDeque::new();
let delay = Delay::new(0);
let firmware = include_bytes!("0100_2_02-bq34z100.df.fs");
let is_dry_run = !request.uri().ends_with("?flash=true");
let mut total_read: usize = 0;
response.write("Checking pass: \n".as_bytes()).unwrap();
for iter in firmware.lines() {
delay.delay_us(1);
let line = iter?;
let msg = format!("{line}<br>");
println!("{line}");
response.write(msg.as_bytes()).unwrap();
let validate = board.flash_bq34_z100(&line, true);
if validate.is_err() {
response.write(validate.unwrap_err().to_string().as_bytes()).unwrap();
let mut toggle = true;
let delay = Delay::new(1);
loop {
delay.delay_us(2);
let read = request.read(&mut buffer).unwrap();
total_read += read;
println!("received {read} bytes ota {total_read}");
if read == 0 {
if line_buffer.len() > 0 {
println!("No further body but no endline");
let mut line = std::string::String::new();
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();
response.write(msg.as_bytes()).unwrap();
response.flush().unwrap();
return anyhow::Ok(())
}
break;
}
let to_write = &buffer[0..read];
line_buffer.write_all(to_write).unwrap();
println!("Write to deque new lenght is {}", line_buffer.len());
board.general_fault(toggle);
toggle = !toggle;
println!("Updated btn");
loop {
let mut line = std::string::String::new();
println!("Check for line");
let has_line = line_buffer.read_line(&mut line);
let mut line_size = 0;
match has_line {
Ok(size) => {
line_size = size;
if size == 0 {
println!("Was no line no string read");
break;
}
},
Err(err) => {
println!("Was no line and error {}", err);
break;
},
}
println!("Processing line with size {} {}", line_size, line);
//let validate = board.flash_bq34_z100(&line, is_dry_run);
let validate = anyhow::Ok(());
delay.delay_us(2);
if validate.is_err() {
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();
response
.write(err_msg)
.unwrap();
return anyhow::Ok(())
}
}
}
}
response.write("Executing flashing: \n".as_bytes()).unwrap();
let mut toggle = true;
for iter in firmware.lines() {
delay.delay_us(1);
let line = iter?;
let msg = format!("{line}<br>");
println!("{line}");
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(toggle);
toggle = !toggle;
let write = board.flash_bq34_z100(&line, false);
if write.is_err() {
response.write(write.unwrap_err().to_string().as_bytes()).unwrap();
}
}
board.general_fault(false);
anyhow::Ok(())
})
.unwrap();
board.general_fault(false);
anyhow::Ok(())
})
.unwrap();
server
}