Skip to main content
RKTK API Docs RKTK Home Repo

rktk/config/storage/
write.rs

1use core::fmt::Debug;
2use kmsm::interface::state::config::StateConfig;
3use postcard::experimental::max_size::MaxSize as _;
4
5use crate::{config::keymap::Layer, drivers::interface::storage::StorageDriver};
6
7use super::{ConfigKey, StorageConfigManager};
8
9#[derive(Debug)]
10pub enum ConfigWriteError<E: Debug> {
11    WriteError(E),
12    EncodeError(postcard::Error),
13}
14
15impl<E: Debug> From<E> for ConfigWriteError<E> {
16    fn from(e: E) -> Self {
17        ConfigWriteError::WriteError(e)
18    }
19}
20
21impl<S: StorageDriver> StorageConfigManager<S> {
22    pub async fn write_version(&self, version: u16) -> Result<(), ConfigWriteError<S::Error>> {
23        let key = u64::from_le_bytes([ConfigKey::Version as u8, 0, 0, 0, 0, 0, 0, 0]);
24
25        self.storage.write::<2>(key, &version.to_le_bytes()).await?;
26        Ok(())
27    }
28
29    pub async fn write_state_config(
30        &self,
31        data: &StateConfig,
32    ) -> Result<(), ConfigWriteError<S::Error>> {
33        let key = u64::from_le_bytes([ConfigKey::StateConfig as u8, 0, 0, 0, 0, 0, 0, 0]);
34
35        let mut buf = [0; StateConfig::POSTCARD_MAX_SIZE];
36        let _slice = postcard::to_slice(data, &mut buf).map_err(ConfigWriteError::EncodeError)?;
37        self.storage.write::<{ StateConfig::POSTCARD_MAX_SIZE }>(key, &buf).await?;
38        Ok(())
39    }
40
41    pub async fn write_keymap(
42        &self,
43        layer: u8,
44        data: &Layer,
45    ) -> Result<(), ConfigWriteError<S::Error>> {
46        let key = u64::from_le_bytes([ConfigKey::StateKeymap as u8, layer, 0, 0, 0, 0, 0, 0]);
47
48        let mut buf = [0; Layer::POSTCARD_MAX_SIZE];
49        let _slice = postcard::to_slice(data, &mut buf).map_err(ConfigWriteError::EncodeError)?;
50        self.storage.write::<{ Layer::POSTCARD_MAX_SIZE }>(key, &buf).await?;
51        Ok(())
52    }
53
54    pub async fn write_calibration<const N: usize>(
55        &self,
56        data: &[u8],
57    ) -> Result<(), ConfigWriteError<S::Error>> {
58        let key = u64::from_le_bytes([ConfigKey::Calibration as u8, 0, 0, 0, 0, 0, 0, 0]);
59        self.storage.write::<N>(key, data).await?;
60        Ok(())
61    }
62}