ota: buffer data flash full erase blocks
this speeds it up a lot because it's not doing mutiple erases for the same block
This commit is contained in:
@@ -38,7 +38,7 @@ use esp_storage::FlashStorage;
|
||||
|
||||
use embassy_net::Stack;
|
||||
|
||||
use log::{warn,info};
|
||||
use log::{warn, info, error};
|
||||
|
||||
use crate::mdns;
|
||||
|
||||
@@ -107,6 +107,7 @@ pub async fn start_wifi(spawner: &Spawner,
|
||||
let rng = Rng::new();
|
||||
let seed = (rng.random() as u64) << 32 | rng.random() as u64;
|
||||
|
||||
|
||||
// Init network stack
|
||||
let (stack, runner) = embassy_net::new(
|
||||
wifi_interface,
|
||||
@@ -239,37 +240,54 @@ async fn write_ota(ota : &mut Ota<FlashStorage<'_>>,
|
||||
sock: &mut embassy_net::tcp::TcpSocket<'_>,
|
||||
len: u32) {
|
||||
let mut buf = [0u8; 4096];
|
||||
let mut buf_offset = 0;
|
||||
|
||||
ota.ota_begin(len, 0);
|
||||
if let Err(e) = ota.ota_begin(len, 0) {
|
||||
error!("ota_begin faled {:?}", e);
|
||||
return;
|
||||
}
|
||||
|
||||
let mut len = len;
|
||||
while len > 0 {
|
||||
match sock.read(&mut buf).await {
|
||||
match sock.read(&mut buf[buf_offset..]).await {
|
||||
Ok(0) => {
|
||||
info!("unexpected eof on read");
|
||||
break;
|
||||
}
|
||||
Ok(chunksize) => {
|
||||
info!("writing {} bytes, {} remaining", chunksize, len);
|
||||
let res = ota.ota_write_chunk(&buf[0..chunksize]);
|
||||
if res == Ok(true) {
|
||||
info!("eof on write, remaining bytes = {} ", len);
|
||||
|
||||
if ota.ota_flush(false, false).is_ok() { // ignore crc, no rollback
|
||||
Timer::after_millis(1000).await;
|
||||
esp_hal::system::software_reset();
|
||||
}
|
||||
}
|
||||
// let progress = (ota.get_ota_progress() * 100.0) as u8;
|
||||
// log::info!("progress: {}%", progress);
|
||||
len = len - (chunksize as u32);
|
||||
},
|
||||
// info!("read {} at {}, {} remaining", chunksize, buf_offset, len);
|
||||
buf_offset += chunksize;
|
||||
len -= chunksize as u32;
|
||||
}
|
||||
Err(x) => {
|
||||
warn!("error reading ota image: {:?}", x);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if buf_offset == 4096 {
|
||||
info!("{} remaining", len);
|
||||
if let Err(_) = ota.ota_write_chunk(&buf) {
|
||||
break;
|
||||
}
|
||||
buf_offset = 0;
|
||||
};
|
||||
if len <= 0 {
|
||||
if let Err(_) = ota.ota_write_chunk(&buf[0..buf_offset]) {
|
||||
break;
|
||||
}
|
||||
};
|
||||
}
|
||||
if len == 0 {
|
||||
info!("wrote all bytes");
|
||||
if ota.ota_flush(false, false).is_ok() { // ignore crc, no rollback
|
||||
info!("write {:?}", sock.write(b"BYE\n").await);
|
||||
let _ = sock.flush().await;
|
||||
sock.close();
|
||||
Timer::after_millis(1000).await;
|
||||
esp_hal::system::software_reset();
|
||||
}
|
||||
} else {
|
||||
warn!("stream ended early, was expecting another {} bytes", len);
|
||||
warn!("stream ended early or flash failed with {} bytes left", len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -308,9 +326,6 @@ async fn run_tcp_handler(stack : Stack<'_>, flash_peripheral: esp_hal::periphera
|
||||
let len = u32::from_be_bytes(len_bytes);
|
||||
info!("reading {} bytes", len);
|
||||
write_ota(&mut ota, &mut socket, len).await;
|
||||
info!("write {:?}", socket.write(b"BYE\n").await);
|
||||
socket.flush().await;
|
||||
socket.close();
|
||||
},
|
||||
b"KEY0" => {
|
||||
info!("sessionkey");
|
||||
|
||||
Reference in New Issue
Block a user