Skip to content

Commit

Permalink
Using postcard for complete serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
ryan-summers committed Nov 13, 2023
1 parent 316adb5 commit 0b941ff
Showing 1 changed file with 10 additions and 36 deletions.
46 changes: 10 additions & 36 deletions src/hardware/flash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use core::fmt::Write;
use embedded_storage::nor_flash::{NorFlash, ReadNorFlash};
use stm32h7xx_hal::flash::{LockedFlashBank, UnlockedFlashBank};

#[derive(miniconf::Tree)]
#[derive(serde::Serialize, serde::Deserialize, miniconf::Tree)]
pub struct Settings {
pub broker: heapless::String<255>,
pub id: heapless::String<23>,
Expand Down Expand Up @@ -30,34 +30,16 @@ impl FlashSettings {
mut flash: LockedFlashBank,
mac: smoltcp_nal::smoltcp::wire::EthernetAddress,
) -> Self {
let mut settings = Settings::new(mac);
let mut buffer = [0u8; 512];
flash.read(0, &mut buffer[..]).unwrap();

let mut data = &buffer[..];

// We iteratively read the settings from flash to allow for easy expansion of the settings
// without losing data in the future when new fields are added.
settings.broker = {
match postcard::take_from_bytes(data) {
Ok((item, remainder)) => {
data = remainder;
item
}
Err(e) => {
log::warn!("Failed to decode broker from flash settings memory - using default: {e:?}");
settings.broker
}
}
};

settings.id = {
match postcard::from_bytes(data) {
Ok(item) => item,
Err(e) => {
log::warn!("Failed to MQTT ID from flash settings memory - using default: {e:?}");
settings.id
}
let settings = match postcard::from_bytes(&buffer) {
Ok(settings) => settings,
Err(_) => {
log::warn!(
"Failed to load settings from flash. Using defaults"
);
Settings::new(mac)
}
};

Expand All @@ -68,16 +50,8 @@ impl FlashSettings {
let mut bank = self.flash.unlocked();

let mut data = [0; 512];
let mut offset: usize = 0;
offset +=
postcard::to_slice(&self.settings.broker, &mut data[offset..])
.unwrap()
.len();
offset += postcard::to_slice(&self.settings.id, &mut data[offset..])
.unwrap()
.len();

let serialized = postcard::to_slice(&self.settings, &mut data).unwrap();
bank.erase(0, UnlockedFlashBank::ERASE_SIZE as u32).unwrap();
bank.write(0, &data[..offset]).unwrap();
bank.write(0, serialized).unwrap();
}
}

0 comments on commit 0b941ff

Please sign in to comment.