extern crate linux_embedded_hal as hal;
extern crate rfid_rs as mfrc522;
use std::fs::File;
use std::io::Write;
use embedded_hal::blocking::delay::DelayMs;
use embedded_hal::blocking::spi::{Transfer as SpiTransfer, Write as SpiWrite};
use embedded_hal::digital::v2::OutputPin;
use hal::spidev::{SpiModeFlags, SpidevOptions};
use hal::sysfs_gpio::Direction;
use hal::{Delay, Pin, Spidev};
use mfrc522::Mfrc522;
pub struct Led;
impl Led {
fn on(&mut self) {
File::create("/sys/class/leds/beaglebone:green:usr1/brightness")
.unwrap()
.write_all(b"1\n")
.unwrap();
}
fn off(&mut self) {
File::create("/sys/class/leds/beaglebone:green:usr1/brightness")
.unwrap()
.write_all(b"0\n")
.unwrap();
}
}
fn main() {
let mut spi = Spidev::open("/dev/spidev0.0").unwrap();
let options = SpidevOptions::new()
.max_speed_hz(1_000_000)
.mode(SpiModeFlags::SPI_MODE_0)
.build();
spi.configure(&options).unwrap();
let pin = Pin::new(5); pin.export().unwrap();
while !pin.is_exported() {}
pin.set_direction(Direction::Out).unwrap();
pin.set_value(1).unwrap();
let mut led = Led;
let mut delay = Delay;
let mut mfrc522 = Mfrc522::new(spi, pin).unwrap();
let vers = mfrc522.version().unwrap();
println!("VERSION: 0x{:x}", vers);
assert!(vers == 0x91 || vers == 0x92);
loop {
const CARD_UID: [u8; 4] = [34, 246, 178, 171];
const TAG_UID: [u8; 4] = [128, 170, 179, 76];
match mfrc522.reqa() {
Ok(atqa) => {
if let Ok(uid) = mfrc522.select(&atqa) {
println!("UID: {:?}", uid.as_bytes());
if uid.as_bytes() == &CARD_UID {
led.off();
println!("CARD");
} else if uid.as_bytes() == &TAG_UID {
led.on();
println!("TAG");
}
handle_authenticate(&mut mfrc522, &uid, |m| {
match m.mf_read(1) {
Ok(data) => {
println!("read {:?}", data);
}
Err(_) => {
println!("error during read");
}
}
});
}
}
Err(e) => {
println!("ERROR: {:?}", e);
}
}
delay.delay_ms(1000u32);
}
}
fn handle_authenticate<E, SPI, NSS, F>(
mfrc522: &mut Mfrc522<SPI, NSS>,
uid: &mfrc522::Uid,
action: F,
) where
SPI: SpiTransfer<u8, Error = E> + SpiWrite<u8, Error = E>,
NSS: OutputPin,
F: FnOnce(&mut Mfrc522<SPI, NSS>) -> (),
{
let key = [0xFF; 6];
if mfrc522.mf_authenticate(uid, 1, &key).is_ok() {
action(mfrc522);
} else {
println!("Could not authenticate");
}
if mfrc522.hlta().is_err() {
println!("Could not halt");
}
if mfrc522.stop_crypto1().is_err() {
println!("Could not disable crypto1");
}
}