rktk_drivers_common/storage/
flash_sequential_map.rs1use core::fmt::Debug;
4use embedded_storage_async::nor_flash::{MultiwriteNorFlash, NorFlash, ReadNorFlash};
5use rktk::{
6 drivers::interface::{Error, storage::StorageDriver},
7 utils::Mutex,
8};
9pub use sequential_storage;
10use sequential_storage::{
11 cache::NoCache,
12 map::{fetch_item, remove_all_items, store_item},
13};
14
15pub struct FlashSequentialMapStorage<'a, F: NorFlash + ReadNorFlash + MultiwriteNorFlash> {
16 pub flash_range: core::ops::Range<u32>,
17 pub flash: &'a Mutex<F>,
18 pub cache: &'a Mutex<NoCache>,
19}
20
21#[derive(Debug)]
22#[cfg_attr(feature = "defmt", derive(defmt::Format))]
23pub enum FlashSequentialMapStorageError<E: Debug> {
24 Storage(#[cfg_attr(feature = "defmt", defmt(Debug2Format))] sequential_storage::Error<E>),
25 NotFound,
26}
27
28impl<E: Debug> Error for FlashSequentialMapStorageError<E> {}
29
30impl<E: Debug> From<sequential_storage::Error<E>> for FlashSequentialMapStorageError<E> {
31 fn from(e: sequential_storage::Error<E>) -> Self {
32 Self::Storage(e)
33 }
34}
35
36impl<F: NorFlash + ReadNorFlash + MultiwriteNorFlash> StorageDriver
37 for FlashSequentialMapStorage<'_, F>
38{
39 type Error = FlashSequentialMapStorageError<F::Error>;
40
41 async fn format(&self) -> Result<(), Self::Error> {
42 let mut flash = self.flash.lock().await;
43 let mut cache = self.cache.lock().await;
44 remove_all_items::<u64, _>(
45 &mut *flash,
46 self.flash_range.clone(),
47 &mut *cache,
48 &mut [0; 1024],
49 )
50 .await?;
51 Ok(())
52 }
53
54 async fn read<const N: usize>(&self, key: u64, buf: &mut [u8]) -> Result<(), Self::Error> {
55 let mut flash = self.flash.lock().await;
56 let mut cache = self.cache.lock().await;
57 let val: [u8; N] = fetch_item(
58 &mut *flash,
59 self.flash_range.clone(),
60 &mut *cache,
61 &mut [0; 1024],
62 &key,
63 )
64 .await?
65 .ok_or(FlashSequentialMapStorageError::NotFound)?;
66 buf.copy_from_slice(&val);
67 Ok(())
68 }
69
70 async fn write<const N: usize>(&self, key: u64, buf: &[u8]) -> Result<(), Self::Error> {
71 let mut flash = self.flash.lock().await;
72 let mut cache = self.cache.lock().await;
73 store_item(
74 &mut *flash,
75 self.flash_range.clone(),
76 &mut *cache,
77 &mut [0; 1024],
78 &key,
79 &buf,
80 )
81 .await?;
82 Ok(())
83 }
84}