#pragma once #include #include #include #include #include #include #include #include #include #include #include #include extern const GpioPin* const pinD0; extern const GpioPin* const pinD1; extern volatile int bit_count; #define MAX_BITS 42 extern volatile bool data[]; extern volatile uint32_t data_fall[]; extern volatile uint32_t data_rise[]; extern bool data_saved; #define WIEGAND_KEY_NAME_SIZE 25 #define WIEGAND_APPS_DATA_FOLDER EXT_PATH("apps_data") #define WIEGAND_SAVE_FOLDER \ WIEGAND_APPS_DATA_FOLDER "/" \ "wiegand" #define WIEGAND_SAVE_EXTENSION ".wgn" #define TAG "WIEGAND_APP" typedef enum { WiegandMainMenuScene, WiegandInstructionsScene, WiegandReadScene, WiegandDataScene, WiegandSaveScene, WiegandLoadScene, WiegandSceneCount, } WiegandScene; typedef enum { WiegandSubmenuView, WiegandWidgetView, WiegandTextInputView, } WiegandView; typedef struct App { SceneManager* scene_manager; ViewDispatcher* view_dispatcher; Submenu* submenu; Widget* widget; TextInput* text_input; DialogsApp* dialogs; FuriString* file_path; char file_name[WIEGAND_KEY_NAME_SIZE]; FuriTimer* timer; } App; typedef enum { WiegandMainMenuInstructions, WiegandMainMenuRead, WiegandMainMenuLoad, } WiegandMainMenuSceneIndex; typedef enum { WiegandMainMenuUnknownEvent, WiegandMainMenuInstructionsEvent, WiegandMainMenuReadEvent, WiegandMainMenuLoadEvent, } WiegandMainMenuEvent; typedef enum { WiegandDataSceneSaveButtonEvent, WiegandDataScenePlayButtonEvent, WiegandDataSceneSaveFileEvent, } WiegandDataEvent; void wiegand_menu_callback(void* context, uint32_t index); void wiegand_main_menu_scene_on_enter(void* context); bool wiegand_main_menu_scene_on_event(void* context, SceneManagerEvent event); // void wiegand_main_menu_scene_on_exit(void* context); void wiegand_instructions_scene_on_enter(void* context); // bool wiegand_instructions_scene_on_event(void* context, SceneManagerEvent event); // void wiegand_instructions_scene_on_exit(void* context); void wiegand_isr_d0(void* context); void wiegand_isr_d1(void* context); void wiegand_start_read(void* context); void wiegand_stop_read(void* context); void wiegand_timer_callback(void* context); void wiegand_read_scene_on_enter(void* context); // bool wiegand_read_scene_on_event(void* context, SceneManagerEvent event); void wiegand_read_scene_on_exit(void* context); void wiegand_add_info_4bit_8bit(FuriString* buffer); void wiegand_add_info_26bit(FuriString* buffer); void wiegand_add_info_24bit(FuriString* buffer); void wiegand_add_info(FuriString* buffer); void single_vibro(); void wiegand_play(); void wiegand_button_callback(GuiButtonType result, InputType type, void* context); void wiegand_data_scene_on_enter(void* context); bool wiegand_data_scene_on_event(void* context, SceneManagerEvent event); // void wiegand_data_scene_on_exit(void* context); void wiegand_data_scene_save_name_text_input_callback(void* context); void ensure_dir_exists(Storage* storage); void wiegand_save(void* context); void wiegand_save_scene_on_enter(void* context); bool wiegand_save_scene_on_event(void* context, SceneManagerEvent event); // void wiegand_save_scene_on_exit(void* context); void wiegand_load_scene_on_enter(void* context); // bool wiegand_load_scene_on_event(void* context, SceneManagerEvent event); // void wiegand_load_scene_on_exit(void* context); bool wiegand_custom_callback(void* context, uint32_t custom_event); bool wiegand_back_event_callback(void* context); // Methods with no implementation. bool wiegand_empty_scene_on_event(void* context, SceneManagerEvent event); void wiegand_empty_scene_on_exit(void* _ctx); App* app_alloc(); void app_free(void* context);