Skip to content

Commit dad1b1e

Browse files
committed
amiibo browser and amiidb support read only option solosky#256
1 parent 5d4cc1e commit dad1b1e

File tree

8 files changed

+61
-19
lines changed

8 files changed

+61
-19
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ static int32_t ntag_read(vfs_driver_t *p_vfs_driver, const char *path, ntag_t *n
7474
memcpy(ntag->notes, meta.notes, strlen(meta.notes));
7575
}
7676

77+
NRF_LOG_INFO("has_flag:%d flag:%d", meta.has_flags, meta.flags);
7778
if (meta.has_flags && (meta.flags & VFS_OBJ_FLAG_READONLY)) {
7879
ntag->read_only = true;
7980
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ static ret_code_t amiibo_scene_amiibo_detail_set_readonly(app_amiibo_t *app, boo
3131
char path[VFS_MAX_PATH_LEN];
3232
vfs_meta_t meta;
3333
vfs_obj_t obj;
34+
uint8_t meta_buf[VFS_MAX_META_LEN];
35+
3436

3537
cwalk_append_segment(path, string_get_cstr(app->current_folder), string_get_cstr(app->current_file));
3638

@@ -50,7 +52,8 @@ static ret_code_t amiibo_scene_amiibo_detail_set_readonly(app_amiibo_t *app, boo
5052
meta.flags &= ~VFS_OBJ_FLAG_READONLY;
5153
}
5254

53-
if (p_vfs_driver->update_file_meta(path, obj.meta, sizeof(obj.meta)) == VFS_OK) {
55+
vfs_meta_encode(meta_buf, sizeof(meta_buf), &meta);
56+
if (p_vfs_driver->update_file_meta(path, meta_buf, sizeof(meta_buf)) == VFS_OK) {
5457
return NRF_SUCCESS;
5558
} else {
5659
return -1;
@@ -169,6 +172,7 @@ static void amiibo_scene_amiibo_detail_menu_on_selected(mui_list_view_event_t ev
169172
ret_code_t err_code = amiibo_scene_amiibo_detail_set_readonly(app, !app->ntag.read_only);
170173
if (err_code == NRF_SUCCESS) {
171174
app->ntag.read_only = !app->ntag.read_only;
175+
ntag_emu_set_tag(&app->ntag);
172176
mui_list_view_item_set_sub_text(p_item,
173177
app->ntag.read_only ? getLangString(_L_ON_F) : getLangString(_L_OFF_F));
174178
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ static void amiibo_scene_file_browser_reload_folders(app_amiibo_t *app) {
5454
vfs_meta_t meta;
5555
memset(&meta, 0, sizeof(vfs_meta_t));
5656
vfs_meta_decode(obj.meta, sizeof(obj.meta), &meta);
57-
if (meta.has_flags && (meta.flags && VFS_OBJ_FLAG_HIDDEN)) {
57+
if (meta.has_flags && (meta.flags & VFS_OBJ_FLAG_HIDDEN)) {
5858
continue;
5959
}
6060
uint16_t icon = obj.type == VFS_TYPE_DIR ? ICON_FOLDER : ICON_FILE;

fw/application/src/app/amiibo/view/amiibo_detail_view.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#include "amiibo_detail_view.h"
2-
#include "mui_element.h"
3-
#include "i18n/language.h"
4-
#include "db_header.h"
52
#include "amiibo_helper.h"
3+
#include "db_header.h"
4+
#include "i18n/language.h"
5+
#include "mui_element.h"
66

77
#define ICON_LEFT 0xe1ac
88
#define ICON_RIGHT 0xe1aa
9+
#define ICON_INFO 0xe0ae
910

1011
static void amiibo_detail_view_on_draw(mui_view_t *p_view, mui_canvas_t *p_canvas) {
1112
char buff[64];
@@ -36,14 +37,22 @@ static void amiibo_detail_view_on_draw(mui_view_t *p_view, mui_canvas_t *p_canva
3637

3738
y += 12;
3839

39-
mui_canvas_draw_utf8(p_canvas, 0, y += 12, string_get_cstr(p_amiibo_detail_view->file_name));
40+
if (ntag->read_only) {
41+
mui_canvas_set_font(p_canvas, u8g2_font_siji_t_6x10);
42+
mui_canvas_draw_glyph(p_canvas, 0, y += 12, ICON_INFO);
43+
mui_canvas_set_font(p_canvas, u8g2_font_wqy12_t_gb2312a);
44+
mui_canvas_draw_utf8(p_canvas, 12, y, string_get_cstr(p_amiibo_detail_view->file_name));
45+
} else {
46+
mui_canvas_draw_utf8(p_canvas, 0, y += 12, string_get_cstr(p_amiibo_detail_view->file_name));
47+
}
4048

4149
uint32_t head = to_little_endian_int32(&ntag->data[84]);
4250
uint32_t tail = to_little_endian_int32(&ntag->data[88]);
4351

4452
const db_amiibo_t *amd = get_amiibo_by_id(head, tail);
4553
if (amd != NULL) {
46-
const char *name =(getLanguage() == LANGUAGE_ZH_TW || getLanguage() == LANGUAGE_ZH_HANS) ? amd->name_cn : amd->name_en;
54+
const char *name =
55+
(getLanguage() == LANGUAGE_ZH_TW || getLanguage() == LANGUAGE_ZH_HANS) ? amd->name_cn : amd->name_en;
4756
mui_element_autowrap_text(p_canvas, 0, y += 15, mui_canvas_get_width(p_canvas), 24, name);
4857
if (strlen(ntag->notes) > 0) {
4958
mui_element_autowrap_text(p_canvas, 0, y += 13, mui_canvas_get_width(p_canvas), 24, ntag->notes);

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ int32_t amiidb_api_slot_write(uint8_t slot, ntag_t *p_ntag) {
5656
meta.amiibo_tail = to_little_endian_int32(&p_ntag->data[88]);
5757

5858
// TODO write only flag???
59+
meta.has_flags = true;
60+
if (p_ntag->read_only) {
61+
meta.flags |= VFS_OBJ_FLAG_READONLY;
62+
} else {
63+
meta.flags &= ~VFS_OBJ_FLAG_READONLY;
64+
}
5965

6066
vfs_meta_encode(meta_encoded, sizeof(meta_encoded), &meta);
6167
res = p_vfs_driver->update_file_meta(path, meta_encoded, sizeof(meta_encoded));
@@ -135,7 +141,7 @@ int32_t amiidb_api_slot_list(amiibo_slot_info_cb_t cb, void *ctx) {
135141
slots[index].amiibo_head = meta.amiibo_head;
136142
slots[index].amiibo_tail = meta.amiibo_tail;
137143
}
138-
if (meta.has_flags && meta.flags & VFS_OBJ_FLAG_READONLY) {
144+
if (meta.has_flags && (meta.flags & VFS_OBJ_FLAG_READONLY)) {
139145
slots[index].is_readonly = true;
140146
}
141147
}
@@ -154,6 +160,7 @@ int32_t amiidb_api_slot_set_readonly(uint8_t slot, bool readonly) {
154160
char path[VFS_MAX_PATH_LEN];
155161
vfs_meta_t meta;
156162
vfs_obj_t obj;
163+
uint8_t meta_buf[VFS_MAX_META_LEN];
157164

158165
sprintf(path, "/amiibo/data/%02d.bin", slot);
159166
vfs_driver_t *p_vfs_driver = vfs_get_driver(VFS_DRIVE_EXT);
@@ -172,8 +179,9 @@ int32_t amiidb_api_slot_set_readonly(uint8_t slot, bool readonly) {
172179
meta.flags &= ~VFS_OBJ_FLAG_READONLY;
173180
}
174181

175-
if (p_vfs_driver->update_file_meta(path, obj.meta, sizeof(obj.meta)) == VFS_OK) {
176-
return 0;
182+
vfs_meta_encode(meta_buf, sizeof(meta_buf), &meta);
183+
if (p_vfs_driver->update_file_meta(path, meta_buf, sizeof(meta_buf)) == VFS_OK) {
184+
return NRF_SUCCESS;
177185
} else {
178186
return -1;
179187
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ static void ntag_generate_timer_handler(void *p_context) {
182182
static void amiidb_scene_amiibo_view_on_event(amiibo_view_event_t event, amiibo_view_t *p_view) {
183183
app_amiidb_t *app = p_view->user_data;
184184
if (event == AMIIBO_VIEW_EVENT_MENU) {
185+
app->cur_slot_index = amiibo_view_get_focus(app->p_amiibo_view);
185186
mui_scene_dispatcher_next_scene(app->p_scene_dispatcher, AMIIDB_SCENE_AMIIBO_DETAIL_MENU);
186187
} else if (event == AMIIBO_VIEW_EVENT_UPDATE) {
187188
if (app->prev_scene_id == AMIIDB_SCENE_GAME_LIST) {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,11 @@ void amiidb_scene_amiibo_detail_menu_on_enter(void *user_data) {
159159
mui_list_view_add_item_ext(app->p_list_view, 0xe006, getLangString(_L_SHOW_QRCODE), txt,
160160
(void *)AMIIDB_DETAIL_MENU_SHOW_QRCODE);
161161

162-
mui_list_view_add_item_ext(app->p_list_view, 0xe007, getLangString(_L_READ_ONLY),
162+
if (app->prev_scene_id == AMIIDB_SCENE_DATA_LIST){
163+
mui_list_view_add_item_ext(app->p_list_view, 0xe007, getLangString(_L_READ_ONLY),
163164
app->ntag.read_only ? getLangString(_L_ON_F) : getLangString(_L_OFF_F),
164165
(void *)AMIIDB_DETAIL_MENU_READ_ONLY);
166+
}
165167

166168
mui_list_view_add_item(app->p_list_view, ICON_FAVORITE, getLangString(_L_APP_AMIIDB_DETAIL_FAVORITE),
167169
(void *)AMIIDB_DETAIL_MENU_FAVORITE);

fw/application/src/app/amiidb/view/amiibo_view.c

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#define ICON_LEFT 0xe1ac
99
#define ICON_RIGHT 0xe1aa
10+
#define ICON_INFO 0xe0ae
1011

1112
static void amiibo_view_on_draw(mui_view_t *p_view, mui_canvas_t *p_canvas) {
1213
char buff[64];
@@ -42,9 +43,17 @@ static void amiibo_view_on_draw(mui_view_t *p_view, mui_canvas_t *p_canvas) {
4243

4344
const db_amiibo_t *amd = get_amiibo_by_id(head, tail);
4445
if (amd != NULL) {
45-
const char *name =(getLanguage() == LANGUAGE_ZH_TW || getLanguage() == LANGUAGE_ZH_HANS) ? amd->name_cn : amd->name_en;
46-
mui_canvas_draw_utf8(p_canvas, 0, y += 13, name);
47-
46+
const char *name =
47+
(getLanguage() == LANGUAGE_ZH_TW || getLanguage() == LANGUAGE_ZH_HANS) ? amd->name_cn : amd->name_en;
48+
49+
if (ntag->read_only) {
50+
mui_canvas_set_font(p_canvas, u8g2_font_siji_t_6x10);
51+
mui_canvas_draw_glyph(p_canvas, 0, y += 12, ICON_INFO);
52+
mui_canvas_set_font(p_canvas, u8g2_font_wqy12_t_gb2312a);
53+
mui_canvas_draw_utf8(p_canvas, 12, y, name);
54+
} else {
55+
mui_canvas_draw_utf8(p_canvas, 0, y += 12, name);
56+
}
4857
mui_rect_t clip_win_prev;
4958
mui_rect_t clip_win_cur;
5059
mui_canvas_get_clip_window(p_canvas, &clip_win_prev);
@@ -67,17 +76,21 @@ static void amiibo_view_on_draw(mui_view_t *p_view, mui_canvas_t *p_canvas) {
6776
p_amiibo_view->desc_page_size = clip_win_cur.h;
6877
const db_link_t *link = get_link_by_id(p_amiibo_view->game_id, head, tail);
6978
if (strlen(ntag->notes) > 0) {
70-
p_amiibo_view->desc_total = mui_element_autowrap_text_box(p_canvas, clip_win_cur.x, clip_win_cur.y, clip_win_cur.w, clip_win_cur.h, p_amiibo_view->desc_offset, square_r, ntag->notes);
79+
p_amiibo_view->desc_total =
80+
mui_element_autowrap_text_box(p_canvas, clip_win_cur.x, clip_win_cur.y, clip_win_cur.w, clip_win_cur.h,
81+
p_amiibo_view->desc_offset, square_r, ntag->notes);
7182
} else if (link != NULL) {
7283
const char *notes;
73-
if (getLanguage() == LANGUAGE_ZH_HANS) {
84+
if (getLanguage() == LANGUAGE_ZH_HANS) {
7485
notes = link->note_cn;
75-
} else if(getLanguage() == LANGUAGE_IT_IT) {
86+
} else if (getLanguage() == LANGUAGE_IT_IT) {
7687
notes = link->note_it;
7788
} else {
7889
notes = link->note_en;
7990
}
80-
p_amiibo_view->desc_total = mui_element_autowrap_text_box(p_canvas, clip_win_cur.x, clip_win_cur.y, clip_win_cur.w, clip_win_cur.h, p_amiibo_view->desc_offset, square_r, notes);
91+
p_amiibo_view->desc_total =
92+
mui_element_autowrap_text_box(p_canvas, clip_win_cur.x, clip_win_cur.y, clip_win_cur.w, clip_win_cur.h,
93+
p_amiibo_view->desc_offset, square_r, notes);
8194
}
8295
mui_canvas_set_clip_window(p_canvas, &clip_win_prev);
8396
} else if (head > 0 && tail > 0) {
@@ -107,7 +120,11 @@ static void amiibo_view_on_input(mui_view_t *p_view, mui_input_event_t *event) {
107120
}
108121
break;
109122
case INPUT_KEY_RIGHT:
110-
if (p_amiibo_view->desc_total > 0 && p_amiibo_view->desc_offset < p_amiibo_view->desc_page_size * ((p_amiibo_view->desc_total + p_amiibo_view->desc_page_size - 1) / p_amiibo_view->desc_page_size - 1)) {
123+
if (p_amiibo_view->desc_total > 0 &&
124+
p_amiibo_view->desc_offset <
125+
p_amiibo_view->desc_page_size * ((p_amiibo_view->desc_total + p_amiibo_view->desc_page_size - 1) /
126+
p_amiibo_view->desc_page_size -
127+
1)) {
111128
p_amiibo_view->desc_offset += p_amiibo_view->desc_step;
112129
}
113130

0 commit comments

Comments
 (0)