sdmmc-core 0.5.0

SD/MMC core data structures and algorithms
Documentation
use crate::lib_enum;
use crate::result::Error;

lib_enum! {
    /// Represents the time value multiplier for the maximum transfer rate.
    TransferTimeValue: u8 {
        default: Value25,
        error: Error,
        /// Transfer rate time value: 1.0.
        Value10 = 0x1,
        /// Transfer rate time value: 1.2.
        Value12 = 0x2,
        /// Transfer rate time value: 1.3.
        Value13 = 0x3,
        /// Transfer rate time value: 1.5.
        Value15 = 0x4,
        /// Transfer rate time value: 2.0.
        Value20 = 0x5,
        /// Transfer rate time value: 2.5.
        Value25 = 0x6,
        /// Transfer rate time value: 3.0.
        Value30 = 0x7,
        /// Transfer rate time value: 3.5.
        Value35 = 0x8,
        /// Transfer rate time value: 4.0.
        Value40 = 0x9,
        /// Transfer rate time value: 4.5.
        Value45 = 0xa,
        /// Transfer rate time value: 5.0.
        Value50 = 0xb,
        /// Transfer rate time value: 5.5.
        Value55 = 0xc,
        /// Transfer rate time value: 6.0.
        Value60 = 0xd,
        /// Transfer rate time value: 7.0.
        Value70 = 0xe,
        /// Transfer rate time value: 8.0.
        Value80 = 0xf,
    }
}

impl TransferTimeValue {
    /// Gets the time value for [TransferTimeValue].
    ///
    /// ```rust
    /// # use sdmmc_core::register::csd::{TransferRateUnit, TransferTimeValue};
    /// // To get the actual time value:
    /// let time = (TransferTimeValue::Value13.value() * (TransferRateUnit::Kbits100.kbits() as f32)) as u32;
    /// assert_eq!(time, 130);
    /// ```
    pub const fn value(&self) -> f32 {
        match self {
            Self::Value10 => 1.0,
            Self::Value12 => 1.2,
            Self::Value13 => 1.3,
            Self::Value15 => 1.5,
            Self::Value20 => 2.0,
            Self::Value25 => 2.5,
            Self::Value30 => 3.0,
            Self::Value35 => 3.5,
            Self::Value40 => 4.0,
            Self::Value45 => 4.5,
            Self::Value50 => 5.0,
            Self::Value55 => 5.5,
            Self::Value60 => 6.0,
            Self::Value70 => 7.0,
            Self::Value80 => 8.0,
        }
    }

    /// Gets the integer time value for [TransferTimeValue].
    ///
    /// ```rust
    /// # use sdmmc_core::register::csd::{TransferRateUnit, TransferTimeValue};
    /// // To get the actual time value:
    /// let time = (TransferTimeValue::Value80.value_int() * TransferRateUnit::Mbits100.kbits()) / 10;
    /// assert_eq!(time, 800_000);
    /// ```
    pub const fn value_int(&self) -> u32 {
        match self {
            Self::Value10 => 10,
            Self::Value12 => 12,
            Self::Value13 => 13,
            Self::Value15 => 15,
            Self::Value20 => 20,
            Self::Value25 => 25,
            Self::Value30 => 30,
            Self::Value35 => 35,
            Self::Value40 => 40,
            Self::Value45 => 45,
            Self::Value50 => 50,
            Self::Value55 => 55,
            Self::Value60 => 60,
            Self::Value70 => 70,
            Self::Value80 => 80,
        }
    }
}