Skip to content

Commit 86023e9

Browse files
committed
Settings view
1 parent 9f90187 commit 86023e9

File tree

8 files changed

+146
-74
lines changed

8 files changed

+146
-74
lines changed

nfc_playlist.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@
33

44
static void (*const nfc_playlist_scene_on_enter_handlers[])(void*) = {
55
nfc_playlist_main_menu_scene_on_enter,
6-
nfc_playlist_emulation_scene_on_enter,
6+
nfc_playlist_settings_scene_on_enter,
7+
nfc_playlist_emulation_scene_on_enter
78
};
89

910
static bool (*const nfc_playlist_scene_on_event_handlers[])(void*, SceneManagerEvent) = {
1011
nfc_playlist_main_menu_scene_on_event,
11-
nfc_playlist_emulation_scene_on_event,
12+
nfc_playlist_settings_scene_on_event,
13+
nfc_playlist_emulation_scene_on_event
1214
};
1315

1416
static void (*const nfc_playlist_scene_on_exit_handlers[])(void*) = {
1517
nfc_playlist_main_menu_scene_on_exit,
16-
nfc_playlist_emulation_scene_on_exit,
18+
nfc_playlist_settings_scene_on_exit,
19+
nfc_playlist_emulation_scene_on_exit
1720
};
1821

1922
static const SceneManagerHandlers nfc_playlist_scene_manager_handlers = {
@@ -44,6 +47,7 @@ static NfcPlaylist* nfc_playlist_alloc() {
4447
view_dispatcher_enable_queue(nfc_playlist->view_dispatcher);
4548

4649
nfc_playlist->variable_item_list = variable_item_list_alloc();
50+
nfc_playlist->submenu = submenu_alloc();
4751
nfc_playlist->popup = popup_alloc();
4852
nfc_playlist->emulate_timeout = default_emulate_timeout;
4953
nfc_playlist->emulate_delay = default_emulate_delay;
@@ -54,7 +58,9 @@ static NfcPlaylist* nfc_playlist_alloc() {
5458
view_dispatcher_set_custom_event_callback(nfc_playlist->view_dispatcher, nfc_playlist_custom_callback);
5559
view_dispatcher_set_navigation_event_callback(nfc_playlist->view_dispatcher, nfc_playlist_back_event_callback);
5660

57-
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Menu, variable_item_list_get_view(nfc_playlist->variable_item_list));
61+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Menu, submenu_get_view(nfc_playlist->submenu));
62+
63+
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Settings, variable_item_list_get_view(nfc_playlist->variable_item_list));
5864

5965
view_dispatcher_add_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup, popup_get_view(nfc_playlist->popup));
6066

@@ -65,9 +71,11 @@ static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
6571
furi_assert(nfc_playlist);
6672
scene_manager_free(nfc_playlist->scene_manager);
6773
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Menu);
74+
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Settings);
6875
view_dispatcher_remove_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Popup);
6976
view_dispatcher_free(nfc_playlist->view_dispatcher);
7077
variable_item_list_free(nfc_playlist->variable_item_list);
78+
submenu_free(nfc_playlist->submenu);
7179
popup_free(nfc_playlist->popup);
7280
furi_record_close(RECORD_NOTIFICATION);
7381
free(nfc_playlist);

nfc_playlist.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
#include <gui/scene_manager.h>
88
#include <gui/modules/popup.h>
99
#include <gui/modules/variable_item_list.h>
10+
#include <gui/modules/submenu.h>
1011
#include <notification/notification_messages.h>
1112
#include <nfc_playlist_worker.h>
1213

1314
typedef enum {
1415
NfcPlaylistView_Menu,
16+
NfcPlaylistView_Settings,
1517
NfcPlaylistView_Popup
1618
} NfcPlayScenesView;
1719

1820
typedef enum {
1921
NfcPlaylistScene_MainMenu,
22+
NfcPlaylistScene_Settings,
2023
NfcPlaylistScene_EmulatingPopup,
2124
NfcPlaylistScene_count
2225
} NfcPlaylistScene;
@@ -25,6 +28,7 @@ typedef struct {
2528
SceneManager* scene_manager;
2629
ViewDispatcher* view_dispatcher;
2730
VariableItemList* variable_item_list;
31+
Submenu* submenu;
2832
Popup* popup;
2933
NotificationApp* notification;
3034
FuriThread* thread;

nfc_playlist_i.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
22

33
#include "scences/main_menu.h"
4+
#include "scences/settings.h"
45
#include "scences/emulation.h"

scences/emulation.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ void nfc_playlist_emulation_scene_on_enter(void* context) {
1111

1212
bool nfc_playlist_emulation_scene_on_event(void* context, SceneManagerEvent event) {
1313
UNUSED(context);
14-
FURI_LOG_RAW_I("nfc_playlist_emulation_scene_on_event: %ld", event.event);
1514
switch (event.event) {
1615
case 0:
1716
if (EmulationState == NfcPlaylistEmulationState_Emulating) {
@@ -152,11 +151,11 @@ int32_t nfc_playlist_emulation_task(void* context) {
152151
nfc_playlist_worker_stop(nfc_playlist->nfc_playlist_worker);
153152
}
154153
}
155-
EmulationState = NfcPlaylistEmulationState_Stopped;
156154
popup_reset(nfc_playlist->popup);
157-
popup_set_header(nfc_playlist->popup, "Emulation finished", 64, 10, AlignCenter, AlignTop);
155+
popup_set_header(nfc_playlist->popup, EmulationState == NfcPlaylistEmulationState_Canceled ? "Emulation stopped" : "Emulation finished", 64, 10, AlignCenter, AlignTop);
158156
popup_set_text(nfc_playlist->popup, "Press back", 64, 50, AlignCenter, AlignTop);
159157
stop_blink(nfc_playlist);
158+
EmulationState = NfcPlaylistEmulationState_Stopped;
160159
} else {
161160
popup_set_header(nfc_playlist->popup, "Error:", 64, 10, AlignCenter, AlignTop);
162161
popup_set_text(nfc_playlist->popup, "Failed to open file\n/ext/apps_data/nfc_playlist/playlist.txt", 64, 25, AlignCenter, AlignTop);

scences/main_menu.c

Lines changed: 22 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22
#include "scences/main_menu.h"
33

44
typedef enum {
5-
NfcPlaylistEvent_ShowEmulatingPopup
5+
NfcPlaylistEvent_ShowEmulatingPopup,
6+
NfcPlaylistEvent_ShowSettings
67
} NfcPlaylistMainMenuEvent;
78

89
typedef enum {
9-
NfcPlaylistSettings_Timeout,
10-
NfcPlaylistSettings_Delay,
11-
NfcPlaylistSettings_LedIndicator,
12-
NfcPlaylistMenuSelection_Start
10+
NfcPlaylistMenuSelection_Start,
11+
NfcPlaylistMenuSelection_Settings
1312
} NfcPlaylistMenuSelection;
1413

1514
static void nfc_playlist_menu_callback(void* context, uint32_t index) {
@@ -18,35 +17,8 @@ static void nfc_playlist_menu_callback(void* context, uint32_t index) {
1817
case NfcPlaylistMenuSelection_Start:
1918
scene_manager_handle_custom_event(nfc_playlist->scene_manager, NfcPlaylistEvent_ShowEmulatingPopup);
2019
break;
21-
default:
22-
break;
23-
}
24-
}
25-
26-
static void nfc_playlist_settings_change_callback(VariableItem* item) {
27-
NfcPlaylist* nfc_playlist = variable_item_get_context(item);
28-
29-
uint8_t current_option = variable_item_list_get_selected_item_index(nfc_playlist->variable_item_list);
30-
uint8_t option_value_index = variable_item_get_current_value_index(item);
31-
32-
switch(current_option) {
33-
case NfcPlaylistSettings_Timeout: {
34-
nfc_playlist->emulate_timeout = option_value_index;
35-
char emulate_timeout_text[10];
36-
snprintf(emulate_timeout_text, 10, "%ds", options_emulate_timeout[option_value_index]);
37-
variable_item_set_current_value_text(item, (char*)emulate_timeout_text);
38-
break;
39-
}
40-
case NfcPlaylistSettings_Delay: {
41-
nfc_playlist->emulate_delay = option_value_index;
42-
char emulate_delay_text[10];
43-
snprintf(emulate_delay_text, 10, "%ds", options_emulate_delay[option_value_index]);
44-
variable_item_set_current_value_text(item, (char*)emulate_delay_text);
45-
break;
46-
}
47-
case NfcPlaylistSettings_LedIndicator:
48-
nfc_playlist->emulate_led_indicator = option_value_index;
49-
variable_item_set_current_value_text(item, nfc_playlist->emulate_led_indicator ? "ON" : "OFF");
20+
case NfcPlaylistMenuSelection_Settings:
21+
scene_manager_handle_custom_event(nfc_playlist->scene_manager, NfcPlaylistEvent_ShowSettings);
5022
break;
5123
default:
5224
break;
@@ -55,42 +27,22 @@ static void nfc_playlist_settings_change_callback(VariableItem* item) {
5527

5628
void nfc_playlist_main_menu_scene_on_enter(void* context) {
5729
NfcPlaylist* nfc_playlist = context;
58-
variable_item_list_set_header(nfc_playlist->variable_item_list, "NFC Playlist");
59-
60-
VariableItem* emulation_timeout_settings = variable_item_list_add(
61-
nfc_playlist->variable_item_list,
62-
"Emulate time",
63-
(sizeof(options_emulate_timeout)/sizeof(options_emulate_timeout[0])),
64-
nfc_playlist_settings_change_callback,
65-
nfc_playlist);
66-
variable_item_set_current_value_index(emulation_timeout_settings, nfc_playlist->emulate_timeout);
67-
char emulation_timeout_settings_text[10];
68-
snprintf(emulation_timeout_settings_text, 10, "%ds", options_emulate_timeout[nfc_playlist->emulate_timeout]);
69-
variable_item_set_current_value_text(emulation_timeout_settings, (char*)emulation_timeout_settings_text);
30+
submenu_set_header(nfc_playlist->submenu, "NFC Playlist");
7031

71-
VariableItem* emulation_delay_settings = variable_item_list_add(
72-
nfc_playlist->variable_item_list,
73-
"Delay time",
74-
(sizeof(options_emulate_delay)/sizeof(options_emulate_delay[0])),
75-
nfc_playlist_settings_change_callback,
32+
submenu_add_item(
33+
nfc_playlist->submenu,
34+
"Start",
35+
NfcPlaylistMenuSelection_Start,
36+
nfc_playlist_menu_callback,
7637
nfc_playlist);
77-
variable_item_set_current_value_index(emulation_delay_settings, nfc_playlist->emulate_delay);
78-
char emulation_delay_settings_text[10];
79-
snprintf(emulation_delay_settings_text, 10, "%ds", options_emulate_delay[nfc_playlist->emulate_delay]);
80-
variable_item_set_current_value_text(emulation_delay_settings, (char*)emulation_delay_settings_text);
8138

82-
// add bool setting
83-
VariableItem* emulation_led_indicator_settings = variable_item_list_add(
84-
nfc_playlist->variable_item_list,
85-
"LED Indicator",
86-
2,
87-
nfc_playlist_settings_change_callback,
39+
submenu_add_item(
40+
nfc_playlist->submenu,
41+
"Settings",
42+
NfcPlaylistMenuSelection_Settings,
43+
nfc_playlist_menu_callback,
8844
nfc_playlist);
89-
variable_item_set_current_value_index(emulation_led_indicator_settings, nfc_playlist->emulate_led_indicator);
90-
variable_item_set_current_value_text(emulation_led_indicator_settings, nfc_playlist->emulate_led_indicator ? "ON" : "OFF");
9145

92-
variable_item_list_add(nfc_playlist->variable_item_list, "Start", 0, NULL, NULL);
93-
variable_item_list_set_enter_callback(nfc_playlist->variable_item_list, nfc_playlist_menu_callback, nfc_playlist);
9446
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Menu);
9547
}
9648

@@ -104,6 +56,10 @@ bool nfc_playlist_main_menu_scene_on_event(void* context, SceneManagerEvent even
10456
scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_EmulatingPopup);
10557
consumed = true;
10658
break;
59+
case NfcPlaylistEvent_ShowSettings:
60+
scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_Settings);
61+
consumed = true;
62+
break;
10763
default:
10864
break;
10965
}
@@ -117,5 +73,5 @@ bool nfc_playlist_main_menu_scene_on_event(void* context, SceneManagerEvent even
11773

11874
void nfc_playlist_main_menu_scene_on_exit(void* context) {
11975
NfcPlaylist* nfc_playlist = context;
120-
variable_item_list_reset(nfc_playlist->variable_item_list);
76+
submenu_reset(nfc_playlist->submenu);
12177
}

scences/main_menu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <gui/gui.h>
44
#include <gui/view_dispatcher.h>
55
#include <gui/scene_manager.h>
6-
#include <gui/modules/variable_item_list.h>
6+
#include <gui/modules/submenu.h>
77

88
void nfc_playlist_main_menu_scene_on_enter(void* context);
99
bool nfc_playlist_main_menu_scene_on_event(void* context, SceneManagerEvent event);

scences/settings.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include "nfc_playlist.h"
2+
#include "scences/settings.h"
3+
4+
typedef enum {
5+
NfcPlaylistSettings_Timeout,
6+
NfcPlaylistSettings_Delay,
7+
NfcPlaylistSettings_LedIndicator
8+
} NfcPlaylistMenuSelection;
9+
10+
static void nfc_playlist_menu_callback(void* context, uint32_t index) {
11+
UNUSED(context);
12+
UNUSED(index);
13+
}
14+
15+
static void nfc_playlist_settings_options_change_callback(VariableItem* item) {
16+
NfcPlaylist* nfc_playlist = variable_item_get_context(item);
17+
18+
uint8_t current_option = variable_item_list_get_selected_item_index(nfc_playlist->variable_item_list);
19+
uint8_t option_value_index = variable_item_get_current_value_index(item);
20+
21+
switch(current_option) {
22+
case NfcPlaylistSettings_Timeout: {
23+
nfc_playlist->emulate_timeout = option_value_index;
24+
char emulate_timeout_text[10];
25+
snprintf(emulate_timeout_text, 10, "%ds", options_emulate_timeout[option_value_index]);
26+
variable_item_set_current_value_text(item, (char*)emulate_timeout_text);
27+
break;
28+
}
29+
case NfcPlaylistSettings_Delay: {
30+
nfc_playlist->emulate_delay = option_value_index;
31+
char emulate_delay_text[10];
32+
snprintf(emulate_delay_text, 10, "%ds", options_emulate_delay[option_value_index]);
33+
variable_item_set_current_value_text(item, (char*)emulate_delay_text);
34+
break;
35+
}
36+
case NfcPlaylistSettings_LedIndicator:
37+
nfc_playlist->emulate_led_indicator = option_value_index;
38+
variable_item_set_current_value_text(item, nfc_playlist->emulate_led_indicator ? "ON" : "OFF");
39+
break;
40+
default:
41+
break;
42+
}
43+
}
44+
45+
void nfc_playlist_settings_scene_on_enter(void* context) {
46+
NfcPlaylist* nfc_playlist = context;
47+
variable_item_list_set_header(nfc_playlist->variable_item_list, "Settings");
48+
49+
VariableItem* emulation_timeout_settings = variable_item_list_add(
50+
nfc_playlist->variable_item_list,
51+
"Emulate time",
52+
(sizeof(options_emulate_timeout)/sizeof(options_emulate_timeout[0])),
53+
nfc_playlist_settings_options_change_callback,
54+
nfc_playlist);
55+
56+
variable_item_set_current_value_index(emulation_timeout_settings, nfc_playlist->emulate_timeout);
57+
char emulation_timeout_settings_text[10];
58+
snprintf(emulation_timeout_settings_text, 10, "%ds", options_emulate_timeout[nfc_playlist->emulate_timeout]);
59+
variable_item_set_current_value_text(emulation_timeout_settings, (char*)emulation_timeout_settings_text);
60+
61+
VariableItem* emulation_delay_settings = variable_item_list_add(
62+
nfc_playlist->variable_item_list,
63+
"Delay time",
64+
(sizeof(options_emulate_delay)/sizeof(options_emulate_delay[0])),
65+
nfc_playlist_settings_options_change_callback,
66+
nfc_playlist);
67+
variable_item_set_current_value_index(emulation_delay_settings, nfc_playlist->emulate_delay);
68+
char emulation_delay_settings_text[10];
69+
snprintf(emulation_delay_settings_text, 10, "%ds", options_emulate_delay[nfc_playlist->emulate_delay]);
70+
variable_item_set_current_value_text(emulation_delay_settings, (char*)emulation_delay_settings_text);
71+
72+
VariableItem* emulation_led_indicator_settings = variable_item_list_add(
73+
nfc_playlist->variable_item_list,
74+
"LED Indicator",
75+
2,
76+
nfc_playlist_settings_options_change_callback,
77+
nfc_playlist);
78+
variable_item_set_current_value_index(emulation_led_indicator_settings, nfc_playlist->emulate_led_indicator);
79+
variable_item_set_current_value_text(emulation_led_indicator_settings, nfc_playlist->emulate_led_indicator ? "ON" : "OFF");
80+
81+
variable_item_list_set_enter_callback(nfc_playlist->variable_item_list, nfc_playlist_menu_callback, nfc_playlist);
82+
view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Settings);
83+
}
84+
85+
bool nfc_playlist_settings_scene_on_event(void* context, SceneManagerEvent event) {
86+
UNUSED(context);
87+
UNUSED(event);
88+
return false;
89+
}
90+
91+
void nfc_playlist_settings_scene_on_exit(void* context) {
92+
NfcPlaylist* nfc_playlist = context;
93+
variable_item_list_reset(nfc_playlist->variable_item_list);
94+
}

scences/settings.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#pragma once
2+
#include <furi.h>
3+
#include <gui/gui.h>
4+
#include <gui/view_dispatcher.h>
5+
#include <gui/scene_manager.h>
6+
#include <gui/modules/variable_item_list.h>
7+
8+
void nfc_playlist_settings_scene_on_enter(void* context);
9+
bool nfc_playlist_settings_scene_on_event(void* context, SceneManagerEvent event);
10+
void nfc_playlist_settings_scene_on_exit(void* context);

0 commit comments

Comments
 (0)