lightmeter_scene_config.c 7.6 KB

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