use core::ffi::c_char;
use alloc::ffi::CString;
use crate::{private::cstr::to_cstring_arg, sys::*};
extern crate alloc;
#[allow(dead_code)]
enum Partition<T> {
SdCard(T),
PartitionLabel(CString),
RawPartition(*mut esp_partition_t),
}
#[derive(Clone)]
pub(crate) enum PartitionRawData {
#[cfg(esp_idf_littlefs_sdmmc_support)]
SdCard(*mut sdmmc_card_t),
PartitionLabel(*const c_char),
RawPartition(*mut esp_partition_t),
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct LittleFsInfo {
pub total_bytes: usize,
pub used_bytes: usize,
}
pub struct Littlefs<T> {
_partition: Partition<T>,
partition_raw_data: PartitionRawData,
}
impl<T> Littlefs<T> {
#[cfg(esp_idf_littlefs_sdmmc_support)]
pub fn new_sdcard<H>(sd_card_driver: T) -> Result<Self, EspError>
where
T: core::borrow::BorrowMut<crate::hal::sd::SdCardDriver<H>>,
{
let card_raw_ptr = sd_card_driver.borrow().card() as *const _ as *mut _;
Ok(Self {
_partition: Partition::SdCard(sd_card_driver),
partition_raw_data: PartitionRawData::SdCard(card_raw_ptr),
})
}
pub unsafe fn new_partition(partition_label: &str) -> Result<Self, EspError> {
let partition_label = to_cstring_arg(partition_label)?;
let partition_raw_data = PartitionRawData::PartitionLabel(partition_label.as_ptr());
Ok(Self {
_partition: Partition::PartitionLabel(partition_label),
partition_raw_data,
})
}
pub unsafe fn new_raw_partition(partition: *mut esp_partition_t) -> Result<Self, EspError> {
Ok(Self {
_partition: Partition::RawPartition(partition),
partition_raw_data: PartitionRawData::RawPartition(partition),
})
}
pub(crate) fn partition_raw_data(&self) -> PartitionRawData {
self.partition_raw_data.clone()
}
pub fn format(&mut self) -> Result<(), EspError> {
match self.partition_raw_data {
#[cfg(esp_idf_littlefs_sdmmc_support)]
PartitionRawData::SdCard(sd_card_ptr) => {
esp!(unsafe { esp_littlefs_format_sdmmc(sd_card_ptr) })?;
}
PartitionRawData::PartitionLabel(label) => {
esp!(unsafe { esp_littlefs_format(label) })?;
}
PartitionRawData::RawPartition(partition) => {
esp!(unsafe { esp_littlefs_format_partition(partition) })?;
}
}
Ok(())
}
}