[FL-2864] NFC update detect reader (#1820)
* nfc: update detect reader view * nfc: make detect reader more interractive * nfc: update icons * nfc: fix detect reader gui * nfc: fix gui, fix worker events * nfc: fix notifications * nfc: add nfc_worker NULL assert Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
@@ -92,7 +92,7 @@ void mfkey32_set_callback(Mfkey32* instance, Mfkey32ParseDataCallback callback,
|
||||
|
||||
static bool mfkey32_write_params(Mfkey32* instance, Mfkey32Params* params) {
|
||||
FuriString* str = furi_string_alloc_printf(
|
||||
"Sector %d key %c cuid %08x nt0 %08x nr0 %08x ar0 %08x nt1 %08x nr1 %08x ar1 %08x\n",
|
||||
"Sec %d key %c cuid %08x nt0 %08x nr0 %08x ar0 %08x nt1 %08x nr1 %08x ar1 %08x\n",
|
||||
params->sector,
|
||||
params->key == MfClassicKeyA ? 'A' : 'B',
|
||||
params->cuid,
|
||||
|
@@ -647,7 +647,8 @@ static void nfc_worker_reader_analyzer_callback(ReaderAnalyzerEvent event, void*
|
||||
furi_assert(context);
|
||||
NfcWorker* nfc_worker = context;
|
||||
|
||||
if(event == ReaderAnalyzerEventMfkeyCollected) {
|
||||
if((nfc_worker->state == NfcWorkerStateAnalyzeReader) &&
|
||||
(event == ReaderAnalyzerEventMfkeyCollected)) {
|
||||
if(nfc_worker->callback) {
|
||||
nfc_worker->callback(NfcWorkerEventDetectReaderMfkeyCollected, nfc_worker->context);
|
||||
}
|
||||
@@ -655,6 +656,9 @@ static void nfc_worker_reader_analyzer_callback(ReaderAnalyzerEvent event, void*
|
||||
}
|
||||
|
||||
void nfc_worker_analyze_reader(NfcWorker* nfc_worker) {
|
||||
furi_assert(nfc_worker);
|
||||
furi_assert(nfc_worker->callback);
|
||||
|
||||
FuriHalNfcTxRxContext tx_rx = {};
|
||||
|
||||
ReaderAnalyzer* reader_analyzer = nfc_worker->reader_analyzer;
|
||||
@@ -673,17 +677,32 @@ void nfc_worker_analyze_reader(NfcWorker* nfc_worker) {
|
||||
rfal_platform_spi_acquire();
|
||||
|
||||
FURI_LOG_D(TAG, "Start reader analyzer");
|
||||
|
||||
uint8_t reader_no_data_received_cnt = 0;
|
||||
bool reader_no_data_notified = true;
|
||||
|
||||
while(nfc_worker->state == NfcWorkerStateAnalyzeReader) {
|
||||
furi_hal_nfc_stop_cmd();
|
||||
furi_delay_ms(5);
|
||||
furi_hal_nfc_listen_start(nfc_data);
|
||||
if(furi_hal_nfc_listen_rx(&tx_rx, 300)) {
|
||||
if(reader_no_data_notified) {
|
||||
nfc_worker->callback(NfcWorkerEventDetectReaderDetected, nfc_worker->context);
|
||||
}
|
||||
reader_no_data_received_cnt = 0;
|
||||
reader_no_data_notified = false;
|
||||
NfcProtocol protocol =
|
||||
reader_analyzer_guess_protocol(reader_analyzer, tx_rx.rx_data, tx_rx.rx_bits / 8);
|
||||
if(protocol == NfcDeviceProtocolMifareClassic) {
|
||||
mf_classic_emulator(&emulator, &tx_rx);
|
||||
}
|
||||
} else {
|
||||
reader_no_data_received_cnt++;
|
||||
if(!reader_no_data_notified && (reader_no_data_received_cnt > 5)) {
|
||||
nfc_worker->callback(NfcWorkerEventDetectReaderLost, nfc_worker->context);
|
||||
reader_no_data_received_cnt = 0;
|
||||
reader_no_data_notified = true;
|
||||
}
|
||||
FURI_LOG_D(TAG, "No data from reader");
|
||||
continue;
|
||||
}
|
||||
|
@@ -56,6 +56,8 @@ typedef enum {
|
||||
NfcWorkerEventFoundKeyB,
|
||||
|
||||
// Detect Reader events
|
||||
NfcWorkerEventDetectReaderDetected,
|
||||
NfcWorkerEventDetectReaderLost,
|
||||
NfcWorkerEventDetectReaderMfkeyCollected,
|
||||
|
||||
// Mifare Ultralight events
|
||||
|
Reference in New Issue
Block a user