lightmeter_scene_config.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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. static const char* measurement_resolution[] = {
  52. [LOW_RES] = "Low",
  53. [HIGH_RES] = "High",
  54. [HIGH_RES2] = "High2",
  55. };
  56. static const char* device_addr_bh1750[] = {
  57. [ADDR_LOW] = "0x23",
  58. [ADDR_HIGH] = "0x5C",
  59. };
  60. static const char* device_addr_max44009[] = {
  61. [ADDR_LOW] = "0x4A",
  62. [ADDR_HIGH] = "0x4B",
  63. };
  64. enum LightMeterSubmenuIndex {
  65. LightMeterSubmenuIndexISO,
  66. LightMeterSubmenuIndexND,
  67. LightMeterSubmenuIndexDome,
  68. LightMeterSubmenuIndexBacklight,
  69. LightMeterSubmenuIndexLuxMeter,
  70. LightMeterSubmenuIndexSensorType,
  71. LightMeterSubmenuIndexMeasurementResolution,
  72. LightMeterSubmenuIndexI2CAddress,
  73. LightMeterSubmenuIndexHelp,
  74. LightMeterSubmenuIndexAbout,
  75. };
  76. static void iso_numbers_cb(VariableItem* item) {
  77. LightMeterApp* app = variable_item_get_context(item);
  78. uint8_t index = variable_item_get_current_value_index(item);
  79. variable_item_set_current_value_text(item, iso_numbers[index]);
  80. LightMeterConfig* config = app->config;
  81. config->iso = index;
  82. lightmeter_app_set_config(app, config);
  83. }
  84. static void nd_numbers_cb(VariableItem* item) {
  85. LightMeterApp* app = variable_item_get_context(item);
  86. uint8_t index = variable_item_get_current_value_index(item);
  87. variable_item_set_current_value_text(item, nd_numbers[index]);
  88. LightMeterConfig* config = app->config;
  89. config->nd = index;
  90. lightmeter_app_set_config(app, config);
  91. }
  92. static void dome_presence_cb(VariableItem* item) {
  93. LightMeterApp* app = variable_item_get_context(item);
  94. uint8_t index = variable_item_get_current_value_index(item);
  95. variable_item_set_current_value_text(item, diffusion_dome[index]);
  96. LightMeterConfig* config = app->config;
  97. config->dome = index;
  98. lightmeter_app_set_config(app, config);
  99. }
  100. static void backlight_cb(VariableItem* item) {
  101. LightMeterApp* app = variable_item_get_context(item);
  102. uint8_t index = variable_item_get_current_value_index(item);
  103. variable_item_set_current_value_text(item, backlight[index]);
  104. LightMeterConfig* config = app->config;
  105. if(index != config->backlight) {
  106. if(index == BACKLIGHT_ON) {
  107. notification_message(
  108. app->notifications,
  109. &sequence_display_backlight_enforce_on); // force on backlight
  110. } else {
  111. notification_message(
  112. app->notifications,
  113. &sequence_display_backlight_enforce_auto); // force auto backlight
  114. }
  115. }
  116. config->backlight = index;
  117. lightmeter_app_set_config(app, config);
  118. }
  119. static void lux_only_cb(VariableItem* item) {
  120. LightMeterApp* app = variable_item_get_context(item);
  121. uint8_t index = variable_item_get_current_value_index(item);
  122. variable_item_set_current_value_text(item, lux_only[index]);
  123. LightMeterConfig* config = app->config;
  124. config->lux_only = index;
  125. lightmeter_app_set_config(app, config);
  126. }
  127. static void measurement_resolution_cb(VariableItem* item) {
  128. LightMeterApp* app = variable_item_get_context(item);
  129. uint8_t index = variable_item_get_current_value_index(item);
  130. variable_item_set_current_value_text(item, measurement_resolution[index]);
  131. LightMeterConfig* config = app->config;
  132. config->measurement_resolution = index;
  133. lightmeter_app_set_config(app, config);
  134. lightmeter_app_i2c_init_sensor(app);
  135. }
  136. static void update_item_addr(LightMeterApp* app) {
  137. VariableItem* item = app->var_item_addr;
  138. switch(app->config->sensor_type) {
  139. case SENSOR_BH1750:
  140. variable_item_set_current_value_index(item, app->config->device_addr);
  141. variable_item_set_current_value_text(item, device_addr_bh1750[app->config->device_addr]);
  142. break;
  143. case SENSOR_MAX44009:
  144. variable_item_set_current_value_index(item, app->config->device_addr);
  145. variable_item_set_current_value_text(item, device_addr_max44009[app->config->device_addr]);
  146. break;
  147. default:
  148. FURI_LOG_E(TAG, "Invalid sensor type %ld", app->config->sensor_type);
  149. return;
  150. }
  151. }
  152. static void device_addr_cb(VariableItem* item) {
  153. LightMeterApp* app = variable_item_get_context(item);
  154. uint8_t index = variable_item_get_current_value_index(item);
  155. switch(app->config->sensor_type) {
  156. case SENSOR_BH1750:
  157. variable_item_set_current_value_text(item, device_addr_bh1750[index]);
  158. break;
  159. case SENSOR_MAX44009:
  160. variable_item_set_current_value_text(item, device_addr_max44009[index]);
  161. break;
  162. default:
  163. FURI_LOG_E(TAG, "Invalid sensor type %ld", app->config->sensor_type);
  164. return;
  165. }
  166. // variable_item_set_current_value_text(item, device_addr[index]);
  167. LightMeterConfig* config = app->config;
  168. config->device_addr = index;
  169. lightmeter_app_set_config(app, config);
  170. lightmeter_app_i2c_init_sensor(app);
  171. }
  172. static void sensor_type_cb(VariableItem* item) {
  173. LightMeterApp* app = variable_item_get_context(item);
  174. uint8_t index = variable_item_get_current_value_index(item);
  175. variable_item_set_current_value_text(item, sensor_type[index]);
  176. LightMeterConfig* config = app->config;
  177. config->sensor_type = index;
  178. update_item_addr(app);
  179. lightmeter_app_set_config(app, config);
  180. }
  181. static void ok_cb(void* context, uint32_t index) {
  182. LightMeterApp* app = context;
  183. UNUSED(app);
  184. switch(index) {
  185. case LightMeterSubmenuIndexHelp:
  186. view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventHelp);
  187. break;
  188. case LightMeterSubmenuIndexAbout:
  189. view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventAbout);
  190. break;
  191. default:
  192. break;
  193. }
  194. }
  195. void lightmeter_scene_config_on_enter(void* context) {
  196. LightMeterApp* app = context;
  197. VariableItemList* var_item_list = app->var_item_list;
  198. VariableItem* item;
  199. LightMeterConfig* config = app->config;
  200. item =
  201. variable_item_list_add(var_item_list, "ISO", COUNT_OF(iso_numbers), iso_numbers_cb, app);
  202. variable_item_set_current_value_index(item, config->iso);
  203. variable_item_set_current_value_text(item, iso_numbers[config->iso]);
  204. item = variable_item_list_add(
  205. var_item_list, "ND factor", COUNT_OF(nd_numbers), nd_numbers_cb, app);
  206. variable_item_set_current_value_index(item, config->nd);
  207. variable_item_set_current_value_text(item, nd_numbers[config->nd]);
  208. item = variable_item_list_add(
  209. var_item_list, "Diffusion dome", COUNT_OF(diffusion_dome), dome_presence_cb, app);
  210. variable_item_set_current_value_index(item, config->dome);
  211. variable_item_set_current_value_text(item, diffusion_dome[config->dome]);
  212. item =
  213. variable_item_list_add(var_item_list, "Backlight", COUNT_OF(backlight), backlight_cb, app);
  214. variable_item_set_current_value_index(item, config->backlight);
  215. variable_item_set_current_value_text(item, backlight[config->backlight]);
  216. item = variable_item_list_add(
  217. var_item_list, "Lux meter only", COUNT_OF(lux_only), lux_only_cb, app);
  218. variable_item_set_current_value_index(item, config->lux_only);
  219. variable_item_set_current_value_text(item, lux_only[config->lux_only]);
  220. item = variable_item_list_add(
  221. var_item_list, "Sensor", COUNT_OF(sensor_type), sensor_type_cb, app);
  222. variable_item_set_current_value_index(item, config->sensor_type);
  223. variable_item_set_current_value_text(item, sensor_type[config->sensor_type]);
  224. item = variable_item_list_add(
  225. var_item_list,
  226. "Resolution",
  227. COUNT_OF(measurement_resolution),
  228. measurement_resolution_cb,
  229. app);
  230. variable_item_set_current_value_index(item, config->measurement_resolution);
  231. variable_item_set_current_value_text(
  232. item, measurement_resolution[config->measurement_resolution]);
  233. switch(config->sensor_type) {
  234. case SENSOR_BH1750:
  235. item = variable_item_list_add(
  236. var_item_list, "I2C address", COUNT_OF(device_addr_bh1750), device_addr_cb, app);
  237. variable_item_set_current_value_index(item, config->device_addr);
  238. variable_item_set_current_value_text(item, device_addr_bh1750[config->device_addr]);
  239. break;
  240. case SENSOR_MAX44009:
  241. item = variable_item_list_add(
  242. var_item_list, "I2C address", COUNT_OF(device_addr_max44009), device_addr_cb, app);
  243. variable_item_set_current_value_index(item, config->device_addr);
  244. variable_item_set_current_value_text(item, device_addr_max44009[config->device_addr]);
  245. break;
  246. default:
  247. FURI_LOG_E(TAG, "Invalid sensor type %ld", config->sensor_type);
  248. return;
  249. }
  250. app->var_item_addr = item;
  251. update_item_addr(app);
  252. item = variable_item_list_add(var_item_list, "Help and Pinout", 0, NULL, NULL);
  253. item = variable_item_list_add(var_item_list, "About", 0, NULL, NULL);
  254. variable_item_list_set_selected_item(
  255. var_item_list,
  256. scene_manager_get_scene_state(app->scene_manager, LightMeterAppSceneConfig));
  257. variable_item_list_set_enter_callback(var_item_list, ok_cb, app);
  258. view_dispatcher_switch_to_view(app->view_dispatcher, LightMeterAppViewVarItemList);
  259. }
  260. bool lightmeter_scene_config_on_event(void* context, SceneManagerEvent event) {
  261. LightMeterApp* app = context;
  262. bool consumed = false;
  263. if(event.type == SceneManagerEventTypeTick) {
  264. consumed = true;
  265. } else if(event.type == SceneManagerEventTypeCustom) {
  266. switch(event.event) {
  267. case LightMeterAppCustomEventHelp:
  268. scene_manager_next_scene(app->scene_manager, LightMeterAppSceneHelp);
  269. consumed = true;
  270. break;
  271. case LightMeterAppCustomEventAbout:
  272. scene_manager_next_scene(app->scene_manager, LightMeterAppSceneAbout);
  273. consumed = true;
  274. break;
  275. }
  276. }
  277. return consumed;
  278. }
  279. void lightmeter_scene_config_on_exit(void* context) {
  280. LightMeterApp* app = context;
  281. variable_item_list_reset(app->var_item_list);
  282. main_view_set_iso(app->main_view, app->config->iso);
  283. main_view_set_nd(app->main_view, app->config->nd);
  284. main_view_set_dome(app->main_view, app->config->dome);
  285. main_view_set_lux_only(app->main_view, app->config->lux_only);
  286. main_view_set_measurement_resolution(app->main_view, app->config->measurement_resolution);
  287. }