cheapsdo2.0/firmware/src/nvstate.rs

51 lines
1.4 KiB
Rust

use cheapsdo_protocol::PLLSettings;
use postcard::{from_bytes_cobs, to_slice_cobs};
use serde::{Deserialize, Serialize};
use stm32f1xx_hal::flash::{self, FlashSize, FlashWriter, SectorSize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct NVState {
pub pwm: u16,
pub pll_settings: PLLSettings,
}
impl Default for NVState {
fn default() -> Self {
Self {
pwm: 1500u16,
pll_settings: PLLSettings::default(),
}
}
}
const PAGE_SIZE: usize = 1024;
const NVSTATE_OFFSET: u32 = 63 * PAGE_SIZE as u32;
const FLASH_SIZE: FlashSize = FlashSize::Sz64K;
const SECTOR_SIZE: SectorSize = SectorSize::Sz1K;
pub fn load(flash: &mut flash::Parts) -> NVState {
let mut flash_writer = flash.writer(SECTOR_SIZE, FLASH_SIZE);
let tmp = flash_writer.read(NVSTATE_OFFSET, PAGE_SIZE).unwrap();
let mut nvstate_page = [0u8; PAGE_SIZE];
nvstate_page.copy_from_slice(tmp);
match from_bytes_cobs::<NVState>(&mut nvstate_page) {
Ok(nvstate) => nvstate,
Err(_) => NVState::default(),
}
}
impl NVState {
pub fn save(&self, flash: &mut flash::Parts) {
let mut flash_writer = flash.writer(SECTOR_SIZE, FLASH_SIZE);
let mut page = [0u8; PAGE_SIZE];
let used = to_slice_cobs(self, &mut page).unwrap();
flash_writer.page_erase(NVSTATE_OFFSET).unwrap();
flash_writer.write(NVSTATE_OFFSET, &used).unwrap();
}
}