use displaydoc::Display;
use thiserror::Error;
use crate::{
Mmc,
mmc::{Cdb, MmcCommand, MmcDirection, MmcError},
};
impl Mmc {
pub fn set_cd_speed(
&self,
rotation_mode: RotationMode,
read_speed: u16,
write_speed: u16,
) -> Result<(), MmcSetCdSpeedError> {
let mut cdb = Cdb::default();
cdb[0] = MmcCommand::SetCdSpeed as u8;
cdb[1] = rotation_mode as u8;
cdb[2..4].copy_from_slice(&read_speed.to_be_bytes());
cdb[4..6].copy_from_slice(&write_speed.to_be_bytes());
self.run_command(Some(MmcDirection::Write), &mut [], cdb)?;
Ok(())
}
}
#[repr(u8)]
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum RotationMode {
#[default]
Cav = 0b00,
Clv = 0b01,
}
#[derive(Debug, Display, Error)]
pub struct MmcSetCdSpeedError {
#[from]
pub source: MmcError,
}
#[cfg(test)]
mod tests {
use super::*;
#[test_log::test(test)]
#[ignore = "requires a drive with mmc"]
fn set_cd_speed() {
Mmc::new()
.unwrap()
.set_cd_speed(RotationMode::Cav, 0xffff, 0xffff)
.unwrap();
}
}