lightmeter_scene_config.c 4.8 KB

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