[FL-663] Read EMV cards (#460)

* nfc: add emv decoder
* api-hal-nfc: add data exchange api
* nfc_worker: add read emv routine
* nfc: add emv reader view
* nfc: add support for Mastercard reading
* api-hal-nfc: fix incorrect merge changes
* nfc_worker: set to zero emv app object on each cycle
* api-hal-nfc: add api for f6 target
* nfc: move emv_decoder to lib folder

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
gornekich
2021-05-18 21:12:01 +03:00
committed by GitHub
parent df4a170213
commit 725981f431
13 changed files with 590 additions and 15 deletions

View File

@@ -40,7 +40,7 @@ static void api_hal_nfc_change_state_cb(rfalNfcState st) {
}
}
bool api_hal_nfc_detect(rfalNfcDevice **dev_list, uint8_t* dev_cnt, uint32_t cycles) {
bool api_hal_nfc_detect(rfalNfcDevice **dev_list, uint8_t* dev_cnt, uint32_t cycles, bool deactivate) {
furi_assert(dev_list);
furi_assert(dev_cnt);
@@ -74,8 +74,10 @@ bool api_hal_nfc_detect(rfalNfcDevice **dev_list, uint8_t* dev_cnt, uint32_t cyc
}
osDelay(5);
}
rfalNfcDeactivate(false);
rfalLowPowerModeStart();
if(deactivate) {
rfalNfcDeactivate(false);
rfalLowPowerModeStart();
}
if(!cycles) {
FURI_LOG_D("HAL NFC", "Timeout");
return false;
@@ -83,3 +85,44 @@ bool api_hal_nfc_detect(rfalNfcDevice **dev_list, uint8_t* dev_cnt, uint32_t cyc
return true;
}
ReturnCode api_hal_nfc_data_exchange(rfalNfcDevice* dev, uint8_t* tx_buff, uint16_t tx_len, uint8_t** rx_buff, uint16_t** rx_len, bool deactivate) {
furi_assert(dev);
furi_assert(tx_buff);
furi_assert(rx_buff);
furi_assert(rx_len);
ReturnCode ret;
rfalNfcDevice* active_dev;
rfalNfcState state = RFAL_NFC_STATE_ACTIVATED;
ret = rfalNfcGetActiveDevice(&active_dev);
if(ret != ERR_NONE) {
return ret;
}
if (active_dev != dev) {
return ERR_NOTFOUND;
}
ret = rfalNfcDataExchangeStart(tx_buff, tx_len, rx_buff, rx_len, 0);
if(ret != ERR_NONE) {
return ret;
}
FURI_LOG_D("HAL NFC", "Start data exchange");
while(state != RFAL_NFC_STATE_DATAEXCHANGE_DONE) {
rfalNfcWorker();
state = rfalNfcGetState();
FURI_LOG_D("HAL NFC", "Data exchange status: %d", rfalNfcDataExchangeGetStatus());
osDelay(10);
}
FURI_LOG_D("HAL NFC", "Data exchange complete");
if(deactivate) {
rfalNfcDeactivate(false);
rfalLowPowerModeStart();
}
return ERR_NONE;
}
void api_hal_nfc_deactivate() {
rfalNfcDeactivate(false);
rfalLowPowerModeStart();
}