@@ -41,32 +41,37 @@ impl TryFrom<&[u8]> for UidCl {
4141 }
4242}
4343
44+ /// SEL command codes for each cascade level (ISO14443-3 Table 6).
45+ pub const SEL_CL1 : u8 = 0x93 ;
46+ pub const SEL_CL2 : u8 = 0x95 ;
47+ pub const SEL_CL3 : u8 = 0x97 ;
48+
4449/// Table 6 - Coding of SEL
4550#[ derive( Debug , Clone ) ]
4651#[ repr( u8 ) ]
4752pub enum Cascade {
48- Level1 ( UidCl ) = 0x93 ,
49- Level2 ( UidCl ) = 0x95 ,
50- Level3 ( UidCl ) = 0x97 ,
53+ Level1 ( UidCl ) = SEL_CL1 ,
54+ Level2 ( UidCl ) = SEL_CL2 ,
55+ Level3 ( UidCl ) = SEL_CL3 ,
5156}
5257
5358impl Cascade {
5459 pub ( crate ) fn check_sel ( sel : u8 ) -> bool {
55- sel == 0x93 || sel == 0x95 || sel == 0x97
60+ sel == SEL_CL1 || sel == SEL_CL2 || sel == SEL_CL3
5661 }
5762 pub ( crate ) fn try_from ( sel : u8 , uid_cl : & [ u8 ; 5 ] ) -> Result < Self , TypeAError > {
5863 match sel {
59- 0x93 => Ok ( Cascade :: Level1 ( UidCl :: try_from ( uid_cl) ?) ) ,
60- 0x95 => Ok ( Cascade :: Level2 ( UidCl :: try_from ( uid_cl) ?) ) ,
61- 0x97 => Ok ( Cascade :: Level3 ( UidCl :: try_from ( uid_cl) ?) ) ,
64+ SEL_CL1 => Ok ( Cascade :: Level1 ( UidCl :: try_from ( uid_cl) ?) ) ,
65+ SEL_CL2 => Ok ( Cascade :: Level2 ( UidCl :: try_from ( uid_cl) ?) ) ,
66+ SEL_CL3 => Ok ( Cascade :: Level3 ( UidCl :: try_from ( uid_cl) ?) ) ,
6267 _ => Err ( TypeAError :: UnknownOpcode ( sel) ) ,
6368 }
6469 }
6570 fn code ( & self ) -> u8 {
6671 match self {
67- Cascade :: Level1 ( _) => 0x93 ,
68- Cascade :: Level2 ( _) => 0x95 ,
69- Cascade :: Level3 ( _) => 0x97 ,
72+ Cascade :: Level1 ( _) => SEL_CL1 ,
73+ Cascade :: Level2 ( _) => SEL_CL2 ,
74+ Cascade :: Level3 ( _) => SEL_CL3 ,
7075 }
7176 }
7277
@@ -128,6 +133,24 @@ impl TryFrom<u8> for NumberOfValidBits {
128133}
129134
130135impl NumberOfValidBits {
136+ /// NVB for initial anticollision: 2 bytes valid (SEL + NVB), no UID bits
137+ /// known yet. ISO14443-3 Table 7.
138+ pub fn anticollision ( ) -> Self {
139+ Self {
140+ byte_cnt : BoundedU8 :: new ( 2 ) . unwrap ( ) ,
141+ bit_cnt : BoundedU8 :: new ( 0 ) . unwrap ( ) ,
142+ }
143+ }
144+
145+ /// NVB for SELECT: 7 bytes valid (SEL + NVB + UID[4] + BCC).
146+ /// ISO14443-3 Table 7.
147+ pub fn select ( ) -> Self {
148+ Self {
149+ byte_cnt : BoundedU8 :: new ( 7 ) . unwrap ( ) ,
150+ bit_cnt : BoundedU8 :: new ( 0 ) . unwrap ( ) ,
151+ }
152+ }
153+
131154 pub ( crate ) fn has_40_data_bits ( & self ) -> bool {
132155 self . byte_cnt == 7 && self . bit_cnt == 0
133156 }
0 commit comments