lightmeter_scene_config.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "../../lightmeter.h"
  2. #define TAG "Scene Config"
  3. static const char* iso_numbers[] = {
  4. [ISO_6] = "6",
  5. [ISO_12] = "12",
  6. [ISO_25] = "25",
  7. [ISO_50] = "50",
  8. [ISO_100] = "100",
  9. [ISO_200] = "200",
  10. [ISO_400] = "400",
  11. [ISO_800] = "800",
  12. [ISO_1600] = "1600",
  13. [ISO_3200] = "3200",
  14. [ISO_6400] = "6400",
  15. [ISO_12800] = "12800",
  16. [ISO_25600] = "25600",
  17. [ISO_51200] = "51200",
  18. [ISO_102400] = "102400",
  19. };
  20. static const char* nd_numbers[] = {
  21. [ND_0] = "0",
  22. [ND_2] = "2",
  23. [ND_4] = "4",
  24. [ND_8] = "8",
  25. [ND_16] = "16",
  26. [ND_32] = "32",
  27. [ND_64] = "64",
  28. [ND_128] = "128",
  29. [ND_256] = "256",
  30. [ND_512] = "512",
  31. [ND_1024] = "1024",
  32. [ND_2048] = "2048",
  33. [ND_4096] = "4096",
  34. };
  35. static const char* diffusion_dome[] = {
  36. [WITHOUT_DOME] = "No",
  37. [WITH_DOME] = "Yes",
  38. };
  39. static const char* backlight[] = {
  40. [BACKLIGHT_AUTO] = "Auto",
  41. [BACKLIGHT_ON] = "On",
  42. };
  43. enum LightMeterSubmenuIndex {
  44. LightMeterSubmenuIndexISO,
  45. LightMeterSubmenuIndexND,
  46. LightMeterSubmenuIndexDome,
  47. };
  48. static void iso_numbers_cb(VariableItem* item) {
  49. LightMeterApp* app = variable_item_get_context(item);
  50. uint8_t index = variable_item_get_current_value_index(item);
  51. variable_item_set_current_value_text(item, iso_numbers[index]);
  52. LightMeterConfig* config = app->config;
  53. config->iso = index;
  54. lightmeter_app_set_config(app, config);
  55. }
  56. static void nd_numbers_cb(VariableItem* item) {
  57. LightMeterApp* app = variable_item_get_context(item);
  58. uint8_t index = variable_item_get_current_value_index(item);
  59. variable_item_set_current_value_text(item, nd_numbers[index]);
  60. LightMeterConfig* config = app->config;
  61. config->nd = index;
  62. lightmeter_app_set_config(app, config);
  63. }
  64. static void dome_presence_cb(VariableItem* item) {
  65. LightMeterApp* app = variable_item_get_context(item);
  66. uint8_t index = variable_item_get_current_value_index(item);
  67. variable_item_set_current_value_text(item, diffusion_dome[index]);
  68. LightMeterConfig* config = app->config;
  69. config->dome = index;
  70. lightmeter_app_set_config(app, config);
  71. }
  72. static void backlight_cb(VariableItem* item) {
  73. LightMeterApp* app = variable_item_get_context(item);
  74. uint8_t index = variable_item_get_current_value_index(item);
  75. variable_item_set_current_value_text(item, backlight[index]);
  76. LightMeterConfig* config = app->config;
  77. if(index != config->backlight) {
  78. if(index == BACKLIGHT_ON) {
  79. notification_message(
  80. app->notifications,
  81. &sequence_display_backlight_enforce_on); // force on backlight
  82. } else {
  83. notification_message(
  84. app->notifications,
  85. &sequence_display_backlight_enforce_auto); // force auto backlight
  86. }
  87. }
  88. config->backlight = index;
  89. lightmeter_app_set_config(app, config);
  90. }
  91. static void ok_cb(void* context, uint32_t index) {
  92. LightMeterApp* app = context;
  93. UNUSED(app);
  94. switch(index) {
  95. case 4:
  96. view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventHelp);
  97. break;
  98. case 5:
  99. view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventAbout);
  100. break;
  101. default:
  102. break;
  103. }
  104. }
  105. void lightmeter_scene_config_on_enter(void* context) {
  106. LightMeterApp* app = context;
  107. VariableItemList* var_item_list = app->var_item_list;
  108. VariableItem* item;
  109. LightMeterConfig* config = app->config;
  110. item =
  111. variable_item_list_add(var_item_list, "ISO", COUNT_OF(iso_numbers), iso_numbers_cb, app);
  112. variable_item_set_current_value_index(item, config->iso);
  113. variable_item_set_current_value_text(item, iso_numbers[config->iso]);
  114. item = variable_item_list_add(
  115. var_item_list, "ND factor", COUNT_OF(nd_numbers), nd_numbers_cb, app);
  116. variable_item_set_current_value_index(item, config->nd);
  117. variable_item_set_current_value_text(item, nd_numbers[config->nd]);
  118. item = variable_item_list_add(
  119. var_item_list, "Diffusion dome", COUNT_OF(diffusion_dome), dome_presence_cb, app);
  120. variable_item_set_current_value_index(item, config->dome);
  121. variable_item_set_current_value_text(item, diffusion_dome[config->dome]);
  122. item =
  123. variable_item_list_add(var_item_list, "Backlight", COUNT_OF(backlight), backlight_cb, app);
  124. variable_item_set_current_value_index(item, config->backlight);
  125. variable_item_set_current_value_text(item, backlight[config->backlight]);
  126. item = variable_item_list_add(var_item_list, "Help and Pinout", 0, NULL, NULL);
  127. item = variable_item_list_add(var_item_list, "About", 0, NULL, NULL);
  128. variable_item_list_set_selected_item(
  129. var_item_list,
  130. scene_manager_get_scene_state(app->scene_manager, LightMeterAppSceneConfig));
  131. variable_item_list_set_enter_callback(var_item_list, ok_cb, app);
  132. view_dispatcher_switch_to_view(app->view_dispatcher, LightMeterAppViewVarItemList);
  133. }
  134. bool lightmeter_scene_config_on_event(void* context, SceneManagerEvent event) {
  135. LightMeterApp* app = context;
  136. bool consumed = false;
  137. if(event.type == SceneManagerEventTypeTick) {
  138. consumed = true;
  139. } else if(event.type == SceneManagerEventTypeCustom) {
  140. switch(event.event) {
  141. case LightMeterAppCustomEventHelp:
  142. scene_manager_next_scene(app->scene_manager, LightMeterAppSceneHelp);
  143. consumed = true;
  144. break;
  145. case LightMeterAppCustomEventAbout:
  146. scene_manager_next_scene(app->scene_manager, LightMeterAppSceneAbout);
  147. consumed = true;
  148. break;
  149. }
  150. }
  151. return consumed;
  152. }
  153. void lightmeter_scene_config_on_exit(void* context) {
  154. LightMeterApp* app = context;
  155. variable_item_list_reset(app->var_item_list);
  156. main_view_set_iso(app->main_view, app->config->iso);
  157. main_view_set_nd(app->main_view, app->config->nd);
  158. main_view_set_dome(app->main_view, app->config->dome);
  159. }