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

async request version, show on new scene

Eric Betts 2 лет назад
Родитель
Сommit
725ce52ea3
5 измененных файлов с 76 добавлено и 18 удалено
  1. 6 0
      ccid.c
  2. 1 0
      scenes/seader_scene_config.h
  3. 60 0
      scenes/seader_scene_sam_info.c
  4. 8 15
      scenes/seader_scene_sam_present.c
  5. 1 3
      seader_worker.c

+ 6 - 0
ccid.c

@@ -229,10 +229,16 @@ size_t processCCID(SeaderWorker* seader_worker, uint8_t* cmd, size_t cmd_len) {
                     FURI_LOG_I(TAG, "SAM ATR!");
                     FURI_LOG_I(TAG, "SAM ATR!");
                     hasSAM = true;
                     hasSAM = true;
                     seader_worker_send_version(seader_worker);
                     seader_worker_send_version(seader_worker);
+                    if(seader_worker->callback) {
+                        seader_worker->callback(SeaderWorkerEventSamPresent, seader_worker->context);
+                    }
                 } else if(memcmp(SAM_ATR2, message.payload, sizeof(SAM_ATR2)) == 0) {
                 } else if(memcmp(SAM_ATR2, message.payload, sizeof(SAM_ATR2)) == 0) {
                     FURI_LOG_I(TAG, "SAM ATR2!");
                     FURI_LOG_I(TAG, "SAM ATR2!");
                     hasSAM = true;
                     hasSAM = true;
                     seader_worker_send_version(seader_worker);
                     seader_worker_send_version(seader_worker);
+                    if(seader_worker->callback) {
+                        seader_worker->callback(SeaderWorkerEventSamPresent, seader_worker->context);
+                    }
                 } else {
                 } else {
                     FURI_LOG_W(TAG, "Unknown ATR");
                     FURI_LOG_W(TAG, "Unknown ATR");
                     if(seader_worker->callback) {
                     if(seader_worker->callback) {

+ 1 - 0
scenes/seader_scene_config.h

@@ -13,3 +13,4 @@ ADD_SCENE(seader, file_select, FileSelect)
 ADD_SCENE(seader, delete, Delete)
 ADD_SCENE(seader, delete, Delete)
 ADD_SCENE(seader, delete_success, DeleteSuccess)
 ADD_SCENE(seader, delete_success, DeleteSuccess)
 ADD_SCENE(seader, credential_info, CredentialInfo)
 ADD_SCENE(seader, credential_info, CredentialInfo)
+ADD_SCENE(seader, sam_info, SamInfo)

+ 60 - 0
scenes/seader_scene_sam_info.c

@@ -0,0 +1,60 @@
+#include "../seader_i.h"
+#include <dolphin/dolphin.h>
+
+#define TAG "SeaderSamInfoScene"
+
+void seader_scene_sam_info_widget_callback(
+    GuiButtonType result,
+    InputType type,
+    void* context) {
+    Seader* seader = context;
+    if(type == InputTypeShort) {
+        view_dispatcher_send_custom_event(seader->view_dispatcher, result);
+    }
+}
+
+void seader_scene_sam_info_on_enter(void* context) {
+    Seader* seader = context;
+    SeaderWorker* seader_worker = seader->worker;
+    Widget* widget = seader->widget;
+
+    FuriString* fw_str = furi_string_alloc();
+
+    furi_string_cat_printf(fw_str, "FW %d.%d", seader_worker->sam_version[0], seader_worker->sam_version[1]);
+
+    widget_add_button_element(
+        seader->widget,
+        GuiButtonTypeLeft,
+        "Back",
+        seader_scene_sam_info_widget_callback,
+        seader);
+
+    widget_add_string_element(
+        widget, 64, 5, AlignCenter, AlignCenter, FontSecondary, furi_string_get_cstr(fw_str));
+
+    furi_string_free(fw_str);
+
+    view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewWidget);
+}
+
+bool seader_scene_sam_info_on_event(void* context, SceneManagerEvent event) {
+    Seader* seader = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == GuiButtonTypeLeft) {
+            consumed = scene_manager_previous_scene(seader->scene_manager);
+        }
+    } else if(event.type == SceneManagerEventTypeBack) {
+        consumed = scene_manager_search_and_switch_to_previous_scene(
+            seader->scene_manager, SeaderSceneSamPresent);
+    }
+    return consumed;
+}
+
+void seader_scene_sam_info_on_exit(void* context) {
+    Seader* seader = context;
+
+    // Clear views
+    widget_reset(seader->widget);
+}

+ 8 - 15
scenes/seader_scene_sam_present.c

@@ -3,7 +3,7 @@ enum SubmenuIndex {
     SubmenuIndexReadPicopass,
     SubmenuIndexReadPicopass,
     SubmenuIndexRead14a,
     SubmenuIndexRead14a,
     SubmenuIndexSaved,
     SubmenuIndexSaved,
-    SubmenuIndexFwVersion,
+    SubmenuIndexSamInfo,
 };
 };
 
 
 void seader_scene_sam_present_submenu_callback(void* context, uint32_t index) {
 void seader_scene_sam_present_submenu_callback(void* context, uint32_t index) {
@@ -13,7 +13,6 @@ void seader_scene_sam_present_submenu_callback(void* context, uint32_t index) {
 
 
 void seader_scene_sam_present_on_enter(void* context) {
 void seader_scene_sam_present_on_enter(void* context) {
     Seader* seader = context;
     Seader* seader = context;
-    SeaderWorker* seader_worker = seader->worker;
 
 
     Submenu* submenu = seader->submenu;
     Submenu* submenu = seader->submenu;
 
 
@@ -31,19 +30,8 @@ void seader_scene_sam_present_on_enter(void* context) {
         seader);
         seader);
     submenu_add_item(
     submenu_add_item(
         submenu, "Load", SubmenuIndexSaved, seader_scene_sam_present_submenu_callback, seader);
         submenu, "Load", SubmenuIndexSaved, seader_scene_sam_present_submenu_callback, seader);
-
-    if(seader_worker->sam_version[0] != 0 && seader_worker->sam_version[1] != 0) {
-        FuriString* fw_str = furi_string_alloc();
-        furi_string_cat_printf(
-            fw_str, "FW %d.%d", seader_worker->sam_version[0], seader_worker->sam_version[1]);
-        submenu_add_item(
-            submenu,
-            furi_string_get_cstr(fw_str),
-            SubmenuIndexFwVersion,
-            seader_scene_sam_present_submenu_callback,
-            seader);
-        furi_string_free(fw_str);
-    }
+    submenu_add_item(
+        submenu, "SAM Info", SubmenuIndexSamInfo, seader_scene_sam_present_submenu_callback, seader);
 
 
     submenu_set_selected_item(
     submenu_set_selected_item(
         submenu, scene_manager_get_scene_state(seader->scene_manager, SeaderSceneSamPresent));
         submenu, scene_manager_get_scene_state(seader->scene_manager, SeaderSceneSamPresent));
@@ -66,6 +54,11 @@ bool seader_scene_sam_present_on_event(void* context, SceneManagerEvent event) {
                 seader->scene_manager, SeaderSceneSamPresent, SubmenuIndexRead14a);
                 seader->scene_manager, SeaderSceneSamPresent, SubmenuIndexRead14a);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneRead14a);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneRead14a);
             consumed = true;
             consumed = true;
+        } else if(event.event == SubmenuIndexSamInfo) {
+            scene_manager_set_scene_state(
+                seader->scene_manager, SeaderSceneSamPresent, SubmenuIndexSamInfo);
+            scene_manager_next_scene(seader->scene_manager, SeaderSceneSamInfo);
+            consumed = true;
         } else if(event.event == SubmenuIndexSaved) {
         } else if(event.event == SubmenuIndexSaved) {
             scene_manager_next_scene(seader->scene_manager, SeaderSceneFileSelect);
             scene_manager_next_scene(seader->scene_manager, SeaderSceneFileSelect);
             consumed = true;
             consumed = true;

+ 1 - 3
seader_worker.c

@@ -459,9 +459,7 @@ bool parseSamResponse(SeaderWorker* seader_worker, SamResponse_t* samResponse) {
             }
             }
         }
         }
     } else if(parseVersion(seader_worker, samResponse->buf, samResponse->size)) {
     } else if(parseVersion(seader_worker, samResponse->buf, samResponse->size)) {
-        if(seader_worker->callback) {
-            seader_worker->callback(SeaderWorkerEventSamPresent, seader_worker->context);
-        }
+        // no-op
     } else if(unpack_pacs(seader_worker, credential, samResponse->buf, samResponse->size)) {
     } else if(unpack_pacs(seader_worker, credential, samResponse->buf, samResponse->size)) {
         if(seader_worker->callback) {
         if(seader_worker->callback) {
             seader_worker->callback(SeaderWorkerEventSuccess, seader_worker->context);
             seader_worker->callback(SeaderWorkerEventSuccess, seader_worker->context);