Zachary Weiss 1 год назад
Родитель
Сommit
0acc57d045

+ 23 - 0
helpers/mag_helpers.c

@@ -19,6 +19,29 @@ const int sublen[] = {32, 48, 48};
 
 uint8_t last_value = 2;
 
+const GpioPin* mag_gpio_enum_to_pin(MagSettingPin pin) {
+    switch(pin) {
+    case MagSettingPinA7:
+        return &gpio_ext_pa7;
+    case MagSettingPinA6:
+        return &gpio_ext_pa6;
+    case MagSettingPinA4:
+        return &gpio_ext_pa4;
+    case MagSettingPinB3:
+        return &gpio_ext_pb3;
+    case MagSettingPinB2:
+        return &gpio_ext_pb2;
+    case MagSettingPinC3:
+        return &gpio_ext_pc3;
+    case MagSettingPinC1:
+        return &gpio_ext_pc1;
+    case MagSettingPinC0:
+        return &gpio_ext_pc0;
+    default:
+        return NULL;
+    }
+}
+
 void play_halfbit(bool value, MagSetting* setting) {
     switch(setting->tx) {
     case MagTxStateRFID:

+ 2 - 0
helpers/mag_helpers.h

@@ -2,6 +2,8 @@
 #include <stdio.h>
 #include <string.h>
 
+const GpioPin* mag_gpio_enum_to_pin(MagSettingPin pin);
+
 void play_halfbit(bool value, MagSetting* setting);
 void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting, bool reverse);
 

+ 11 - 0
helpers/mag_types.h

@@ -14,6 +14,17 @@ typedef enum {
     MagViewTextInput,
 } MagView;
 
+typedef enum {
+    MagSettingPinA7,
+    MagSettingPinA6,
+    MagSettingPinA4,
+    MagSettingPinB3,
+    MagSettingPinB2,
+    MagSettingPinC3,
+    MagSettingPinC1,
+    MagSettingPinC0,
+} MagSettingPin;
+
 typedef enum {
     MagReverseStateOff,
     MagReverseStateOn,

+ 5 - 6
mag.c

@@ -2,12 +2,6 @@
 
 #define TAG "Mag"
 
-#define SETTING_DEFAULT_REVERSE MagReverseStateOff
-#define SETTING_DEFAULT_TRACK MagTrackStateOneAndTwo
-#define SETTING_DEFAULT_TX MagTxStateGPIO
-#define SETTING_DEFAULT_US_CLOCK 240
-#define SETTING_DEFAULT_US_INTERPACKET 10
-
 static bool mag_debug_custom_event_callback(void* context, uint32_t event) {
     furi_assert(context);
     Mag* mag = context;
@@ -28,6 +22,11 @@ static MagSetting* mag_setting_alloc() {
     setting->tx = SETTING_DEFAULT_TX;
     setting->us_clock = SETTING_DEFAULT_US_CLOCK;
     setting->us_interpacket = SETTING_DEFAULT_US_INTERPACKET;
+
+    setting->pin_input = SETTING_DEFAULT_PIN_INPUT;
+    setting->pin_output = SETTING_DEFAULT_PIN_OUTPUT;
+    setting->pin_enable = SETTING_DEFAULT_PIN_ENABLE;
+
     setting->is_debug = furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug);
 
     return setting;

+ 12 - 0
mag_i.h

@@ -47,6 +47,15 @@
     }
 #endif
 
+#define SETTING_DEFAULT_REVERSE MagReverseStateOff
+#define SETTING_DEFAULT_TRACK MagTrackStateOneAndTwo
+#define SETTING_DEFAULT_TX MagTxStateGPIO
+#define SETTING_DEFAULT_US_CLOCK 240
+#define SETTING_DEFAULT_US_INTERPACKET 10
+#define SETTING_DEFAULT_PIN_INPUT MagSettingPinA7
+#define SETTING_DEFAULT_PIN_OUTPUT MagSettingPinA6
+#define SETTING_DEFAULT_PIN_ENABLE MagSettingPinA4
+
 enum MagCustomEvent {
     MagEventNext = 100,
     MagEventExit,
@@ -59,6 +68,9 @@ typedef struct {
     MagReverseState reverse;
     uint32_t us_clock;
     uint32_t us_interpacket;
+    MagSettingPin pin_input;
+    MagSettingPin pin_output;
+    MagSettingPin pin_enable;
     bool is_debug;
 } MagSetting;
 

+ 3 - 2
scenes/mag_scene_config.h

@@ -1,5 +1,7 @@
 ADD_SCENE(mag, start, Start)
 ADD_SCENE(mag, about, About)
+ADD_SCENE(mag, read, Read)
+ADD_SCENE(mag, settings, Settings)
 ADD_SCENE(mag, emulate, Emulate)
 ADD_SCENE(mag, emulate_config, EmulateConfig)
 ADD_SCENE(mag, file_select, FileSelect)
@@ -11,5 +13,4 @@ ADD_SCENE(mag, save_success, SaveSuccess)
 ADD_SCENE(mag, delete_success, DeleteSuccess)
 ADD_SCENE(mag, delete_confirm, DeleteConfirm)
 ADD_SCENE(mag, exit_confirm, ExitConfirm)
-ADD_SCENE(mag, under_construction, UnderConstruction)
-ADD_SCENE(mag, read, Read)
+ADD_SCENE(mag, under_construction, UnderConstruction)

+ 6 - 6
scenes/mag_scene_emulate_config.c

@@ -2,12 +2,12 @@
 
 #define TAG "MagSceneEmulateConfig"
 
-enum MagSettingIndex {
-    MagSettingIndexTx,
-    MagSettingIndexTrack,
-    MagSettingIndexReverse,
-    MagSettingIndexClock,
-    MagSettingIndexInterpacket,
+enum MagEmulateConfigIndex {
+    MagEmulateConfigIndexTx,
+    MagEmulateConfigIndexTrack,
+    MagEmulateConfigIndexReverse,
+    MagEmulateConfigIndexClock,
+    MagEmulateConfigIndexInterpacket,
 };
 
 #define TX_COUNT 7

+ 80 - 0
scenes/mag_scene_settings.c

@@ -0,0 +1,80 @@
+#include "../mag_i.h"
+
+#define TAG "MagSceneEmulateConfig"
+
+#define GPIO_COUNT 8
+static const char* gpio[GPIO_COUNT] = {
+    [MagSettingPinA7] = "2 (A7)",
+    [MagSettingPinA6] = "3 (A6)",
+    [MagSettingPinA4] = "4 (A4)",
+    [MagSettingPinB3] = "5 (B3)",
+    [MagSettingPinB2] = "6 (B2)",
+    [MagSettingPinC3] = "7 (C3)",
+    [MagSettingPinC1] = "15 (C1)",
+    [MagSettingPinC0] = "16 (C0)",
+};
+
+static void mag_scene_settings_set_gpio(VariableItem* item, MagSettingPin* pin_to_set) {
+    MagSettingPin pin = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, gpio[pin]);
+    *pin_to_set = pin;
+}
+
+static void mag_scene_settings_set_gpio_input(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    mag_scene_settings_set_gpio(item, &mag->setting->pin_input);
+};
+
+static void mag_scene_settings_set_gpio_output(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    mag_scene_settings_set_gpio(item, &mag->setting->pin_output);
+};
+
+static void mag_scene_settings_set_gpio_enable(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    mag_scene_settings_set_gpio(item, &mag->setting->pin_enable);
+};
+
+static void mag_pin_variable_item_list_add(
+    Mag* mag,
+    const char* label,
+    MagSettingPin pin,
+    VariableItemChangeCallback change_callback) {
+    VariableItem* item =
+        variable_item_list_add(mag->variable_item_list, label, GPIO_COUNT, change_callback, mag);
+    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;
+
+    mag_pin_variable_item_list_add(
+        mag, "Input pin:", mag->setting->pin_input, mag_scene_settings_set_gpio_input);
+    mag_pin_variable_item_list_add(
+        mag, "Output pin:", mag->setting->pin_output, mag_scene_settings_set_gpio_output);
+    mag_pin_variable_item_list_add(
+        mag, "Enable pin:", mag->setting->pin_enable, mag_scene_settings_set_gpio_enable);
+
+    view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewVariableItemList);
+}
+
+bool mag_scene_settings_on_event(void* context, SceneManagerEvent event) {
+    Mag* mag = context;
+    SceneManager* scene_manager = mag->scene_manager;
+    bool consumed = false;
+
+    UNUSED(mag);
+    UNUSED(scene_manager);
+    UNUSED(event);
+
+    return consumed;
+}
+
+void mag_scene_settings_on_exit(void* context) {
+    Mag* mag = context;
+    variable_item_list_set_selected_item(mag->variable_item_list, 0);
+    variable_item_list_reset(mag->variable_item_list);
+}

+ 8 - 0
scenes/mag_scene_start.c

@@ -4,6 +4,7 @@ typedef enum {
     SubmenuIndexSaved,
     SubmenuIndexRead,
     //SubmenuIndexAddManually,
+    SubmenuIndexSettings,
     SubmenuIndexAbout,
 } SubmenuIndex;
 
@@ -28,6 +29,9 @@ void mag_scene_start_on_enter(void* context) {
         "Enable Debug!");
     //submenu_add_item(
     //    submenu, "Add Manually", SubmenuIndexAddManually, mag_scene_start_submenu_callback, mag);
+    submenu_add_item(
+        submenu, "Settings", SubmenuIndexSettings, mag_scene_start_submenu_callback, mag);
+
     submenu_add_item(submenu, "About", SubmenuIndexAbout, mag_scene_start_submenu_callback, mag);
 
     submenu_set_selected_item(
@@ -59,6 +63,10 @@ bool mag_scene_start_on_event(void* context, SceneManagerEvent event) {
         //    scene_manager_next_scene(mag->scene_manager, MagSceneInputValue);
         //    consumed = true;
         //    break;
+        case SubmenuIndexSettings:
+            scene_manager_next_scene(mag->scene_manager, MagSceneSettings);
+            consumed = true;
+            break;
         case SubmenuIndexAbout:
             scene_manager_next_scene(mag->scene_manager, MagSceneAbout);
             consumed = true;