123 lines
2.4 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 = 8;
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++;
for (uint8_t j = 0; j < 16; j++) {
((uint8_t *)&mifare_card_data)[i + j] = buffer[j];
}
break;
}
//stop_card_working();
return &mifare_card_data;
}
bool write_mifare_card()
{
status_code status;
uint8_t block = 8;
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++;
break;
}
//stop_card_working();
return true;
}
void stop_card_working()
{
picc_halt_a();
pcd_stop_cryptol();
}
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;
mifare_card_data.uid[0] = 0x5555AAAA;
mifare_card_data.uid[1] = 0xEEEEFFFF;
mifare_card_data.uid[2] = 0x11112222;
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;
}