mirror of
https://github.com/whowechina/aic_pico.git
synced 2024-11-27 23:10:48 +01:00
Better card name report mechnism
This commit is contained in:
parent
2f3824b664
commit
c85e42094f
@ -33,6 +33,7 @@ typedef enum {
|
||||
CARD_AIME,
|
||||
CARD_BANA,
|
||||
CARD_NESICA,
|
||||
CARD_VICINITY,
|
||||
CARD_EAMUSE,
|
||||
} nfc_card_name;
|
||||
|
||||
@ -40,6 +41,9 @@ const char *nfc_card_name_str(nfc_card_name card_name);
|
||||
nfc_card_name nfc_last_card_name();
|
||||
void nfc_identify_last_card();
|
||||
|
||||
typedef void (*card_name_listener_func)(nfc_card_name card_name);
|
||||
void nfc_set_card_name_listener(card_name_listener_func listener);
|
||||
|
||||
typedef void (*nfc_wait_loop_t)();
|
||||
typedef struct {
|
||||
nfc_card_type card_type;
|
||||
|
@ -54,7 +54,7 @@ static inline bool card_splash_active()
|
||||
return time_us_64() - card_splash.time < 3000000;
|
||||
}
|
||||
|
||||
void report_card(nfc_card_name card)
|
||||
void gui_report_card(nfc_card_name card)
|
||||
{
|
||||
card_splash.card = card;
|
||||
card_splash.time = time_us_64();
|
||||
|
@ -17,6 +17,6 @@ void gui_init();
|
||||
void gui_level(uint8_t level);
|
||||
void gui_loop();
|
||||
uint16_t gui_keypad_read();
|
||||
void report_card(nfc_card_name card);
|
||||
void gui_report_card(nfc_card_name card);
|
||||
|
||||
#endif
|
@ -75,18 +75,48 @@ const char *nfc_card_name_str(nfc_card_name card_name)
|
||||
|
||||
#define CARD_INFO_TIMEOUT_US (1000 * 1000)
|
||||
|
||||
static nfc_card_name last_card_name = CARD_NONE;
|
||||
static uint64_t last_card_name_time = 0;
|
||||
|
||||
static void update_card_name(nfc_card_name card_name)
|
||||
static nfc_card_name last_card_name = CARD_NONE;
|
||||
static bool last_name_final;
|
||||
static uint64_t last_card_name_time = 0;
|
||||
static card_name_listener_func card_name_listener;
|
||||
|
||||
static inline bool last_name_expired()
|
||||
{
|
||||
last_card_name = card_name;
|
||||
last_card_name_time = time_us_64();
|
||||
return time_us_64() - last_card_name_time > CARD_INFO_TIMEOUT_US;
|
||||
}
|
||||
|
||||
static void update_card_name(nfc_card_name card_name, bool final)
|
||||
{
|
||||
bool accept = last_name_expired();
|
||||
|
||||
if (!accept && !last_name_final) {
|
||||
accept = true;
|
||||
}
|
||||
|
||||
if (!accept && (card_name == last_card_name)) {
|
||||
accept = true;
|
||||
}
|
||||
|
||||
if (accept) {
|
||||
last_card_name = card_name;
|
||||
last_name_final = final;
|
||||
|
||||
last_card_name_time = time_us_64();
|
||||
if (card_name_listener) {
|
||||
card_name_listener(card_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void nfc_set_card_name_listener(card_name_listener_func listener)
|
||||
{
|
||||
card_name_listener = listener;
|
||||
}
|
||||
|
||||
nfc_card_name nfc_last_card_name()
|
||||
{
|
||||
if (time_us_64() - last_card_name_time > CARD_INFO_TIMEOUT_US) {
|
||||
if (last_name_expired()) {
|
||||
return CARD_NONE;
|
||||
}
|
||||
|
||||
@ -288,7 +318,16 @@ nfc_card_t nfc_detect_card()
|
||||
if (nfc_detect_mifare(&card) ||
|
||||
nfc_detect_felica(&card) ||
|
||||
nfc_detect_vicinity(&card)) {
|
||||
|
||||
update_last_card(&card);
|
||||
if (card.card_type == NFC_CARD_FELICA) {
|
||||
update_card_name(CARD_AIC, false);
|
||||
} else if (card.card_type == NFC_CARD_MIFARE) {
|
||||
update_card_name(CARD_MIFARE, false);
|
||||
} else if (card.card_type == NFC_CARD_VICINITY) {
|
||||
update_card_name(CARD_EAMUSE, true);
|
||||
}
|
||||
|
||||
return card;
|
||||
}
|
||||
|
||||
@ -319,10 +358,6 @@ void nfc_identify_last_card()
|
||||
|
||||
if (last_card.card_type == NFC_CARD_FELICA) {
|
||||
nfc_felica_read(0x000b, 0x8082, last_card.uid);
|
||||
} else if (last_card.card_type == NFC_CARD_MIFARE) {
|
||||
update_card_name(CARD_MIFARE);
|
||||
} else if (last_card.card_type == NFC_CARD_VICINITY) {
|
||||
update_card_name(CARD_EAMUSE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -344,26 +379,41 @@ bool nfc_mifare_auth(const uint8_t uid[4], uint8_t block_id, uint8_t key_id, con
|
||||
return api[nfc_module].mifare_auth(uid, block_id, key_id, key);
|
||||
}
|
||||
|
||||
static void identify_mifare_card(const uint8_t block_data[16])
|
||||
{
|
||||
if (memcmp(block_data + 2, "NBGIC", 5) == 0) {
|
||||
update_card_name(CARD_BANA, true);
|
||||
} else if (memcmp(block_data, "SBSD", 4) == 0) {
|
||||
update_card_name(CARD_AIME, true);
|
||||
}
|
||||
}
|
||||
|
||||
bool nfc_mifare_read(uint8_t block_id, uint8_t block_data[16])
|
||||
{
|
||||
if (!api[nfc_module].mifare_read) {
|
||||
return false;
|
||||
}
|
||||
return api[nfc_module].mifare_read(block_id, block_data);
|
||||
|
||||
bool read_ok = api[nfc_module].mifare_read(block_id, block_data);
|
||||
if (read_ok && (block_id == 0x01)) {
|
||||
identify_mifare_card(block_data);
|
||||
}
|
||||
|
||||
return read_ok;
|
||||
}
|
||||
|
||||
static void felica_report_name(const uint8_t dfc[2])
|
||||
{
|
||||
update_card_name(CARD_AIC);
|
||||
update_card_name(CARD_AIC, false);
|
||||
|
||||
if (dfc[1] == 0x78) {
|
||||
update_card_name(CARD_AIC_SEGA);
|
||||
update_card_name(CARD_AIC_SEGA, true);
|
||||
} else if (dfc[1] == 0x68) {
|
||||
update_card_name(CARD_AIC_KONAMI);
|
||||
update_card_name(CARD_AIC_KONAMI, true);
|
||||
} else if ((dfc[1] == 0x2a) || (dfc[1] == 0x3a)) {
|
||||
update_card_name(CARD_AIC_BANA);
|
||||
update_card_name(CARD_AIC_BANA, true);
|
||||
} else if (dfc[1] == 0x79) {
|
||||
update_card_name(CARD_AIC_NESICA);
|
||||
update_card_name(CARD_AIC_NESICA, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -375,7 +425,7 @@ bool nfc_felica_read(uint16_t svc_code, uint16_t block_id, uint8_t block_data[16
|
||||
|
||||
bool read_ok = api[nfc_module].felica_read(svc_code, block_id, block_data);
|
||||
|
||||
if (read_ok && (svc_code = 0x000b) && (block_id == 0x8082)) {
|
||||
if (read_ok && (svc_code == 0x000b) && (block_id == 0x8082)) {
|
||||
felica_report_name(block_data + 8); // DFC
|
||||
}
|
||||
|
||||
|
@ -156,6 +156,11 @@ static void core1_loop()
|
||||
}
|
||||
}
|
||||
|
||||
void card_name_update_cb(nfc_card_name card_name)
|
||||
{
|
||||
gui_report_card(card_name);
|
||||
}
|
||||
|
||||
static void update_cardio(nfc_card_t *card)
|
||||
{
|
||||
switch (card->card_type) {
|
||||
@ -208,7 +213,6 @@ static void cardio_run()
|
||||
}
|
||||
|
||||
old_card = card;
|
||||
report_card(nfc_last_card_name());
|
||||
|
||||
if (!reader_is_active() && !hid_is_active()) {
|
||||
if (card.card_type != NFC_CARD_NONE) {
|
||||
@ -392,6 +396,7 @@ void init()
|
||||
nfc_init();
|
||||
nfc_set_wait_loop(wait_loop);
|
||||
nfc_pn5180_tx_tweak(aic_cfg->tweak.pn5180_tx);
|
||||
nfc_set_card_name_listener(card_name_update_cb);
|
||||
|
||||
aime_init(cdc_reader_putc);
|
||||
aime_virtual_aic(aic_cfg->reader.virtual_aic);
|
||||
|
Loading…
Reference in New Issue
Block a user