1#[repr(C)]
3#[derive(Clone, Copy, Debug, Eq, PartialEq)]
4pub enum OperationMode {
5 Inactive,
6 CardIdentification,
7 DataTransfer,
8}
9
10impl OperationMode {
11 pub const fn new() -> Self {
13 Self::Inactive
14 }
15}
16
17impl Default for OperationMode {
18 fn default() -> Self {
19 Self::new()
20 }
21}
22
23#[repr(C)]
25#[derive(Clone, Copy, Debug, Eq, PartialEq)]
26pub enum CardState {
27 Inactive,
28 Idle,
29 Ready,
30 Identification,
31 Standby,
32 Transfer,
33 SendingData,
34 ReceivingData,
35 Programming,
36 Disconnect,
37}
38
39impl CardState {
40 pub const fn new() -> Self {
42 Self::Inactive
43 }
44
45 pub const fn operation_mode(&self) -> OperationMode {
49 match self {
50 Self::Inactive => OperationMode::Inactive,
51 Self::Idle | Self::Ready | Self::Identification => OperationMode::CardIdentification,
52 _ => OperationMode::DataTransfer,
53 }
54 }
55}
56
57impl Default for CardState {
58 fn default() -> Self {
59 Self::new()
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn test_card_state() {
69 [
70 CardState::Inactive,
71 CardState::Idle,
72 CardState::Ready,
73 CardState::Identification,
74 CardState::Standby,
75 CardState::Transfer,
76 CardState::SendingData,
77 CardState::ReceivingData,
78 CardState::Programming,
79 CardState::Disconnect,
80 ]
81 .into_iter()
82 .zip([
83 OperationMode::Inactive,
84 OperationMode::CardIdentification,
85 OperationMode::CardIdentification,
86 OperationMode::CardIdentification,
87 OperationMode::DataTransfer,
88 OperationMode::DataTransfer,
89 OperationMode::DataTransfer,
90 OperationMode::DataTransfer,
91 OperationMode::DataTransfer,
92 OperationMode::DataTransfer,
93 ])
94 .for_each(|(exp_cs, exp_om)| {
95 assert_eq!(
96 exp_cs.operation_mode(),
97 exp_om,
98 "CardState: {exp_cs:?}, OperationMode: {exp_om:?}"
99 );
100 });
101 }
102}