use embassy_rp_plus::embassy_rp::flash;
use embassy_rp_plus::embassy_rp::flash::{Async, Flash, Instance, Mode};
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
use embassy_sync::mutex::Mutex;
use crate::flash::flash_util::FlashUtil;
pub struct FlashLock<'a, T: Instance, M: Mode, const FLASH_SIZE: usize> {
flash: Mutex<CriticalSectionRawMutex, Flash<'a, T, M, FLASH_SIZE>>,
}
impl<'a, T: Instance, M: Mode, const FLASH_SIZE: usize> FlashLock<'a, T, M, FLASH_SIZE> {
#[inline]
pub fn new(flash: Flash<'a, T, M, FLASH_SIZE>) -> Self {
Self { flash: Mutex::new(flash) }
}
#[inline]
pub fn build_flash_util(&'a self, offset: u32, erase_size: u32) -> FlashUtil<'a, T, M, FLASH_SIZE> {
FlashUtil::new(self, offset, erase_size)
}
#[inline]
pub fn build_flash_util_default(&'a self) -> FlashUtil<'a, T, M, FLASH_SIZE> {
FlashUtil::new_default(self)
}
#[inline]
pub async fn capacity(&self) -> usize {
self.flash.lock().await.capacity()
}
#[inline]
pub async fn blocking_jedec_id(&self) -> Result<u32, flash::Error> {
self.flash.lock().await.blocking_jedec_id()
}
#[inline]
pub async fn blocking_unique_id(&self, uid: &mut [u8]) -> Result<(), flash::Error> {
self.flash.lock().await.blocking_unique_id(uid)
}
#[inline]
pub async fn blocking_read(&self, offset: u32, bytes: &mut [u8]) -> Result<(), flash::Error> {
self.flash.lock().await.blocking_read(offset, bytes)
}
#[inline]
pub async fn blocking_erase(&self, from: u32, to: u32) -> Result<(), flash::Error> {
self.flash.lock().await.blocking_erase(from, to)
}
#[inline]
pub async fn blocking_write(&self, offset: u32, bytes: &[u8]) -> Result<(), flash::Error> {
self.flash.lock().await.blocking_write(offset, bytes)
}
pub async fn try_erase_write(&self, offset: u32, to: u32, buf: &[u8]) -> Result<(), flash::Error> {
let mut flash = self.flash.lock().await;
flash.blocking_erase(offset, to)?;
flash.blocking_write(offset, buf)
}
}
impl<'a, T: Instance, const FLASH_SIZE: usize> FlashLock<'a, T, Async, FLASH_SIZE> {
#[inline]
pub async fn read(&self, offset: u32, bytes: &mut [u8]) -> Result<(), flash::Error> {
self.flash.lock().await.read(offset, bytes).await
}
}