Zachary Weiss 3 лет назад
Родитель
Сommit
7f3f3ade1a
6 измененных файлов с 307 добавлено и 0 удалено
  1. 11 0
      mag.c
  2. 3 0
      mag_i.h
  3. 2 0
      scenes/mag_scene_config.h
  4. 40 0
      scenes/mag_scene_emulate.c
  5. 245 0
      scenes/mag_scene_emulate_config.c
  6. 6 0
      scenes/mag_scene_start.c

+ 11 - 0
mag.c

@@ -61,6 +61,13 @@ static Mag* mag_alloc() {
     mag->widget = widget_alloc();
     view_dispatcher_add_view(mag->view_dispatcher, MagViewWidget, widget_get_view(mag->widget));
 
+    // Variable Item List
+    mag->variable_item_list = variable_item_list_alloc();
+    view_dispatcher_add_view(
+        mag->view_dispatcher,
+        MagViewVariableItemList,
+        variable_item_list_get_view(mag->variable_item_list));
+
     // Text Input
     mag->text_input = text_input_alloc();
     view_dispatcher_add_view(
@@ -104,6 +111,10 @@ static void mag_free(Mag* mag) {
     view_dispatcher_remove_view(mag->view_dispatcher, MagViewWidget);
     widget_free(mag->widget);
 
+    // Variable Item List
+    view_dispatcher_remove_view(mag->view_dispatcher, MagViewVariableItemList);
+    variable_item_list_free(mag->variable_item_list);
+
     // TextInput
     view_dispatcher_remove_view(mag->view_dispatcher, MagViewTextInput);
     text_input_free(mag->text_input);

+ 3 - 0
mag_i.h

@@ -19,6 +19,7 @@
 #include <gui/modules/loading.h>
 #include <gui/modules/text_input.h>
 #include <gui/modules/widget.h>
+#include <gui/modules/variable_item_list.h>
 
 #include <notification/notification_messages.h>
 #include <dialogs/dialogs.h>
@@ -59,6 +60,7 @@ struct Mag {
     Loading* loading;
     TextInput* text_input;
     Widget* widget;
+    VariableItemList* variable_item_list;
 
     // Custom views
     Mag_TextInput* mag_text_input;
@@ -70,6 +72,7 @@ typedef enum {
     MagViewPopup,
     MagViewLoading,
     MagViewWidget,
+    MagViewVariableItemList,
     MagViewTextInput,
     MagViewMagTextInput,
 } MagView;

+ 2 - 0
scenes/mag_scene_config.h

@@ -1,5 +1,7 @@
 ADD_SCENE(mag, start, Start)
 ADD_SCENE(mag, emulate_test, EmulateTest)
+ADD_SCENE(mag, emulate, Emulate)
+ADD_SCENE(mag, emulate_config, EmulateConfig)
 ADD_SCENE(mag, file_select, FileSelect)
 ADD_SCENE(mag, saved_menu, SavedMenu)
 ADD_SCENE(mag, saved_info, SavedInfo)

+ 40 - 0
scenes/mag_scene_emulate.c

@@ -0,0 +1,40 @@
+#include "../mag_i.h"
+
+void mag_scene_emulate_on_enter(void* context) {
+    Mag* mag = context;
+    Widget* widget = mag->widget;
+
+    FuriString* tmp_str;
+    tmp_str = furi_string_alloc();
+
+    widget_add_button_element(widget, GuiButtonTypeLeft, "Back", mag_widget_callback, mag);
+
+    furi_string_printf(tmp_str, "Under construction!");
+    widget_add_string_element(
+        widget, 64, 4, AlignCenter, AlignTop, FontPrimary, furi_string_get_cstr(tmp_str));
+    furi_string_reset(tmp_str);
+
+    view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget);
+    furi_string_free(tmp_str);
+}
+
+bool mag_scene_emulate_on_event(void* context, SceneManagerEvent event) {
+    Mag* mag = context;
+    SceneManager* scene_manager = mag->scene_manager;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == GuiButtonTypeLeft) {
+            consumed = true;
+
+            scene_manager_previous_scene(scene_manager);
+        }
+    }
+
+    return consumed;
+}
+
+void mag_scene_emulate_on_exit(void* context) {
+    Mag* mag = context;
+    widget_reset(mag->widget);
+}

+ 245 - 0
scenes/mag_scene_emulate_config.c

@@ -0,0 +1,245 @@
+#include "../mag_i.h"
+#include <lib/toolbox/value_index.h>
+
+#define TAG "MagSceneEmulateConfig"
+
+enum MagSettingIndex {
+    MagSettingIndexTx,
+    MagSettingIndexTrack,
+    MagSettingIndexReverse,
+    MagSettingIndexClock,
+    MagSettingIndexInterpacket,
+};
+
+#define TX_COUNT 2
+const char* const tx_text[TX_COUNT] = {
+    "RFID",
+    "A6/A7",
+};
+const bool tx_value[TX_COUNT] = {
+    true,
+    false,
+}; // placeholder; there is certainly going to be a smarter way to do this...
+
+#define TRACK_COUNT 3
+const char* const track_text[TRACK_COUNT] = {
+    "ALL",
+    "1",
+    "2",
+};
+const uint32_t track_value[TRACK_COUNT] = {
+    0,
+    1,
+    2,
+}; // placeholder; will want a better way to designate both tracks. create a file akin to subghz_types.h?
+
+#define REVERSE_COUNT 2
+const char* const reverse_text[REVERSE_COUNT] = {
+    "ON",
+    "OFF",
+};
+const bool reverse_value[REVERSE_COUNT] = {
+    true,
+    false,
+};
+
+#define CLOCK_COUNT 15
+const char* const clock_text[CLOCK_COUNT] = {
+    "200us",
+    "220us",
+    "240us",
+    "250us",
+    "260us",
+    "280us",
+    "300us",
+    "325us",
+    "350us",
+    "375us",
+    "400us",
+    "450us",
+    "500us",
+    "600us",
+    "700us",
+};
+const uint32_t clock_value[CLOCK_COUNT] = {
+    200,
+    220,
+    240,
+    250,
+    260,
+    280,
+    300,
+    325,
+    350,
+    375,
+    400,
+    450,
+    500,
+    600,
+    700,
+};
+
+#define INTERPACKET_COUNT 13
+const char* const interpacket_text[INTERPACKET_COUNT] = {
+    "0us",
+    "2us",
+    "4us",
+    "6us",
+    "8us",
+    "10us",
+    "12us",
+    "14us",
+    "16us",
+    "18us",
+    "20us",
+    "25us",
+    "30us",
+};
+const uint32_t interpacket_value[INTERPACKET_COUNT] = {
+    0,
+    2,
+    4,
+    6,
+    8,
+    10,
+    12,
+    14,
+    16,
+    18,
+    20,
+    25,
+    30,
+};
+
+static void mag_scene_emulate_config_set_tx(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+
+    variable_item_set_current_value_text(item, tx_text[index]);
+
+    UNUSED(mag);
+
+    // TODO: set code
+};
+
+static void mag_scene_emulate_config_set_track(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+
+    variable_item_set_current_value_text(item, track_text[index]);
+
+    UNUSED(mag);
+
+    // TODO: set code
+};
+
+static void mag_scene_emulate_config_set_reverse(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+
+    variable_item_set_current_value_text(item, reverse_text[index]);
+
+    UNUSED(mag);
+
+    // TODO: set code
+};
+
+static void mag_scene_emulate_config_set_clock(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+
+    variable_item_set_current_value_text(item, clock_text[index]);
+
+    UNUSED(mag);
+
+    // TODO: set code
+};
+
+static void mag_scene_emulate_config_set_interpacket(VariableItem* item) {
+    Mag* mag = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+
+    variable_item_set_current_value_text(item, interpacket_text[index]);
+
+    UNUSED(mag);
+
+    // TODO: set code
+};
+
+void mag_scene_emulate_config_on_enter(void* context) {
+    // TODO: retrieve current values from struct, rather than setting to default on setup
+
+    Mag* mag = context;
+    VariableItem* item;
+    uint8_t value_index;
+
+    // TX
+    item = variable_item_list_add(
+        mag->variable_item_list, "TX via:", TX_COUNT, mag_scene_emulate_config_set_tx, mag);
+    value_index = value_index_bool(true, tx_value, TX_COUNT);
+    scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
+    variable_item_set_current_value_index(item, value_index);
+    variable_item_set_current_value_text(item, tx_text[value_index]);
+
+    // Track
+    item = variable_item_list_add(
+        mag->variable_item_list, "Track:", TRACK_COUNT, mag_scene_emulate_config_set_track, mag);
+    value_index = value_index_uint32(1, track_value, TRACK_COUNT);
+    scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
+    variable_item_set_current_value_index(item, value_index);
+    variable_item_set_current_value_text(item, track_text[value_index]);
+
+    // Reverse
+    item = variable_item_list_add(
+        mag->variable_item_list,
+        "Reverse:",
+        REVERSE_COUNT,
+        mag_scene_emulate_config_set_reverse,
+        mag);
+    value_index = value_index_bool(true, reverse_value, REVERSE_COUNT);
+    scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
+    variable_item_set_current_value_index(item, value_index);
+    variable_item_set_current_value_text(item, reverse_text[value_index]);
+
+    // Clock
+    item = variable_item_list_add(
+        mag->variable_item_list, "Clock:", CLOCK_COUNT, mag_scene_emulate_config_set_clock, mag);
+    value_index = value_index_uint32(240, clock_value, CLOCK_COUNT);
+    scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
+    variable_item_set_current_value_index(item, value_index);
+    variable_item_set_current_value_text(item, clock_text[value_index]);
+
+    // Interpacket
+    item = variable_item_list_add(
+        mag->variable_item_list,
+        "Interpacket:",
+        INTERPACKET_COUNT,
+        mag_scene_emulate_config_set_interpacket,
+        mag);
+    value_index = value_index_uint32(10, interpacket_value, INTERPACKET_COUNT);
+    scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item);
+    variable_item_set_current_value_index(item, value_index);
+    variable_item_set_current_value_text(item, interpacket_text[value_index]);
+
+    view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewVariableItemList);
+}
+
+bool mag_scene_emulate_config_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_emulate_config_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);
+    // mag_last_settings_save?
+    // scene_manager_set_scene_state? Using subghz_scene_reciever_config as framework/inspo
+}

+ 6 - 0
scenes/mag_scene_start.c

@@ -2,6 +2,7 @@
 
 typedef enum {
     SubmenuIndexEmulateTest,
+    SubmenuIndexConfigWip,
     SubmenuIndexSaved,
     SubmenuIndexAddManually,
 } SubmenuIndex;
@@ -22,6 +23,8 @@ void mag_scene_start_on_enter(void* context) {
         SubmenuIndexEmulateTest,
         mag_scene_start_submenu_callback,
         mag);
+    submenu_add_item(
+        submenu, "Config WIP", SubmenuIndexConfigWip, mag_scene_start_submenu_callback, mag);
     submenu_add_item(submenu, "Saved", SubmenuIndexSaved, mag_scene_start_submenu_callback, mag);
     submenu_add_item(
         submenu, "Add Manually", SubmenuIndexAddManually, mag_scene_start_submenu_callback, mag);
@@ -43,6 +46,9 @@ bool mag_scene_start_on_event(void* context, SceneManagerEvent event) {
         if(event.event == SubmenuIndexEmulateTest) {
             scene_manager_next_scene(mag->scene_manager, MagSceneEmulateTest);
             consumed = true;
+        } else if(event.event == SubmenuIndexConfigWip) {
+            scene_manager_next_scene(mag->scene_manager, MagSceneEmulateConfig);
+            consumed = true;
         } else if(event.event == SubmenuIndexSaved) {
             furi_string_set(mag->file_path, MAG_APP_FOLDER);
             scene_manager_next_scene(mag->scene_manager, MagSceneFileSelect);