firmware streaming
This commit is contained in:
@@ -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">
|
||||
|
@@ -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">
|
||||
|
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user