new backup adjustments
This commit is contained in:
@@ -16,6 +16,7 @@ use async_trait::async_trait;
|
||||
use bincode::config;
|
||||
use canapi::id::{classify, plant_id, MessageKind, IDENTIFY_CMD_OFFSET};
|
||||
use canapi::SensorSlot;
|
||||
use core::cmp::min;
|
||||
use embassy_embedded_hal::shared_bus::blocking::i2c::I2cDevice;
|
||||
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
||||
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<()> {
|
||||
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)?;
|
||||
info!("Writing backup config of size {}", length);
|
||||
let mut checksum = X25.digest();
|
||||
checksum.update(&buffer[..length]);
|
||||
let mut header_page_buffer = [0_u8; BACKUP_HEADER_MAX_SIZE];
|
||||
@@ -556,20 +558,31 @@ impl<'a> BoardInteraction<'a> for V4<'a> {
|
||||
timestamp: time,
|
||||
size: length as u16,
|
||||
};
|
||||
info!("Header is {:?}", header);
|
||||
bincode::encode_into_slice(&header, &mut header_page_buffer, CONFIG)?;
|
||||
info!("Header is serialized");
|
||||
self.get_rtc_module().write(0, &header_page_buffer)?;
|
||||
info!("Header written");
|
||||
let mut to_write = length;
|
||||
let mut chunk: usize = 0;
|
||||
|
||||
while to_write > 0 {
|
||||
self.progress(chunk as u32).await;
|
||||
let start = BACKUP_HEADER_MAX_SIZE + chunk * EEPROM_PAGE;
|
||||
let end = start + crate::hal::rtc::EEPROM_PAGE;
|
||||
let start = chunk * EEPROM_PAGE;
|
||||
let end = start + min(EEPROM_PAGE, to_write);
|
||||
let part = &buffer[start..end];
|
||||
info!(
|
||||
"Writing chunk {} of size {} to offset {}",
|
||||
chunk,
|
||||
part.len(),
|
||||
start
|
||||
);
|
||||
to_write -= part.len();
|
||||
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;
|
||||
Ok(())
|
||||
}
|
||||
@@ -592,9 +605,10 @@ impl<'a> BoardInteraction<'a> for V4<'a> {
|
||||
async fn backup_info(&mut self) -> FatResult<BackupHeader> {
|
||||
let mut header_page_buffer = [0_u8; BACKUP_HEADER_MAX_SIZE];
|
||||
self.get_rtc_module().read(0, &mut header_page_buffer)?;
|
||||
|
||||
info!("Read header page");
|
||||
let info: Result<(BackupHeader, usize), bincode::error::DecodeError> =
|
||||
bincode::decode_from_slice(&header_page_buffer[..], CONFIG);
|
||||
info!("decoding header: {:?}", info);
|
||||
info.map(|(header, _)| header)
|
||||
.map_err(|e| FatError::String {
|
||||
error: "Could not read backup header: ".to_string() + &e.to_string(),
|
||||
|
||||
Reference in New Issue
Block a user