Add card detection

This commit is contained in:
2026-08-26 00:08:47 +08:00
parent 5c95cc40f7
commit 261b04fec3
69 changed files with 2178 additions and 5928 deletions
+74
View File
@@ -0,0 +1,74 @@
use crate::{Error, Interface, Pn532, TargetInitStatus};
use crate::commands::{PN532_COMMAND_TGGETDATA, PN532_COMMAND_TGINITASTARGET, PN532_COMMAND_TGSETDATA};
use crate::error::StatusCode;
impl<B: Interface> Pn532<B> {
/// Initialize the PN532 as a target using a raw command frame.
pub fn tg_init_as_target(
&mut self,
command: &[u8],
timeout_ms: u16,
) -> Result<TargetInitStatus, Error<B::TransportError>> {
self.interface.write_command(command, &[])?;
match self.interface.read_response(&mut self.buffer, timeout_ms) {
Ok(_) => Ok(TargetInitStatus::Success),
Err(Error::Timeout) => Ok(TargetInitStatus::Timeout),
Err(_) => Ok(TargetInitStatus::Failed),
}
}
/// Initialize the PN532 as a target with the default LLCP parameters.
pub fn tg_init_as_target_default(
&mut self,
timeout_ms: u16,
) -> Result<TargetInitStatus, Error<B::TransportError>> {
const COMMAND: [u8; 44] = [
PN532_COMMAND_TGINITASTARGET, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0xFE,
0x0F, 0xBB, 0xBA, 0xA6, 0xC9, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0x01, 0xFE, 0x0F, 0xBB, 0xBA, 0xA6, 0xC9, 0x89, 0x00, 0x00, 0x06, 0x46,
0x66, 0x6D, 0x01, 0x01, 0x10, 0x00,
];
self.tg_init_as_target(&COMMAND, timeout_ms)
}
/// Retrieve data received from the initiator.
pub fn tg_get_data(&mut self, buf: &mut [u8]) -> Result<usize, Error<B::TransportError>> {
self.buffer[0] = PN532_COMMAND_TGGETDATA;
self.send(1)?;
let len = self.read_timeout(3000)?;
if len == 0 {
return Ok(0);
}
if self.buffer[0] != 0 {
return Err(Error::Status(StatusCode::from_repr(self.buffer[0]).unwrap()));
}
let data_len = len - 1;
let copy_len = data_len.min(buf.len());
buf[..copy_len].copy_from_slice(&self.buffer[1..1 + copy_len]);
Ok(copy_len)
}
/// Send data to the initiator.
pub fn tg_set_data(
&mut self,
header: &[u8],
body: &[u8],
) -> Result<(), Error<B::TransportError>> {
if header.len() > crate::driver::PACKET_BUFFER_SIZE - 1 {
self.buffer[0] = PN532_COMMAND_TGSETDATA;
self.interface.write_command(&self.buffer[..1], header)?;
} else {
self.buffer[0] = PN532_COMMAND_TGSETDATA;
self.buffer[1..1 + header.len()].copy_from_slice(header);
self.interface
.write_command(&self.buffer[..1 + header.len()], body)?;
}
let len = self.read_timeout(3000)?;
if len == 0 || self.buffer[0] != 0 {
return Err(Error::Status(StatusCode::from_repr(self.buffer[0]).unwrap()));
}
Ok(())
}
}