Skip to content

Commit 0acc57d

Browse files
committed
Pin settings menu
1 parent 3ad981c commit 0acc57d

9 files changed

+150
-14
lines changed

helpers/mag_helpers.c

+23
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,29 @@ const int sublen[] = {32, 48, 48};
1919

2020
uint8_t last_value = 2;
2121

22+
const GpioPin* mag_gpio_enum_to_pin(MagSettingPin pin) {
23+
switch(pin) {
24+
case MagSettingPinA7:
25+
return &gpio_ext_pa7;
26+
case MagSettingPinA6:
27+
return &gpio_ext_pa6;
28+
case MagSettingPinA4:
29+
return &gpio_ext_pa4;
30+
case MagSettingPinB3:
31+
return &gpio_ext_pb3;
32+
case MagSettingPinB2:
33+
return &gpio_ext_pb2;
34+
case MagSettingPinC3:
35+
return &gpio_ext_pc3;
36+
case MagSettingPinC1:
37+
return &gpio_ext_pc1;
38+
case MagSettingPinC0:
39+
return &gpio_ext_pc0;
40+
default:
41+
return NULL;
42+
}
43+
}
44+
2245
void play_halfbit(bool value, MagSetting* setting) {
2346
switch(setting->tx) {
2447
case MagTxStateRFID:

helpers/mag_helpers.h

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include <stdio.h>
33
#include <string.h>
44

5+
const GpioPin* mag_gpio_enum_to_pin(MagSettingPin pin);
6+
57
void play_halfbit(bool value, MagSetting* setting);
68
void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting, bool reverse);
79

helpers/mag_types.h

+11
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@ typedef enum {
1414
MagViewTextInput,
1515
} MagView;
1616

17+
typedef enum {
18+
MagSettingPinA7,
19+
MagSettingPinA6,
20+
MagSettingPinA4,
21+
MagSettingPinB3,
22+
MagSettingPinB2,
23+
MagSettingPinC3,
24+
MagSettingPinC1,
25+
MagSettingPinC0,
26+
} MagSettingPin;
27+
1728
typedef enum {
1829
MagReverseStateOff,
1930
MagReverseStateOn,

mag.c

+5-6
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,6 @@
22

33
#define TAG "Mag"
44

5-
#define SETTING_DEFAULT_REVERSE MagReverseStateOff
6-
#define SETTING_DEFAULT_TRACK MagTrackStateOneAndTwo
7-
#define SETTING_DEFAULT_TX MagTxStateGPIO
8-
#define SETTING_DEFAULT_US_CLOCK 240
9-
#define SETTING_DEFAULT_US_INTERPACKET 10
10-
115
static bool mag_debug_custom_event_callback(void* context, uint32_t event) {
126
furi_assert(context);
137
Mag* mag = context;
@@ -28,6 +22,11 @@ static MagSetting* mag_setting_alloc() {
2822
setting->tx = SETTING_DEFAULT_TX;
2923
setting->us_clock = SETTING_DEFAULT_US_CLOCK;
3024
setting->us_interpacket = SETTING_DEFAULT_US_INTERPACKET;
25+
26+
setting->pin_input = SETTING_DEFAULT_PIN_INPUT;
27+
setting->pin_output = SETTING_DEFAULT_PIN_OUTPUT;
28+
setting->pin_enable = SETTING_DEFAULT_PIN_ENABLE;
29+
3130
setting->is_debug = furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug);
3231

3332
return setting;

mag_i.h

+12
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@
4747
}
4848
#endif
4949

50+
#define SETTING_DEFAULT_REVERSE MagReverseStateOff
51+
#define SETTING_DEFAULT_TRACK MagTrackStateOneAndTwo
52+
#define SETTING_DEFAULT_TX MagTxStateGPIO
53+
#define SETTING_DEFAULT_US_CLOCK 240
54+
#define SETTING_DEFAULT_US_INTERPACKET 10
55+
#define SETTING_DEFAULT_PIN_INPUT MagSettingPinA7
56+
#define SETTING_DEFAULT_PIN_OUTPUT MagSettingPinA6
57+
#define SETTING_DEFAULT_PIN_ENABLE MagSettingPinA4
58+
5059
enum MagCustomEvent {
5160
MagEventNext = 100,
5261
MagEventExit,
@@ -59,6 +68,9 @@ typedef struct {
5968
MagReverseState reverse;
6069
uint32_t us_clock;
6170
uint32_t us_interpacket;
71+
MagSettingPin pin_input;
72+
MagSettingPin pin_output;
73+
MagSettingPin pin_enable;
6274
bool is_debug;
6375
} MagSetting;
6476

scenes/mag_scene_config.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
ADD_SCENE(mag, start, Start)
22
ADD_SCENE(mag, about, About)
3+
ADD_SCENE(mag, read, Read)
4+
ADD_SCENE(mag, settings, Settings)
35
ADD_SCENE(mag, emulate, Emulate)
46
ADD_SCENE(mag, emulate_config, EmulateConfig)
57
ADD_SCENE(mag, file_select, FileSelect)
@@ -11,5 +13,4 @@ ADD_SCENE(mag, save_success, SaveSuccess)
1113
ADD_SCENE(mag, delete_success, DeleteSuccess)
1214
ADD_SCENE(mag, delete_confirm, DeleteConfirm)
1315
ADD_SCENE(mag, exit_confirm, ExitConfirm)
14-
ADD_SCENE(mag, under_construction, UnderConstruction)
15-
ADD_SCENE(mag, read, Read)
16+
ADD_SCENE(mag, under_construction, UnderConstruction)

scenes/mag_scene_emulate_config.c

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
#define TAG "MagSceneEmulateConfig"
44

5-
enum MagSettingIndex {
6-
MagSettingIndexTx,
7-
MagSettingIndexTrack,
8-
MagSettingIndexReverse,
9-
MagSettingIndexClock,
10-
MagSettingIndexInterpacket,
5+
enum MagEmulateConfigIndex {
6+
MagEmulateConfigIndexTx,
7+
MagEmulateConfigIndexTrack,
8+
MagEmulateConfigIndexReverse,
9+
MagEmulateConfigIndexClock,
10+
MagEmulateConfigIndexInterpacket,
1111
};
1212

1313
#define TX_COUNT 7

scenes/mag_scene_settings.c

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include "../mag_i.h"
2+
3+
#define TAG "MagSceneEmulateConfig"
4+
5+
#define GPIO_COUNT 8
6+
static const char* gpio[GPIO_COUNT] = {
7+
[MagSettingPinA7] = "2 (A7)",
8+
[MagSettingPinA6] = "3 (A6)",
9+
[MagSettingPinA4] = "4 (A4)",
10+
[MagSettingPinB3] = "5 (B3)",
11+
[MagSettingPinB2] = "6 (B2)",
12+
[MagSettingPinC3] = "7 (C3)",
13+
[MagSettingPinC1] = "15 (C1)",
14+
[MagSettingPinC0] = "16 (C0)",
15+
};
16+
17+
static void mag_scene_settings_set_gpio(VariableItem* item, MagSettingPin* pin_to_set) {
18+
MagSettingPin pin = variable_item_get_current_value_index(item);
19+
variable_item_set_current_value_text(item, gpio[pin]);
20+
*pin_to_set = pin;
21+
}
22+
23+
static void mag_scene_settings_set_gpio_input(VariableItem* item) {
24+
Mag* mag = variable_item_get_context(item);
25+
mag_scene_settings_set_gpio(item, &mag->setting->pin_input);
26+
};
27+
28+
static void mag_scene_settings_set_gpio_output(VariableItem* item) {
29+
Mag* mag = variable_item_get_context(item);
30+
mag_scene_settings_set_gpio(item, &mag->setting->pin_output);
31+
};
32+
33+
static void mag_scene_settings_set_gpio_enable(VariableItem* item) {
34+
Mag* mag = variable_item_get_context(item);
35+
mag_scene_settings_set_gpio(item, &mag->setting->pin_enable);
36+
};
37+
38+
static void mag_pin_variable_item_list_add(
39+
Mag* mag,
40+
const char* label,
41+
MagSettingPin pin,
42+
VariableItemChangeCallback change_callback) {
43+
VariableItem* item =
44+
variable_item_list_add(mag->variable_item_list, label, GPIO_COUNT, change_callback, mag);
45+
variable_item_set_current_value_index(item, pin);
46+
variable_item_set_current_value_text(item, gpio[pin]);
47+
}
48+
// static const char* uart_pins[] = {[DapUartTypeUSART1] = "13,14", [DapUartTypeLPUART1] = "15,16"};
49+
// static const char* uart_swap[] = {[DapUartTXRXNormal] = "No", [DapUartTXRXSwap] = "Yes"};
50+
51+
void mag_scene_settings_on_enter(void* context) {
52+
Mag* mag = context;
53+
54+
mag_pin_variable_item_list_add(
55+
mag, "Input pin:", mag->setting->pin_input, mag_scene_settings_set_gpio_input);
56+
mag_pin_variable_item_list_add(
57+
mag, "Output pin:", mag->setting->pin_output, mag_scene_settings_set_gpio_output);
58+
mag_pin_variable_item_list_add(
59+
mag, "Enable pin:", mag->setting->pin_enable, mag_scene_settings_set_gpio_enable);
60+
61+
view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewVariableItemList);
62+
}
63+
64+
bool mag_scene_settings_on_event(void* context, SceneManagerEvent event) {
65+
Mag* mag = context;
66+
SceneManager* scene_manager = mag->scene_manager;
67+
bool consumed = false;
68+
69+
UNUSED(mag);
70+
UNUSED(scene_manager);
71+
UNUSED(event);
72+
73+
return consumed;
74+
}
75+
76+
void mag_scene_settings_on_exit(void* context) {
77+
Mag* mag = context;
78+
variable_item_list_set_selected_item(mag->variable_item_list, 0);
79+
variable_item_list_reset(mag->variable_item_list);
80+
}

scenes/mag_scene_start.c

+8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ typedef enum {
44
SubmenuIndexSaved,
55
SubmenuIndexRead,
66
//SubmenuIndexAddManually,
7+
SubmenuIndexSettings,
78
SubmenuIndexAbout,
89
} SubmenuIndex;
910

@@ -28,6 +29,9 @@ void mag_scene_start_on_enter(void* context) {
2829
"Enable Debug!");
2930
//submenu_add_item(
3031
// submenu, "Add Manually", SubmenuIndexAddManually, mag_scene_start_submenu_callback, mag);
32+
submenu_add_item(
33+
submenu, "Settings", SubmenuIndexSettings, mag_scene_start_submenu_callback, mag);
34+
3135
submenu_add_item(submenu, "About", SubmenuIndexAbout, mag_scene_start_submenu_callback, mag);
3236

3337
submenu_set_selected_item(
@@ -59,6 +63,10 @@ bool mag_scene_start_on_event(void* context, SceneManagerEvent event) {
5963
// scene_manager_next_scene(mag->scene_manager, MagSceneInputValue);
6064
// consumed = true;
6165
// break;
66+
case SubmenuIndexSettings:
67+
scene_manager_next_scene(mag->scene_manager, MagSceneSettings);
68+
consumed = true;
69+
break;
6270
case SubmenuIndexAbout:
6371
scene_manager_next_scene(mag->scene_manager, MagSceneAbout);
6472
consumed = true;

0 commit comments

Comments
 (0)