[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:
		| @@ -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(); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user