rfid-rs 0.1.2

Linux MFRC522 library
Documentation
use spidev::{Spidev, SpidevOptions, SpiModeFlags};
use std::io;

extern crate rfid_rs;
use rfid_rs::picc;

fn create_spi() -> io::Result<Spidev> {
    let mut spi = Spidev::open("/dev/spidev1.0")?;
    let options = SpidevOptions::new()
        .bits_per_word(8)
        .max_speed_hz(20_000)
        .mode(SpiModeFlags::SPI_MODE_0)
        .build();
    spi.configure(&options)?;
    Ok(spi)
}

fn main() {
    let spi = create_spi().unwrap();
    let mut mfrc522 = rfid_rs::MFRC522 { spi };
    mfrc522.init().expect("Init failed!");

    loop {
        let new_card = mfrc522.new_card_present().is_ok();

        if new_card {
            let key: rfid_rs::MifareKey = [0xffu8; 6];

            let uid = match mfrc522.read_card_serial() {
                Ok(u) => u,
                Err(e) => {
                    println!("Could not read card: {:?}", e);
                    continue
                },
            };

            let block = 1;
            let buffer = [0x42u8, 0x66u8, 0x13u8, 0x69u8, 0x42u8, 0x66u8, 0x13u8, 0x69u8,
                          0x42u8, 0x66u8, 0x13u8, 0x69u8, 0x42u8, 0x66u8, 0x13u8, 0x69u8];

            match mfrc522.authenticate(picc::Command::MfAuthKeyA, block, key, &uid) {
                Ok(_) => println!("Authenticated card"),
                Err(e) => {
                    println!("Could not authenticate card {:?}", e);
                    continue
                }
            }
            match mfrc522.mifare_write(block, &buffer) {
                Ok(_) => println!("Wrote block {} successfully", block),
                Err(e) => {
                    println!("Failed reading block {}: {:?}", block, e);
                    continue
                }
            }

            mfrc522.halt_a().expect("Could not halt");
            mfrc522.stop_crypto1().expect("Could not stop crypto1");
        }
    }
}