uv_meter_app.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "uv_meter_app_i.hpp"
  2. // Forward events from View Dispatcher to Scene Manager
  3. static bool uv_meter_app_custom_callback(void* context, uint32_t custom_event) {
  4. furi_assert(context);
  5. auto* app = static_cast<UVMeterApp*>(context);
  6. return scene_manager_handle_custom_event(app->scene_manager, custom_event);
  7. }
  8. static bool uv_meter_app_back_event_callback(void* context) {
  9. furi_assert(context);
  10. auto* app = static_cast<UVMeterApp*>(context);
  11. bool value = scene_manager_handle_back_event(app->scene_manager);
  12. return value;
  13. }
  14. static void uv_meter_app_tick_callback(void* context) {
  15. furi_assert(context);
  16. auto* app = static_cast<UVMeterApp*>(context);
  17. scene_manager_handle_tick_event(app->scene_manager);
  18. }
  19. static UVMeterApp* uv_meter_app_alloc() {
  20. UVMeterApp* app = new UVMeterApp();
  21. app->app_state = new UVMeterAppState();
  22. app->app_state->as7331_mutex = furi_mutex_alloc(FuriMutexTypeNormal);
  23. app->app_state->results.uv_a = 0;
  24. app->app_state->results.uv_b = 0;
  25. app->app_state->results.uv_c = 0;
  26. app->app_state->raw_results.uv_a = 0;
  27. app->app_state->raw_results.uv_b = 0;
  28. app->app_state->raw_results.uv_c = 0;
  29. app->app_state->last_sensor_check_timestamp = 0;
  30. app->app_state->as7331_initialized = false;
  31. app->app_state->i2c_address = UVMeterI2CAddressAuto;
  32. app->app_state->unit = UVMeterUnituW_cm_2;
  33. app->scene_manager = scene_manager_alloc(&uv_meter_scene_handlers, app);
  34. app->view_dispatcher = view_dispatcher_alloc();
  35. view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
  36. view_dispatcher_set_custom_event_callback(app->view_dispatcher, uv_meter_app_custom_callback);
  37. view_dispatcher_set_navigation_event_callback(
  38. app->view_dispatcher, uv_meter_app_back_event_callback);
  39. view_dispatcher_set_tick_event_callback(
  40. app->view_dispatcher, uv_meter_app_tick_callback, furi_ms_to_ticks(150));
  41. app->uv_meter_wiring_view = uv_meter_wiring_alloc();
  42. view_dispatcher_add_view(
  43. app->view_dispatcher,
  44. UVMeterViewWiring,
  45. uv_meter_wiring_get_view(app->uv_meter_wiring_view));
  46. app->variable_item_list = variable_item_list_alloc();
  47. view_dispatcher_add_view(
  48. app->view_dispatcher,
  49. UVMeterViewVariableItemList,
  50. variable_item_list_get_view(app->variable_item_list));
  51. app->uv_meter_data_view = uv_meter_data_alloc();
  52. uv_meter_data_set_sensor(
  53. app->uv_meter_data_view, &app->app_state->as7331, app->app_state->as7331_mutex);
  54. view_dispatcher_add_view(
  55. app->view_dispatcher, UVMeterViewData, uv_meter_data_get_view(app->uv_meter_data_view));
  56. app->widget = widget_alloc();
  57. view_dispatcher_add_view(
  58. app->view_dispatcher, UVMeterViewWidget, widget_get_view(app->widget));
  59. app->gui = static_cast<Gui*>(furi_record_open(RECORD_GUI));
  60. view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
  61. scene_manager_next_scene(app->scene_manager, UVMeterViewWiring);
  62. return app;
  63. }
  64. static void uv_meter_app_free(UVMeterApp* app) {
  65. furi_assert(app);
  66. furi_record_close(RECORD_GUI);
  67. view_dispatcher_remove_view(app->view_dispatcher, UVMeterViewWidget);
  68. widget_free(app->widget);
  69. view_dispatcher_remove_view(app->view_dispatcher, UVMeterViewData);
  70. uv_meter_data_free(app->uv_meter_data_view);
  71. view_dispatcher_remove_view(app->view_dispatcher, UVMeterViewVariableItemList);
  72. variable_item_list_free(app->variable_item_list);
  73. view_dispatcher_remove_view(app->view_dispatcher, UVMeterViewWiring);
  74. uv_meter_wiring_free(app->uv_meter_wiring_view);
  75. view_dispatcher_free(app->view_dispatcher);
  76. scene_manager_free(app->scene_manager);
  77. furi_mutex_free(app->app_state->as7331_mutex);
  78. delete app->app_state;
  79. delete app;
  80. }
  81. /**
  82. * @brief Main application entry point
  83. *
  84. * @param p Unused parameter
  85. * @return Exit code
  86. */
  87. extern "C" int32_t uv_meter_app(void* p) {
  88. UNUSED(p);
  89. UVMeterApp* app = uv_meter_app_alloc();
  90. view_dispatcher_run(app->view_dispatcher);
  91. // Power down the sensor before exiting
  92. if(app->app_state->as7331_initialized) {
  93. app->app_state->as7331.setPowerDown(true);
  94. app->app_state->as7331_initialized = false;
  95. }
  96. uv_meter_app_free(app);
  97. return 0;
  98. }