#include "card_reader.hpp" #include "factory.hpp" #include namespace acs { card_reader::card_reader() { rfid_ = factory::get()->get_devices()->rfid(); rfid_->pcd_init(); } uint32_t card_reader::find_card() { if (!rfid_->picc_is_new_card_present()) return 0; if (!rfid_->picc_read_card_serial()) return 0; last_uid_ = rfid_->uid; uint32_t retval; memcpy(&retval, last_uid_.uid_byte, 4); return retval; } std::string card_reader::get_student_number() { auto status = rfid_->pcd_authenticate( mfrc522::PICC_CMD_MF_AUTH_KEY_A, 1, &key_, &last_uid_); if (status != mfrc522::STATUS_OK) return {}; byte buffer[18]; byte len = 18; status = rfid_->mifare_read(1, buffer, &len); if (status != mfrc522::STATUS_OK || len != 18) return {}; std::string retval; for (auto i = 0; i < 10; ++i) { if (buffer[i] < 0x30) break; retval += buffer[i]; } rfid_->pcd_stop_crypto1(); return retval; } mfrc522::mifare_key card_reader::key_ = { { 1, 2, 3, 4, 5, 6 } }; }