xremote_settings.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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_HORIZONTAL "Horizontal"
  14. #define XREMOTE_ORIENTATION_TEXT_VERTICAL "Vertical"
  15. #define XREMOTE_ORIENTATION_TEXT "Orientation"
  16. #define XREMOTE_ORIENTATION_INDEX_HORIZONTAL 0
  17. #define XREMOTE_ORIENTATION_INDEX_VERTICAL 1
  18. #define XREMOTE_ORIENTATION_MAX 2
  19. #define XREMOTE_EXIT_BEHAVIOR_TEXT_PRESS "Press"
  20. #define XREMOTE_EXIT_BEHAVIOR_TEXT_HOLD "Hold"
  21. #define XREMOTE_EXIT_BEHAVIOR_TEXT "Exit App"
  22. #define XREMOTE_EXIT_BEHAVIOR_INDEX_PRESS 0
  23. #define XREMOTE_EXIT_BEHAVIOR_INDEX_HOLD 1
  24. #define XREMOTE_EXIT_BEHAVIOR_MAX 2
  25. #define XREMOTE_REPEAT_TEXT "IR Msg Repeat"
  26. #define XREMOTE_REPEAT_MAX 128
  27. static uint32_t xremote_settings_view_exit_callback(void* context)
  28. {
  29. UNUSED(context);
  30. return XRemoteViewSubmenu;
  31. }
  32. static uint32_t xremote_settings_get_exit_index(XRemoteAppSettings* settings)
  33. {
  34. return settings->exit_behavior == XRemoteAppExitPress ?
  35. XREMOTE_EXIT_BEHAVIOR_INDEX_PRESS :
  36. XREMOTE_EXIT_BEHAVIOR_INDEX_HOLD;
  37. }
  38. static const char* xremote_settings_get_exit_str(XRemoteAppSettings* settings)
  39. {
  40. return settings->exit_behavior == XRemoteAppExitPress ?
  41. XREMOTE_EXIT_BEHAVIOR_TEXT_PRESS :
  42. XREMOTE_EXIT_BEHAVIOR_TEXT_HOLD;
  43. }
  44. static XRemoteAppExit xremote_settings_get_exit_behavior(uint8_t exit_behavior)
  45. {
  46. return exit_behavior == XREMOTE_EXIT_BEHAVIOR_INDEX_PRESS ?
  47. XRemoteAppExitPress :
  48. XRemoteAppExitHold;
  49. }
  50. static uint32_t xremote_settings_get_orientation_index(XRemoteAppSettings* settings)
  51. {
  52. return settings->orientation == ViewOrientationHorizontal ?
  53. XREMOTE_ORIENTATION_INDEX_HORIZONTAL :
  54. XREMOTE_ORIENTATION_INDEX_VERTICAL;
  55. }
  56. static const char* xremote_settings_get_orientation_str(XRemoteAppSettings* settings)
  57. {
  58. return settings->orientation == ViewOrientationHorizontal ?
  59. XREMOTE_ORIENTATION_TEXT_HORIZONTAL :
  60. XREMOTE_ORIENTATION_TEXT_VERTICAL;
  61. }
  62. static ViewOrientation xremote_settings_get_orientation(uint8_t orientation)
  63. {
  64. return orientation == XREMOTE_ORIENTATION_INDEX_HORIZONTAL ?
  65. ViewOrientationHorizontal :
  66. ViewOrientationVertical;
  67. }
  68. static void infrared_settings_orientation_changed(VariableItem* item)
  69. {
  70. XRemoteSettingsContext* ctx = variable_item_get_context(item);
  71. XRemoteAppSettings* settings = ctx->app_ctx->app_settings;
  72. uint8_t orientation = variable_item_get_current_value_index(item);
  73. settings->orientation = xremote_settings_get_orientation(orientation);
  74. const char* orientation_str = xremote_settings_get_orientation_str(settings);
  75. variable_item_set_current_value_text(item, orientation_str);
  76. xremote_app_settings_store(settings);
  77. }
  78. static void infrared_settings_repeat_changed(VariableItem* item)
  79. {
  80. XRemoteSettingsContext* ctx = variable_item_get_context(item);
  81. XRemoteAppSettings* settings = ctx->app_ctx->app_settings;
  82. char repeat_str[8];
  83. settings->repeat_count = variable_item_get_current_value_index(item);
  84. snprintf(repeat_str, sizeof(repeat_str), "%lu", settings->repeat_count);
  85. variable_item_set_current_value_text(item, repeat_str);
  86. xremote_app_settings_store(settings);
  87. }
  88. static void infrared_settings_exit_changed(VariableItem* item)
  89. {
  90. XRemoteSettingsContext* ctx = variable_item_get_context(item);
  91. XRemoteAppSettings* settings = ctx->app_ctx->app_settings;
  92. uint8_t exit = variable_item_get_current_value_index(item);
  93. settings->exit_behavior = xremote_settings_get_exit_behavior(exit);
  94. const char* exit_str = xremote_settings_get_exit_str(settings);
  95. variable_item_set_current_value_text(item, exit_str);
  96. xremote_app_settings_store(settings);
  97. }
  98. static XRemoteSettingsContext* xremote_settings_context_alloc(XRemoteAppContext* app_ctx)
  99. {
  100. XRemoteSettingsContext *context = malloc(sizeof(XRemoteSettingsContext));
  101. XRemoteAppSettings* settings = app_ctx->app_settings;
  102. context->item_list = variable_item_list_alloc();
  103. context->app_ctx = app_ctx;
  104. char repeat_str[8];
  105. /* Configure variable item list view */
  106. View *view = variable_item_list_get_view(context->item_list);
  107. view_set_previous_callback(view, xremote_settings_view_exit_callback);
  108. view_dispatcher_add_view(app_ctx->view_dispatcher, XRemoteViewSettings, view);
  109. /* Add settings to variable item list */
  110. VariableItem* item = variable_item_list_add(
  111. context->item_list,
  112. XREMOTE_ORIENTATION_TEXT,
  113. XREMOTE_ORIENTATION_MAX,
  114. infrared_settings_orientation_changed,
  115. context);
  116. /* Get application orientation settings */
  117. const char* orient_str = xremote_settings_get_orientation_str(settings);
  118. uint32_t orient_index = xremote_settings_get_orientation_index(settings);
  119. /* Set current orientation item index and string */
  120. variable_item_set_current_value_index(item, orient_index);
  121. variable_item_set_current_value_text(item, orient_str);
  122. /* Add IR message repeat counter to variable item list */
  123. item = variable_item_list_add(
  124. context->item_list,
  125. XREMOTE_REPEAT_TEXT,
  126. XREMOTE_REPEAT_MAX,
  127. infrared_settings_repeat_changed,
  128. context);
  129. /* Set repeat count item index and string */
  130. snprintf(repeat_str, sizeof(repeat_str), "%lu", settings->repeat_count);
  131. variable_item_set_current_value_index(item, settings->repeat_count);
  132. variable_item_set_current_value_text(item, repeat_str);
  133. /* Add exit behavior to variable item list */
  134. item = variable_item_list_add(
  135. context->item_list,
  136. XREMOTE_EXIT_BEHAVIOR_TEXT,
  137. XREMOTE_EXIT_BEHAVIOR_MAX,
  138. infrared_settings_exit_changed,
  139. context);
  140. /* Get exit behavior settings */
  141. const char* exit_str = xremote_settings_get_exit_str(settings);
  142. uint32_t exit_index = xremote_settings_get_exit_index(settings);
  143. /* Set exit behavior item index and string */
  144. variable_item_set_current_value_index(item, exit_index);
  145. variable_item_set_current_value_text(item, exit_str);
  146. return context;
  147. }
  148. static void xremote_settings_context_clear_callback(void *context)
  149. {
  150. XRemoteSettingsContext *ctx = (XRemoteSettingsContext*)context;
  151. ViewDispatcher* view_disp = ctx->app_ctx->view_dispatcher;
  152. view_dispatcher_remove_view(view_disp, XRemoteViewSettings);
  153. variable_item_list_free(ctx->item_list);
  154. }
  155. XRemoteApp* xremote_settings_alloc(XRemoteAppContext* app_ctx)
  156. {
  157. XRemoteApp* app = xremote_app_alloc(app_ctx);
  158. XRemoteSettingsContext* context = xremote_settings_context_alloc(app_ctx);
  159. xremote_app_set_user_context(app, context, xremote_settings_context_clear_callback);
  160. return app;
  161. }