uem_reader/
card.rs

1//! Crate card related structures
2//! 
3
4#![allow(dead_code)]
5
6use enum_iterator::Sequence;
7
8// #[repr(u8)]
9// #[derive(Debug, Default, PartialEq, Sequence, Clone)]
10// pub enum UemCardStandard {
11//     #[default]
12//     Iso14443a = 0x00,
13//     Iso14443b = 0x01,
14//     Iso15693 = 0x02,
15// }
16
17#[repr(u8)]
18#[derive(Debug, Default, PartialEq, Sequence, Clone, Copy)]
19pub enum UemCardBaudrates {
20    #[default]
21    Baud106kbps = 0b00,
22    Baud212kbps = 0b01,
23    Baud424kbps = 0b10,
24    Baud848kbps = 0b11,
25}
26
27#[derive(Debug, Clone)]
28/// ISO14443A card type object
29pub struct UemCardIso14443A {
30    /// Answer to request - 2 bytes
31    pub atq: Vec<u8>,
32    /// Select Acknowledge byte 
33    pub sak: u8,
34    /// Unique identifier - 4/7/10 bytes
35    pub uid: Vec<u8>,
36    /// Answer to select - returned after switching
37    /// to T=CL mode
38    pub ats: Vec<u8>,
39}
40
41#[derive(Debug, Clone)]
42/// ISO14443B card type object
43pub struct UemCardIso14443B {
44    /// Buffer length identifier
45    pub mbli: u8,
46    /// Unique identifier - 4 bytes
47    pub pupi: Vec<u8>,
48    /// Application data - 4 bytes
49    pub app_data: Vec<u8>,
50    /// Protocol information - 3 bytes
51    pub prot_info: Vec<u8>,
52    /// Answer to request
53    pub atq: Vec<u8>,
54}
55
56/// General placeholder for a card object
57pub enum UemCard {
58    Iso14443A(UemCardIso14443A),
59    Iso14443B(UemCardIso14443B),
60}
61
62impl UemCard {
63    /// Returns unique identifier of a card
64    pub fn uid(&self) -> &Vec<u8> {
65        match self {
66            Self::Iso14443A(card) => &card.uid,
67            Self::Iso14443B(card) => &card.pupi,
68        }
69    }
70}