diff --git a/applications/system/hid_app/hid.c b/applications/system/hid_app/hid.c index a4502c016..55c27bf3c 100644 --- a/applications/system/hid_app/hid.c +++ b/applications/system/hid_app/hid.c @@ -8,23 +8,6 @@ #define TAG "HidApp" -enum HidDebugSubmenuIndex { - HidSubmenuIndexKeynote, - HidSubmenuIndexKeynoteVertical, - HidSubmenuIndexKeyboard, - HidSubmenuIndexNumpad, - HidSubmenuIndexMedia, - HidSubmenuIndexMusicMacOs, - HidSubmenuIndexMovie, - HidSubmenuIndexTikTok, - HidSubmenuIndexMouse, - HidSubmenuIndexMouseClicker, - HidSubmenuIndexMouseJiggler, - HidSubmenuIndexMouseJigglerStealth, - HidSubmenuIndexPushToTalk, - HidSubmenuIndexRemovePairing, -}; - bool hid_custom_event_callback(void* context, uint32_t event) { furi_assert(context); Hid* app = context; @@ -34,9 +17,7 @@ bool hid_custom_event_callback(void* context, uint32_t event) { bool hid_back_event_callback(void* context) { furi_assert(context); Hid* app = context; - FURI_LOG_D("HID", "Back event"); - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewSubmenu); - return true; + return scene_manager_handle_back_event(app->scene_manager); } void bt_hid_remove_pairing(Hid* app) { @@ -53,53 +34,12 @@ void bt_hid_remove_pairing(Hid* app) { furi_hal_bt_start_advertising(); } -static void hid_submenu_callback(void* context, uint32_t index) { - furi_assert(context); - Hid* app = context; - if(index == HidSubmenuIndexKeynote) { - hid_keynote_set_orientation(app->hid_keynote, false); - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewKeynote); - } else if(index == HidSubmenuIndexKeynoteVertical) { - hid_keynote_set_orientation(app->hid_keynote, true); - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewKeynote); - } else if(index == HidSubmenuIndexKeyboard) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewKeyboard); - } else if(index == HidSubmenuIndexNumpad) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewNumpad); - } else if(index == HidSubmenuIndexMedia) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMedia); - } else if(index == HidSubmenuIndexMusicMacOs) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMusicMacOs); - } else if(index == HidSubmenuIndexMovie) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMovie); - } else if(index == HidSubmenuIndexMouse) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMouse); - } else if(index == HidSubmenuIndexTikTok) { - view_dispatcher_switch_to_view(app->view_dispatcher, BtHidViewTikTok); - } else if(index == HidSubmenuIndexMouseClicker) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMouseClicker); - } else if(index == HidSubmenuIndexMouseJiggler) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMouseJiggler); - } else if(index == HidSubmenuIndexMouseJigglerStealth) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMouseJigglerStealth); - } else if(index == HidSubmenuIndexPushToTalk) { - view_dispatcher_switch_to_view(app->view_dispatcher, HidViewPushToTalkMenu); - } else if(index == HidSubmenuIndexRemovePairing) { - scene_manager_next_scene(app->scene_manager, HidSceneUnpair); - } -} - static void bt_hid_connection_status_changed_callback(BtStatus status, void* context) { furi_assert(context); Hid* hid = context; - bool connected = (status == BtStatusConnected); -#ifdef HID_TRANSPORT_BLE - if(connected) { - notification_internal_message(hid->notifications, &sequence_set_blue_255); - } else { - notification_internal_message(hid->notifications, &sequence_reset_blue); - } -#endif + const bool connected = (status == BtStatusConnected); + notification_internal_message( + hid->notifications, connected ? &sequence_set_blue_255 : &sequence_reset_blue); hid_keynote_set_connected_status(hid->hid_keynote, connected); hid_keyboard_set_connected_status(hid->hid_keyboard, connected); hid_numpad_set_connected_status(hid->hid_numpad, connected); @@ -114,11 +54,6 @@ static void bt_hid_connection_status_changed_callback(BtStatus status, void* con hid_tiktok_set_connected_status(hid->hid_tiktok, connected); } -static uint32_t hid_exit(void* context) { - UNUSED(context); - return VIEW_NONE; -} - static uint32_t hid_ptt_menu_view(void* context) { UNUSED(context); return HidViewPushToTalkMenu; @@ -139,55 +74,18 @@ Hid* hid_alloc(void) { // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_enable_queue(app->view_dispatcher); - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - view_dispatcher_set_navigation_event_callback(app->view_dispatcher, hid_back_event_callback); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); + view_dispatcher_set_custom_event_callback(app->view_dispatcher, hid_custom_event_callback); + view_dispatcher_set_navigation_event_callback(app->view_dispatcher, hid_back_event_callback); + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Scene Manager app->scene_manager = scene_manager_alloc(&hid_scene_handlers, app); // Device Type Submenu view app->submenu = submenu_alloc(); - submenu_add_item(app->submenu, "Keynote", HidSubmenuIndexKeynote, hid_submenu_callback, app); - submenu_add_item( - app->submenu, - "Keynote Vertical", - HidSubmenuIndexKeynoteVertical, - hid_submenu_callback, - app); - submenu_add_item(app->submenu, "Keyboard", HidSubmenuIndexKeyboard, hid_submenu_callback, app); - submenu_add_item(app->submenu, "Numpad", HidSubmenuIndexNumpad, hid_submenu_callback, app); - submenu_add_item(app->submenu, "Media", HidSubmenuIndexMedia, hid_submenu_callback, app); - submenu_add_item( - app->submenu, "Apple Music macOS", HidSubmenuIndexMusicMacOs, hid_submenu_callback, app); - submenu_add_item(app->submenu, "Movie", HidSubmenuIndexMovie, hid_submenu_callback, app); - submenu_add_item(app->submenu, "Mouse", HidSubmenuIndexMouse, hid_submenu_callback, app); - submenu_add_item( - app->submenu, "TikTok / YT Shorts", HidSubmenuIndexTikTok, hid_submenu_callback, app); - submenu_add_item( - app->submenu, "Mouse Clicker", HidSubmenuIndexMouseClicker, hid_submenu_callback, app); - submenu_add_item( - app->submenu, "Mouse Jiggler", HidSubmenuIndexMouseJiggler, hid_submenu_callback, app); - submenu_add_item( - app->submenu, - "Mouse Jiggler Stealth", - HidSubmenuIndexMouseJigglerStealth, - hid_submenu_callback, - app); - submenu_add_item( - app->submenu, "PushToTalk", HidSubmenuIndexPushToTalk, hid_submenu_callback, app); -#ifdef HID_TRANSPORT_BLE - submenu_add_item( - app->submenu, "Remove Pairing", HidSubmenuIndexRemovePairing, hid_submenu_callback, app); -#endif - view_set_previous_callback(submenu_get_view(app->submenu), hid_exit); - view_dispatcher_add_view(app->view_dispatcher, HidViewSubmenu, submenu_get_view(app->submenu)); - return app; -} -Hid* hid_app_alloc_view(void* context) { - furi_assert(context); - Hid* app = context; + view_dispatcher_add_view(app->view_dispatcher, HidViewSubmenu, submenu_get_view(app->submenu)); // Dialog view app->dialog = dialog_ex_alloc(); @@ -327,18 +225,16 @@ void hid_free(Hid* app) { int32_t hid_usb_app(void* p) { UNUSED(p); Hid* app = hid_alloc(); - app = hid_app_alloc_view(app); + FURI_LOG_D("HID", "Starting as USB app"); FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); furi_hal_usb_unlock(); furi_check(furi_hal_usb_set_config(&usb_hid, NULL) == true); - bt_hid_connection_status_changed_callback(BtStatusConnected, app); - dolphin_deed(DolphinDeedPluginStart); - scene_manager_next_scene(app->scene_manager, HidSceneMain); + scene_manager_next_scene(app->scene_manager, HidSceneStart); view_dispatcher_run(app->view_dispatcher); @@ -352,7 +248,6 @@ int32_t hid_usb_app(void* p) { int32_t hid_ble_app(void* p) { UNUSED(p); Hid* app = hid_alloc(); - app = hid_app_alloc_view(app); FURI_LOG_D("HID", "Starting as BLE app"); @@ -382,7 +277,7 @@ int32_t hid_ble_app(void* p) { dolphin_deed(DolphinDeedPluginStart); - scene_manager_next_scene(app->scene_manager, HidSceneMain); + scene_manager_next_scene(app->scene_manager, HidSceneStart); view_dispatcher_run(app->view_dispatcher); diff --git a/applications/system/hid_app/scenes/hid_scene_config.h b/applications/system/hid_app/scenes/hid_scene_config.h index 1228ead4f..d18b15558 100644 --- a/applications/system/hid_app/scenes/hid_scene_config.h +++ b/applications/system/hid_app/scenes/hid_scene_config.h @@ -1,2 +1,3 @@ +ADD_SCENE(hid, start, Start) ADD_SCENE(hid, main, Main) -ADD_SCENE(hid, unpair, Unpair) \ No newline at end of file +ADD_SCENE(hid, unpair, Unpair) diff --git a/applications/system/hid_app/scenes/hid_scene_start.c b/applications/system/hid_app/scenes/hid_scene_start.c new file mode 100644 index 000000000..61d340eec --- /dev/null +++ b/applications/system/hid_app/scenes/hid_scene_start.c @@ -0,0 +1,167 @@ +#include "../hid.h" +#include "../views.h" + +enum HidSubmenuIndex { + HidSubmenuIndexKeynote, + HidSubmenuIndexKeynoteVertical, + HidSubmenuIndexKeyboard, + HidSubmenuIndexNumpad, + HidSubmenuIndexMedia, + HidSubmenuIndexMusicMacOs, + HidSubmenuIndexMovie, + HidSubmenuIndexTikTok, + HidSubmenuIndexMouse, + HidSubmenuIndexMouseClicker, + HidSubmenuIndexMouseJiggler, + HidSubmenuIndexMouseJigglerStealth, + HidSubmenuIndexPushToTalk, + HidSubmenuIndexRemovePairing, +}; + +static void hid_scene_start_submenu_callback(void* context, uint32_t index) { + furi_assert(context); + Hid* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +void hid_scene_start_on_enter(void* context) { + Hid* app = context; + submenu_add_item( + app->submenu, "Keynote", HidSubmenuIndexKeynote, hid_scene_start_submenu_callback, app); + submenu_add_item( + app->submenu, + "Keynote Vertical", + HidSubmenuIndexKeynoteVertical, + hid_scene_start_submenu_callback, + app); + submenu_add_item( + app->submenu, "Keyboard", HidSubmenuIndexKeyboard, hid_scene_start_submenu_callback, app); + submenu_add_item( + app->submenu, "Numpad", HidSubmenuIndexNumpad, hid_scene_start_submenu_callback, app); + submenu_add_item( + app->submenu, "Media", HidSubmenuIndexMedia, hid_scene_start_submenu_callback, app); + submenu_add_item( + app->submenu, + "Apple Music macOS", + HidSubmenuIndexMusicMacOs, + hid_scene_start_submenu_callback, + app); + submenu_add_item( + app->submenu, "Movie", HidSubmenuIndexMovie, hid_scene_start_submenu_callback, app); + submenu_add_item( + app->submenu, "Mouse", HidSubmenuIndexMouse, hid_scene_start_submenu_callback, app); + submenu_add_item( + app->submenu, + "TikTok / YT Shorts", + HidSubmenuIndexTikTok, + hid_scene_start_submenu_callback, + app); + submenu_add_item( + app->submenu, + "Mouse Clicker", + HidSubmenuIndexMouseClicker, + hid_scene_start_submenu_callback, + app); + submenu_add_item( + app->submenu, + "Mouse Jiggler", + HidSubmenuIndexMouseJiggler, + hid_scene_start_submenu_callback, + app); + submenu_add_item( + app->submenu, + "Mouse Jiggler Stealth", + HidSubmenuIndexMouseJigglerStealth, + hid_scene_start_submenu_callback, + app); + submenu_add_item( + app->submenu, + "PushToTalk", + HidSubmenuIndexPushToTalk, + hid_scene_start_submenu_callback, + app); +#ifdef HID_TRANSPORT_BLE + submenu_add_item( + app->submenu, + "Bluetooth Unpairing", + HidSubmenuIndexRemovePairing, + hid_scene_start_submenu_callback, + app); +#endif + + submenu_set_selected_item( + app->submenu, scene_manager_get_scene_state(app->scene_manager, HidSceneStart)); + view_dispatcher_switch_to_view(app->view_dispatcher, HidViewSubmenu); +} + +bool hid_scene_start_on_event(void* context, SceneManagerEvent event) { + Hid* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == HidSubmenuIndexRemovePairing) { + scene_manager_next_scene(app->scene_manager, HidSceneUnpair); + } else { + HidView view_id; + + switch(event.event) { + case HidSubmenuIndexKeynote: + view_id = HidViewKeynote; + hid_keynote_set_orientation(app->hid_keynote, false); + break; + case HidSubmenuIndexKeynoteVertical: + view_id = HidViewKeynote; + hid_keynote_set_orientation(app->hid_keynote, true); + break; + case HidSubmenuIndexKeyboard: + view_id = HidViewKeyboard; + break; + case HidSubmenuIndexNumpad: + view_id = HidViewNumpad; + break; + case HidSubmenuIndexMedia: + view_id = HidViewMedia; + break; + case HidSubmenuIndexMusicMacOs: + view_id = HidViewMusicMacOs; + break; + case HidSubmenuIndexMovie: + view_id = HidViewMovie; + break; + case HidSubmenuIndexTikTok: + view_id = BtHidViewTikTok; + break; + case HidSubmenuIndexMouse: + view_id = HidViewMouse; + break; + case HidSubmenuIndexMouseClicker: + view_id = HidViewMouseClicker; + break; + case HidSubmenuIndexMouseJiggler: + view_id = HidViewMouseJiggler; + break; + case HidSubmenuIndexMouseJigglerStealth: + view_id = HidViewMouseJigglerStealth; + break; + case HidSubmenuIndexPushToTalk: + view_id = HidViewPushToTalkMenu; + break; + default: + furi_crash(); + } + + scene_manager_set_scene_state(app->scene_manager, HidSceneMain, view_id); + scene_manager_next_scene(app->scene_manager, HidSceneMain); + } + + scene_manager_set_scene_state(app->scene_manager, HidSceneStart, event.event); + consumed = true; + } + + return consumed; +} + +void hid_scene_start_on_exit(void* context) { + Hid* app = context; + submenu_reset(app->submenu); +}