113 lines
2.2 KiB
C

#include "mfrc522data.h"
#include <includes.h>
#include "rfid-spi.h"
#include "time.h"
mifaredata_t mifare_card_data;
mifaredata_t* get_mifare_data()
{
return &mifare_card_data;
}
void set_mifare_data(mifaredata_t* data)
{
memcpy(&mifare_card_data, &data, sizeof(mifaredata_t));
}
mifaredata_t* read_mifare_card()
{
status_code status;
uint8_t block = 1;
uint8_t len = 18;
uint8_t buffer[18];
MIFARE_Key key;
for (uint8_t i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
for(uint8_t i = 0; i < sizeof(mifare_card_data); i += 16)
{
status = pcd_authenticate(PICC_CMD_MF_AUTH_KEY_A, block, &key, get_uid());
if (status != STATUS_OK) {
return NULL;
}
status = mifare_read(block, buffer, &len);
if (status != STATUS_OK) {
return NULL;
}
block++;
len = 18;
for (uint8_t j = 0; j < 16; j++) {
((uint8_t *)&mifare_card_data)[i] = buffer[j];
}
}
picc_halt_a();
pcd_stop_cryptol();
return &mifare_card_data;
}
bool write_mifare_card()
{
status_code status;
uint8_t block = 1;
MIFARE_Key key;
for (uint8_t i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
for(uint8_t i = 0; i < sizeof(mifare_card_data); i += 16)
{
status = pcd_authenticate(PICC_CMD_MF_AUTH_KEY_A, block, &key, get_uid());
if (status != STATUS_OK) {
return false;
}
status = mifare_write(block, &(((uint8_t *)&mifare_card_data)[i]), 16);
if (status != STATUS_OK) {
return false;
}
block++;
}
picc_halt_a();
pcd_stop_cryptol();
return true;
}
mifaredata_t* init_mifare_card_data()
{
for(uint8_t i = 0; i < sizeof(mifare_card_data); i++)
{
((uint8_t *)&mifare_card_data)[i] = 0x00;
}
mifare_card_data.init = 0xDEADBEEF;
return &mifare_card_data;
}
bool is_empty_mifare_card()
{
return mifare_card_data.init != 0xDEADBEEF;
}
bool need_clear_bonus()
{
uint32_t SystemTime = GetTimeSec();
if(SystemTime > mifare_card_data.best_before)
{
mifare_card_data.bonus = 0;
return true;
}
return false;
}