Преглед изворни кода

check read mode when reading

Eric Betts пре 9 месеци
родитељ
комит
a9ecd017f2
2 измењених фајлова са 45 додато и 34 уклоњено
  1. 39 32
      passy_reader.c
  2. 6 2
      scenes/passy_scene_read_success.c

+ 39 - 32
passy_reader.c

@@ -366,46 +366,53 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
             break;
         }
 
-        bit_buffer_reset(passy->DG1);
-        uint8_t header[4];
-        ret = passy_reader_read_binary(passy_reader, 0x00, 0x04, header);
-        if(ret != NfcCommandContinue) {
-            view_dispatcher_send_custom_event(passy->view_dispatcher, PassyCustomEventReaderError);
+        if(passy->read_type == PassyReadDG1) {
+            bit_buffer_reset(passy->DG1);
+            uint8_t header[4];
+            ret = passy_reader_read_binary(passy_reader, 0x00, 0x04, header);
+            if(ret != NfcCommandContinue) {
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderError);
 
-            break;
-        }
-        size_t body_size = asn1_length(header + 1);
-        uint8_t body_offset = 0x04;
-        do {
-            view_dispatcher_send_custom_event(
-                passy->view_dispatcher, PassyCustomEventReaderReading);
-            uint8_t chunk[0x20];
-            uint8_t Le = MIN(sizeof(chunk), (size_t)(body_size - body_offset));
-
-            ret = passy_reader_read_binary(passy_reader, body_offset, Le, chunk);
+                break;
+            }
+            size_t body_size = asn1_length(header + 1);
+            uint8_t body_offset = 0x04;
+            bit_buffer_append_bytes(passy_reader->DG1, header, sizeof(header));
+            do {
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderReading);
+                uint8_t chunk[0x20];
+                uint8_t Le = MIN(sizeof(chunk), (size_t)(body_size - body_offset));
+
+                ret = passy_reader_read_binary(passy_reader, body_offset, Le, chunk);
+                if(ret != NfcCommandContinue) {
+                    view_dispatcher_send_custom_event(
+                        passy->view_dispatcher, PassyCustomEventReaderError);
+                    break;
+                }
+                bit_buffer_append_bytes(passy_reader->DG1, chunk, sizeof(chunk));
+                body_offset += sizeof(chunk);
+            } while(body_offset < body_size);
+            passy_log_bitbuffer(TAG, "DG1", passy_reader->DG1);
+        } else if(passy->read_type == PassyReadDG2) {
+            ret = passy_reader_select_file(passy_reader, 0x0102);
             if(ret != NfcCommandContinue) {
                 view_dispatcher_send_custom_event(
                     passy->view_dispatcher, PassyCustomEventReaderError);
                 break;
             }
-            bit_buffer_append_bytes(passy_reader->DG1, chunk, sizeof(chunk));
-            body_offset += sizeof(chunk);
-        } while(body_offset < body_size);
-        passy_log_bitbuffer(TAG, "DG1", passy_reader->DG1);
 
-        ret = passy_reader_select_file(passy_reader, 0x0102);
-        if(ret != NfcCommandContinue) {
-            view_dispatcher_send_custom_event(passy->view_dispatcher, PassyCustomEventReaderError);
-            break;
-        }
-
-        ret = passy_reader_read_binary(passy_reader, 0x00, 0x04, header);
-        if(ret != NfcCommandContinue) {
-            view_dispatcher_send_custom_event(passy->view_dispatcher, PassyCustomEventReaderError);
-            break;
+            uint8_t header[4];
+            ret = passy_reader_read_binary(passy_reader, 0x00, 0x04, header);
+            if(ret != NfcCommandContinue) {
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderError);
+                break;
+            }
+            size_t body_size = asn1_length(header + 1);
+            FURI_LOG_I(TAG, "DG2 length: %d", body_size);
         }
-        body_size = asn1_length(header + 1);
-        FURI_LOG_I(TAG, "DG2 length: %d", body_size);
 
         // Everything done
         ret = NfcCommandStop;

+ 6 - 2
scenes/passy_scene_read_success.c

@@ -11,8 +11,12 @@ void passy_scene_read_success_on_enter(void* context) {
 
     furi_string_reset(passy->text_box_store);
     FuriString* str = passy->text_box_store;
-    furi_string_cat_printf(str, "%s\n", bit_buffer_get_data(passy->DG1) + 3);
-
+    if(passy->read_type == PassyReadDG1) {
+        // +5 is derived epirically, but really should be from parsing the ASN.1
+        furi_string_cat_printf(str, "%s\n", bit_buffer_get_data(passy->DG1) + 5);
+    } else if(passy->read_type == PassyReadDG2) {
+        furi_string_cat_printf(str, "Saved to disk");
+    }
     text_box_set_font(passy->text_box, TextBoxFontText);
     text_box_set_text(passy->text_box, furi_string_get_cstr(passy->text_box_store));
     view_dispatcher_switch_to_view(passy->view_dispatcher, PassyViewTextBox);