bad_usb_app.c 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "bad_usb_app_i.h"
  2. #include <furi.h>
  3. #include <furi-hal.h>
  4. static bool bad_usb_app_custom_event_callback(void* context, uint32_t event) {
  5. furi_assert(context);
  6. BadUsbApp* app = context;
  7. return scene_manager_handle_custom_event(app->scene_manager, event);
  8. }
  9. static bool bad_usb_app_back_event_callback(void* context) {
  10. furi_assert(context);
  11. BadUsbApp* app = context;
  12. return scene_manager_handle_back_event(app->scene_manager);
  13. }
  14. static void bad_usb_app_tick_event_callback(void* context) {
  15. furi_assert(context);
  16. BadUsbApp* app = context;
  17. scene_manager_handle_tick_event(app->scene_manager);
  18. }
  19. BadUsbApp* bad_usb_app_alloc() {
  20. BadUsbApp* app = furi_alloc(sizeof(BadUsbApp));
  21. app->gui = furi_record_open("gui");
  22. app->notifications = furi_record_open("notification");
  23. app->dialogs = furi_record_open("dialogs");
  24. app->view_dispatcher = view_dispatcher_alloc();
  25. app->scene_manager = scene_manager_alloc(&bad_usb_scene_handlers, app);
  26. view_dispatcher_enable_queue(app->view_dispatcher);
  27. view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
  28. view_dispatcher_set_tick_event_callback(
  29. app->view_dispatcher, bad_usb_app_tick_event_callback, 500);
  30. view_dispatcher_set_custom_event_callback(
  31. app->view_dispatcher, bad_usb_app_custom_event_callback);
  32. view_dispatcher_set_navigation_event_callback(
  33. app->view_dispatcher, bad_usb_app_back_event_callback);
  34. view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
  35. app->bad_usb_view = bad_usb_alloc();
  36. view_dispatcher_add_view(
  37. app->view_dispatcher, BadUsbAppViewWork, bad_usb_get_view(app->bad_usb_view));
  38. scene_manager_next_scene(app->scene_manager, BadUsbAppViewFileSelect);
  39. return app;
  40. }
  41. void bad_usb_app_free(BadUsbApp* app) {
  42. furi_assert(app);
  43. // Views
  44. view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewFileSelect);
  45. view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewWork);
  46. bad_usb_free(app->bad_usb_view);
  47. // View dispatcher
  48. view_dispatcher_free(app->view_dispatcher);
  49. scene_manager_free(app->scene_manager);
  50. // Close records
  51. furi_record_close("gui");
  52. furi_record_close("notification");
  53. furi_record_close("dialogs");
  54. free(app);
  55. }
  56. int32_t bad_usb_app(void* p) {
  57. UsbInterface* usb_mode_prev = furi_hal_usb_get_config();
  58. furi_hal_usb_set_config(&usb_hid);
  59. BadUsbApp* bad_usb_app = bad_usb_app_alloc();
  60. view_dispatcher_run(bad_usb_app->view_dispatcher);
  61. furi_hal_usb_set_config(usb_mode_prev);
  62. bad_usb_app_free(bad_usb_app);
  63. return 0;
  64. }