ソースを参照

Merge magspoof from https://github.com/zacharyweiss/magspoof_flipper

Willy-JL 1 年間 前
コミット
aa0cd1d19f
4 ファイル変更65 行追加73 行削除
  1. 1 1
      magspoof/application.fam
  2. 1 0
      magspoof/mag_i.h
  3. 34 11
      magspoof/mag_state.c
  4. 29 61
      magspoof/scenes/mag_scene_settings.c

+ 1 - 1
magspoof/application.fam

@@ -17,7 +17,7 @@ App(
     fap_category="GPIO",
     fap_category="GPIO",
     fap_icon_assets="icons",
     fap_icon_assets="icons",
     fap_icon_assets_symbol="mag",
     fap_icon_assets_symbol="mag",
-    fap_version=(0, 8),  # major, minor
+    fap_version=(0, 9),  # major, minor
     fap_description="Enables wireless transmission of magstripe data",
     fap_description="Enables wireless transmission of magstripe data",
     fap_author="Zachary Weiss",
     fap_author="Zachary Weiss",
     fap_weburl="https://github.com/zacharyweiss/magspoof_flipper",
     fap_weburl="https://github.com/zacharyweiss/magspoof_flipper",

+ 1 - 0
magspoof/mag_i.h

@@ -52,6 +52,7 @@ enum MagCustomEvent {
     MagEventNext = 100,
     MagEventNext = 100,
     MagEventExit,
     MagEventExit,
     MagEventPopupClosed,
     MagEventPopupClosed,
+    MagEventConfirmDialog,
 };
 };
 
 
 typedef struct {
 typedef struct {

+ 34 - 11
magspoof/mag_state.c

@@ -50,18 +50,41 @@ bool mag_state_load(MagState* out_state) {
             if(!flipper_format_file_open_existing(file, MAG_STATE_PATH)) break;
             if(!flipper_format_file_open_existing(file, MAG_STATE_PATH)) break;
             if(!flipper_format_read_header(file, str, &tmp)) break;
             if(!flipper_format_read_header(file, str, &tmp)) break;
             if(furi_string_cmp_str(str, MAG_STATE_HEADER)) break;
             if(furi_string_cmp_str(str, MAG_STATE_HEADER)) break;
-            if(tmp != MAG_STATE_VER) break;
+            // if(tmp != MAG_STATE_VER) break;
 
 
-            if(!flipper_format_read_uint32(file, "pin_input", &tmp, 1)) break;
+            if(!flipper_format_read_uint32(file, "pin_input", &tmp, 1)) {
+                flipper_format_rewind(file);
+                tmp = MAG_STATE_DEFAULT_PIN_INPUT;
+            }
             state.pin_input = (MagPin)tmp;
             state.pin_input = (MagPin)tmp;
-            if(!flipper_format_read_uint32(file, "pin_output", &tmp, 1)) break;
+
+            if(!flipper_format_read_uint32(file, "pin_output", &tmp, 1)) {
+                flipper_format_rewind(file);
+                tmp = MAG_STATE_DEFAULT_PIN_OUTPUT;
+            }
             state.pin_output = (MagPin)tmp;
             state.pin_output = (MagPin)tmp;
-            if(!flipper_format_read_uint32(file, "pin_enable", &tmp, 1)) break;
+
+            if(!flipper_format_read_uint32(file, "pin_enable", &tmp, 1)) {
+                flipper_format_rewind(file);
+                tmp = MAG_STATE_DEFAULT_PIN_ENABLE;
+            }
             state.pin_enable = (MagPin)tmp;
             state.pin_enable = (MagPin)tmp;
-            if(!flipper_format_read_bool(file, "allow_uart", &state.allow_uart, 1)) break;
-            if(!flipper_format_read_uint32(file, "n_repeats", &tmp, 1)) break;
+
+            if(!flipper_format_read_bool(file, "allow_uart", &state.allow_uart, 1)) {
+                flipper_format_rewind(file);
+                state.allow_uart = MAG_STATE_DEFAULT_ALLOW_UART;
+            }
+
+            if(!flipper_format_read_uint32(file, "n_repeats", &tmp, 1)) {
+                flipper_format_rewind(file);
+                tmp = MAG_STATE_DEFAULT_N_REPEATS;
+            }
             state.n_repeats = (uint8_t)tmp;
             state.n_repeats = (uint8_t)tmp;
-            if(!flipper_format_read_bool(file, "repeat_mode", &state.repeat_mode, 1)) break;
+
+            if(!flipper_format_read_bool(file, "repeat_mode", &state.repeat_mode, 1)) {
+                flipper_format_rewind(file);
+                state.repeat_mode = MAG_STATE_DEFAULT_REPEAT_MODE;
+            }
 
 
             loaded_from_file = true;
             loaded_from_file = true;
         } while(0);
         } while(0);
@@ -69,15 +92,15 @@ bool mag_state_load(MagState* out_state) {
     }
     }
     furi_record_close(RECORD_STORAGE);
     furi_record_close(RECORD_STORAGE);
 
 
-    // If could not be read from file
-    // Or file GPIO config is invalid (pins overlap)
-    // Set defaults
+    // If file's GPIO config is invalid (pins overlap)
+    // Reset to defaults
     // Additionally raise message to user?
     // Additionally raise message to user?
-    if(!loaded_from_file || !mag_state_gpio_is_valid(&state)) {
+    if(!mag_state_gpio_is_valid(&state)) {
         mag_state_gpio_reset(&state);
         mag_state_gpio_reset(&state);
     }
     }
 
 
     if(!loaded_from_file) {
     if(!loaded_from_file) {
+        mag_state_gpio_reset(&state);
         state.allow_uart = MAG_STATE_DEFAULT_ALLOW_UART;
         state.allow_uart = MAG_STATE_DEFAULT_ALLOW_UART;
         state.n_repeats = MAG_STATE_DEFAULT_N_REPEATS;
         state.n_repeats = MAG_STATE_DEFAULT_N_REPEATS;
         state.repeat_mode = MAG_STATE_DEFAULT_REPEAT_MODE;
         state.repeat_mode = MAG_STATE_DEFAULT_REPEAT_MODE;

+ 29 - 61
magspoof/scenes/mag_scene_settings.c

@@ -61,6 +61,8 @@ const char* const off_on_text[OFF_ON_COUNT] = {
     "ON",
     "ON",
 };
 };
 
 
+VariableItem* item_dialog_cb;
+
 void mag_scene_settings_var_item_list_callback(void* context, uint32_t index) {
 void mag_scene_settings_var_item_list_callback(void* context, uint32_t index) {
     Mag* mag = context;
     Mag* mag = context;
     view_dispatcher_send_custom_event(mag->view_dispatcher, index);
     view_dispatcher_send_custom_event(mag->view_dispatcher, index);
@@ -105,36 +107,20 @@ static void mag_scene_settings_set_repeat_mode(VariableItem* item) {
     mag_scene_settings_set_bool(item, &mag->state.repeat_mode);
     mag_scene_settings_set_bool(item, &mag->state.repeat_mode);
 }
 }
 
 
-/*
 static void mag_scene_settings_set_allow_uart(VariableItem* item) {
 static void mag_scene_settings_set_allow_uart(VariableItem* item) {
     Mag* mag = variable_item_get_context(item);
     Mag* mag = variable_item_get_context(item);
 
 
-    bool rising = !(mag->state.allow_uart);
+    // rising change when value index is truth-y, and prior value false
+    bool rising = !mag->state.allow_uart && !!variable_item_get_current_value_index(item);
     // trigger dialog only on rising change
     // trigger dialog only on rising change
     if(rising) {
     if(rising) {
-        DialogMessage* msg = dialog_message_alloc();
-        dialog_message_set_header(msg, "UART MSR", 64, 0, AlignCenter, AlignTop);
-        dialog_message_set_buttons(msg, "No", NULL, "Yes");
-        dialog_message_set_text(
-            msg,
-            "This option requires a\nUART-compatible mag reader.\nIs it installed?\n",
-            64,
-            32,
-            AlignCenter,
-            AlignCenter);
-        DialogMessageButton res = dialog_message_show(furi_record_open(RECORD_DIALOGS), msg);
-        if(res != DialogMessageButtonRight) {
-            // if not "Yes", reset index
-            variable_item_set_current_value_index(item, (uint32_t)mag->state.allow_uart);
-        }
-        dialog_message_free(msg);
-        furi_record_close(RECORD_DIALOGS);
+        item_dialog_cb = item;
+        view_dispatcher_send_custom_event(mag->view_dispatcher, MagEventConfirmDialog);
     }
     }
 
 
     // set value & text based on current varitem index
     // set value & text based on current varitem index
     mag_scene_settings_set_bool(item, &mag->state.allow_uart);
     mag_scene_settings_set_bool(item, &mag->state.allow_uart);
 }
 }
-*/
 
 
 static void mag_pin_variable_item_list_add(
 static void mag_pin_variable_item_list_add(
     Mag* mag,
     Mag* mag,
@@ -188,13 +174,8 @@ void mag_scene_settings_on_enter(void* context) {
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_text(item, n_repeats_text[value_index]);
     variable_item_set_current_value_text(item, n_repeats_text[value_index]);
 
 
-#ifndef FW_ORIGIN_Official
-    item = variable_item_list_add(var_item_list, "UART MSR: ", 1, NULL, mag);
-    variable_item_set_current_value_text(item, mag->state.allow_uart ? "ON" : "OFF");
-#endif
-
-    //mag_bool_variable_item_list_add(
-    //    mag, "UART MSR:", mag->state.allow_uart, mag_scene_settings_set_allow_uart);
+    mag_bool_variable_item_list_add(
+        mag, "UART MSR:", mag->state.allow_uart, mag_scene_settings_set_allow_uart);
 
 
     variable_item_list_set_enter_callback(
     variable_item_list_set_enter_callback(
         var_item_list, mag_scene_settings_var_item_list_callback, mag);
         var_item_list, mag_scene_settings_var_item_list_callback, mag);
@@ -228,36 +209,6 @@ void mag_scene_settings_dialog_invalid_pins(Mag* mag) {
     }
     }
 }
 }
 
 
-#ifndef FW_ORIGIN_Official
-void mag_scene_settings_dialog_allow_uart(Mag* mag) {
-    bool change = mag->state.allow_uart;
-    if(!change) {
-        DialogMessage* msg = dialog_message_alloc();
-        dialog_message_set_header(msg, "UART MSR", 64, 0, AlignCenter, AlignTop);
-        dialog_message_set_buttons(msg, "No", NULL, "Yes");
-        dialog_message_set_text(
-            msg,
-            "This option requires a\nUART-compatible mag reader.\nIs it installed?\n",
-            64,
-            32,
-            AlignCenter,
-            AlignCenter);
-        DialogMessageButton res = dialog_message_show(furi_record_open(RECORD_DIALOGS), msg);
-        if(res == DialogMessageButtonRight) {
-            change = true;
-        }
-        dialog_message_free(msg);
-        furi_record_close(RECORD_DIALOGS);
-    }
-    if(change) {
-        mag->state.allow_uart = !mag->state.allow_uart;
-        variable_item_set_current_value_text(
-            variable_item_list_get(mag->variable_item_list, VarItemListIndexAllowUART),
-            mag->state.allow_uart ? "ON" : "OFF");
-    }
-}
-#endif
-
 bool mag_scene_settings_on_event(void* context, SceneManagerEvent event) {
 bool mag_scene_settings_on_event(void* context, SceneManagerEvent event) {
     Mag* mag = context;
     Mag* mag = context;
     SceneManager* scene_manager = mag->scene_manager;
     SceneManager* scene_manager = mag->scene_manager;
@@ -274,16 +225,33 @@ bool mag_scene_settings_on_event(void* context, SceneManagerEvent event) {
         } else {
         } else {
             scene_manager_previous_scene(scene_manager);
             scene_manager_previous_scene(scene_manager);
         }
         }
+
         break;
         break;
-#ifndef FW_ORIGIN_Official
     case SceneManagerEventTypeCustom:
     case SceneManagerEventTypeCustom:
         scene_manager_set_scene_state(mag->scene_manager, MagSceneSettings, event.event);
         scene_manager_set_scene_state(mag->scene_manager, MagSceneSettings, event.event);
         consumed = true;
         consumed = true;
-        if(event.event == VarItemListIndexAllowUART) {
-            mag_scene_settings_dialog_allow_uart(mag);
+        if(event.event == MagEventConfirmDialog) {
+            DialogMessage* msg = dialog_message_alloc();
+            dialog_message_set_header(msg, "UART MSR", 64, 0, AlignCenter, AlignTop);
+            dialog_message_set_buttons(msg, "No", NULL, "Yes");
+            dialog_message_set_text(
+                msg,
+                "This option requires a\nUART-compatible mag reader.\nIs it installed?\n",
+                64,
+                32,
+                AlignCenter,
+                AlignCenter);
+            DialogMessageButton res = dialog_message_show(furi_record_open(RECORD_DIALOGS), msg);
+            if(res != DialogMessageButtonRight) {
+                // if not "Yes", reset to "OFF" (0 / false-y)
+                variable_item_set_current_value_index(item_dialog_cb, 0);
+                mag_scene_settings_set_bool(item_dialog_cb, &mag->state.allow_uart);
+            }
+            dialog_message_free(msg);
+            furi_record_close(RECORD_DIALOGS);
+            item_dialog_cb = NULL;
         }
         }
         break;
         break;
-#endif
     default:
     default:
         break;
         break;
     }
     }