Zachary Weiss 1 год назад
Родитель
Сommit
51179f08a4
4 измененных файлов с 79 добавлено и 6 удалено
  1. 7 0
      mag_state.c
  2. 2 0
      mag_state.h
  3. 69 5
      scenes/mag_scene_settings.c
  4. 1 1
      scenes/mag_scene_start.c

+ 7 - 0
mag_state.c

@@ -58,6 +58,7 @@ bool mag_state_load(MagState* out_state) {
             state.pin_output = tmp;
             if(!flipper_format_read_uint32(file, "pin_enable", &tmp, 1)) break;
             state.pin_enable = tmp;
+            if(!flipper_format_read_bool(file, "allow_uart", &state.allow_uart, 1)) break;
 
             loaded_from_file = true;
         } while(0);
@@ -68,10 +69,15 @@ bool mag_state_load(MagState* out_state) {
     // If could not be read from file
     // Or file GPIO config is invalid (pins overlap)
     // Set defaults
+    // Additionally raise message to user?
     if(!loaded_from_file || !mag_state_gpio_is_valid(&state)) {
         mag_state_gpio_reset(&state);
     }
 
+    if(!loaded_from_file) {
+        state.allow_uart = MAG_STATE_DEFAULT_ALLOW_UART;
+    }
+
     // set defaults we don't save
     state.tx = MAG_STATE_DEFAULT_TX;
     state.track = MAG_STATE_DEFAULT_TRACK;
@@ -102,6 +108,7 @@ void mag_state_save(MagState* state) {
         if(!flipper_format_write_uint32(file, "pin_output", &tmp, 1)) break;
         tmp = state->pin_enable;
         if(!flipper_format_write_uint32(file, "pin_enable", &tmp, 1)) break;
+        if(!flipper_format_write_bool(file, "allow_uart", &state->allow_uart, 1)) break;
 
     } while(0);
     flipper_format_free(file);

+ 2 - 0
mag_state.h

@@ -37,6 +37,7 @@ typedef enum {
 #define MAG_STATE_DEFAULT_PIN_INPUT MagPinA7
 #define MAG_STATE_DEFAULT_PIN_OUTPUT MagPinA6
 #define MAG_STATE_DEFAULT_PIN_ENABLE MagPinA4
+#define MAG_STATE_DEFAULT_ALLOW_UART false
 
 typedef struct {
     MagTxState tx;
@@ -47,6 +48,7 @@ typedef struct {
     MagPin pin_input;
     MagPin pin_output;
     MagPin pin_enable;
+    bool allow_uart;
     bool is_debug;
 } MagState;
 

+ 69 - 5
scenes/mag_scene_settings.c

@@ -4,6 +4,13 @@
 
 #define TAG "MagSceneEmulateConfig"
 
+enum VarItemListIndex {
+    VarItemListIndexPinInput,
+    VarItemListIndexPinOutput,
+    VarItemListIndexPinEnable,
+    VarItemListIndexAllowUART,
+};
+
 static const char* gpio[] = {
     [MagPinA7] = "2 (A7)",
     [MagPinA6] = "3 (A6)",
@@ -15,6 +22,13 @@ static const char* gpio[] = {
     [MagPinC0] = "16 (C0)",
 };
 const uint8_t GPIO_COUNT = COUNT_OF(gpio);
+// static const char* uart_pins[] = {[DapUartTypeUSART1] = "13,14", [DapUartTypeLPUART1] = "15,16"};
+// static const char* uart_swap[] = {[DapUartTXRXNormal] = "No", [DapUartTXRXSwap] = "Yes"};
+
+void mag_scene_settings_var_item_list_callback(void* context, uint32_t index) {
+    Mag* mag = context;
+    view_dispatcher_send_custom_event(mag->view_dispatcher, index);
+}
 
 static void mag_scene_settings_set_gpio(VariableItem* item, MagPin* pin_out) {
     MagPin pin = variable_item_get_current_value_index(item);
@@ -47,11 +61,11 @@ static void mag_pin_variable_item_list_add(
     variable_item_set_current_value_index(item, pin);
     variable_item_set_current_value_text(item, gpio[pin]);
 }
-// static const char* uart_pins[] = {[DapUartTypeUSART1] = "13,14", [DapUartTypeLPUART1] = "15,16"};
-// static const char* uart_swap[] = {[DapUartTXRXNormal] = "No", [DapUartTXRXSwap] = "Yes"};
 
 void mag_scene_settings_on_enter(void* context) {
     Mag* mag = context;
+    VariableItem* item;
+    VariableItemList* var_item_list = mag->variable_item_list;
 
     mag_pin_variable_item_list_add(
         mag, "Input pin:", mag->state.pin_input, mag_scene_settings_set_gpio_input);
@@ -60,10 +74,19 @@ void mag_scene_settings_on_enter(void* context) {
     mag_pin_variable_item_list_add(
         mag, "Enable pin:", mag->state.pin_enable, mag_scene_settings_set_gpio_enable);
 
+    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");
+
+    variable_item_list_set_enter_callback(
+        var_item_list, mag_scene_settings_var_item_list_callback, mag);
+
+    variable_item_list_set_selected_item(
+        var_item_list, scene_manager_get_scene_state(mag->scene_manager, MagSceneSettings));
+
     view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewVariableItemList);
 }
 
-void mag_scene_invalid_dialog(Mag* mag) {
+void mag_scene_settings_dialog_invalid_pins(Mag* mag) {
     SceneManager* scene_manager = mag->scene_manager;
 
     DialogMessage* message = dialog_message_alloc();
@@ -86,19 +109,60 @@ void mag_scene_invalid_dialog(Mag* mag) {
     }
 }
 
+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");
+    }
+}
+
 bool mag_scene_settings_on_event(void* context, SceneManagerEvent event) {
     Mag* mag = context;
     SceneManager* scene_manager = mag->scene_manager;
     bool consumed = false;
 
-    if(event.type == SceneManagerEventTypeBack) {
+    switch(event.type) {
+    case SceneManagerEventTypeBack:
+        // when attempting to exit, validate pin configuration
+        // if invalid, prompt
         consumed = true;
 
         if(!mag_state_gpio_is_valid(&mag->state)) {
-            mag_scene_invalid_dialog(mag);
+            mag_scene_settings_dialog_invalid_pins(mag);
         } else {
             scene_manager_previous_scene(scene_manager);
         }
+        break;
+    case SceneManagerEventTypeCustom:
+        scene_manager_set_scene_state(mag->scene_manager, MagSceneSettings, event.event);
+        consumed = true;
+        if(event.event == VarItemListIndexAllowUART) {
+            mag_scene_settings_dialog_allow_uart(mag);
+        }
+        break;
+    default:
+        break;
     }
 
     return consumed;

+ 1 - 1
scenes/mag_scene_start.c

@@ -25,7 +25,7 @@ void mag_scene_start_on_enter(void* context) {
         SubmenuIndexRead,
         mag_scene_start_submenu_callback,
         mag,
-        !mag->state.is_debug,
+        (!mag->state.is_debug && !mag->state.allow_uart),
         "Enable Debug!");
     //submenu_add_item(
     //    submenu, "Add Manually", SubmenuIndexAddManually, mag_scene_start_submenu_callback, mag);