use embedded_hal::delay::DelayNs; use embedded_hal::digital::{InputPin, OutputPin}; use crate::{Error, Interface, Pn532}; use crate::types::felica::{CardSession, FelicaLiteSBlock}; use crate::types::felica::felica_lite_s::auth::{AuthSession, CardKey, CardKeyVersion}; use crate::types::felica::felica_lite_s::config::MemoryConfig; impl Pn532 where RST: OutputPin, IRQ: InputPin, DELAY: DelayNs, B: Interface { pub fn set_id(&mut self, card: &CardSession, arbitrary: [u8; 6], dfc: Option<[u8; 2]>) -> Result<(), Error> { let dfc = dfc.unwrap_or_default(); let mut block = [0u8; 16]; block[8] = dfc[0]; block[9] = dfc[1]; block[10..16].copy_from_slice(&arbitrary); self.write_block( card, &[FelicaLiteSBlock::ID], &[block] ) } pub fn get_id(&mut self, card: &CardSession) -> Result<[u8; 16], Error> { let mut block = [[0u8; 16]]; self.read_block( card, &[FelicaLiteSBlock::ID], &mut block )?; crate::trace!("ID block: {:02X}", block); Ok(block[0]) } pub fn set_ck(&mut self, card: &CardSession, key: &CardKey) -> Result<(), Error> { self.write_block( card, &[FelicaLiteSBlock::CK], &[**key] ) } pub fn set_ck_with_mac(&mut self, card: &CardSession, session: &AuthSession, key: &CardKey) -> Result<(), Error> { self.write_with_mac( card, session, FelicaLiteSBlock::CK, &**key ) } pub fn set_ckv(&mut self, card: &CardSession, version: &CardKeyVersion) -> Result<(), Error> { self.write_block( card, &[FelicaLiteSBlock::CKV], &[version.as_block()] ) } pub fn set_ckv_with_mac(&mut self, card: &CardSession, session: &AuthSession, version: &CardKeyVersion) -> Result<(), Error> { self.write_with_mac( card, session, FelicaLiteSBlock::CKV, &version.as_block() ) } pub fn get_ckv(&mut self, card: &CardSession) -> Result> { let mut block = [[0u8; 16]]; self.read_block( card, &[FelicaLiteSBlock::CKV], &mut block )?; crate::trace!("CKV block: {:02X}", block); Ok(CardKeyVersion::from(block[0])) } pub fn get_mc(&mut self, card: &CardSession) -> Result> { let mut block = [[0u8; 16]]; self.read_block( card, &[FelicaLiteSBlock::MemoryConfig], &mut block )?; crate::trace!("MC block: {:02X}", block[0]); Ok(MemoryConfig::from(block[0])) } pub fn set_mc(&mut self, card: &CardSession, config: MemoryConfig) -> Result<(), Error> { let block: [u8; 16] = config.into(); self.write_block( card, &[FelicaLiteSBlock::MemoryConfig], &[block] ) } }