Skip to content

Commit 936ef88

Browse files
committed
support default card for card emulator app solosky#156
1 parent f98a3b0 commit 936ef88

23 files changed

+96
-16
lines changed

fw/application/src/app/chameleon/app_chameleon.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "chameleon_scene.h"
77
#include "fds_utils.h"
88
#include "i18n/language.h"
9+
#include "settings.h"
10+
#include "tag_helper.h"
911

1012
static void app_chameleon_on_run(mini_app_inst_t *p_app_inst);
1113
static void app_chameleon_on_kill(mini_app_inst_t *p_app_inst);
@@ -76,7 +78,13 @@ void app_chameleon_on_kill(mini_app_inst_t *p_app_inst) {
7678

7779
p_retain->cycle_mode_index = chameleon_view_get_index(p_app_handle->p_chameleon_view);
7880

81+
settings_data_t *settings = settings_get_data();
82+
if (tag_helper_valid_default_slot()) {
83+
tag_emulation_change_slot(settings->chameleon_default_slot_index, false);
84+
}
85+
7986
tag_emulation_save();
87+
settings_save();
8088

8189
mui_scene_dispatcher_exit(p_app_handle->p_scene_dispatcher);
8290
mui_scene_dispatcher_free(p_app_handle->p_scene_dispatcher);

fw/application/src/app/chameleon/port/tag_helper.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
#include "fds_utils.h"
44
#include "i18n/language.h"
55
#include "nrf_log.h"
6+
#include "settings.h"
67
#include "utils2.h"
78
#include <string.h>
9+
810
#define NFC_TAG_NTAG_DATA_SIZE 4
911

1012
const static tag_specific_type_name_t tag_type_names[] = {
@@ -190,4 +192,15 @@ void tag_helper_generate_uid() {
190192
memcpy(m_tag_information->res_coll.uid, uuid, sizeof(uuid));
191193
}
192194
}
195+
}
196+
197+
bool tag_helper_is_defult_slot() {
198+
settings_data_t *settings = settings_get_data();
199+
return settings->chameleon_default_slot_index == tag_emulation_get_slot();
200+
}
201+
202+
bool tag_helper_valid_default_slot(){
203+
settings_data_t *settings = settings_get_data();
204+
return settings->chameleon_default_slot_index != INVALID_SLOT_INDEX
205+
&& tag_emulation_slot_is_enabled(settings->chameleon_default_slot_index, TAG_SENSE_HF);
193206
}

fw/application/src/app/chameleon/port/tag_helper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,8 @@ uint8_t *tag_helper_get_active_tag_memory_data();
3838

3939
void tag_helper_generate_uid();
4040

41+
bool tag_helper_is_defult_slot();
42+
43+
bool tag_helper_valid_default_slot();
44+
4145
#endif

fw/application/src/app/chameleon/scene/chameleon_scene_menu.c

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@
1414

1515
#include "tag_helper.h"
1616

17+
#include "settings.h"
18+
1719
typedef enum {
1820
CHAMELEON_MENU_HOME,
1921
CHAMELEON_MENU_BACK,
2022
CHAMELEON_MENU_SLOT,
2123
CHAMELEON_MENU_CARD_NAME,
2224
CHAMELEON_MENU_SLOT_SELECT,
25+
CHAMELEON_MENU_DEFAULT_CARD,
2326
CHAMELEON_MENU_CARD_DATA,
2427
CHAMELEON_MENU_CARD_TYPE,
2528
CHAMELEON_MENU_CARD_ADVANCED,
@@ -41,6 +44,18 @@ void chameleon_scene_menu_on_event(mui_list_view_event_t event, mui_list_view_t
4144
mui_scene_dispatcher_next_scene(app->p_scene_dispatcher, CHAMELEON_SCENE_MENU_CARD_SLOT);
4245
break;
4346

47+
case CHAMELEON_MENU_DEFAULT_CARD: {
48+
settings_data_t *settings = settings_get_data();
49+
uint8_t slot = tag_emulation_get_slot();
50+
if (settings->chameleon_default_slot_index == slot) {
51+
settings->chameleon_default_slot_index = INVALID_SLOT_INDEX;
52+
} else {
53+
settings->chameleon_default_slot_index = slot;
54+
}
55+
56+
mui_list_view_item_set_sub_text(p_item, slot == settings->chameleon_default_slot_index ? _T(ON_F) : _T(OFF_F));
57+
} break;
58+
4459
case CHAMELEON_MENU_SLOT_SELECT:
4560
mui_scene_dispatcher_next_scene(app->p_scene_dispatcher, CHAMELEON_SCENE_MENU_CARD_SLOT_SELECT);
4661
break;
@@ -65,32 +80,40 @@ void chameleon_scene_menu_on_event(mui_list_view_event_t event, mui_list_view_t
6580

6681
void chameleon_scene_menu_on_enter(void *user_data) {
6782
app_chameleon_t *app = user_data;
68-
6983
char buff[64];
7084
uint8_t slot = tag_emulation_get_slot();
7185
tag_specific_type_t tag_type = tag_helper_get_active_tag_type();
7286
const tag_specific_type_name_t *tag_name = tag_helper_get_tag_type_name(tag_type);
7387
const nfc_tag_14a_coll_res_reference_t *coll_res = tag_helper_get_active_coll_res_ref();
7488

7589
sprintf(buff, "[%02d]", slot + 1);
76-
mui_list_view_add_item_ext(app->p_list_view, ICON_VIEW, _T(APP_CHAMELEON_CARD_SLOT), buff, (void *)CHAMELEON_MENU_SLOT_SELECT);
90+
mui_list_view_add_item_ext(app->p_list_view, ICON_VIEW, _T(APP_CHAMELEON_CARD_SLOT), buff,
91+
(void *)CHAMELEON_MENU_SLOT_SELECT);
7792
strcpy(buff, "[");
7893
tag_helper_get_nickname(buff + 1, sizeof(buff) - 3);
7994
strcat(buff, "]");
80-
mui_list_view_add_item_ext(app->p_list_view, ICON_KEY, _T(APP_CHAMELEON_CARD_NICK), buff, (void *)CHAMELEON_MENU_CARD_NAME);
95+
mui_list_view_add_item_ext(app->p_list_view, ICON_KEY, _T(APP_CHAMELEON_CARD_NICK), buff,
96+
(void *)CHAMELEON_MENU_CARD_NAME);
8197

8298
strcpy(buff, "[");
8399
tag_helper_format_uid(buff + 1, coll_res->uid, *(coll_res->size));
84100
strcat(buff, "]");
85101
mui_list_view_add_item_ext(app->p_list_view, ICON_DATA, _T(APP_CHAMELEON_CARD_ID), buff, (void *)-1);
86102

87103
sprintf(buff, "[%s]", tag_name->long_name);
88-
mui_list_view_add_item_ext(app->p_list_view, ICON_FAVORITE, _T(APP_CHAMELEON_CARD_TYPE), buff, (void *)CHAMELEON_MENU_CARD_TYPE);
104+
mui_list_view_add_item_ext(app->p_list_view, ICON_FAVORITE, _T(APP_CHAMELEON_CARD_TYPE), buff,
105+
(void *)CHAMELEON_MENU_CARD_TYPE);
106+
107+
settings_data_t *settings = settings_get_data();
108+
mui_list_view_add_item_ext(app->p_list_view, ICON_SLOT, _T(APP_CHAMELEON_CARD_DEFAULT_CARD),
109+
settings->chameleon_default_slot_index == slot ? _T(ON_F) : _T(OFF_F),
110+
(void *)CHAMELEON_MENU_DEFAULT_CARD);
89111

90112
mui_list_view_add_item(app->p_list_view, ICON_FILE, _T(APP_CHAMELEON_CARD_DATA), (void *)CHAMELEON_MENU_CARD_DATA);
91-
mui_list_view_add_item(app->p_list_view, ICON_PAGE, _T(APP_CHAMELEON_CARD_ADVANCED), (void *)CHAMELEON_MENU_CARD_ADVANCED);
92-
mui_list_view_add_item(app->p_list_view, ICON_SLOT, _T(APP_CHAMELEON_CARD_SLOT_SETTINGS), (void *)CHAMELEON_MENU_SLOT);
93-
// mui_list_view_add_item(app->p_list_view, ICON_SETTINGS, "全局设置..", (void *)-1);
113+
mui_list_view_add_item(app->p_list_view, ICON_PAGE, _T(APP_CHAMELEON_CARD_ADVANCED),
114+
(void *)CHAMELEON_MENU_CARD_ADVANCED);
115+
mui_list_view_add_item(app->p_list_view, ICON_SLOT, _T(APP_CHAMELEON_CARD_SLOT_SETTINGS),
116+
(void *)CHAMELEON_MENU_SLOT);
94117

95118
mui_list_view_add_item(app->p_list_view, ICON_BACK, _T(TAG_DETAILS), (void *)CHAMELEON_MENU_BACK);
96119
mui_list_view_add_item(app->p_list_view, ICON_HOME, _T(MAIN_MENU), (void *)CHAMELEON_MENU_HOME);

fw/application/src/app/chameleon/view/chameleon_view.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ static void chameleon_view_on_draw(mui_view_t *p_view, mui_canvas_t *p_canvas) {
8080
icon_glyph);
8181
}
8282

83+
if(tag_helper_is_defult_slot()){
84+
mui_canvas_set_font(p_canvas, MUI_FONT_ICON);
85+
mui_canvas_draw_glyph(p_canvas, mui_canvas_get_width(p_canvas) - 20, mui_canvas_get_height(p_canvas),
86+
ICON_FAVORITE);
87+
}
88+
8389
mui_canvas_set_font(p_canvas, MUI_FONT_NORMAL);
8490
}
8591

fw/application/src/core/mini_app_launcher.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "nrf_log.h"
55
#include "nrf_log_ctrl.h"
66
#include "settings.h"
7+
#include "nrf_power.h"
8+
#include "tag_helper.h"
79

810
mini_app_launcher_t *mini_app_launcher() {
911
static mini_app_launcher_t launcher;
@@ -71,7 +73,7 @@ void mini_app_launcher_exit(mini_app_launcher_t* p_launcher){
7173
mini_app_launcher_kill(p_launcher, p_launcher->p_main_app_inst->p_app->id);
7274
}
7375

74-
void mini_app_launcher_init(mini_app_launcher_t *p_launcher) {
76+
void mini_app_launcher_init(mini_app_launcher_t *p_launcher, uint32_t wakeup_reason) {
7577

7678
mui_app_inst_dict_init(p_launcher->app_inst_dict);
7779
p_launcher->p_main_app_inst = NULL;
@@ -80,7 +82,12 @@ void mini_app_launcher_init(mini_app_launcher_t *p_launcher) {
8082

8183
cache_data_t *p_cache = cache_get_data();
8284
settings_data_t *p_settings = settings_get_data();
83-
if (p_cache->enabled == 1 && p_settings->hibernate_enabled == 1) {
85+
86+
NRF_LOG_INFO("wakeup reason: %d", wakeup_reason);
87+
88+
if( (wakeup_reason & NRF_POWER_RESETREAS_NFC_MASK) && tag_helper_valid_default_slot()){
89+
mini_app_launcher_run_with_retain_data(p_launcher, MINI_APP_ID_CHAMELEON, NULL);
90+
}else if (p_cache->enabled == 1 && p_settings->hibernate_enabled == 1) {
8491
mini_app_launcher_run_with_retain_data(p_launcher, p_cache->id, p_cache->retain_data);
8592
} else {
8693
mini_app_launcher_run_with_retain_data(p_launcher, MINI_APP_ID_DESKTOP, NULL);

fw/application/src/core/mini_app_launcher.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ mini_app_launcher_t* mini_app_launcher();
1919
void mini_app_launcher_run(mini_app_launcher_t* p_launcher, uint32_t id);
2020
void mini_app_launcher_kill(mini_app_launcher_t* p_launcher, uint32_t id);
2121
void mini_app_launcher_exit(mini_app_launcher_t* p_launcher);
22-
void mini_app_launcher_init(mini_app_launcher_t* p_launcher);
22+
void mini_app_launcher_init(mini_app_launcher_t* p_launcher, uint32_t wakeup_reason);
2323
void mini_app_launcher_sleep(mini_app_launcher_t* p_launcher);
2424
void mini_app_launcher_post_event(mini_app_launcher_t* p_launcher, uint32_t id, mini_app_event_t* p_event);
2525
void* mini_app_launcher_get_app_handle(mini_app_launcher_t* p_launcher, uint32_t id);

fw/application/src/i18n/de_DE.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,5 @@ const char * const lang_de_DE[_L_COUNT] = {
173173
[_L_APP_CHAMELEON_CARD_WRITE_MODE] = "Schreibmodus",
174174
[_L_APP_CHAMELEON_CARD_ADV_ID_EDIT_INVALID_INPUT] = "Ungültige Eingabe!",
175175
[_L_APP_CHAMELEON_CARD_TYPE_FACTORY_DATA_CONFRIM] = "Kartentyp geändert. \nKartendaten zurücksetzen?",
176+
[_L_APP_CHAMELEON_CARD_DEFAULT_CARD] = "",
176177
};

fw/application/src/i18n/en_US.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,5 @@ const char * const lang_en_US[_L_COUNT] = {
173173
[_L_APP_CHAMELEON_CARD_WRITE_MODE] = "Write Mode",
174174
[_L_APP_CHAMELEON_CARD_ADV_ID_EDIT_INVALID_INPUT] = "Invalid Input!",
175175
[_L_APP_CHAMELEON_CARD_TYPE_FACTORY_DATA_CONFRIM] = "Card type changed. \nFactory card data?",
176+
[_L_APP_CHAMELEON_CARD_DEFAULT_CARD] = "Default Card",
176177
};

fw/application/src/i18n/es_ES.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,5 @@ const char * const lang_es_ES[_L_COUNT] = {
173173
[_L_APP_CHAMELEON_CARD_WRITE_MODE] = "Modo escrit.",
174174
[_L_APP_CHAMELEON_CARD_ADV_ID_EDIT_INVALID_INPUT] = "¡Entrada inválida!",
175175
[_L_APP_CHAMELEON_CARD_TYPE_FACTORY_DATA_CONFRIM] = "Tipo tarjeta modificado\n¿Inicializar tarjeta?",
176+
[_L_APP_CHAMELEON_CARD_DEFAULT_CARD] = "",
176177
};

0 commit comments

Comments
 (0)