فهرست منبع

catch wrong ATR

Eric Betts 2 سال پیش
والد
کامیت
270deb0ee0
5فایلهای تغییر یافته به همراه65 افزوده شده و 1 حذف شده
  1. 3 0
      ccid.c
  2. 1 0
      scenes/seader_scene_config.h
  3. 56 0
      scenes/seader_scene_sam_wrong.c
  4. 3 0
      scenes/seader_scene_start.c
  5. 2 1
      seader_worker.h

+ 3 - 0
ccid.c

@@ -240,6 +240,9 @@ size_t processCCID(SeaderWorker* seader_worker, uint8_t* cmd, size_t cmd_len) {
                     }
                 } else {
                     FURI_LOG_W(TAG, "Unknown ATR");
+                    if(seader_worker->callback) {
+                        seader_worker->callback(SeaderWorkerEventSamWrong, seader_worker->context);
+                    }
                 }
             }
         } else {

+ 1 - 0
scenes/seader_scene_config.h

@@ -1,6 +1,7 @@
 ADD_SCENE(seader, start, Start)
 ADD_SCENE(seader, sam_present, SamPresent)
 ADD_SCENE(seader, sam_missing, SamMissing)
+ADD_SCENE(seader, sam_wrong, SamWrong)
 ADD_SCENE(seader, read_picopass, ReadPicopass)
 ADD_SCENE(seader, read_14a, Read14a)
 ADD_SCENE(seader, read_card_success, ReadCardSuccess)

+ 56 - 0
scenes/seader_scene_sam_wrong.c

@@ -0,0 +1,56 @@
+#include "../seader_i.h"
+enum SubmenuIndex {
+    SubmenuIndexDetectSam,
+    SubmenuIndexSaved,
+};
+
+void seader_scene_sam_wrong_submenu_callback(void* context, uint32_t index) {
+    Seader* seader = context;
+    view_dispatcher_send_custom_event(seader->view_dispatcher, index);
+}
+
+void seader_scene_sam_wrong_on_enter(void* context) {
+    Seader* seader = context;
+
+    Submenu* submenu = seader->submenu;
+
+    submenu_add_item(
+        submenu,
+        "Wrong ATR: Retry",
+        SubmenuIndexDetectSam,
+        seader_scene_sam_wrong_submenu_callback,
+        seader);
+    submenu_add_item(
+        submenu, "Load", SubmenuIndexSaved, seader_scene_sam_wrong_submenu_callback, seader);
+
+    submenu_set_selected_item(
+        submenu, scene_manager_get_scene_state(seader->scene_manager, SeaderSceneSamPresent));
+
+    view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewMenu);
+}
+
+bool seader_scene_sam_wrong_on_event(void* context, SceneManagerEvent event) {
+    Seader* seader = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == SubmenuIndexDetectSam) {
+            scene_manager_next_scene(seader->scene_manager, SeaderSceneStart);
+            consumed = true;
+        } else if(event.event == SubmenuIndexSaved) {
+            scene_manager_next_scene(seader->scene_manager, SeaderSceneFileSelect);
+            consumed = true;
+        }
+    } else if(event.type == SceneManagerEventTypeBack) {
+        scene_manager_stop(seader->scene_manager);
+        view_dispatcher_stop(seader->view_dispatcher);
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void seader_scene_sam_wrong_on_exit(void* context) {
+    Seader* seader = context;
+    submenu_reset(seader->submenu);
+}

+ 3 - 0
scenes/seader_scene_start.c

@@ -52,6 +52,9 @@ bool seader_scene_start_on_event(void* context, SceneManagerEvent event) {
         } else if(event.event == SeaderWorkerEventSamMissing) {
             scene_manager_next_scene(seader->scene_manager, SeaderSceneSamMissing);
             consumed = true;
+        } else if(event.event == SeaderWorkerEventSamWrong) {
+            scene_manager_next_scene(seader->scene_manager, SeaderSceneSamWrong);
+            consumed = true;
         }
 
         scene_manager_set_scene_state(seader->scene_manager, SeaderSceneStart, event.event);

+ 2 - 1
seader_worker.h

@@ -27,6 +27,7 @@ typedef enum {
     SeaderWorkerEventSuccess,
     SeaderWorkerEventFail,
     SeaderWorkerEventSamPresent,
+    SeaderWorkerEventSamWrong,
     SeaderWorkerEventSamMissing,
     SeaderWorkerEventNoCardDetected,
     SeaderWorkerEventStartReading,
@@ -49,4 +50,4 @@ void seader_worker_start(
     void* context);
 
 void seader_worker_stop(SeaderWorker* seader_worker);
-void seader_worker_process_message(SeaderWorker* seader_worker, CCID_Message *message);
+void seader_worker_process_message(SeaderWorker* seader_worker, CCID_Message* message);