4
4
5
5
#define TAG "MagSceneEmulateConfig"
6
6
7
+ enum VarItemListIndex {
8
+ VarItemListIndexPinInput ,
9
+ VarItemListIndexPinOutput ,
10
+ VarItemListIndexPinEnable ,
11
+ VarItemListIndexAllowUART ,
12
+ };
13
+
7
14
static const char * gpio [] = {
8
15
[MagPinA7 ] = "2 (A7)" ,
9
16
[MagPinA6 ] = "3 (A6)" ,
@@ -15,6 +22,13 @@ static const char* gpio[] = {
15
22
[MagPinC0 ] = "16 (C0)" ,
16
23
};
17
24
const uint8_t GPIO_COUNT = COUNT_OF (gpio );
25
+ // static const char* uart_pins[] = {[DapUartTypeUSART1] = "13,14", [DapUartTypeLPUART1] = "15,16"};
26
+ // static const char* uart_swap[] = {[DapUartTXRXNormal] = "No", [DapUartTXRXSwap] = "Yes"};
27
+
28
+ void mag_scene_settings_var_item_list_callback (void * context , uint32_t index ) {
29
+ Mag * mag = context ;
30
+ view_dispatcher_send_custom_event (mag -> view_dispatcher , index );
31
+ }
18
32
19
33
static void mag_scene_settings_set_gpio (VariableItem * item , MagPin * pin_out ) {
20
34
MagPin pin = variable_item_get_current_value_index (item );
@@ -47,11 +61,11 @@ static void mag_pin_variable_item_list_add(
47
61
variable_item_set_current_value_index (item , pin );
48
62
variable_item_set_current_value_text (item , gpio [pin ]);
49
63
}
50
- // static const char* uart_pins[] = {[DapUartTypeUSART1] = "13,14", [DapUartTypeLPUART1] = "15,16"};
51
- // static const char* uart_swap[] = {[DapUartTXRXNormal] = "No", [DapUartTXRXSwap] = "Yes"};
52
64
53
65
void mag_scene_settings_on_enter (void * context ) {
54
66
Mag * mag = context ;
67
+ VariableItem * item ;
68
+ VariableItemList * var_item_list = mag -> variable_item_list ;
55
69
56
70
mag_pin_variable_item_list_add (
57
71
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) {
60
74
mag_pin_variable_item_list_add (
61
75
mag , "Enable pin:" , mag -> state .pin_enable , mag_scene_settings_set_gpio_enable );
62
76
77
+ item = variable_item_list_add (var_item_list , "UART MSR: " , 1 , NULL , mag );
78
+ variable_item_set_current_value_text (item , mag -> state .allow_uart ? "ON" : "OFF" );
79
+
80
+ variable_item_list_set_enter_callback (
81
+ var_item_list , mag_scene_settings_var_item_list_callback , mag );
82
+
83
+ variable_item_list_set_selected_item (
84
+ var_item_list , scene_manager_get_scene_state (mag -> scene_manager , MagSceneSettings ));
85
+
63
86
view_dispatcher_switch_to_view (mag -> view_dispatcher , MagViewVariableItemList );
64
87
}
65
88
66
- void mag_scene_invalid_dialog (Mag * mag ) {
89
+ void mag_scene_settings_dialog_invalid_pins (Mag * mag ) {
67
90
SceneManager * scene_manager = mag -> scene_manager ;
68
91
69
92
DialogMessage * message = dialog_message_alloc ();
@@ -86,19 +109,60 @@ void mag_scene_invalid_dialog(Mag* mag) {
86
109
}
87
110
}
88
111
112
+ void mag_scene_settings_dialog_allow_uart (Mag * mag ) {
113
+ bool change = mag -> state .allow_uart ;
114
+ if (!change ) {
115
+ DialogMessage * msg = dialog_message_alloc ();
116
+ dialog_message_set_header (msg , "UART MSR" , 64 , 0 , AlignCenter , AlignTop );
117
+ dialog_message_set_buttons (msg , "No" , NULL , "Yes" );
118
+ dialog_message_set_text (
119
+ msg ,
120
+ "This option requires a\nUART-compatible mag reader.\nIs it installed?\n" ,
121
+ 64 ,
122
+ 32 ,
123
+ AlignCenter ,
124
+ AlignCenter );
125
+ DialogMessageButton res = dialog_message_show (furi_record_open (RECORD_DIALOGS ), msg );
126
+ if (res == DialogMessageButtonRight ) {
127
+ change = true;
128
+ }
129
+ dialog_message_free (msg );
130
+ furi_record_close (RECORD_DIALOGS );
131
+ }
132
+ if (change ) {
133
+ mag -> state .allow_uart = !mag -> state .allow_uart ;
134
+ variable_item_set_current_value_text (
135
+ variable_item_list_get (mag -> variable_item_list , VarItemListIndexAllowUART ),
136
+ mag -> state .allow_uart ? "ON" : "OFF" );
137
+ }
138
+ }
139
+
89
140
bool mag_scene_settings_on_event (void * context , SceneManagerEvent event ) {
90
141
Mag * mag = context ;
91
142
SceneManager * scene_manager = mag -> scene_manager ;
92
143
bool consumed = false;
93
144
94
- if (event .type == SceneManagerEventTypeBack ) {
145
+ switch (event .type ) {
146
+ case SceneManagerEventTypeBack :
147
+ // when attempting to exit, validate pin configuration
148
+ // if invalid, prompt
95
149
consumed = true;
96
150
97
151
if (!mag_state_gpio_is_valid (& mag -> state )) {
98
- mag_scene_invalid_dialog (mag );
152
+ mag_scene_settings_dialog_invalid_pins (mag );
99
153
} else {
100
154
scene_manager_previous_scene (scene_manager );
101
155
}
156
+ break ;
157
+ case SceneManagerEventTypeCustom :
158
+ scene_manager_set_scene_state (mag -> scene_manager , MagSceneSettings , event .event );
159
+ consumed = true;
160
+ if (event .event == VarItemListIndexAllowUART ) {
161
+ mag_scene_settings_dialog_allow_uart (mag );
162
+ }
163
+ break ;
164
+ default :
165
+ break ;
102
166
}
103
167
104
168
return consumed ;
0 commit comments