mirror of
https://github.com/bettse/seader.git
synced 2026-08-29 07:38:30 +00:00
146 lines
5.6 KiB
C
146 lines
5.6 KiB
C
#include "../seader_i.h"
|
|
enum SubmenuIndex {
|
|
SubmenuIndexRead,
|
|
SubmenuIndexSaved,
|
|
SubmenuIndexAPDURunner,
|
|
SubmenuIndexReadConfigCard,
|
|
SubmenuIndexSamInfo,
|
|
};
|
|
|
|
static uint8_t fwChecks = 3;
|
|
|
|
void seader_scene_sam_present_submenu_callback(void* context, uint32_t index);
|
|
|
|
static void seader_scene_sam_present_rebuild_menu(Seader* seader, uint32_t selected_item) {
|
|
Submenu* submenu = seader_get_submenu(seader);
|
|
if(!submenu) {
|
|
return;
|
|
}
|
|
submenu_reset(submenu);
|
|
|
|
submenu_add_item(
|
|
submenu, "Read HF", SubmenuIndexRead, seader_scene_sam_present_submenu_callback, seader);
|
|
submenu_add_item(
|
|
submenu, "Saved", SubmenuIndexSaved, seader_scene_sam_present_submenu_callback, seader);
|
|
|
|
if(seader->is_debug_enabled) {
|
|
submenu_add_item(
|
|
submenu,
|
|
"Read Config Card",
|
|
SubmenuIndexReadConfigCard,
|
|
seader_scene_sam_present_submenu_callback,
|
|
seader);
|
|
}
|
|
|
|
if(apdu_log_check_presence(SEADER_APDU_RUNNER_FILE_NAME)) {
|
|
submenu_add_item(
|
|
submenu,
|
|
"Run APDUs",
|
|
SubmenuIndexAPDURunner,
|
|
seader_scene_sam_present_submenu_callback,
|
|
seader);
|
|
}
|
|
submenu_add_item(
|
|
submenu,
|
|
seader->sam_key_label,
|
|
SubmenuIndexSamInfo,
|
|
seader_scene_sam_present_submenu_callback,
|
|
seader);
|
|
|
|
if(seader->sam_version[0] != 0 && seader->sam_version[1] != 0) {
|
|
fwChecks = 0;
|
|
}
|
|
|
|
submenu_set_selected_item(submenu, selected_item);
|
|
view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewMenu);
|
|
}
|
|
|
|
void seader_scene_sam_present_submenu_callback(void* context, uint32_t index) {
|
|
Seader* seader = context;
|
|
view_dispatcher_send_custom_event(seader->view_dispatcher, index);
|
|
}
|
|
|
|
void seader_scene_sam_present_on_update(void* context) {
|
|
Seader* seader = context;
|
|
seader_scene_sam_present_rebuild_menu(
|
|
seader, scene_manager_get_scene_state(seader->scene_manager, SeaderSceneSamPresent));
|
|
}
|
|
|
|
void seader_scene_sam_present_on_enter(void* context) {
|
|
seader_scene_sam_present_on_update(context);
|
|
}
|
|
|
|
bool seader_scene_sam_present_on_event(void* context, SceneManagerEvent event) {
|
|
Seader* seader = context;
|
|
bool consumed = false;
|
|
|
|
if(event.type == SceneManagerEventTypeCustom) {
|
|
if(seader->sam_present_menu_guard_active &&
|
|
(event.event == SubmenuIndexRead || event.event == SubmenuIndexSaved ||
|
|
event.event == SubmenuIndexAPDURunner || event.event == SubmenuIndexReadConfigCard ||
|
|
event.event == SubmenuIndexSamInfo)) {
|
|
seader->sam_present_menu_guard_active = false;
|
|
consumed = true;
|
|
} else if(event.event == SubmenuIndexRead) {
|
|
scene_manager_set_scene_state(
|
|
seader->scene_manager, SeaderSceneSamPresent, event.event);
|
|
scene_manager_next_scene(seader->scene_manager, SeaderSceneRead);
|
|
consumed = true;
|
|
} else if(event.event == SubmenuIndexReadConfigCard) {
|
|
scene_manager_set_scene_state(
|
|
seader->scene_manager, SeaderSceneSamPresent, SubmenuIndexReadConfigCard);
|
|
scene_manager_next_scene(seader->scene_manager, SeaderSceneReadConfigCard);
|
|
consumed = true;
|
|
} else if(event.event == SubmenuIndexSamInfo) {
|
|
scene_manager_set_scene_state(
|
|
seader->scene_manager, SeaderSceneSamPresent, event.event);
|
|
scene_manager_next_scene(seader->scene_manager, SeaderSceneSamInfo);
|
|
consumed = true;
|
|
} else if(event.event == SubmenuIndexSaved) {
|
|
scene_manager_set_scene_state(
|
|
seader->scene_manager, SeaderSceneSamPresent, event.event);
|
|
scene_manager_next_scene(seader->scene_manager, SeaderSceneFileSelect);
|
|
consumed = true;
|
|
} else if(event.event == SeaderWorkerEventSamMissing) {
|
|
seader->board_status = seader_board_status_on_sam_missing(seader->board_status);
|
|
scene_manager_next_scene(seader->scene_manager, SeaderSceneSamMissing);
|
|
consumed = true;
|
|
} else if(event.event == SubmenuIndexAPDURunner) {
|
|
scene_manager_set_scene_state(
|
|
seader->scene_manager, SeaderSceneSamPresent, event.event);
|
|
scene_manager_next_scene(seader->scene_manager, SeaderSceneAPDURunner);
|
|
consumed = true;
|
|
} else if(event.event == SeaderWorkerEventHfTeardownComplete) {
|
|
consumed = seader_hf_finish_teardown_action(seader);
|
|
} else if(event.event == SeaderCustomEventSamStatusUpdated) {
|
|
Submenu* submenu = seader_get_submenu(seader);
|
|
if(submenu) {
|
|
seader_scene_sam_present_rebuild_menu(seader, submenu_get_selected_item(submenu));
|
|
}
|
|
consumed = true;
|
|
}
|
|
} else if(event.type == SceneManagerEventTypeBack) {
|
|
consumed = seader_hf_request_teardown(seader, SeaderHfTeardownActionStopApp);
|
|
} else if(event.type == SceneManagerEventTypeTick) {
|
|
if(seader->sam_present_menu_guard_active) {
|
|
seader->sam_present_menu_guard_active = false;
|
|
}
|
|
if(fwChecks > 0 && seader->sam_version[0] != 0 && seader->sam_version[1] != 0) {
|
|
fwChecks--;
|
|
Submenu* submenu = seader_get_submenu(seader);
|
|
if(submenu) {
|
|
seader_scene_sam_present_rebuild_menu(seader, submenu_get_selected_item(submenu));
|
|
}
|
|
}
|
|
}
|
|
|
|
return consumed;
|
|
}
|
|
|
|
void seader_scene_sam_present_on_exit(void* context) {
|
|
Seader* seader = context;
|
|
if(seader->submenu) {
|
|
submenu_reset(seader->submenu);
|
|
}
|
|
}
|