50 lines
1.2 KiB
C++
50 lines
1.2 KiB
C++
|
|
#include "card_reader.hpp"
|
|
#include "factory.hpp"
|
|
#include <cstring>
|
|
|
|
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 } };
|
|
}
|