camera_suite_view_wifi_camera.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. void camera_suite_view_wifi_camera_set_callback(
  11. CameraSuiteViewWiFiCamera* instance,
  12. CameraSuiteViewWiFiCameraCallback callback,
  13. void* context) {
  14. furi_assert(instance);
  15. furi_assert(callback);
  16. instance->callback = callback;
  17. instance->context = context;
  18. }
  19. static void camera_suite_view_wifi_camera_draw(Canvas* canvas, void* model) {
  20. furi_assert(canvas);
  21. furi_assert(model);
  22. CameraSuiteViewWiFiCameraModel* instance = model;
  23. canvas_clear(canvas);
  24. canvas_set_color(canvas, ColorBlack);
  25. canvas_set_font(canvas, FontSecondary);
  26. canvas_draw_frame(canvas, 0, 0, FRAME_WIDTH, FRAME_HEIGHT);
  27. canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, "Feature coming soon!");
  28. // Draw log from camera.
  29. canvas_draw_str_aligned(
  30. canvas, 3, 13, AlignLeft, AlignTop, furi_string_get_cstr(instance->log));
  31. }
  32. static bool camera_suite_view_wifi_camera_input(InputEvent* event, void* context) {
  33. furi_assert(context);
  34. furi_assert(event);
  35. CameraSuiteViewWiFiCamera* instance = context;
  36. if(event->type == InputTypeRelease) {
  37. switch(event->key) {
  38. default:
  39. with_view_model(
  40. instance->view,
  41. CameraSuiteViewWiFiCameraModel * model,
  42. {
  43. UNUSED(model);
  44. // Stop all sounds, reset the LED.
  45. camera_suite_play_bad_bump(instance->context);
  46. camera_suite_stop_all_sound(instance->context);
  47. camera_suite_led_set_rgb(instance->context, 0, 0, 0);
  48. },
  49. true);
  50. break;
  51. }
  52. } else if(event->type == InputTypePress) {
  53. switch(event->key) {
  54. case InputKeyBack: {
  55. with_view_model(
  56. instance->view,
  57. CameraSuiteViewWiFiCameraModel * model,
  58. {
  59. UNUSED(model);
  60. // Stop camera WiFi stream.
  61. // furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'w'}, 1);
  62. // furi_delay_ms(50);
  63. // Go back to the main menu.
  64. instance->callback(CameraSuiteCustomEventSceneCameraBack, instance->context);
  65. },
  66. true);
  67. break;
  68. }
  69. case InputKeyLeft:
  70. case InputKeyRight:
  71. case InputKeyUp:
  72. case InputKeyDown:
  73. case InputKeyOk:
  74. case InputKeyMAX:
  75. default: {
  76. break;
  77. }
  78. }
  79. }
  80. return false;
  81. }
  82. static void camera_suite_view_wifi_camera_exit(void* context) {
  83. furi_assert(context);
  84. }
  85. static void camera_suite_view_wifi_camera_model_init(CameraSuiteViewWiFiCameraModel* const model) {
  86. model->log = furi_string_alloc();
  87. furi_string_reserve(model->log, 4096);
  88. }
  89. static void camera_suite_view_wifi_camera_enter(void* context) {
  90. furi_assert(context);
  91. // Get the camera suite instance context.
  92. CameraSuiteViewWiFiCamera* instance = (CameraSuiteViewWiFiCamera*)context;
  93. // Start wifi camera stream.
  94. // furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'W'}, 1);
  95. with_view_model(
  96. instance->view,
  97. CameraSuiteViewWiFiCameraModel * model,
  98. { camera_suite_view_wifi_camera_model_init(model); },
  99. true);
  100. }
  101. CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
  102. // Allocate memory for the instance
  103. CameraSuiteViewWiFiCamera* instance = malloc(sizeof(CameraSuiteViewWiFiCamera));
  104. // Allocate the view object
  105. instance->view = view_alloc();
  106. // Allocate model
  107. view_allocate_model(
  108. instance->view, ViewModelTypeLocking, sizeof(CameraSuiteViewWiFiCameraModel));
  109. // Set context for the view (furi_assert crashes in events without this)
  110. view_set_context(instance->view, instance);
  111. // Set draw callback
  112. view_set_draw_callback(instance->view, (ViewDrawCallback)camera_suite_view_wifi_camera_draw);
  113. // Set input callback
  114. view_set_input_callback(instance->view, camera_suite_view_wifi_camera_input);
  115. // Set enter callback
  116. view_set_enter_callback(instance->view, camera_suite_view_wifi_camera_enter);
  117. // Set exit callback
  118. view_set_exit_callback(instance->view, camera_suite_view_wifi_camera_exit);
  119. with_view_model(
  120. instance->view,
  121. CameraSuiteViewWiFiCameraModel * model,
  122. { camera_suite_view_wifi_camera_model_init(model); },
  123. true);
  124. return instance;
  125. }
  126. void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* instance) {
  127. furi_assert(instance);
  128. with_view_model(
  129. instance->view,
  130. CameraSuiteViewWiFiCameraModel * model,
  131. { furi_string_free(model->log); },
  132. true);
  133. view_free(instance->view);
  134. free(instance);
  135. }
  136. View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* instance) {
  137. furi_assert(instance);
  138. return instance->view;
  139. }