new backup adjustments
This commit is contained in:
@@ -16,6 +16,7 @@ use async_trait::async_trait;
|
|||||||
use bincode::config;
|
use bincode::config;
|
||||||
use canapi::id::{classify, plant_id, MessageKind, IDENTIFY_CMD_OFFSET};
|
use canapi::id::{classify, plant_id, MessageKind, IDENTIFY_CMD_OFFSET};
|
||||||
use canapi::SensorSlot;
|
use canapi::SensorSlot;
|
||||||
|
use core::cmp::min;
|
||||||
use embassy_embedded_hal::shared_bus::blocking::i2c::I2cDevice;
|
use embassy_embedded_hal::shared_bus::blocking::i2c::I2cDevice;
|
||||||
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
||||||
use embassy_time::{Duration, Timer, WithTimeout};
|
use embassy_time::{Duration, Timer, WithTimeout};
|
||||||
@@ -546,6 +547,7 @@ impl<'a> BoardInteraction<'a> for V4<'a> {
|
|||||||
async fn backup_config(&mut self, controller_config: &PlantControllerConfig) -> FatResult<()> {
|
async fn backup_config(&mut self, controller_config: &PlantControllerConfig) -> FatResult<()> {
|
||||||
let mut buffer: [u8; 4096 - BACKUP_HEADER_MAX_SIZE] = [0; 4096 - BACKUP_HEADER_MAX_SIZE];
|
let mut buffer: [u8; 4096 - BACKUP_HEADER_MAX_SIZE] = [0; 4096 - BACKUP_HEADER_MAX_SIZE];
|
||||||
let length = bincode::encode_into_slice(controller_config, &mut buffer, CONFIG)?;
|
let length = bincode::encode_into_slice(controller_config, &mut buffer, CONFIG)?;
|
||||||
|
info!("Writing backup config of size {}", length);
|
||||||
let mut checksum = X25.digest();
|
let mut checksum = X25.digest();
|
||||||
checksum.update(&buffer[..length]);
|
checksum.update(&buffer[..length]);
|
||||||
let mut header_page_buffer = [0_u8; BACKUP_HEADER_MAX_SIZE];
|
let mut header_page_buffer = [0_u8; BACKUP_HEADER_MAX_SIZE];
|
||||||
@@ -556,20 +558,31 @@ impl<'a> BoardInteraction<'a> for V4<'a> {
|
|||||||
timestamp: time,
|
timestamp: time,
|
||||||
size: length as u16,
|
size: length as u16,
|
||||||
};
|
};
|
||||||
|
info!("Header is {:?}", header);
|
||||||
bincode::encode_into_slice(&header, &mut header_page_buffer, CONFIG)?;
|
bincode::encode_into_slice(&header, &mut header_page_buffer, CONFIG)?;
|
||||||
|
info!("Header is serialized");
|
||||||
self.get_rtc_module().write(0, &header_page_buffer)?;
|
self.get_rtc_module().write(0, &header_page_buffer)?;
|
||||||
|
info!("Header written");
|
||||||
let mut to_write = length;
|
let mut to_write = length;
|
||||||
let mut chunk: usize = 0;
|
let mut chunk: usize = 0;
|
||||||
|
|
||||||
while to_write > 0 {
|
while to_write > 0 {
|
||||||
self.progress(chunk as u32).await;
|
self.progress(chunk as u32).await;
|
||||||
let start = BACKUP_HEADER_MAX_SIZE + chunk * EEPROM_PAGE;
|
let start = chunk * EEPROM_PAGE;
|
||||||
let end = start + crate::hal::rtc::EEPROM_PAGE;
|
let end = start + min(EEPROM_PAGE, to_write);
|
||||||
let part = &buffer[start..end];
|
let part = &buffer[start..end];
|
||||||
|
info!(
|
||||||
|
"Writing chunk {} of size {} to offset {}",
|
||||||
|
chunk,
|
||||||
|
part.len(),
|
||||||
|
start
|
||||||
|
);
|
||||||
to_write -= part.len();
|
to_write -= part.len();
|
||||||
chunk += 1;
|
chunk += 1;
|
||||||
self.get_rtc_module().write((1 + chunk) as u32, part)?;
|
self.get_rtc_module()
|
||||||
|
.write((BACKUP_HEADER_MAX_SIZE + chunk * EEPROM_PAGE) as u32, part)?;
|
||||||
}
|
}
|
||||||
|
info!("Backup complete");
|
||||||
self.clear_progress().await;
|
self.clear_progress().await;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -592,9 +605,10 @@ impl<'a> BoardInteraction<'a> for V4<'a> {
|
|||||||
async fn backup_info(&mut self) -> FatResult<BackupHeader> {
|
async fn backup_info(&mut self) -> FatResult<BackupHeader> {
|
||||||
let mut header_page_buffer = [0_u8; BACKUP_HEADER_MAX_SIZE];
|
let mut header_page_buffer = [0_u8; BACKUP_HEADER_MAX_SIZE];
|
||||||
self.get_rtc_module().read(0, &mut header_page_buffer)?;
|
self.get_rtc_module().read(0, &mut header_page_buffer)?;
|
||||||
|
info!("Read header page");
|
||||||
let info: Result<(BackupHeader, usize), bincode::error::DecodeError> =
|
let info: Result<(BackupHeader, usize), bincode::error::DecodeError> =
|
||||||
bincode::decode_from_slice(&header_page_buffer[..], CONFIG);
|
bincode::decode_from_slice(&header_page_buffer[..], CONFIG);
|
||||||
|
info!("decoding header: {:?}", info);
|
||||||
info.map(|(header, _)| header)
|
info.map(|(header, _)| header)
|
||||||
.map_err(|e| FatError::String {
|
.map_err(|e| FatError::String {
|
||||||
error: "Could not read backup header: ".to_string() + &e.to_string(),
|
error: "Could not read backup header: ".to_string() + &e.to_string(),
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
|
|||||||
let reboot_now = Arc::new(AtomicBool::new(false));
|
let reboot_now = Arc::new(AtomicBool::new(false));
|
||||||
println!("starting webserver");
|
println!("starting webserver");
|
||||||
|
|
||||||
spawner.spawn(http_server(reboot_now.clone(), stack))?;
|
let _ = http_server(reboot_now.clone(), stack);
|
||||||
wait_infinity(board, WaitType::MissingConfig, reboot_now.clone()).await;
|
wait_infinity(board, WaitType::MissingConfig, reboot_now.clone()).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,7 +642,7 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
|
|||||||
if stay_alive {
|
if stay_alive {
|
||||||
let reboot_now = Arc::new(AtomicBool::new(false));
|
let reboot_now = Arc::new(AtomicBool::new(false));
|
||||||
if let Some(s) = stack.take() {
|
if let Some(s) = stack.take() {
|
||||||
let _webserver = http_server(reboot_now.clone(), s);
|
spawner.spawn(http_server(reboot_now.clone(), s))?;
|
||||||
wait_infinity(board, WaitType::MqttConfig, reboot_now.clone()).await;
|
wait_infinity(board, WaitType::MqttConfig, reboot_now.clone()).await;
|
||||||
} else {
|
} else {
|
||||||
bail!("Network Stack missing, hard abort");
|
bail!("Network Stack missing, hard abort");
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use alloc::string::{String, ToString};
|
|||||||
use chrono::DateTime;
|
use chrono::DateTime;
|
||||||
use edge_http::io::server::Connection;
|
use edge_http::io::server::Connection;
|
||||||
use edge_nal::io::{Read, Write};
|
use edge_nal::io::{Read, Write};
|
||||||
|
use log::info;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||||
@@ -46,19 +47,11 @@ where
|
|||||||
T: Read + Write,
|
T: Read + Write,
|
||||||
{
|
{
|
||||||
let input = read_up_to_bytes_from_request(conn, Some(4096)).await?;
|
let input = read_up_to_bytes_from_request(conn, Some(4096)).await?;
|
||||||
|
info!("Read input with length {}", input.len());
|
||||||
let mut board = BOARD_ACCESS.get().await.lock().await;
|
let mut board = BOARD_ACCESS.get().await.lock().await;
|
||||||
let config_to_backup = serde_json::from_slice(&input)?;
|
let config_to_backup = serde_json::from_slice(&input)?;
|
||||||
|
info!("Parsed send config to object");
|
||||||
board.board_hal.backup_config(&config_to_backup).await?;
|
board.board_hal.backup_config(&config_to_backup).await?;
|
||||||
conn.initiate_response(
|
|
||||||
200,
|
|
||||||
Some("OK"),
|
|
||||||
&[
|
|
||||||
("Access-Control-Allow-Origin", "*"),
|
|
||||||
("Access-Control-Allow-Headers", "*"),
|
|
||||||
("Access-Control-Allow-Methods", "*"),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
Ok(Some("saved".to_owned()))
|
Ok(Some("saved".to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,6 +66,7 @@ where
|
|||||||
|
|
||||||
let json = match info {
|
let json = match info {
|
||||||
Ok(h) => {
|
Ok(h) => {
|
||||||
|
info!("Got backup info: {:?}", h);
|
||||||
let timestamp = DateTime::from_timestamp_millis(h.timestamp).unwrap_or_default();
|
let timestamp = DateTime::from_timestamp_millis(h.timestamp).unwrap_or_default();
|
||||||
let wbh = WebBackupHeader {
|
let wbh = WebBackupHeader {
|
||||||
timestamp: timestamp.to_rfc3339(),
|
timestamp: timestamp.to_rfc3339(),
|
||||||
@@ -81,6 +75,7 @@ where
|
|||||||
serde_json::to_string(&wbh)?
|
serde_json::to_string(&wbh)?
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
info!("Error getting backup info: {:?}", err);
|
||||||
let wbh = WebBackupHeader {
|
let wbh = WebBackupHeader {
|
||||||
timestamp: err.to_string(),
|
timestamp: err.to_string(),
|
||||||
size: 0,
|
size: 0,
|
||||||
|
|||||||
Reference in New Issue
Block a user