Просмотр исходного кода

For all other DG, grab the header and show that

Eric Betts 9 месяцев назад
Родитель
Сommit
194c9778d1
6 измененных файлов с 34 добавлено и 2 удалено
  1. 2 0
      passy.c
  2. 1 0
      passy_i.h
  3. 13 0
      passy_reader.c
  4. 1 0
      passy_reader.h
  5. 2 0
      scenes/passy_scene_read_error.c
  6. 15 2
      scenes/passy_scene_read_success.c

+ 2 - 0
passy.c

@@ -193,6 +193,7 @@ Passy* passy_alloc() {
 
     passy->DG1 = bit_buffer_alloc(PASSY_DG1_MAX_LENGTH);
     passy->COM = bit_buffer_alloc(PASSY_DG1_MAX_LENGTH);
+    passy->dg_header = bit_buffer_alloc(PASSY_DG1_MAX_LENGTH);
 
     return passy;
 }
@@ -254,6 +255,7 @@ void passy_free(Passy* passy) {
 
     bit_buffer_free(passy->DG1);
     bit_buffer_free(passy->COM);
+    bit_buffer_free(passy->dg_header);
 
     free(passy);
 }

+ 1 - 0
passy_i.h

@@ -89,6 +89,7 @@ struct Passy {
 
     BitBuffer* DG1;
     BitBuffer* COM;
+    BitBuffer* dg_header;
 
     PassyReadType read_type;
 

+ 13 - 0
passy_reader.c

@@ -48,6 +48,7 @@ PassyReader* passy_reader_alloc(Passy* passy) {
     passy_reader->passy = passy;
     passy_reader->DG1 = passy->DG1;
     passy_reader->COM = passy->COM;
+    passy_reader->dg_header = passy->dg_header;
     passy_reader->tx_buffer = bit_buffer_alloc(PASSY_READER_MAX_BUFFER_SIZE);
     passy_reader->rx_buffer = bit_buffer_alloc(PASSY_READER_MAX_BUFFER_SIZE);
 
@@ -443,6 +444,18 @@ NfcCommand passy_reader_state_machine(PassyReader* passy_reader) {
             file_stream_close(stream);
             furi_record_close(RECORD_STORAGE);
             furi_string_free(path);
+        } else {
+            // Until file specific handling is implemented, we just read the header
+            bit_buffer_reset(passy_reader->dg_header);
+            uint8_t header[4];
+            ret = passy_reader_read_binary(passy_reader, 0x00, sizeof(header), header);
+            if(ret != NfcCommandContinue) {
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderError);
+
+                break;
+            }
+            bit_buffer_append_bytes(passy_reader->dg_header, header, sizeof(header));
         }
 
         // Everything done

+ 1 - 0
passy_reader.h

@@ -29,6 +29,7 @@ typedef struct {
 
     BitBuffer* DG1;
     BitBuffer* COM;
+    BitBuffer* dg_header;
 
     SecureMessaging* secure_messaging;
 

+ 2 - 0
scenes/passy_scene_read_error.c

@@ -24,6 +24,8 @@ void passy_scene_read_error_on_enter(void* context) {
 
     if(passy->last_sw == 0x6a82) {
         furi_string_printf(secondary_str, "File not found\nTry again?");
+    } else if(passy->last_sw == 0x9000) {
+        furi_string_printf(secondary_str, "Try again?");
     } else {
         furi_string_printf(secondary_str, "%04x\nTry again?", passy->last_sw);
     }

+ 15 - 2
scenes/passy_scene_read_success.c

@@ -124,6 +124,18 @@ void passy_scene_read_success_on_enter(void* context) {
 
     } else if(passy->read_type == PassyReadDG2 || passy->read_type == PassyReadDG7) {
         furi_string_cat_printf(str, "Saved to disk in apps_data/passy/\n");
+    } else {
+        char display[9]; // 4 byte header in hex + NULL
+        memset(display, 0, sizeof(display));
+        for(size_t i = 0; i < bit_buffer_get_size_bytes(passy->dg_header); i++) {
+            snprintf(
+                display + (i * 2),
+                sizeof(display),
+                "%02X",
+                bit_buffer_get_data(passy->dg_header)[i]);
+        }
+        furi_string_cat_printf(str, "Unparsed file\n");
+        furi_string_cat_printf(str, "File header: %s\n", display);
     }
     text_box_set_font(passy->text_box, TextBoxFontText);
     text_box_set_text(passy->text_box, furi_string_get_cstr(passy->text_box_store));
@@ -136,8 +148,9 @@ bool passy_scene_read_success_on_event(void* context, SceneManagerEvent event) {
 
     if(event.type == SceneManagerEventTypeCustom) {
     } else if(event.type == SceneManagerEventTypeBack) {
-        scene_manager_search_and_switch_to_previous_scene(
-            passy->scene_manager, PassySceneMainMenu);
+        const uint32_t possible_scenes[] = {PassySceneAdvancedMenu, PassySceneMainMenu};
+        scene_manager_search_and_switch_to_previous_scene_one_of(
+            passy->scene_manager, possible_scenes, COUNT_OF(possible_scenes));
         consumed = true;
     }
     return consumed;