xbox_controller.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
  48. // Submenu view
  49. app->submenu = submenu_alloc();
  50. view_set_orientation(submenu_get_view(app->submenu), ViewOrientationVertical);
  51. submenu_add_item(
  52. app->submenu, "Xbox One", XboxControllerSubmenuIndexXboxOne, usb_hid_submenu_callback, app);
  53. submenu_add_item(
  54. app->submenu, "Power", XboxControllerSubmenuIndexPower, usb_hid_submenu_callback, app);
  55. view_set_previous_callback(submenu_get_view(app->submenu), usb_hid_exit);
  56. view_dispatcher_add_view(
  57. app->view_dispatcher, UsbHidViewSubmenu, submenu_get_view(app->submenu));
  58. // Xbox Controller View
  59. app->xbox_controller_view = xbox_controller_view_alloc(app->notifications);
  60. view_set_previous_callback(
  61. xbox_controller_view_get_view(app->xbox_controller_view), usb_hid_exit_confirm_view);
  62. view_dispatcher_add_view(
  63. app->view_dispatcher,
  64. UsbHidViewXboxController,
  65. xbox_controller_view_get_view(app->xbox_controller_view));
  66. // Switch to Xbox Controller by default
  67. app->view_id = UsbHidViewSubmenu;
  68. view_dispatcher_switch_to_view(app->view_dispatcher, app->view_id);
  69. return app;
  70. }
  71. void xbox_controller_app_free(XboxController* app) {
  72. furi_assert(app);
  73. // Reset notification
  74. notification_internal_message(app->notifications, &sequence_reset_blue);
  75. // Free views
  76. view_dispatcher_remove_view(app->view_dispatcher, UsbHidViewSubmenu);
  77. submenu_free(app->submenu);
  78. view_dispatcher_remove_view(app->view_dispatcher, UsbHidViewXboxController);
  79. xbox_controller_view_free(app->xbox_controller_view);
  80. view_dispatcher_free(app->view_dispatcher);
  81. // Close records
  82. furi_record_close(RECORD_GUI);
  83. app->gui = NULL;
  84. furi_record_close(RECORD_NOTIFICATION);
  85. app->notifications = NULL;
  86. // Free rest
  87. free(app);
  88. }
  89. int32_t xbox_controller_app(void* p) {
  90. UNUSED(p);
  91. XboxController* app = xbox_controller_app_alloc();
  92. view_dispatcher_run(app->view_dispatcher);
  93. xbox_controller_app_free(app);
  94. return 0;
  95. }