xremote_settings.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*!
  2. * @file flipper-xremote/xremote_settings.c
  3. @license This project is released under the GNU GPLv3 License
  4. * @copyright (c) 2023 Sandro Kalatozishvili (s.kalatoz@gmail.com)
  5. *
  6. * @brief XRemote applications settings menu and functionality.
  7. */
  8. #include "xremote_settings.h"
  9. typedef struct {
  10. VariableItemList* item_list;
  11. XRemoteAppContext* app_ctx;
  12. } XRemoteSettingsContext;
  13. #define XREMOTE_ORIENTATION_TEXT "Orientation"
  14. #define XREMOTE_ORIENTATION_MAX 2
  15. #define XREMOTE_EXIT_BEHAVIOR_TEXT "Exit Apps"
  16. #define XREMOTE_EXIT_BEHAVIOR_MAX 2
  17. #define XREMOTE_REPEAT_TEXT "IR Msg Repeat"
  18. #define XREMOTE_REPEAT_MAX 128
  19. #define XREMOTE_ALT_NAMES_TEXT "Alt Names"
  20. #define XREMOTE_ALT_NAMES_MAX 2
  21. static uint32_t xremote_settings_view_exit_callback(void* context) {
  22. UNUSED(context);
  23. return XRemoteViewSubmenu;
  24. }
  25. static void infrared_settings_orientation_changed(VariableItem* item) {
  26. XRemoteSettingsContext* ctx = variable_item_get_context(item);
  27. XRemoteAppSettings* settings = ctx->app_ctx->app_settings;
  28. uint8_t orientation_index = variable_item_get_current_value_index(item);
  29. settings->orientation = xremote_app_get_orientation(orientation_index);
  30. const char* orientation_str = xremote_app_get_orientation_str(settings->orientation);
  31. variable_item_set_current_value_text(item, orientation_str);
  32. xremote_app_settings_store(settings);
  33. }
  34. static void infrared_settings_repeat_changed(VariableItem* item) {
  35. XRemoteSettingsContext* ctx = variable_item_get_context(item);
  36. XRemoteAppSettings* settings = ctx->app_ctx->app_settings;
  37. char repeat_str[8];
  38. settings->repeat_count = variable_item_get_current_value_index(item);
  39. snprintf(repeat_str, sizeof(repeat_str), "%lu", settings->repeat_count);
  40. variable_item_set_current_value_text(item, repeat_str);
  41. xremote_app_settings_store(settings);
  42. }
  43. static void infrared_settings_exit_changed(VariableItem* item) {
  44. XRemoteSettingsContext* ctx = variable_item_get_context(item);
  45. XRemoteAppSettings* settings = ctx->app_ctx->app_settings;
  46. uint8_t exit_index = variable_item_get_current_value_index(item);
  47. settings->exit_behavior = xremote_app_get_exit_behavior(exit_index);
  48. const char* exit_str = xremote_app_get_exit_str(settings->exit_behavior);
  49. variable_item_set_current_value_text(item, exit_str);
  50. xremote_app_settings_store(settings);
  51. }
  52. static void infrared_settings_alt_names_changed(VariableItem* item) {
  53. XRemoteSettingsContext* ctx = variable_item_get_context(item);
  54. XRemoteAppSettings* settings = ctx->app_ctx->app_settings;
  55. settings->alt_names = variable_item_get_current_value_index(item);
  56. const char* alt_names_str = xremote_app_get_alt_names_str(settings->alt_names);
  57. if(settings->alt_names) xremote_app_alt_names_check_and_init();
  58. variable_item_set_current_value_text(item, alt_names_str);
  59. xremote_app_settings_store(settings);
  60. }
  61. static XRemoteSettingsContext* xremote_settings_context_alloc(XRemoteAppContext* app_ctx) {
  62. XRemoteSettingsContext* context = malloc(sizeof(XRemoteSettingsContext));
  63. XRemoteAppSettings* settings = app_ctx->app_settings;
  64. context->item_list = variable_item_list_alloc();
  65. context->app_ctx = app_ctx;
  66. char repeat_str[8];
  67. /* Configure variable item list view */
  68. View* view = variable_item_list_get_view(context->item_list);
  69. view_set_previous_callback(view, xremote_settings_view_exit_callback);
  70. view_dispatcher_add_view(app_ctx->view_dispatcher, XRemoteViewSettings, view);
  71. /* Add settings to variable item list */
  72. VariableItem* item = variable_item_list_add(
  73. context->item_list,
  74. XREMOTE_ORIENTATION_TEXT,
  75. XREMOTE_ORIENTATION_MAX,
  76. infrared_settings_orientation_changed,
  77. context);
  78. /* Get application orientation settings */
  79. const char* orient_str = xremote_app_get_orientation_str(settings->orientation);
  80. uint32_t orient_index = xremote_app_get_orientation_index(settings->orientation);
  81. /* Set current orientation item index and string */
  82. variable_item_set_current_value_index(item, orient_index);
  83. variable_item_set_current_value_text(item, orient_str);
  84. /* Add IR message repeat counter to variable item list */
  85. item = variable_item_list_add(
  86. context->item_list,
  87. XREMOTE_REPEAT_TEXT,
  88. XREMOTE_REPEAT_MAX,
  89. infrared_settings_repeat_changed,
  90. context);
  91. /* Set repeat count item index and string */
  92. snprintf(repeat_str, sizeof(repeat_str), "%lu", settings->repeat_count);
  93. variable_item_set_current_value_index(item, settings->repeat_count);
  94. variable_item_set_current_value_text(item, repeat_str);
  95. /* Add exit behavior to variable item list */
  96. item = variable_item_list_add(
  97. context->item_list,
  98. XREMOTE_EXIT_BEHAVIOR_TEXT,
  99. XREMOTE_EXIT_BEHAVIOR_MAX,
  100. infrared_settings_exit_changed,
  101. context);
  102. /* Get exit behavior settings */
  103. const char* exit_str = xremote_app_get_exit_str(settings->exit_behavior);
  104. uint32_t exit_index = xremote_app_get_exit_index(settings->exit_behavior);
  105. /* Set exit behavior item index and string */
  106. variable_item_set_current_value_index(item, exit_index);
  107. variable_item_set_current_value_text(item, exit_str);
  108. /* Add exit behavior to variable item list */
  109. item = variable_item_list_add(
  110. context->item_list,
  111. XREMOTE_ALT_NAMES_TEXT,
  112. XREMOTE_ALT_NAMES_MAX,
  113. infrared_settings_alt_names_changed,
  114. context);
  115. /* Set exit behavior item index and string */
  116. variable_item_set_current_value_index(item, settings->alt_names);
  117. variable_item_set_current_value_text(item, xremote_app_get_alt_names_str(settings->alt_names));
  118. return context;
  119. }
  120. static void xremote_settings_context_clear_callback(void* context) {
  121. XRemoteSettingsContext* ctx = (XRemoteSettingsContext*)context;
  122. ViewDispatcher* view_disp = ctx->app_ctx->view_dispatcher;
  123. view_dispatcher_remove_view(view_disp, XRemoteViewSettings);
  124. variable_item_list_free(ctx->item_list);
  125. }
  126. XRemoteApp* xremote_settings_alloc(XRemoteAppContext* app_ctx) {
  127. XRemoteApp* app = xremote_app_alloc(app_ctx);
  128. XRemoteSettingsContext* context = xremote_settings_context_alloc(app_ctx);
  129. xremote_app_set_user_context(app, context, xremote_settings_context_clear_callback);
  130. return app;
  131. }