فهرست منبع

respond to seos

Eric Betts 2 سال پیش
والد
کامیت
2a837eca2f
4فایلهای تغییر یافته به همراه56 افزوده شده و 9 حذف شده
  1. 7 7
      scenes/seader_scene_read_14a.c
  2. 2 2
      seader_i.h
  3. 43 0
      seader_worker.c
  4. 4 0
      seader_worker.h

+ 7 - 7
scenes/seader_scene_read_14a.c

@@ -20,6 +20,7 @@ void seader_scene_read_14a_on_enter(void* context) {
     view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewPopup);
 
     seader->poller = nfc_poller_alloc(seader->nfc, NfcProtocolIso14443_4a);
+    nfc_poller_start(seader->poller, seader_worker_poller_callback_iso14443_4a, seader);
 
     seader_blink_start(seader);
 }
@@ -30,18 +31,12 @@ bool seader_scene_read_14a_on_event(void* context, SceneManagerEvent event) {
 
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == SeaderCustomEventWorkerExit) {
-            nfc_poller_stop(seader->poller);
-            nfc_poller_free(seader->poller);
             seader->credential->type = SeaderCredentialType14A;
             scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess);
             consumed = true;
         }
     } else if(event.type == SceneManagerEventTypeBack) {
-        nfc_poller_stop(seader->poller);
-        nfc_poller_free(seader->poller);
-        static const uint32_t possible_scenes[] = {SeaderSceneStart};
-        scene_manager_search_and_switch_to_previous_scene_one_of(
-            seader->scene_manager, possible_scenes, COUNT_OF(possible_scenes));
+        scene_manager_search_and_switch_to_previous_scene(seader->scene_manager, SeaderSceneStart);
         consumed = true;
     }
 
@@ -51,6 +46,11 @@ bool seader_scene_read_14a_on_event(void* context, SceneManagerEvent event) {
 void seader_scene_read_14a_on_exit(void* context) {
     Seader* seader = context;
 
+    if (seader->poller) {
+      nfc_poller_stop(seader->poller);
+      nfc_poller_free(seader->poller);
+    }
+
     // Clear view
     popup_reset(seader->popup);
 

+ 2 - 2
seader_i.h

@@ -24,8 +24,6 @@
 
 #include <lib/nfc/nfc.h>
 #include <lib/nfc/protocols/iso14443_3a/iso14443_3a.h>
-#include <lib/nfc/protocols/iso14443_3a/iso14443_3a_listener.h>
-#include <lib/nfc/protocols/mf_ultralight/mf_ultralight_listener.h>
 
 #include <nfc/nfc_poller.h>
 #include <nfc/nfc_scanner.h>
@@ -67,6 +65,8 @@ enum SeaderCustomEvent {
     SeaderCustomEventWorkerExit,
     SeaderCustomEventByteInputDone,
     SeaderCustomEventTextInputDone,
+
+    SeaderCustomEventPollerSuccess,
 };
 
 typedef enum {

+ 43 - 0
seader_worker.c

@@ -649,3 +649,46 @@ int32_t seader_worker_task(void* context) {
 
     return 0;
 }
+
+NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context) {
+    furi_assert(event.protocol == NfcProtocolIso14443_4a);
+
+    Seader* seader = context;
+    SeaderUartBridge* seader_uart = seader->uart;
+    const Iso14443_4aPollerEvent* iso14443_4a_event = event.event_data;
+
+    if(iso14443_4a_event->type == Iso14443_4aPollerEventTypeReady) {
+        nfc_device_set_data(seader->nfc_device, NfcProtocolIso14443_4a, nfc_poller_get_data(seader->poller));
+        FURI_LOG_D(TAG, "poller 14a ready");
+
+        size_t uid_len;
+        const uint8_t* uid = nfc_device_get_uid(seader->nfc_device, &uid_len);
+
+        // const Iso14443_4aData* iso14443_4a_data = nfc_device_get_data(seader->nfc_device, NfcProtocolIso14443_4a);
+        //const Iso14443_3aData* iso14443_3a_data = iso14443_4a_data->iso14443_3a_data;
+        const Iso14443_3aData* iso14443_3a_data = nfc_device_get_data(seader->nfc_device, NfcProtocolIso14443_3a);
+        uint8_t sak_val = iso14443_3a_get_sak(iso14443_3a_data);
+
+        CardDetails_t* cardDetails = 0;
+        cardDetails = calloc(1, sizeof *cardDetails);
+        assert(cardDetails);
+
+        OCTET_STRING_fromBuf(&cardDetails->csn, (const char*)uid, uid_len);
+        uint8_t protocolBytes[] = {0x00, FrameProtocol_nfc};
+        OCTET_STRING_fromBuf(&cardDetails->protocol, (const char*)protocolBytes, sizeof(protocolBytes));
+
+        OCTET_STRING_t sak = {.buf = &sak_val, .size = 1};
+        cardDetails->sak = &sak;
+
+        OCTET_STRING_t atqa = {.buf = (uint8_t*)iso14443_3a_data->atqa, .size = 2};
+        cardDetails->atqa = &atqa;
+
+        seader_send_card_detected(seader_uart, cardDetails);
+
+        ASN_STRUCT_FREE(asn_DEF_CardDetails, cardDetails);
+
+        return NfcCommandStop;
+    }
+
+    return NfcCommandContinue;
+}

+ 4 - 0
seader_worker.h

@@ -1,5 +1,6 @@
 #pragma once
 
+#include <lib/nfc/protocols/iso14443_4a/iso14443_4a_poller.h>
 #include "seader_credential.h"
 #include "seader_bridge.h"
 
@@ -52,3 +53,6 @@ void seader_worker_start(
 void seader_worker_stop(SeaderWorker* seader_worker);
 void seader_worker_process_sam_message(SeaderWorker* seader_worker, CCID_Message* message);
 void seader_worker_send_version(SeaderWorker* seader_worker);
+
+
+NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context);