camera_suite_view_wifi_camera.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "../camera_suite.h"
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #include <input/input.h>
  5. #include <gui/elements.h>
  6. #include <dolphin/dolphin.h>
  7. #include "../helpers/camera_suite_haptic.h"
  8. #include "../helpers/camera_suite_speaker.h"
  9. #include "../helpers/camera_suite_led.h"
  10. static void camera_suite_view_wifi_camera_draw(Canvas* canvas, void* model) {
  11. furi_assert(canvas);
  12. furi_assert(model);
  13. // Clear the screen.
  14. canvas_set_color(canvas, ColorBlack);
  15. // Draw a frame.
  16. canvas_draw_frame(canvas, 0, 0, FRAME_WIDTH, FRAME_HEIGHT);
  17. }
  18. static bool camera_suite_view_wifi_camera_input(InputEvent* event, void* context) {
  19. furi_assert(context);
  20. furi_assert(event);
  21. CameraSuiteViewWiFiCamera* instance = context;
  22. if(event->type == InputTypeRelease) {
  23. switch(event->key) {
  24. default: // Stop all sounds, reset the LED.
  25. with_view_model(
  26. instance->view,
  27. CameraSuiteViewWiFiCameraModel * model,
  28. {
  29. UNUSED(model);
  30. camera_suite_play_bad_bump(instance->context);
  31. camera_suite_stop_all_sound(instance->context);
  32. camera_suite_led_set_rgb(instance->context, 0, 0, 0);
  33. },
  34. true);
  35. break;
  36. }
  37. } else if(event->type == InputTypePress) {
  38. switch(event->key) {
  39. case InputKeyBack: {
  40. with_view_model(
  41. instance->view,
  42. CameraSuiteViewWiFiCameraModel * model,
  43. {
  44. UNUSED(model);
  45. // Stop camera WiFi stream.
  46. furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'w'}, 1);
  47. furi_delay_ms(50);
  48. // Go back to the main menu.
  49. instance->callback(CameraSuiteCustomEventSceneCameraBack, instance->context);
  50. },
  51. true);
  52. break;
  53. }
  54. case InputKeyLeft:
  55. case InputKeyRight:
  56. case InputKeyUp:
  57. case InputKeyDown:
  58. case InputKeyOk:
  59. case InputKeyMAX:
  60. default: {
  61. break;
  62. }
  63. }
  64. }
  65. return false;
  66. }
  67. static void camera_suite_view_wifi_camera_exit(void* context) {
  68. furi_assert(context);
  69. }
  70. static void camera_suite_view_wifi_camera_enter(void* context) {
  71. UNUSED(context);
  72. // Start wifi camera stream.
  73. furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'W'}, 1);
  74. }
  75. CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
  76. // Allocate memory for the instance
  77. CameraSuiteViewWiFiCamera* instance = malloc(sizeof(CameraSuiteViewWiFiCamera));
  78. // Allocate the view object
  79. instance->view = view_alloc();
  80. // Allocate model
  81. view_allocate_model(
  82. instance->view, ViewModelTypeLocking, sizeof(CameraSuiteViewWiFiCameraModel));
  83. // Set context for the view
  84. view_set_context(instance->view, instance);
  85. // Set draw callback
  86. view_set_draw_callback(instance->view, (ViewDrawCallback)camera_suite_view_wifi_camera_draw);
  87. // Set input callback
  88. view_set_input_callback(instance->view, camera_suite_view_wifi_camera_input);
  89. // Set enter callback
  90. view_set_enter_callback(instance->view, camera_suite_view_wifi_camera_enter);
  91. // Set exit callback
  92. view_set_exit_callback(instance->view, camera_suite_view_wifi_camera_exit);
  93. // Disable console.
  94. furi_hal_console_disable();
  95. // 115200 is the default baud rate for the ESP32-CAM.
  96. furi_hal_uart_set_br(FuriHalUartIdUSART1, 230400);
  97. return instance;
  98. }
  99. void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* instance) {
  100. furi_assert(instance);
  101. // Remove the IRQ callback.
  102. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, NULL, NULL);
  103. // Re-enable the console.
  104. furi_hal_console_enable();
  105. with_view_model(
  106. instance->view, CameraSuiteViewWiFiCameraModel * model, { UNUSED(model); }, true);
  107. view_free(instance->view);
  108. free(instance);
  109. }
  110. View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* instance) {
  111. furi_assert(instance);
  112. return instance->view;
  113. }
  114. void camera_suite_view_wifi_camera_set_callback(
  115. CameraSuiteViewWiFiCamera* instance,
  116. CameraSuiteViewWiFiCameraCallback callback,
  117. void* context) {
  118. furi_assert(instance);
  119. furi_assert(callback);
  120. instance->callback = callback;
  121. instance->context = context;
  122. }