diff --git a/deploy.py b/deploy.py index b1a1de8..5cf210d 100755 --- a/deploy.py +++ b/deploy.py @@ -925,9 +925,9 @@ if __name__ == "__main__": "--nfct_test", dest="application", action="store_const", - const="console_test", - help=("Compiles and installs the console_test example that tests the " - "console driver with messages of various lengths.")) + const="nfct_test", + help=("Compiles and installs the nfct_test example that tests the " + "NFC driver.")) main_parser.set_defaults(features=["with_ctap1"]) diff --git a/examples/nfct_test.rs b/examples/nfct_test.rs index a27d7c5..900bcd7 100644 --- a/examples/nfct_test.rs +++ b/examples/nfct_test.rs @@ -4,6 +4,8 @@ use libtock_drivers::console::Console; use libtock_drivers::nfc; fn main(){ + let mut console = Console::new(); + writeln!(console, "****************************************").unwrap(); writeln!(console, "nfct_test application is installed").unwrap(); writeln!(console, "****************************************").unwrap(); diff --git a/third_party/libtock-drivers/src/nfc.rs b/third_party/libtock-drivers/src/nfc.rs index ee2dda3..9fa950c 100644 --- a/third_party/libtock-drivers/src/nfc.rs +++ b/third_party/libtock-drivers/src/nfc.rs @@ -22,45 +22,106 @@ mod allow_nr { pub const RECEIVE: usize = 2; } -pub const TX_BUFFER_SIZE: usize = 256; -pub const RX_BUFFER_SIZE: usize = 256; - -pub struct NfcTag { - tx_buffer: [u8; BUFFER_SIZE], - rx_buffer: [u8; BUFFER_SIZE], - tag_type: u8, +pub fn enable_emulation() { + emulate(true); } -impl NfcTag { - pub fn new() -> Console { - Console { - tx_buffer: [0; TX_BUFFER_SIZE], - tx_buffer: [0; RX_BUFFER_SIZE], - tag_type: 0, - } - } - - pub fn set_tag_type(&mut self, type: u8) { - self.tag_type = type; - } - - pub fn selected(&self) -> bool { - let is_selected = Cell::new(false); - let mut is_selected_alarm = || is_selected.set(true); - let subscription = syscalls::subscribe::( - DRIVER_NUMBER, - subscribe_nr::SELECT, - &mut is_selected_alarm, - ); - if subscription.is_err() { - return; - } - - util::yieldk_for(|| is_selected.get()); - true - } - - pub fn receive(&self) { - - } +pub fn disable_emulation() { + emulate(false); +} + +pub fn emulate(enabled: bool) -> bool { + let result_code = syscalls::command( + DRIVER_NUMBER, + command_nr::EMULATE, + enabled as usize, + 0 + ); + if result_code.is_err() { + return false; + } + + true +} + +pub fn selected() -> bool { + let is_selected = Cell::new(false); + let mut is_selected_alarm = || is_selected.set(true); + let subscription = syscalls::subscribe::( + DRIVER_NUMBER, + subscribe_nr::SELECT, + &mut is_selected_alarm, + ); + if subscription.is_err() { + return false; + } + + util::yieldk_for(|| is_selected.get()); + true +} + +pub fn configure(tag_type: u8) -> bool { + let result_code = syscalls::command( + DRIVER_NUMBER, + command_nr::CONFIGURE, + tag_type as usize, + 0 + ); + if result_code.is_err() { + return false; + } + + true +} + +pub fn receive(buf: &mut [u8]) -> bool { + let result = syscalls::allow(DRIVER_NUMBER, allow_nr::RECEIVE, buf); + if result.is_err() { + return false; + } + + let done = Cell::new(false); + let mut alarm = || done.set(true); + let subscription = syscalls::subscribe::( + DRIVER_NUMBER, + subscribe_nr::RECEIVE, + &mut alarm, + ); + if subscription.is_err() { + return false; + } + + let result_code = syscalls::command(DRIVER_NUMBER, command_nr::RECEIVE, 0, 0); + if result_code.is_err() { + return false; + } + + util::yieldk_for(|| done.get()); + true +} + +pub fn transmit(buf: &mut [u8]) -> bool { + let result = syscalls::allow(DRIVER_NUMBER, allow_nr::TRANSMIT, buf); + if result.is_err() { + return false; + } + + let done = Cell::new(false); + let mut alarm = || done.set(true); + let subscription = syscalls::subscribe::( + DRIVER_NUMBER, + subscribe_nr::TRANSMIT, + &mut alarm, + ); + if subscription.is_err() { + return false; + } + + let result_code = syscalls::command(DRIVER_NUMBER, command_nr::TRANSMIT, 0, 0); + if result_code.is_err() { + return false; + } + + util::yieldk_for(|| done.get()); + true }