diff --git a/applications/main/lfrfid/lfrfid_i.h b/applications/main/lfrfid/lfrfid_i.h index cff2c6cc4..b574a4e49 100644 --- a/applications/main/lfrfid/lfrfid_i.h +++ b/applications/main/lfrfid/lfrfid_i.h @@ -66,6 +66,7 @@ enum LfRfidCustomEvent { LfRfidEventWriteTooLongToWrite, LfRfidEventRpcLoadFile, LfRfidEventRpcSessionClose, + LfRfidEventEmulationTimeExpired, }; typedef enum { diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c b/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c index dc3918994..59fbb54d6 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c @@ -1,5 +1,14 @@ #include "../lfrfid_i.h" +#define LFRFID_EMULATION_TIME_MAX_MS (5 * 60 * 1000) + +FuriTimer* timer; + +void lfrfid_scene_emulate_popup_callback(void* context) { + LfRfid* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, LfRfidEventEmulationTimeExpired); +} + void lfrfid_scene_emulate_on_enter(void* context) { LfRfid* app = context; Popup* popup = app->popup; @@ -22,18 +31,36 @@ void lfrfid_scene_emulate_on_enter(void* context) { lfrfid_worker_emulate_start(app->lfworker, (LFRFIDProtocol)app->protocol_id); notification_message(app->notifications, &sequence_blink_start_magenta); + timer = furi_timer_alloc(lfrfid_scene_emulate_popup_callback, FuriTimerTypeOnce, app); + furi_timer_start(timer, LFRFID_EMULATION_TIME_MAX_MS); + view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); } bool lfrfid_scene_emulate_on_event(void* context, SceneManagerEvent event) { - UNUSED(context); - UNUSED(event); + LfRfid* app = context; bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == LfRfidEventEmulationTimeExpired) { + if(!scene_manager_previous_scene(app->scene_manager)) { + scene_manager_stop(app->scene_manager); + view_dispatcher_stop(app->view_dispatcher); + } else { + scene_manager_previous_scene(app->scene_manager); + } + consumed = true; + } + } + return consumed; } void lfrfid_scene_emulate_on_exit(void* context) { LfRfid* app = context; + + furi_timer_free(timer); + notification_message(app->notifications, &sequence_blink_stop); popup_reset(app->popup); lfrfid_worker_stop(app->lfworker); diff --git a/applications/main/nfc/helpers/nfc_custom_event.h b/applications/main/nfc/helpers/nfc_custom_event.h index 16fbc4749..86fcdd3d3 100644 --- a/applications/main/nfc/helpers/nfc_custom_event.h +++ b/applications/main/nfc/helpers/nfc_custom_event.h @@ -30,4 +30,6 @@ typedef enum { NfcCustomEventPollerFailure, NfcCustomEventListenerUpdate, + + NfcCustomEventEmulationTimeExpired, } NfcCustomEvent; diff --git a/applications/main/nfc/scenes/nfc_scene_emulate.c b/applications/main/nfc/scenes/nfc_scene_emulate.c index 6f217f315..60be11a62 100644 --- a/applications/main/nfc/scenes/nfc_scene_emulate.c +++ b/applications/main/nfc/scenes/nfc_scene_emulate.c @@ -1,13 +1,45 @@ #include "../helpers/protocol_support/nfc_protocol_support.h" +#include "nfc_app_i.h" + +#define NFC_EMULATION_TIME_MAX_MS (5 * 60 * 1000) + +FuriTimer* timer; + +void nfc_scene_emulate_timer_callback(void* context) { + NfcApp* instance = context; + + view_dispatcher_send_custom_event( + instance->view_dispatcher, NfcCustomEventEmulationTimeExpired); +} + void nfc_scene_emulate_on_enter(void* context) { + NfcApp* instance = context; + nfc_protocol_support_on_enter(NfcProtocolSupportSceneEmulate, context); + + timer = furi_timer_alloc(nfc_scene_emulate_timer_callback, FuriTimerTypeOnce, instance); + furi_timer_start(timer, NFC_EMULATION_TIME_MAX_MS); } bool nfc_scene_emulate_on_event(void* context, SceneManagerEvent event) { + NfcApp* instance = context; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == NfcCustomEventEmulationTimeExpired) { + if(!scene_manager_previous_scene(instance->scene_manager)) { + scene_manager_stop(instance->scene_manager); + view_dispatcher_stop(instance->view_dispatcher); + } else { + scene_manager_previous_scene(instance->scene_manager); + } + return true; + } + } return nfc_protocol_support_on_event(NfcProtocolSupportSceneEmulate, context, event); } void nfc_scene_emulate_on_exit(void* context) { + furi_timer_free(timer); nfc_protocol_support_on_exit(NfcProtocolSupportSceneEmulate, context); }