#include "../mfc_editor_app_i.h" enum SubmenuIndex { // Reserve first indices for opening normal block SubmenuIndexReserved = MF_CLASSIC_TOTAL_BLOCKS_MAX, // Special options - Sector 0 only SubmenuIndexUID, SubmenuIndexManufacturerBytes, // Special options - All sectors SubmenuIndexKeyA, SubmenuIndexKeyB, SubmenuIndexAccessBits, SubmenuIndexUserByte, }; void mfc_editor_scene_block_select_submenu_callback(void* context, uint32_t index) { MfcEditorApp* instance = context; view_dispatcher_send_custom_event(instance->view_dispatcher, index); } void mfc_editor_scene_block_select_on_enter(void* context) { MfcEditorApp* instance = context; Submenu* submenu = instance->submenu; char header[sizeof("Sector ") + 2]; snprintf(header, sizeof(header), "Sector %hhu", instance->current_sector); submenu_set_header(submenu, header); uint8_t first_block = mf_classic_get_first_block_num_of_sector(instance->current_sector); uint8_t block_num = mf_classic_get_blocks_num_in_sector(instance->current_sector); for(uint8_t i = 0; i < block_num; i++) { uint8_t block_index = first_block + i; char label[sizeof("Block ") + 3]; snprintf(label, sizeof(label), "Block %hhu", block_index); submenu_add_item( submenu, label, block_index, mfc_editor_scene_block_select_submenu_callback, instance); } if(instance->current_sector == 0) { submenu_add_item( submenu, "UID", SubmenuIndexUID, mfc_editor_scene_block_select_submenu_callback, instance); submenu_add_item( submenu, "Manufacturer Bytes", SubmenuIndexManufacturerBytes, mfc_editor_scene_block_select_submenu_callback, instance); } submenu_add_item( submenu, "Key A", SubmenuIndexKeyA, mfc_editor_scene_block_select_submenu_callback, instance); submenu_add_item( submenu, "Key B", SubmenuIndexKeyB, mfc_editor_scene_block_select_submenu_callback, instance); submenu_add_item( submenu, "Access Bits", SubmenuIndexAccessBits, mfc_editor_scene_block_select_submenu_callback, instance); submenu_add_item( submenu, "User Byte", SubmenuIndexUserByte, mfc_editor_scene_block_select_submenu_callback, instance); submenu_set_selected_item( submenu, scene_manager_get_scene_state(instance->scene_manager, MfcEditorSceneBlockSelect)); view_dispatcher_switch_to_view(instance->view_dispatcher, MfcEditorAppViewSubmenu); } bool mfc_editor_scene_block_select_on_event(void* context, SceneManagerEvent event) { MfcEditorApp* instance = context; bool consumed = false; UNUSED(instance); if(event.type == SceneManagerEventTypeCustom) { scene_manager_set_scene_state( instance->scene_manager, MfcEditorSceneBlockSelect, event.event); FURI_LOG_I(TAG, "Block select event %lu", event.event); consumed = true; } return consumed; } void mfc_editor_scene_block_select_on_exit(void* context) { MfcEditorApp* instance = context; submenu_reset(instance->submenu); }