diff --git a/Software/MainBoard/rust/src/hal/savegame_manager.rs b/Software/MainBoard/rust/src/hal/savegame_manager.rs index 5ffd8d1..172df5a 100644 --- a/Software/MainBoard/rust/src/hal/savegame_manager.rs +++ b/Software/MainBoard/rust/src/hal/savegame_manager.rs @@ -2,7 +2,7 @@ use alloc::vec::Vec; use bincode::{Decode, Encode}; use embedded_savegame::storage::{Flash, Storage}; use embedded_storage::nor_flash::{NorFlash, ReadNorFlash}; -use esp_bootloader_esp_idf::partitions::{Error as PartitionError, FlashRegion}; +use esp_bootloader_esp_idf::partitions::{Error as PartitionError, Error, FlashRegion}; use log::{error, info}; use serde::Serialize; @@ -58,7 +58,16 @@ impl Flash for SavegameFlashAdapter<'_> { } fn write(&mut self, addr: u32, data: &mut [u8]) -> Result<(), Self::Error> { - NorFlash::write(self.region, addr, data).map_err(SavegameFlashError) + info!( + "Relative writing to flash at 0x{:x} with length {}", + addr, + data.len() + ); + let error = NorFlash::write(self.region, addr, data); + if error.is_err() { + error!("error {:?}", error.unwrap_err()) + } + error.map_err(SavegameFlashError) } /// Erase one full slot at `addr`. @@ -74,6 +83,11 @@ impl Flash for SavegameFlashAdapter<'_> { let end = addr + SAVEGAME_SLOT_SIZE as u32; let aligned_end = end.div_ceil(ERASE_SIZE) * ERASE_SIZE; + info!( + "Relative erasing flash at 0x{:x} (aligned to 0x{:x}-0x{:x})", + addr, aligned_start, aligned_end + ); + if aligned_start != addr || aligned_end != end { log::warn!("Flash erase address not aligned: addr=0x{:x}, slot_size=0x{:x}. Aligned to 0x{:x}-0x{:x}", addr, SAVEGAME_SLOT_SIZE, aligned_start, aligned_end); } @@ -125,7 +139,14 @@ impl SavegameManager { data: data.to_vec(), }; let mut serialized = bincode::encode_to_vec(&wrapper, bincode::config::standard())?; - info!("Serialized config with size {}", serialized.len()); + + // Flash storage often requires length to be a multiple of 4. + let padding = (4 - (serialized.len() % 4)) % 4; + if padding > 0 { + serialized.extend_from_slice(&[0u8; 4][..padding]); + } + + info!("Serialized config with size {} (padded)", serialized.len()); self.storage.append(&mut serialized)?; Ok(()) }