lightmeter_scene_config.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. static const char* lux_only[] = {
  44. [LUX_ONLY_OFF] = "Off",
  45. [LUX_ONLY_ON] = "On",
  46. };
  47. enum LightMeterSubmenuIndex {
  48. LightMeterSubmenuIndexISO,
  49. LightMeterSubmenuIndexND,
  50. LightMeterSubmenuIndexDome,
  51. LightMeterSubmenuIndexBacklight,
  52. LightMeterSubmenuIndexLuxMeter,
  53. LightMeterSubmenuIndexHelp,
  54. LightMeterSubmenuIndexAbout,
  55. };
  56. static void iso_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, iso_numbers[index]);
  60. LightMeterConfig* config = app->config;
  61. config->iso = index;
  62. lightmeter_app_set_config(app, config);
  63. }
  64. static void nd_numbers_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, nd_numbers[index]);
  68. LightMeterConfig* config = app->config;
  69. config->nd = index;
  70. lightmeter_app_set_config(app, config);
  71. }
  72. static void dome_presence_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, diffusion_dome[index]);
  76. LightMeterConfig* config = app->config;
  77. config->dome = index;
  78. lightmeter_app_set_config(app, config);
  79. }
  80. static void backlight_cb(VariableItem* item) {
  81. LightMeterApp* app = variable_item_get_context(item);
  82. uint8_t index = variable_item_get_current_value_index(item);
  83. variable_item_set_current_value_text(item, backlight[index]);
  84. LightMeterConfig* config = app->config;
  85. if(index != config->backlight) {
  86. if(index == BACKLIGHT_ON) {
  87. notification_message(
  88. app->notifications,
  89. &sequence_display_backlight_enforce_on); // force on backlight
  90. } else {
  91. notification_message(
  92. app->notifications,
  93. &sequence_display_backlight_enforce_auto); // force auto backlight
  94. }
  95. }
  96. config->backlight = index;
  97. lightmeter_app_set_config(app, config);
  98. }
  99. static void lux_only_cb(VariableItem* item) {
  100. LightMeterApp* app = variable_item_get_context(item);
  101. uint8_t index = variable_item_get_current_value_index(item);
  102. variable_item_set_current_value_text(item, lux_only[index]);
  103. LightMeterConfig* config = app->config;
  104. config->lux_only = index;
  105. lightmeter_app_set_config(app, config);
  106. }
  107. static void ok_cb(void* context, uint32_t index) {
  108. LightMeterApp* app = context;
  109. UNUSED(app);
  110. switch(index) {
  111. case LightMeterSubmenuIndexHelp:
  112. view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventHelp);
  113. break;
  114. case LightMeterSubmenuIndexAbout:
  115. view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventAbout);
  116. break;
  117. default:
  118. break;
  119. }
  120. }
  121. void lightmeter_scene_config_on_enter(void* context) {
  122. LightMeterApp* app = context;
  123. VariableItemList* var_item_list = app->var_item_list;
  124. VariableItem* item;
  125. LightMeterConfig* config = app->config;
  126. item =
  127. variable_item_list_add(var_item_list, "ISO", COUNT_OF(iso_numbers), iso_numbers_cb, app);
  128. variable_item_set_current_value_index(item, config->iso);
  129. variable_item_set_current_value_text(item, iso_numbers[config->iso]);
  130. item = variable_item_list_add(
  131. var_item_list, "ND factor", COUNT_OF(nd_numbers), nd_numbers_cb, app);
  132. variable_item_set_current_value_index(item, config->nd);
  133. variable_item_set_current_value_text(item, nd_numbers[config->nd]);
  134. item = variable_item_list_add(
  135. var_item_list, "Diffusion dome", COUNT_OF(diffusion_dome), dome_presence_cb, app);
  136. variable_item_set_current_value_index(item, config->dome);
  137. variable_item_set_current_value_text(item, diffusion_dome[config->dome]);
  138. item =
  139. variable_item_list_add(var_item_list, "Backlight", COUNT_OF(backlight), backlight_cb, app);
  140. variable_item_set_current_value_index(item, config->backlight);
  141. variable_item_set_current_value_text(item, backlight[config->backlight]);
  142. item = variable_item_list_add(
  143. var_item_list, "Lux meter only", COUNT_OF(lux_only), lux_only_cb, app);
  144. variable_item_set_current_value_index(item, config->lux_only);
  145. variable_item_set_current_value_text(item, lux_only[config->lux_only]);
  146. item = variable_item_list_add(var_item_list, "Help and Pinout", 0, NULL, NULL);
  147. item = variable_item_list_add(var_item_list, "About", 0, NULL, NULL);
  148. variable_item_list_set_selected_item(
  149. var_item_list,
  150. scene_manager_get_scene_state(app->scene_manager, LightMeterAppSceneConfig));
  151. variable_item_list_set_enter_callback(var_item_list, ok_cb, app);
  152. view_dispatcher_switch_to_view(app->view_dispatcher, LightMeterAppViewVarItemList);
  153. }
  154. bool lightmeter_scene_config_on_event(void* context, SceneManagerEvent event) {
  155. LightMeterApp* app = context;
  156. bool consumed = false;
  157. if(event.type == SceneManagerEventTypeTick) {
  158. consumed = true;
  159. } else if(event.type == SceneManagerEventTypeCustom) {
  160. switch(event.event) {
  161. case LightMeterAppCustomEventHelp:
  162. scene_manager_next_scene(app->scene_manager, LightMeterAppSceneHelp);
  163. consumed = true;
  164. break;
  165. case LightMeterAppCustomEventAbout:
  166. scene_manager_next_scene(app->scene_manager, LightMeterAppSceneAbout);
  167. consumed = true;
  168. break;
  169. }
  170. }
  171. return consumed;
  172. }
  173. void lightmeter_scene_config_on_exit(void* context) {
  174. LightMeterApp* app = context;
  175. variable_item_list_reset(app->var_item_list);
  176. main_view_set_iso(app->main_view, app->config->iso);
  177. main_view_set_nd(app->main_view, app->config->nd);
  178. main_view_set_dome(app->main_view, app->config->dome);
  179. main_view_set_lux_only(app->main_view, app->config->lux_only);
  180. }