Eric Betts 2 лет назад
Родитель
Сommit
4369b01ab7
1 измененных файлов с 37 добавлено и 5 удалено
  1. 37 5
      seader_worker.c

+ 37 - 5
seader_worker.c

@@ -651,7 +651,7 @@ bool seader_process_success_response(Seader* seader, uint8_t* apdu, size_t len)
     SeaderWorker* seader_worker = seader->worker;
 
     // FIXME: use a more semantic method to break nfc related stuff out
-    if (seader->poller) {
+    if (seader->poller || seader->picopass_poller) {
       FURI_LOG_I(TAG, "New SAM Message, %d bytes", len);
       uint32_t space = furi_message_queue_get_space(seader_worker->messages);
       if(space > 0) {
@@ -861,14 +861,13 @@ NfcCommand seader_worker_poller_callback_picopass(PicopassPollerEvent event, voi
     NfcCommand command = NfcCommandContinue;
 
     Seader* seader = context;
+    SeaderWorker* seader_worker = seader->worker;
     PicopassPoller* instance = seader->picopass_poller;
 
     if(event.type == PicopassPollerEventTypeSuccess) {
       FURI_LOG_D(TAG, "PicopassPollerEventTypeSuccess");
 
-      //if(stage == SeaderPollerEventTypeCardDetect) {
-
-
+      if(stage == SeaderPollerEventTypeCardDetect) {
             FURI_LOG_D(TAG, "Card Detect");
 
             uint8_t *csn = picopass_poller_get_csn(instance);
@@ -876,7 +875,40 @@ NfcCommand seader_worker_poller_callback_picopass(PicopassPollerEvent event, voi
             seader_worker_card_detect(seader, 0, NULL, csn, sizeof(PicopassSerialNum), NULL, 0);
 
             furi_thread_set_current_priority(FuriThreadPriorityLowest);
-            //stage = SeaderPollerEventTypeConversation;
+            stage = SeaderPollerEventTypeConversation;
+
+      } else if(stage == SeaderPollerEventTypeConversation) {
+
+          if (furi_mutex_acquire(seader_worker->mq_mutex, 0) == FuriStatusOk) {
+            furi_thread_set_current_priority(FuriThreadPriorityHighest);
+            uint32_t count = furi_message_queue_get_count(seader_worker->messages);
+            if(count > 0) {
+                FURI_LOG_D(TAG, "Conversation: %ld messages", count);
+
+                BitBuffer* message = bit_buffer_alloc(furi_message_queue_get_message_size(seader_worker->messages));
+                FuriStatus status =
+                    furi_message_queue_get(seader_worker->messages, message, FuriWaitForever);
+                if(status != FuriStatusOk) {
+                    FURI_LOG_W(TAG, "furi_message_queue_get fail %d", status);
+                    return NfcCommandStop;
+                }
+                size_t len = bit_buffer_get_size_bytes(message);
+                uint8_t* payload = (uint8_t*)bit_buffer_get_data(message);
+                FURI_LOG_D(TAG, "Conversation: message length %d: %p", len, payload);
+
+                seader_process_success_response_i(seader, payload, len);
+                //bit_buffer_free(message);
+            }
+            furi_mutex_release(seader_worker->mq_mutex);
+
+            stage = SeaderPollerEventTypeComplete;
+          }
+
+
+      } else if(stage == SeaderPollerEventTypeComplete) {
+          FURI_LOG_D(TAG, "Complete");
+          return NfcCommandStop;
+      }