From 0b941ff5d12a3579efd577ac73035509583997de Mon Sep 17 00:00:00 2001 From: Ryan Summers Date: Mon, 13 Nov 2023 14:45:04 +0100 Subject: [PATCH] Using postcard for complete serialization --- src/hardware/flash.rs | 46 ++++++++++--------------------------------- 1 file changed, 10 insertions(+), 36 deletions(-) diff --git a/src/hardware/flash.rs b/src/hardware/flash.rs index 0e651b07c..e16a4a547 100644 --- a/src/hardware/flash.rs +++ b/src/hardware/flash.rs @@ -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>, @@ -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) } }; @@ -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(); } }