use std::any::Any;
use std::fmt;
use crate::chip::Timeline;
use crate::time::{EventId, VirtualNanos};
pub const BLOCK: usize = 512;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Answer {
None,
Short(u32),
Long([u32; 4]),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Busy {
Ready,
Until(VirtualNanos),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Outcome {
Whole,
Corrupt,
Ended,
}
pub trait Card: crate::snapshot::Store + fmt::Debug + Send + Any {
fn command(&mut self, index: u8, argument: u32, context: &mut Timeline<'_, '_>) -> Answer;
fn on_event(&mut self, _event: EventId, _context: &mut Timeline<'_, '_>) {}
fn restarted(&mut self, _context: &mut Timeline<'_, '_>) {}
fn busy(&self) -> Busy {
Busy::Ready
}
fn read(&mut self, block: &mut [u8]) -> Outcome;
fn write(&mut self, block: &[u8]) -> Outcome;
fn commanded(&self) -> &[(u8, u32)] {
&[]
}
}
pub mod command {
pub const GO_IDLE_STATE: u8 = 0;
pub const ALL_SEND_CID: u8 = 2;
pub const SET_RELATIVE_ADDR: u8 = 3;
pub const SELECT_DESELECT_CARD: u8 = 7;
pub const SEND_CSD: u8 = 9;
pub const STOP_TRANSMISSION: u8 = 12;
pub const SEND_STATUS: u8 = 13;
pub const SET_BLOCKLEN: u8 = 16;
pub const READ_SINGLE_BLOCK: u8 = 17;
pub const READ_MULTIPLE_BLOCK: u8 = 18;
pub const WRITE_BLOCK: u8 = 24;
pub const WRITE_MULTIPLE_BLOCK: u8 = 25;
pub const APP_CMD: u8 = 55;
pub const SET_BUS_WIDTH: u8 = 6;
pub const SD_SEND_OP_COND: u8 = 41;
}