settings_scene.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include <gui/modules/variable_item_list.h>
  2. #include "settings_scene.h"
  3. #include "../app_context.h"
  4. #include "../tone_gen.h"
  5. #include "../utils/linked_list.h"
  6. // Not actively used in this instance.
  7. void menu_callback_settings_scene(void* context, uint32_t index) {
  8. UNUSED(context);
  9. UNUSED(index);
  10. }
  11. static uint8_t wave_option_values[] = {SINE, SQUARE};
  12. static char* wave_option_names[] = {"Sine", "Square"};
  13. static void wave_type_option_change(VariableItem* item) {
  14. struct AppContext_t* app = variable_item_get_context(item);
  15. uint8_t index = variable_item_get_current_value_index(item);
  16. variable_item_set_current_value_text(item, wave_option_names[index]);
  17. ((struct ToneData_t*)app->additionalData)->waveType = index;
  18. }
  19. // Since the max number of options for variable item lists is
  20. // the size of an 8-bit integer, we need to limit the max
  21. // number of steps. In this case, we limit it to 241 total
  22. // steps available, incrementing in steps of 10.
  23. #define MIN_FREQ 100
  24. #define MAX_FREQ 2500
  25. #define FREQ_STEPS 10
  26. #define INDEX_TO_FREQ(index) (uint16_t)((index * FREQ_STEPS) + MIN_FREQ)
  27. #define FREQ_TO_INDEX(freq) (uint8_t)((freq - MIN_FREQ) / FREQ_STEPS)
  28. char* frequencyStr;
  29. static void frequency_option_change(VariableItem* item) {
  30. struct AppContext_t* app = variable_item_get_context(item);
  31. uint8_t index = variable_item_get_current_value_index(item);
  32. ((struct ToneData_t*)app->additionalData)->frequency = INDEX_TO_FREQ(index);
  33. snprintf(frequencyStr, 8, "%dhz", ((struct ToneData_t*)app->additionalData)->frequency);
  34. variable_item_set_current_value_text(item, frequencyStr);
  35. }
  36. char* volumeStr;
  37. static void volume_option_change(VariableItem* item) {
  38. struct AppContext_t* app = variable_item_get_context(item);
  39. uint8_t index = variable_item_get_current_value_index(item);
  40. ((struct ToneData_t*)app->additionalData)->volume = ((float)(index)) / 10.0f;
  41. snprintf(volumeStr, 5, "%d", (index * 10));
  42. variable_item_set_current_value_text(item, volumeStr);
  43. }
  44. /** resets the menu, gives it content, callbacks and selection enums */
  45. void scene_on_enter_settings_scene(void* context) {
  46. FURI_LOG_I(TAG, "scene_on_enter_settings_scene");
  47. struct AppContext_t* app = (struct AppContext_t*)context;
  48. // Setup our menu
  49. FURI_LOG_D(TAG, "Adding view menu");
  50. struct View_t* variableItemListView = app->activeViews[ToneGenAppView_VariableItemList];
  51. // Set the currently active view
  52. variable_item_list_reset(variableItemListView->viewData);
  53. FURI_LOG_D(TAG, "Adding options for settings");
  54. // Wave type setting
  55. VariableItem* item = variable_item_list_add(
  56. variableItemListView->viewData,
  57. "Wave Type",
  58. COUNT_OF(wave_option_values),
  59. wave_type_option_change,
  60. app);
  61. variable_item_set_current_value_index(
  62. item, ((struct ToneData_t*)app->additionalData)->waveType);
  63. variable_item_set_current_value_text(
  64. item, wave_option_names[((struct ToneData_t*)app->additionalData)->waveType]);
  65. // Frequency setting
  66. item = variable_item_list_add(
  67. variableItemListView->viewData,
  68. "Frequency",
  69. FREQ_TO_INDEX(MAX_FREQ) + 1,
  70. frequency_option_change,
  71. app);
  72. variable_item_set_current_value_index(
  73. item, FREQ_TO_INDEX(((struct ToneData_t*)app->additionalData)->frequency));
  74. frequencyStr = calloc(8, sizeof(char));
  75. snprintf(frequencyStr, 8, "%dhz", ((struct ToneData_t*)app->additionalData)->frequency);
  76. variable_item_set_current_value_text(item, frequencyStr);
  77. // Volume setting
  78. item = variable_item_list_add(
  79. variableItemListView->viewData, "Volume", 11, volume_option_change, app);
  80. variable_item_set_current_value_index(
  81. item, (uint8_t)(((struct ToneData_t*)app->additionalData)->volume * 10.0f));
  82. volumeStr = calloc(8, sizeof(char));
  83. snprintf(
  84. volumeStr,
  85. 5,
  86. "%d",
  87. ((uint8_t)(((struct ToneData_t*)app->additionalData)->volume * 100.0f)));
  88. variable_item_set_current_value_text(item, volumeStr);
  89. view_dispatcher_switch_to_view(app->view_dispatcher, ToneGenAppView_VariableItemList);
  90. }
  91. // Not actively used in this instance.
  92. bool scene_on_event_settings_scene(void* context, SceneManagerEvent event) {
  93. FURI_LOG_I(TAG, "scene_on_event_settings_scene");
  94. UNUSED(context);
  95. UNUSED(event);
  96. return false;
  97. }
  98. void scene_on_exit_settings_scene(void* context) {
  99. FURI_LOG_I(TAG, "scene_on_exit_settings_scene");
  100. UNUSED(context);
  101. free(frequencyStr);
  102. free(volumeStr);
  103. }