camera_suite_view_wifi_camera.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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 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. with_view_model(
  56. instance->view,
  57. CameraSuiteViewWiFiCameraModel * model,
  58. {
  59. UNUSED(model);
  60. // Play sound.
  61. camera_suite_play_happy_bump(instance->context);
  62. camera_suite_play_input_sound(instance->context);
  63. camera_suite_led_set_rgb(instance->context, 0, 0, 255);
  64. instance->callback(CameraSuiteCustomEventSceneCameraLeft, instance->context);
  65. },
  66. true);
  67. break;
  68. }
  69. case InputKeyRight: {
  70. with_view_model(
  71. instance->view,
  72. CameraSuiteViewWiFiCameraModel * model,
  73. {
  74. UNUSED(model);
  75. // Play sound.
  76. camera_suite_play_happy_bump(instance->context);
  77. camera_suite_play_input_sound(instance->context);
  78. camera_suite_led_set_rgb(instance->context, 0, 0, 255);
  79. instance->callback(CameraSuiteCustomEventSceneCameraRight, instance->context);
  80. },
  81. true);
  82. break;
  83. }
  84. case InputKeyUp: {
  85. with_view_model(
  86. instance->view,
  87. CameraSuiteViewWiFiCameraModel * model,
  88. {
  89. UNUSED(model);
  90. // Play sound.
  91. camera_suite_play_happy_bump(instance->context);
  92. camera_suite_play_input_sound(instance->context);
  93. camera_suite_led_set_rgb(instance->context, 0, 0, 255);
  94. instance->callback(CameraSuiteCustomEventSceneCameraUp, instance->context);
  95. },
  96. true);
  97. break;
  98. }
  99. case InputKeyDown: {
  100. with_view_model(
  101. instance->view,
  102. CameraSuiteViewWiFiCameraModel * model,
  103. {
  104. UNUSED(model);
  105. // Play sound.
  106. camera_suite_play_happy_bump(instance->context);
  107. camera_suite_play_input_sound(instance->context);
  108. camera_suite_led_set_rgb(instance->context, 0, 0, 255);
  109. instance->callback(CameraSuiteCustomEventSceneCameraDown, instance->context);
  110. },
  111. true);
  112. break;
  113. }
  114. case InputKeyOk: {
  115. with_view_model(
  116. instance->view,
  117. CameraSuiteViewWiFiCameraModel * model,
  118. {
  119. UNUSED(model);
  120. // Play sound.
  121. camera_suite_play_long_bump(instance->context);
  122. camera_suite_play_input_sound(instance->context);
  123. camera_suite_led_set_rgb(instance->context, 0, 0, 255);
  124. instance->callback(CameraSuiteCustomEventSceneCameraOk, instance->context);
  125. },
  126. true);
  127. break;
  128. }
  129. case InputKeyMAX:
  130. default: {
  131. break;
  132. }
  133. }
  134. }
  135. return false;
  136. }
  137. static void camera_suite_view_wifi_camera_exit(void* context) {
  138. furi_assert(context);
  139. }
  140. static void camera_suite_view_wifi_camera_enter(void* context) {
  141. UNUSED(context);
  142. // Start wifi camera stream.
  143. furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'W'}, 1);
  144. }
  145. CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
  146. // Allocate memory for the instance
  147. CameraSuiteViewWiFiCamera* instance = malloc(sizeof(CameraSuiteViewWiFiCamera));
  148. // Allocate the view object
  149. instance->view = view_alloc();
  150. // Allocate model
  151. view_allocate_model(
  152. instance->view, ViewModelTypeLocking, sizeof(CameraSuiteViewWiFiCameraModel));
  153. // Set context for the view
  154. view_set_context(instance->view, instance);
  155. // Set draw callback
  156. view_set_draw_callback(instance->view, (ViewDrawCallback)camera_suite_view_wifi_camera_draw);
  157. // Set input callback
  158. view_set_input_callback(instance->view, camera_suite_view_wifi_camera_input);
  159. // Set enter callback
  160. view_set_enter_callback(instance->view, camera_suite_view_wifi_camera_enter);
  161. // Set exit callback
  162. view_set_exit_callback(instance->view, camera_suite_view_wifi_camera_exit);
  163. // Disable console.
  164. furi_hal_console_disable();
  165. // 115200 is the default baud rate for the ESP32-CAM.
  166. furi_hal_uart_set_br(FuriHalUartIdUSART1, 230400);
  167. return instance;
  168. }
  169. void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* instance) {
  170. furi_assert(instance);
  171. // Remove the IRQ callback.
  172. furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, NULL, NULL);
  173. // Re-enable the console.
  174. furi_hal_console_enable();
  175. with_view_model(
  176. instance->view, CameraSuiteViewWiFiCameraModel * model, { UNUSED(model); }, true);
  177. view_free(instance->view);
  178. free(instance);
  179. }
  180. View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* instance) {
  181. furi_assert(instance);
  182. return instance->view;
  183. }
  184. void camera_suite_view_wifi_camera_set_callback(
  185. CameraSuiteViewWiFiCamera* instance,
  186. CameraSuiteViewWiFiCameraCallback callback,
  187. void* context) {
  188. furi_assert(instance);
  189. furi_assert(callback);
  190. instance->callback = callback;
  191. instance->context = context;
  192. }