mirror of
https://github.com/dimoniche/solarium.vlad.git
synced 2026-01-30 04:53:30 +03:00
112 lines
2.2 KiB
C
112 lines
2.2 KiB
C
#include "mfrc522data.h"
|
|
#include <includes.h>
|
|
|
|
#include "rfid-spi.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;
|
|
}
|