Skip to content

Commit 5d4cc1e

Browse files
committed
add read only menu
1 parent 82eb8e6 commit 5d4cc1e

20 files changed

+111
-29
lines changed

fw/application/src/app/amiibo/scene/amiibo_scene_amiibo_detail.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1+
#include "amiibo_helper.h"
12
#include "amiibo_scene.h"
23
#include "app_amiibo.h"
34
#include "app_timer.h"
45
#include "cwalk2.h"
6+
#include "db_header.h"
7+
#include "i18n/language.h"
58
#include "mui_list_view.h"
69
#include "nrf_log.h"
710
#include "ntag_emu.h"
8-
#include "vfs.h"
9-
#include "vfs_meta.h"
10-
#include "amiibo_helper.h"
1111
#include "ntag_store.h"
1212
#include "settings.h"
13-
#include "i18n/language.h"
14-
#include "db_header.h"
13+
#include "vfs.h"
14+
#include "vfs_meta.h"
1515

1616
#define NRF_ERR_NOT_AMIIBO -1000
1717
#define NRF_ERR_READ_ERROR -1001
@@ -70,10 +70,14 @@ static int32_t ntag_read(vfs_driver_t *p_vfs_driver, const char *path, ntag_t *n
7070
vfs_meta_t meta;
7171
memset(&meta, 0, sizeof(vfs_meta_t));
7272
vfs_meta_decode(obj.meta, sizeof(obj.meta), &meta);
73-
if(meta.has_notes){
73+
if (meta.has_notes) {
7474
memcpy(ntag->notes, meta.notes, strlen(meta.notes));
7575
}
7676

77+
if (meta.has_flags && (meta.flags & VFS_OBJ_FLAG_READONLY)) {
78+
ntag->read_only = true;
79+
}
80+
7781
res = p_vfs_driver->read_file_data(path, ntag->data, 540);
7882
if (res != 540 && res != 532) {
7983
return NRF_ERR_READ_ERROR;
@@ -83,7 +87,7 @@ static int32_t ntag_read(vfs_driver_t *p_vfs_driver, const char *path, ntag_t *n
8387

8488
static void ntag_gen(void *p_context) {
8589
ret_code_t err_code;
86-
app_amiibo_t * app = p_context;
90+
app_amiibo_t *app = p_context;
8791
ntag_t *ntag_current = &app->ntag;
8892

8993
err_code = amiibo_helper_rand_amiibo_uuid(ntag_current);
@@ -136,7 +140,7 @@ static void ntag_update_cb(ntag_event_type_t type, void *context, ntag_t *p_ntag
136140
if (type == NTAG_EVENT_TYPE_WRITTEN) {
137141
ntag_update(app, p_ntag);
138142
} else if (type == NTAG_EVENT_TYPE_READ) {
139-
settings_data_t* p_settings = settings_get_data();
143+
settings_data_t *p_settings = settings_get_data();
140144
if (p_settings->auto_gen_amiibo) {
141145
app_timer_stop(m_amiibo_gen_delay_timer);
142146
app_timer_start(m_amiibo_gen_delay_timer, APP_TIMER_TICKS(1000), app);
@@ -187,7 +191,9 @@ static void amiibo_scene_amiibo_detail_reload_files(app_amiibo_t *app) {
187191
vfs_meta_t meta;
188192
memset(&meta, 0, sizeof(vfs_meta_t));
189193
vfs_meta_decode(obj.meta, sizeof(obj.meta), &meta);
190-
if (obj.type == VFS_TYPE_REG && (obj.size == NTAG_DATA_SIZE || obj.size == NTAG_TAGMO_DATA_SIZE || obj.size == NTAG_THENAYA_DATA_SIZE) &&
194+
if (obj.type == VFS_TYPE_REG &&
195+
(obj.size == NTAG_DATA_SIZE || obj.size == NTAG_TAGMO_DATA_SIZE ||
196+
obj.size == NTAG_THENAYA_DATA_SIZE) &&
191197
(!meta.has_flags || !(meta.flags & VFS_OBJ_FLAG_HIDDEN))) {
192198
string_set_str(file_name, obj.name);
193199
string_array_push_back(app->amiibo_files, file_name);

fw/application/src/app/amiibo/scene/amiibo_scene_amiibo_detail_menu.c

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "nrf_log.h"
88
#include "settings.h"
99
#include "vfs.h"
10+
#include "vfs_meta.h"
1011

1112
#include "ntag_emu.h"
1213
#include "ntag_store.h"
@@ -19,12 +20,43 @@
1920
enum amiibo_detail_menu_t {
2021
AMIIBO_DETAIL_MENU_RAND_UID,
2122
AMIIBO_DETAIL_MENU_AUTO_RAND_UID,
23+
AMIIBO_DETAIL_MENU_READ_ONLY,
2224
AMIIBO_DETAIL_MENU_REMOVE_AMIIBO,
2325
AMIIBO_DETAIL_MENU_BACK_AMIIBO_DETAIL,
2426
AMIIBO_DETAIL_MENU_BACK_FILE_BROWSER,
2527
AMIIBO_DETAIL_MENU_BACK_MAIN_MENU,
2628
};
2729

30+
static ret_code_t amiibo_scene_amiibo_detail_set_readonly(app_amiibo_t *app, bool readonly) {
31+
char path[VFS_MAX_PATH_LEN];
32+
vfs_meta_t meta;
33+
vfs_obj_t obj;
34+
35+
cwalk_append_segment(path, string_get_cstr(app->current_folder), string_get_cstr(app->current_file));
36+
37+
vfs_driver_t *p_vfs_driver = vfs_get_driver(VFS_DRIVE_EXT);
38+
int32_t res = p_vfs_driver->stat_file(path, &obj);
39+
if (res < 0) {
40+
return -1;
41+
}
42+
43+
memset(&meta, 0, sizeof(vfs_meta_t));
44+
vfs_meta_decode(obj.meta, sizeof(obj.meta), &meta);
45+
46+
meta.has_flags = true;
47+
if (readonly) {
48+
meta.flags |= VFS_OBJ_FLAG_READONLY;
49+
} else {
50+
meta.flags &= ~VFS_OBJ_FLAG_READONLY;
51+
}
52+
53+
if (p_vfs_driver->update_file_meta(path, obj.meta, sizeof(obj.meta)) == VFS_OK) {
54+
return NRF_SUCCESS;
55+
} else {
56+
return -1;
57+
}
58+
}
59+
2860
static void amiibo_scene_amiibo_detail_menu_msg_box_no_key_cb(mui_msg_box_event_t event, mui_msg_box_t *p_msg_box) {
2961
app_amiibo_t *app = p_msg_box->user_data;
3062
if (event == MUI_MSG_BOX_EVENT_SELECT_CENTER) {
@@ -129,7 +161,17 @@ static void amiibo_scene_amiibo_detail_menu_on_selected(mui_list_view_event_t ev
129161
p_settings->auto_gen_amiibo = !p_settings->auto_gen_amiibo;
130162
settings_save();
131163

132-
mui_list_view_item_set_sub_text(p_item, (p_settings->auto_gen_amiibo ? getLangString(_L_ON_F) : getLangString(_L_OFF_F)));
164+
mui_list_view_item_set_sub_text(
165+
p_item, (p_settings->auto_gen_amiibo ? getLangString(_L_ON_F) : getLangString(_L_OFF_F)));
166+
} break;
167+
168+
case AMIIBO_DETAIL_MENU_READ_ONLY: {
169+
ret_code_t err_code = amiibo_scene_amiibo_detail_set_readonly(app, !app->ntag.read_only);
170+
if (err_code == NRF_SUCCESS) {
171+
app->ntag.read_only = !app->ntag.read_only;
172+
mui_list_view_item_set_sub_text(p_item,
173+
app->ntag.read_only ? getLangString(_L_ON_F) : getLangString(_L_OFF_F));
174+
}
133175
} break;
134176

135177
case AMIIBO_DETAIL_MENU_REMOVE_AMIIBO: {
@@ -157,9 +199,14 @@ void amiibo_scene_amiibo_detail_menu_on_enter(void *user_data) {
157199
(void *)AMIIBO_DETAIL_MENU_RAND_UID);
158200
settings_data_t *p_settings = settings_get_data();
159201

160-
mui_list_view_add_item_ext(app->p_list_view, 0xe1c6, getLangString(_L_AUTO_RANDOM_GENERATION),
161-
(p_settings->auto_gen_amiibo ? getLangString(_L_ON_F) : getLangString(_L_OFF_F)),
162-
(void *)AMIIBO_DETAIL_MENU_AUTO_RAND_UID);
202+
mui_list_view_add_item_ext(app->p_list_view, 0xe1c6, getLangString(_L_AUTO_RANDOM_GENERATION),
203+
(p_settings->auto_gen_amiibo ? getLangString(_L_ON_F) : getLangString(_L_OFF_F)),
204+
(void *)AMIIBO_DETAIL_MENU_AUTO_RAND_UID);
205+
206+
mui_list_view_add_item_ext(app->p_list_view, 0xe007, getLangString(_L_READ_ONLY),
207+
app->ntag.read_only ? getLangString(_L_ON_F) : getLangString(_L_OFF_F),
208+
(void *)AMIIBO_DETAIL_MENU_READ_ONLY);
209+
163210
mui_list_view_add_item(app->p_list_view, 0xe1c7, getLangString(_L_DELETE_TAG),
164211
(void *)AMIIBO_DETAIL_MENU_REMOVE_AMIIBO);
165212
mui_list_view_add_item(app->p_list_view, 0xe068, getLangString(_L_BACK_TO_DETAILS),

fw/application/src/app/amiidb/api/amiidb_api_slot.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ int32_t amiidb_api_slot_read(uint8_t slot, ntag_t *p_ntag) {
3030
strcpy(p_ntag->notes, meta.notes);
3131
}
3232

33-
if (meta.has_flags && meta.flags & VFS_OBJ_FLAG_READONLY) {
34-
p_ntag->readonly = true;
33+
if (meta.has_flags && (meta.flags & VFS_OBJ_FLAG_READONLY)) {
34+
p_ntag->read_only = true;
3535
}
3636

3737
return 0;
@@ -172,5 +172,9 @@ int32_t amiidb_api_slot_set_readonly(uint8_t slot, bool readonly) {
172172
meta.flags &= ~VFS_OBJ_FLAG_READONLY;
173173
}
174174

175-
return p_vfs_driver->update_file_meta(path, obj.meta, sizeof(obj.meta));
175+
if (p_vfs_driver->update_file_meta(path, obj.meta, sizeof(obj.meta)) == VFS_OK) {
176+
return 0;
177+
} else {
178+
return -1;
179+
}
176180
}

fw/application/src/app/amiidb/scene/amiidb_scene_amiibo_detail_menu.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@
1717
#include "mini_app_launcher.h"
1818
#include "mini_app_registry.h"
1919

20+
#include "amiidb_api_slot.h"
21+
2022
static enum amiidb_detail_menu_t {
2123
AMIIDB_DETAIL_MENU_RAND_UID,
2224
AMIIDB_DETAIL_MENU_AUTO_RAND_UID,
25+
AMIIDB_DETAIL_MENU_READ_ONLY,
2326
AMIIDB_DETAIL_MENU_SHOW_QRCODE,
2427
AMIIDB_DETAIL_MENU_FAVORITE,
2528
AMIIDB_DETAIL_MENU_SAVE_AS,
@@ -82,6 +85,15 @@ static void amiidb_scene_amiibo_detail_menu_on_selected(mui_list_view_event_t ev
8285
break;
8386
}
8487

88+
case AMIIDB_DETAIL_MENU_READ_ONLY: {
89+
ret_code_t err_code = amiidb_api_slot_set_readonly(app->cur_slot_index, !app->ntag.read_only);
90+
if (err_code == NRF_SUCCESS) {
91+
app->ntag.read_only = !app->ntag.read_only;
92+
mui_list_view_item_set_sub_text(p_item,
93+
app->ntag.read_only ? getLangString(_L_ON_F) : getLangString(_L_OFF_F));
94+
}
95+
} break;
96+
8597
case AMIIDB_DETAIL_MENU_BACK_AMIIBO_DETAIL: {
8698
mui_scene_dispatcher_previous_scene(app->p_scene_dispatcher);
8799
break;
@@ -146,6 +158,11 @@ void amiidb_scene_amiibo_detail_menu_on_enter(void *user_data) {
146158
snprintf(txt, sizeof(txt), "%s", p_settings->qrcode_enabled ? getLangString(_L_ON_F) : getLangString(_L_OFF_F));
147159
mui_list_view_add_item_ext(app->p_list_view, 0xe006, getLangString(_L_SHOW_QRCODE), txt,
148160
(void *)AMIIDB_DETAIL_MENU_SHOW_QRCODE);
161+
162+
mui_list_view_add_item_ext(app->p_list_view, 0xe007, getLangString(_L_READ_ONLY),
163+
app->ntag.read_only ? getLangString(_L_ON_F) : getLangString(_L_OFF_F),
164+
(void *)AMIIDB_DETAIL_MENU_READ_ONLY);
165+
149166
mui_list_view_add_item(app->p_list_view, ICON_FAVORITE, getLangString(_L_APP_AMIIDB_DETAIL_FAVORITE),
150167
(void *)AMIIDB_DETAIL_MENU_FAVORITE);
151168
mui_list_view_add_item(app->p_list_view, ICON_DATA, getLangString(_L_APP_AMIIDB_DETAIL_SAVE_AS),

fw/application/src/i18n/de_DE.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const char * const lang_de_DE[_L_COUNT] = {
4646
[_L_RANDOM_GENERATION] = "Zufällige UUID",
4747
[_L_AUTO_RANDOM_GENERATION] = "Zufällige UUID (Automatisch)",
4848
[_L_SHOW_QRCODE] = "QR Code",
49+
[_L_READ_ONLY] = "",
4950
[_L_DELETE_TAG] = "Tag löschen",
5051
[_L_DELETE_TAG_CONFIRM] = "Löschen von %s bestätigen?",
5152
[_L_BACK_TO_DETAILS] = "Zurück zu Tag Details",

fw/application/src/i18n/en_US.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const char * const lang_en_US[_L_COUNT] = {
4646
[_L_RANDOM_GENERATION] = "Rand. Tag",
4747
[_L_AUTO_RANDOM_GENERATION] = "Auto Rand.",
4848
[_L_SHOW_QRCODE] = "Display QR Code",
49+
[_L_READ_ONLY] = "Read-only",
4950
[_L_DELETE_TAG] = "Delete Tag",
5051
[_L_DELETE_TAG_CONFIRM] = "Confirm Delete %s ?",
5152
[_L_BACK_TO_DETAILS] = "Back to Tag Details",

fw/application/src/i18n/es_ES.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const char * const lang_es_ES[_L_COUNT] = {
4646
[_L_RANDOM_GENERATION] = "Nuevo serial aleat.",
4747
[_L_AUTO_RANDOM_GENERATION] = "Serial alea. aut",
4848
[_L_SHOW_QRCODE] = "Mostrar QR",
49+
[_L_READ_ONLY] = "",
4950
[_L_DELETE_TAG] = "Borrar amiibo...",
5051
[_L_DELETE_TAG_CONFIRM] = "¿Borrar %s?",
5152
[_L_BACK_TO_DETAILS] = "[Detalles amiibo]",

fw/application/src/i18n/fr_FR.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const char * const lang_fr_FR[_L_COUNT] = {
4646
[_L_RANDOM_GENERATION] = "Randomiser la Balise",
4747
[_L_AUTO_RANDOM_GENERATION] = "Randomisation Automatique",
4848
[_L_SHOW_QRCODE] = "Afficher le Code QR",
49+
[_L_READ_ONLY] = "",
4950
[_L_DELETE_TAG] = "Supprimer la Balise",
5051
[_L_DELETE_TAG_CONFIRM] = "Confirmer la Suppression de %s ?",
5152
[_L_BACK_TO_DETAILS] = "Retour Aux Détails de L'étiquette",

fw/application/src/i18n/hu_HU.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const char * const lang_hu_HU[_L_COUNT] = {
4646
[_L_RANDOM_GENERATION] = "Véletlengenerátor",
4747
[_L_AUTO_RANDOM_GENERATION] = "Automat. Véletlengenerátor",
4848
[_L_SHOW_QRCODE] = "QR-kód Megjelenítése",
49+
[_L_READ_ONLY] = "",
4950
[_L_DELETE_TAG] = "Címke Törlése",
5051
[_L_DELETE_TAG_CONFIRM] = "Törlés Megerősítése?",
5152
[_L_BACK_TO_DETAILS] = "Vissza a Címke Részletkhez",

fw/application/src/i18n/it_IT.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const char * const lang_it_IT[_L_COUNT] = {
4646
[_L_RANDOM_GENERATION] = "Tag casuale",
4747
[_L_AUTO_RANDOM_GENERATION] = "Casuale automatico",
4848
[_L_SHOW_QRCODE] = "Mostra codice QR",
49+
[_L_READ_ONLY] = "",
4950
[_L_DELETE_TAG] = "Elimina tag",
5051
[_L_DELETE_TAG_CONFIRM] = "Conferma eliminazione %s\n?",
5152
[_L_BACK_TO_DETAILS] = "[Torna ai dettagli del tag]",

0 commit comments

Comments
 (0)