xbox_controller.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "xbox_controller.h"
  2. #define TAG "XboxControllerApp"
  3. enum XboxControllerSubmenuIndex {
  4. XboxControllerSubmenuIndexXboxOne,
  5. XboxControllerSubmenuIndexPower
  6. };
  7. uint32_t usb_hid_exit_confirm_view(void* context) {
  8. UNUSED(context);
  9. return UsbHidViewSubmenu;
  10. }
  11. uint32_t usb_hid_exit(void* context) {
  12. UNUSED(context);
  13. return VIEW_NONE;
  14. }
  15. void usb_hid_submenu_callback(void* context, uint32_t index) {
  16. furi_assert(context);
  17. XboxController* app = context;
  18. if(index == XboxControllerSubmenuIndexXboxOne) {
  19. app->view_id = UsbHidViewXboxController;
  20. view_dispatcher_switch_to_view(app->view_dispatcher, UsbHidViewXboxController);
  21. } else if(index == XboxControllerSubmenuIndexPower) {
  22. InfraredMessage* message = malloc(sizeof(InfraredMessage));
  23. message->protocol = InfraredProtocolNECext;
  24. message->address = 0xD880;
  25. message->command = 0xD02F;
  26. message->repeat = false;
  27. infrared_send(message, 2);
  28. free(message);
  29. }
  30. }
  31. void usb_hid_dialog_callback(DialogExResult result, void* context) {
  32. furi_assert(context);
  33. XboxController* app = context;
  34. if(result == DialogExResultLeft) {
  35. view_dispatcher_stop(app->view_dispatcher);
  36. } else if(result == DialogExResultRight) {
  37. view_dispatcher_switch_to_view(app->view_dispatcher, app->view_id); // Show last view
  38. } else if(result == DialogExResultCenter) {
  39. view_dispatcher_switch_to_view(app->view_dispatcher, UsbHidViewSubmenu);
  40. }
  41. }
  42. XboxController* xbox_controller_app_alloc() {
  43. XboxController* app = malloc(sizeof(XboxController));
  44. app->gui = furi_record_open(RECORD_GUI);
  45. app->notifications = furi_record_open(RECORD_NOTIFICATION);
  46. app->view_dispatcher = view_dispatcher_alloc();
  47. view_dispatcher_enable_queue(app->view_dispatcher);
  48. view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
  49. // Submenu view
  50. app->submenu = submenu_alloc();
  51. view_set_orientation(submenu_get_view(app->submenu), ViewOrientationVertical);
  52. submenu_add_item(
  53. app->submenu, "Xbox One", XboxControllerSubmenuIndexXboxOne, usb_hid_submenu_callback, app);
  54. submenu_add_item(
  55. app->submenu, "Power", XboxControllerSubmenuIndexPower, usb_hid_submenu_callback, app);
  56. view_set_previous_callback(submenu_get_view(app->submenu), usb_hid_exit);
  57. view_dispatcher_add_view(
  58. app->view_dispatcher, UsbHidViewSubmenu, submenu_get_view(app->submenu));
  59. // Xbox Controller View
  60. app->xbox_controller_view = xbox_controller_view_alloc(app->notifications);
  61. view_set_previous_callback(
  62. xbox_controller_view_get_view(app->xbox_controller_view), usb_hid_exit_confirm_view);
  63. view_dispatcher_add_view(
  64. app->view_dispatcher,
  65. UsbHidViewXboxController,
  66. xbox_controller_view_get_view(app->xbox_controller_view));
  67. // Switch to Xbox Controller by default
  68. app->view_id = UsbHidViewSubmenu;
  69. view_dispatcher_switch_to_view(app->view_dispatcher, app->view_id);
  70. return app;
  71. }
  72. void xbox_controller_app_free(XboxController* app) {
  73. furi_assert(app);
  74. // Reset notification
  75. notification_internal_message(app->notifications, &sequence_reset_blue);
  76. // Free views
  77. view_dispatcher_remove_view(app->view_dispatcher, UsbHidViewSubmenu);
  78. submenu_free(app->submenu);
  79. view_dispatcher_remove_view(app->view_dispatcher, UsbHidViewXboxController);
  80. xbox_controller_view_free(app->xbox_controller_view);
  81. view_dispatcher_free(app->view_dispatcher);
  82. // Close records
  83. furi_record_close(RECORD_GUI);
  84. app->gui = NULL;
  85. furi_record_close(RECORD_NOTIFICATION);
  86. app->notifications = NULL;
  87. // Free rest
  88. free(app);
  89. }
  90. int32_t xbox_controller_app(void* p) {
  91. UNUSED(p);
  92. XboxController* app = xbox_controller_app_alloc();
  93. view_dispatcher_run(app->view_dispatcher);
  94. xbox_controller_app_free(app);
  95. return 0;
  96. }