Explorar o código

can re-read picopass

Eric Betts %!s(int64=2) %!d(string=hai) anos
pai
achega
32bda09081
Modificáronse 1 ficheiros con 43 adicións e 11 borrados
  1. 43 11
      seader_worker.c

+ 43 - 11
seader_worker.c

@@ -452,11 +452,33 @@ void seader_send_nfc_rx(SeaderUartBridge* seader_uart, uint8_t* buffer, size_t l
     ASN_STRUCT_FREE(asn_DEF_Response, response);
 }
 
+/*
+FuriHalNfcReturn
+    seader_worker_fake_epurse_update(uint8_t* buffer, uint8_t* rxBuffer, uint16_t* recvLen) {
+    uint8_t fake_response[10];
+    memset(fake_response, 0, sizeof(fake_response));
+    memcpy(fake_response + 0, buffer + 6, 4);
+    memcpy(fake_response + 4, buffer + 2, 4);
+
+    uint16_t crc = seader_worker_picopass_calculate_ccitt(0xE012, fake_response, 8);
+    memcpy(fake_response + 8, &crc, sizeof(uint16_t));
+
+    memcpy(rxBuffer, fake_response, sizeof(fake_response));
+    *recvLen = sizeof(fake_response);
+
+    memset(display, 0, sizeof(display));
+    for(uint8_t i = 0; i < sizeof(fake_response); i++) {
+        snprintf(display + (i * 2), sizeof(display), "%02x", fake_response[i]);
+    }
+    FURI_LOG_I(TAG, "Fake update E-Purse response: %s", display);
+    return FuriHalNfcReturnOk;
+}
+*/
+
 NfcCommand seader_iso15693_transmit(Seader* seader, uint8_t* buffer, size_t len) {
     UNUSED(seader);
     UNUSED(buffer);
     UNUSED(len);
-    FURI_LOG_D(TAG, "seader_iso15693_transmit");
 
     NfcCommand ret = NfcCommandContinue;
     SeaderWorker* seader_worker = seader->worker;
@@ -476,15 +498,12 @@ NfcCommand seader_iso15693_transmit(Seader* seader, uint8_t* buffer, size_t len)
         if(error == PicopassErrorIncorrectCrc) {
             error = PicopassErrorNone;
         }
-        FURI_LOG_I(TAG, "picopass_poller_send_frame %d", error);
 
         if(error != PicopassErrorNone) {
             ret = NfcCommandStop;
             break;
         }
 
-        FURI_LOG_I(TAG, "picopass incoming %d bytes", bit_buffer_get_size_bytes(rx_buffer));
-
         // seader_capture_sio(buffer, len, rxBuffer, credential);
         seader_send_nfc_rx(
             seader_uart,
@@ -833,6 +852,9 @@ SeaderPollerEventType seader_worker_poller_conversation(Seader* seader) {
                 furi_message_queue_get(seader_worker->messages, message, FuriWaitForever);
             if(status != FuriStatusOk) {
                 FURI_LOG_W(TAG, "furi_message_queue_get fail %d", status);
+                if(seader_worker->callback) {
+                    seader_worker->callback(SeaderWorkerEventFail, seader_worker->context);
+                }
                 return SeaderPollerEventTypeComplete;
             }
             size_t len = bit_buffer_get_size_bytes(message);
@@ -887,12 +909,15 @@ NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void
             stage = SeaderPollerEventTypeConversation;
         } else if(stage == SeaderPollerEventTypeConversation) {
             stage = seader_worker_poller_conversation(seader);
-
-            // stage = SeaderPollerEventTypeComplete;
         } else if(stage == SeaderPollerEventTypeComplete) {
             FURI_LOG_D(TAG, "Complete");
+            view_dispatcher_send_custom_event(
+                seader->view_dispatcher, SeaderCustomEventWorkerExit);
             ret = NfcCommandStop;
         }
+    } else {
+        // add failure callback if failure type
+        FURI_LOG_D(TAG, "14a event type %x", iso14443_4a_event->type);
     }
 
     return ret;
@@ -903,19 +928,20 @@ NfcCommand seader_worker_poller_callback_picopass(PicopassPollerEvent event, voi
     NfcCommand ret = NfcCommandContinue;
 
     Seader* seader = context;
+    SeaderWorker* seader_worker = seader->worker;
     PicopassPoller* instance = seader->picopass_poller;
 
-    if(event.type == PicopassPollerEventTypeSuccess) {
+    if(event.type == PicopassPollerEventTypeRequestMode) {
+        // Is this a good place to reset?
+        stage = SeaderPollerEventTypeCardDetect;
+        requestPacs = true;
+    } else if(event.type == PicopassPollerEventTypeSuccess) {
         if(stage == SeaderPollerEventTypeCardDetect) {
             FURI_LOG_D(TAG, "Card Detect");
-
             uint8_t* csn = picopass_poller_get_csn(instance);
-
             seader_worker_card_detect(seader, 0, NULL, csn, sizeof(PicopassSerialNum), NULL, 0);
-
             furi_thread_set_current_priority(FuriThreadPriorityLowest);
             stage = SeaderPollerEventTypeConversation;
-
         } else if(stage == SeaderPollerEventTypeConversation) {
             FURI_LOG_D(TAG, "picopass conversation");
             stage = seader_worker_poller_conversation(seader);
@@ -925,6 +951,12 @@ NfcCommand seader_worker_poller_callback_picopass(PicopassPollerEvent event, voi
                 seader->view_dispatcher, SeaderCustomEventWorkerExit);
             ret = NfcCommandStop;
         }
+    } else if(event.type == PicopassPollerEventTypeFail) {
+        if(seader_worker->callback) {
+            seader_worker->callback(SeaderWorkerEventFail, seader_worker->context);
+        }
+    } else {
+        FURI_LOG_D(TAG, "picopass event type %x", event.type);
     }
 
     return ret;