Cody Tolene 1 year ago
parent
commit
6bfc91f4c2

+ 24 - 3
camera_suite.h

@@ -1,6 +1,9 @@
 #pragma once
 #pragma once
 
 
 #include <furi.h>
 #include <furi.h>
+#include <furi_hal.h>
+#include <furi_hal_serial.h>
+#include <furi_hal_serial_control.h>
 #include <gui/gui.h>
 #include <gui/gui.h>
 #include <gui/modules/button_menu.h>
 #include <gui/modules/button_menu.h>
 #include <gui/modules/submenu.h>
 #include <gui/modules/submenu.h>
@@ -11,16 +14,31 @@
 #include <notification/notification_messages.h>
 #include <notification/notification_messages.h>
 #include <stdlib.h>
 #include <stdlib.h>
 
 
+#include "helpers/camera_suite_storage.h"
 #include "scenes/camera_suite_scene.h"
 #include "scenes/camera_suite_scene.h"
+#include "views/camera_suite_view_camera.h"
 #include "views/camera_suite_view_guide.h"
 #include "views/camera_suite_view_guide.h"
 #include "views/camera_suite_view_start.h"
 #include "views/camera_suite_view_start.h"
-#include "views/camera_suite_view_camera.h"
 #include "views/camera_suite_view_wifi_camera.h"
 #include "views/camera_suite_view_wifi_camera.h"
-#include "helpers/camera_suite_storage.h"
+
+#define TAG "Camera Suite"
+#include <furi.h>
+#define FLIPPER_SCREEN_HEIGHT 64
+#define FLIPPER_SCREEN_WIDTH 128
 
 
 #define WORKER_EVENTS_MASK (WorkerEventStop | WorkerEventRx)
 #define WORKER_EVENTS_MASK (WorkerEventStop | WorkerEventRx)
 
 
-#define TAG "Camera Suite"
+#ifdef xtreme_settings
+/**
+ * Enable the following line for "Xtreme Firmware" & "Xtreme Apps" (Flipper-XFW).
+ * 
+ * @see https://github.com/Flipper-XFW/Xtreme-Firmware
+ * @see https://github.com/Flipper-XFW/Xtreme-Apps
+*/
+#define UART_CH (xtreme_settings.uart_esp_channel)
+#else
+#define UART_CH (FuriHalSerialIdUsart)
+#endif
 
 
 typedef struct {
 typedef struct {
     Gui* gui;
     Gui* gui;
@@ -41,6 +59,9 @@ typedef struct {
     uint32_t speaker;
     uint32_t speaker;
     uint32_t led;
     uint32_t led;
     ButtonMenu* button_menu;
     ButtonMenu* button_menu;
+    FuriHalSerialHandle* serial_handle;
+    FuriStreamBuffer* rx_stream;
+    FuriThread* worker_thread;
 } CameraSuite;
 } CameraSuite;
 
 
 typedef enum {
 typedef enum {

+ 1 - 1
helpers/camera_suite_haptic.c

@@ -1,5 +1,5 @@
-#include "../camera_suite.h"
 #include "camera_suite_haptic.h"
 #include "camera_suite_haptic.h"
+#include "../camera_suite.h"
 
 
 void camera_suite_play_happy_bump(void* context) {
 void camera_suite_play_happy_bump(void* context) {
     CameraSuite* app = context;
     CameraSuite* app = context;

+ 0 - 4
helpers/camera_suite_haptic.h

@@ -1,9 +1,5 @@
-#pragma once
-
 #include <notification/notification_messages.h>
 #include <notification/notification_messages.h>
 
 
 void camera_suite_play_happy_bump(void* context);
 void camera_suite_play_happy_bump(void* context);
-
 void camera_suite_play_bad_bump(void* context);
 void camera_suite_play_bad_bump(void* context);
-
 void camera_suite_play_long_bump(void* context);
 void camera_suite_play_long_bump(void* context);

+ 1 - 1
helpers/camera_suite_led.c

@@ -1,5 +1,5 @@
-#include "../camera_suite.h"
 #include "camera_suite_led.h"
 #include "camera_suite_led.h"
+#include "../camera_suite.h"
 
 
 void camera_suite_led_set_rgb(void* context, int red, int green, int blue) {
 void camera_suite_led_set_rgb(void* context, int red, int green, int blue) {
     CameraSuite* app = context;
     CameraSuite* app = context;

+ 0 - 3
helpers/camera_suite_led.h

@@ -1,5 +1,2 @@
-#pragma once
-
 void camera_suite_led_set_rgb(void* context, int red, int green, int blue);
 void camera_suite_led_set_rgb(void* context, int red, int green, int blue);
-
 void camera_suite_led_reset(void* context);
 void camera_suite_led_reset(void* context);

+ 1 - 3
helpers/camera_suite_speaker.c

@@ -1,7 +1,5 @@
-#include "../camera_suite.h"
 #include "camera_suite_speaker.h"
 #include "camera_suite_speaker.h"
-
-#define NOTE_INPUT 587.33f
+#include "../camera_suite.h"
 
 
 void camera_suite_play_input_sound(void* context) {
 void camera_suite_play_input_sound(void* context) {
     CameraSuite* app = context;
     CameraSuite* app = context;

+ 0 - 2
helpers/camera_suite_speaker.h

@@ -1,5 +1,3 @@
-#pragma once
-
 #define NOTE_INPUT 587.33f
 #define NOTE_INPUT 587.33f
 
 
 void camera_suite_play_input_sound(void* context);
 void camera_suite_play_input_sound(void* context);

+ 5 - 2
helpers/camera_suite_storage.h

@@ -1,5 +1,3 @@
-#pragma once
-
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
 #include <storage/storage.h>
 #include <storage/storage.h>
@@ -7,6 +5,9 @@
 
 
 #include "../camera_suite.h"
 #include "../camera_suite.h"
 
 
+#ifndef CAMERA_SUITE_STORAGE_H
+#define CAMERA_SUITE_STORAGE_H
+
 #define BOILERPLATE_SETTINGS_FILE_VERSION 1
 #define BOILERPLATE_SETTINGS_FILE_VERSION 1
 #define CONFIG_FILE_DIRECTORY_PATH EXT_PATH("apps_data/camera_suite")
 #define CONFIG_FILE_DIRECTORY_PATH EXT_PATH("apps_data/camera_suite")
 #define BOILERPLATE_SETTINGS_SAVE_PATH CONFIG_FILE_DIRECTORY_PATH "/camera_suite.conf"
 #define BOILERPLATE_SETTINGS_SAVE_PATH CONFIG_FILE_DIRECTORY_PATH "/camera_suite.conf"
@@ -24,3 +25,5 @@
 void camera_suite_save_settings(void* context);
 void camera_suite_save_settings(void* context);
 
 
 void camera_suite_read_settings(void* context);
 void camera_suite_read_settings(void* context);
+
+#endif

+ 36 - 0
helpers/camera_suite_uart.c

@@ -0,0 +1,36 @@
+#include "camera_suite_uart.h"
+#include "../camera_suite.h"
+
+// void camera_suite_uart_alloc(CameraSuite* instance, FuriThreadCallback* callback) {
+//     // Allocate a stream buffer
+//     instance->rx_stream = furi_stream_buffer_alloc(2048, 1);
+
+//     // Allocate a thread for this camera to run on.
+//     FuriThread* thread = furi_thread_alloc_ex("UsbUartWorker", 2048, callback, instance);
+//     instance->worker_thread = thread;
+//     furi_thread_start(instance->worker_thread);
+
+//     // Set up UART thread.
+//     instance->serial_handle = furi_hal_serial_control_acquire(UART_CH);
+//     furi_check(instance->serial_handle);
+//     furi_hal_serial_init(instance->serial_handle, 230400);
+
+//     // Enable UART1 and set the IRQ callback.
+//     furi_hal_serial_async_rx_start(instance->serial_handle, callback, instance, false);
+// }
+
+// void camera_suite_uart_free(CameraSuite* app_instance) {
+//     furi_assert(app_instance);
+
+//     // Free the worker thread.
+//     furi_thread_flags_set(furi_thread_get_id(app_instance->worker_thread), WorkerEventStop);
+//     furi_thread_join(app_instance->worker_thread);
+//     furi_thread_free(app_instance->worker_thread);
+
+//     // Free the stream buffer.
+//     furi_stream_buffer_free(app_instance->rx_stream);
+
+//     // Free the serial handle.
+//     furi_hal_serial_deinit(app_instance->serial_handle);
+//     furi_hal_serial_control_release(app_instance->serial_handle);
+// }

+ 4 - 0
helpers/camera_suite_uart.h

@@ -0,0 +1,4 @@
+#pragma once
+
+// void camera_suite_uart_alloc(CameraSuite* instance, FuriThreadCallback* callback);
+// void camera_suite_uart_free(CameraSuite* app_instance);

+ 56 - 54
views/camera_suite_view_camera.c

@@ -1,6 +1,24 @@
 #include "../camera_suite.h"
 #include "../camera_suite.h"
 #include "camera_suite_view_camera.h"
 #include "camera_suite_view_camera.h"
 
 
+#include "../helpers/camera_suite_haptic.h"
+#include "../helpers/camera_suite_led.h"
+#include "../helpers/camera_suite_speaker.h"
+#include "../helpers/camera_suite_custom_event.h"
+// #include "../helpers/camera_suite_uart.h"
+
+#define BITMAP_HEADER_LENGTH 62
+#define FRAME_BIT_DEPTH 1
+#define HEADER_LENGTH 3 // 'Y', ':', and row identifier
+#define LAST_ROW_INDEX 1008
+#define ROW_BUFFER_LENGTH 16
+
+static const unsigned char bitmap_header[BITMAP_HEADER_LENGTH] = {
+    0x42, 0x4D, 0x3E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00,
+    0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00};
+
 static void draw_pixel_by_orientation(Canvas* canvas, uint8_t x, uint8_t y, uint8_t orientation) {
 static void draw_pixel_by_orientation(Canvas* canvas, uint8_t x, uint8_t y, uint8_t orientation) {
     furi_assert(canvas);
     furi_assert(canvas);
     furi_assert(x);
     furi_assert(x);
@@ -15,15 +33,15 @@ static void draw_pixel_by_orientation(Canvas* canvas, uint8_t x, uint8_t y, uint
     }
     }
     case 1: { // Camera rotated 90 degrees
     case 1: { // Camera rotated 90 degrees
 
 
-        canvas_draw_dot(canvas, y, FRAME_WIDTH - 1 - x);
+        canvas_draw_dot(canvas, y, FLIPPER_SCREEN_WIDTH - 1 - x);
         break;
         break;
     }
     }
     case 2: { // Camera rotated 180 degrees (upside down)
     case 2: { // Camera rotated 180 degrees (upside down)
-        canvas_draw_dot(canvas, FRAME_WIDTH - 1 - x, FRAME_HEIGHT - 1 - y);
+        canvas_draw_dot(canvas, FLIPPER_SCREEN_WIDTH - 1 - x, FLIPPER_SCREEN_HEIGHT - 1 - y);
         break;
         break;
     }
     }
     case 3: { // Camera rotated 270 degrees
     case 3: { // Camera rotated 270 degrees
-        canvas_draw_dot(canvas, FRAME_HEIGHT - 1 - y, x);
+        canvas_draw_dot(canvas, FLIPPER_SCREEN_HEIGHT - 1 - y, x);
         break;
         break;
     }
     }
     }
     }
@@ -39,7 +57,7 @@ static void camera_suite_view_camera_draw(Canvas* canvas, void* uart_dump_model)
     canvas_set_color(canvas, ColorBlack);
     canvas_set_color(canvas, ColorBlack);
 
 
     // Draw the frame.
     // Draw the frame.
-    canvas_draw_frame(canvas, 0, 0, FRAME_WIDTH, FRAME_HEIGHT);
+    canvas_draw_frame(canvas, 0, 0, FLIPPER_SCREEN_WIDTH, FLIPPER_SCREEN_HEIGHT);
 
 
     for(size_t p = 0; p < FRAME_BUFFER_LENGTH; ++p) {
     for(size_t p = 0; p < FRAME_BUFFER_LENGTH; ++p) {
         uint8_t x = p % ROW_BUFFER_LENGTH; // 0 .. 15
         uint8_t x = p % ROW_BUFFER_LENGTH; // 0 .. 15
@@ -246,6 +264,7 @@ static bool camera_suite_view_camera_input(InputEvent* input_event, void* camera
     furi_assert(input_event);
     furi_assert(input_event);
 
 
     CameraSuiteViewCamera* instance = camera_view_instance;
     CameraSuiteViewCamera* instance = camera_view_instance;
+    CameraSuite* app_instance = instance->context;
     uint8_t data[1];
     uint8_t data[1];
 
 
     if(input_event->type == InputTypeRelease) {
     if(input_event->type == InputTypeRelease) {
@@ -273,7 +292,7 @@ static bool camera_suite_view_camera_input(InputEvent* input_event, void* camera
 
 
                     // Stop camera stream.
                     // Stop camera stream.
                     data[0] = 's';
                     data[0] = 's';
-                    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+                    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                     furi_delay_ms(50);
                     furi_delay_ms(50);
 
 
                     // Go back to the main menu.
                     // Go back to the main menu.
@@ -295,14 +314,14 @@ static bool camera_suite_view_camera_input(InputEvent* input_event, void* camera
                     if(model->is_inverted) {
                     if(model->is_inverted) {
                         // Camera: Set invert to false on the ESP32-CAM.
                         // Camera: Set invert to false on the ESP32-CAM.
                         data[0] = 'i';
                         data[0] = 'i';
-                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+                        furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                         furi_delay_ms(50);
                         furi_delay_ms(50);
 
 
                         model->is_inverted = false;
                         model->is_inverted = false;
                     } else {
                     } else {
                         // Camera: Set invert to true on the ESP32-CAM.
                         // Camera: Set invert to true on the ESP32-CAM.
                         data[0] = 'I';
                         data[0] = 'I';
-                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+                        furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                         furi_delay_ms(50);
                         furi_delay_ms(50);
 
 
                         model->is_inverted = true;
                         model->is_inverted = true;
@@ -326,14 +345,14 @@ static bool camera_suite_view_camera_input(InputEvent* input_event, void* camera
                     if(model->is_dithering_enabled) {
                     if(model->is_dithering_enabled) {
                         // Camera: Disable dithering.
                         // Camera: Disable dithering.
                         data[0] = 'd';
                         data[0] = 'd';
-                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+                        furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                         furi_delay_ms(50);
                         furi_delay_ms(50);
 
 
                         model->is_dithering_enabled = false;
                         model->is_dithering_enabled = false;
                     } else {
                     } else {
                         // Camera: Enable dithering.
                         // Camera: Enable dithering.
                         data[0] = 'D';
                         data[0] = 'D';
-                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+                        furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                         furi_delay_ms(50);
                         furi_delay_ms(50);
 
 
                         model->is_dithering_enabled = true;
                         model->is_dithering_enabled = true;
@@ -358,7 +377,7 @@ static bool camera_suite_view_camera_input(InputEvent* input_event, void* camera
 
 
                     // Camera: Increase contrast.
                     // Camera: Increase contrast.
                     data[0] = 'C';
                     data[0] = 'C';
-                    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+                    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                     furi_delay_ms(50);
                     furi_delay_ms(50);
 
 
                     instance->callback(CameraSuiteCustomEventSceneCameraUp, instance->context);
                     instance->callback(CameraSuiteCustomEventSceneCameraUp, instance->context);
@@ -380,7 +399,7 @@ static bool camera_suite_view_camera_input(InputEvent* input_event, void* camera
 
 
                     // Camera: Reduce contrast.
                     // Camera: Reduce contrast.
                     data[0] = 'c';
                     data[0] = 'c';
-                    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+                    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                     furi_delay_ms(50);
                     furi_delay_ms(50);
 
 
                     instance->callback(CameraSuiteCustomEventSceneCameraDown, instance->context);
                     instance->callback(CameraSuiteCustomEventSceneCameraDown, instance->context);
@@ -428,41 +447,39 @@ static void camera_suite_view_camera_enter(void* camera_view_instance) {
     furi_assert(camera_view_instance);
     furi_assert(camera_view_instance);
 
 
     CameraSuiteViewCamera* instance = camera_view_instance;
     CameraSuiteViewCamera* instance = camera_view_instance;
+    CameraSuite* app_instance = instance->context;
 
 
     uint8_t data[1];
     uint8_t data[1];
 
 
-    // Get the camera suite instance context.
-    CameraSuite* app_context = instance->context;
-
     // Start serial stream to Flipper Zero.
     // Start serial stream to Flipper Zero.
     data[0] = 'S';
     data[0] = 'S';
-    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
     furi_delay_ms(50);
     furi_delay_ms(50);
 
 
     // Get/set dither type.
     // Get/set dither type.
-    uint8_t dither_type = app_context->dither;
-    furi_hal_serial_tx(instance->camera_serial_handle, &dither_type, 1);
+    uint8_t dither_type = app_instance->dither;
+    furi_hal_serial_tx(app_instance->serial_handle, &dither_type, 1);
     furi_delay_ms(50);
     furi_delay_ms(50);
 
 
     // Make sure the camera is not inverted.
     // Make sure the camera is not inverted.
     data[0] = 'i';
     data[0] = 'i';
-    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
     furi_delay_ms(50);
     furi_delay_ms(50);
 
 
     // Toggle flash on or off based on the current state. If the user has this
     // Toggle flash on or off based on the current state. If the user has this
     // on the flash will stay on the entire time the user is in the camera view.
     // on the flash will stay on the entire time the user is in the camera view.
-    data[0] = app_context->flash ? 'F' : 'f';
-    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
+    data[0] = app_instance->flash ? 'F' : 'f';
+    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
     furi_delay_ms(50);
     furi_delay_ms(50);
 
 
     with_view_model(
     with_view_model(
         instance->view,
         instance->view,
         UartDumpModel * model,
         UartDumpModel * model,
-        { camera_suite_view_camera_model_init(model, app_context); },
+        { camera_suite_view_camera_model_init(model, app_instance); },
         true);
         true);
 }
 }
 
 
-static void camera_on_irq_cb(
+static void camera_callback(
     FuriHalSerialHandle* handle,
     FuriHalSerialHandle* handle,
     FuriHalSerialRxEvent event,
     FuriHalSerialRxEvent event,
     void* camera_view_instance) {
     void* camera_view_instance) {
@@ -470,11 +487,12 @@ static void camera_on_irq_cb(
     furi_assert(camera_view_instance);
     furi_assert(camera_view_instance);
 
 
     CameraSuiteViewCamera* instance = camera_view_instance;
     CameraSuiteViewCamera* instance = camera_view_instance;
+    CameraSuite* app_instance = instance->context;
 
 
     if(event == FuriHalSerialRxEventData) {
     if(event == FuriHalSerialRxEventData) {
         uint8_t data = furi_hal_serial_async_rx(handle);
         uint8_t data = furi_hal_serial_async_rx(handle);
-        furi_stream_buffer_send(instance->camera_rx_stream, &data, 1, 0);
-        furi_thread_flags_set(furi_thread_get_id(instance->camera_worker_thread), WorkerEventRx);
+        furi_stream_buffer_send(app_instance->rx_stream, &data, 1, 0);
+        furi_thread_flags_set(furi_thread_get_id(app_instance->worker_thread), WorkerEventRx);
     }
     }
 }
 }
 
 
@@ -530,6 +548,7 @@ static int32_t camera_suite_camera_worker(void* camera_view_instance) {
     furi_assert(camera_view_instance);
     furi_assert(camera_view_instance);
 
 
     CameraSuiteViewCamera* instance = camera_view_instance;
     CameraSuiteViewCamera* instance = camera_view_instance;
+    CameraSuite* app_instance = instance->context;
 
 
     while(1) {
     while(1) {
         // Wait for any event on the worker thread.
         // Wait for any event on the worker thread.
@@ -551,8 +570,7 @@ static int32_t camera_suite_camera_worker(void* camera_view_instance) {
                 // Allocate a buffer for the data.
                 // Allocate a buffer for the data.
                 uint8_t data[buffer_size];
                 uint8_t data[buffer_size];
                 // Read the data from the stream buffer.
                 // Read the data from the stream buffer.
-                length =
-                    furi_stream_buffer_receive(instance->camera_rx_stream, data, buffer_size, 0);
+                length = furi_stream_buffer_receive(app_instance->rx_stream, data, buffer_size, 0);
                 if(length > 0) {
                 if(length > 0) {
                     with_view_model(
                     with_view_model(
                         instance->view,
                         instance->view,
@@ -576,15 +594,11 @@ static int32_t camera_suite_camera_worker(void* camera_view_instance) {
 }
 }
 
 
 CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
 CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
-    // Allocate memory for the instance
     CameraSuiteViewCamera* instance = malloc(sizeof(CameraSuiteViewCamera));
     CameraSuiteViewCamera* instance = malloc(sizeof(CameraSuiteViewCamera));
 
 
     // Allocate the view object
     // Allocate the view object
     instance->view = view_alloc();
     instance->view = view_alloc();
 
 
-    // Allocate a stream buffer
-    instance->camera_rx_stream = furi_stream_buffer_alloc(2048, 1);
-
     // Allocate model
     // Allocate model
     view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(UartDumpModel));
     view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(UartDumpModel));
 
 
@@ -603,20 +617,15 @@ CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
     // Set exit callback
     // Set exit callback
     view_set_exit_callback(instance->view, camera_suite_view_camera_exit);
     view_set_exit_callback(instance->view, camera_suite_view_camera_exit);
 
 
-    // Allocate a thread for this camera to run on.
-    FuriThread* thread = furi_thread_alloc_ex(
-        "Camera_Suite_Camera_Rx_Thread", 2048, camera_suite_camera_worker, instance);
-    instance->camera_worker_thread = thread;
-    furi_thread_start(instance->camera_worker_thread);
+    // Allocate the UART worker thread for the camera.
+    // CameraSuite* app_instance = instance->context;
+    // camera_suite_uart_alloc(app_instance, camera_callback);
 
 
-    // Set up UART thread.
-    instance->camera_serial_handle = furi_hal_serial_control_acquire(UART_CH);
-    furi_check(instance->camera_serial_handle);
-    furi_hal_serial_init(instance->camera_serial_handle, 230400);
-
-    // Enable UART1 and set the IRQ callback.
-    furi_hal_serial_async_rx_start(
-        instance->camera_serial_handle, camera_on_irq_cb, instance, false);
+    with_view_model(
+        instance->view,
+        UartDumpModel * model,
+        { camera_suite_view_camera_model_init(model, instance); },
+        true);
 
 
     return instance;
     return instance;
 }
 }
@@ -624,17 +633,10 @@ CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
 void camera_suite_view_camera_free(CameraSuiteViewCamera* instance) {
 void camera_suite_view_camera_free(CameraSuiteViewCamera* instance) {
     furi_assert(instance);
     furi_assert(instance);
 
 
-    // Free the worker thread.
-    furi_thread_flags_set(furi_thread_get_id(instance->camera_worker_thread), WorkerEventStop);
-    furi_thread_join(instance->camera_worker_thread);
-    furi_thread_free(instance->camera_worker_thread);
+    CameraSuite* app_instance = instance->context;
 
 
-    // Free the allocated stream buffer.
-    furi_stream_buffer_free(instance->camera_rx_stream);
-
-    // Deinitialize the UART.
-    furi_hal_serial_deinit(instance->camera_serial_handle);
-    furi_hal_serial_control_release(instance->camera_serial_handle);
+    // Free the UART worker thread.
+    // camera_suite_uart_free(app_instance);
 
 
     with_view_model(
     with_view_model(
         instance->view, UartDumpModel * model, { UNUSED(model); }, true);
         instance->view, UartDumpModel * model, { UNUSED(model); }, true);
@@ -655,4 +657,4 @@ void camera_suite_view_camera_set_callback(
     furi_assert(callback);
     furi_assert(callback);
     camera_view_instance->callback = callback;
     camera_view_instance->callback = callback;
     camera_view_instance->context = context;
     camera_view_instance->context = context;
-}
+}

+ 6 - 44
views/camera_suite_view_camera.h

@@ -1,51 +1,12 @@
 #pragma once
 #pragma once
 
 
-#include <furi_hal.h>
-#include <furi_hal_serial.h>
-#include <furi_hal_serial_control.h>
-
-#include "../helpers/camera_suite_haptic.h"
-#include "../helpers/camera_suite_led.h"
-#include "../helpers/camera_suite_speaker.h"
-#include "../helpers/camera_suite_custom_event.h"
-
-#define BITMAP_HEADER_LENGTH 62
-#define FRAME_BIT_DEPTH 1
-#define FRAME_BUFFER_LENGTH 1024
-#define FRAME_HEIGHT 64
-#define FRAME_WIDTH 128
-#define HEADER_LENGTH 3 // 'Y', ':', and row identifier
-#define LAST_ROW_INDEX 1008
 #define RING_BUFFER_LENGTH 19
 #define RING_BUFFER_LENGTH 19
-#define ROW_BUFFER_LENGTH 16
-
-#ifdef xtreme_settings
-/**
- * Enable the following line for "Xtreme Firmware" & "Xtreme Apps" (Flipper-XFW).
- * 
- * @see https://github.com/Flipper-XFW/Xtreme-Firmware
- * @see https://github.com/Flipper-XFW/Xtreme-Apps
-*/
-#define UART_CH (xtreme_settings.uart_esp_channel)
-#else
-#define UART_CH (FuriHalSerialIdUsart)
-#endif
-
-static const unsigned char bitmap_header[BITMAP_HEADER_LENGTH] = {
-    0x42, 0x4D, 0x3E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00,
-    0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00};
+#define FRAME_BUFFER_LENGTH 1024
 
 
-// Forward declaration
 typedef void (*CameraSuiteViewCameraCallback)(CameraSuiteCustomEvent event, void* context);
 typedef void (*CameraSuiteViewCameraCallback)(CameraSuiteCustomEvent event, void* context);
 
 
 typedef struct CameraSuiteViewCamera {
 typedef struct CameraSuiteViewCamera {
     CameraSuiteViewCameraCallback callback;
     CameraSuiteViewCameraCallback callback;
-    FuriStreamBuffer* camera_rx_stream;
-    FuriHalSerialHandle* camera_serial_handle;
-    FuriThread* camera_worker_thread;
-    NotificationApp* notification;
     View* view;
     View* view;
     void* context;
     void* context;
 } CameraSuiteViewCamera;
 } CameraSuiteViewCamera;
@@ -60,13 +21,14 @@ typedef struct UartDumpModel {
     uint8_t ringbuffer_index;
     uint8_t ringbuffer_index;
     uint8_t row_identifier;
     uint8_t row_identifier;
     uint8_t row_ringbuffer[RING_BUFFER_LENGTH];
     uint8_t row_ringbuffer[RING_BUFFER_LENGTH];
+    FuriString* log;
+    size_t log_strlen;
 } UartDumpModel;
 } UartDumpModel;
 
 
-// Function Prototypes
 CameraSuiteViewCamera* camera_suite_view_camera_alloc();
 CameraSuiteViewCamera* camera_suite_view_camera_alloc();
-View* camera_suite_view_camera_get_view(CameraSuiteViewCamera* camera_view_instance);
-void camera_suite_view_camera_free(CameraSuiteViewCamera* camera_view_instance);
+View* camera_suite_view_camera_get_view(CameraSuiteViewCamera* camera_suite_static);
+void camera_suite_view_camera_free(CameraSuiteViewCamera* camera_suite_static);
 void camera_suite_view_camera_set_callback(
 void camera_suite_view_camera_set_callback(
-    CameraSuiteViewCamera* camera_view_instance,
+    CameraSuiteViewCamera* camera_suite_view_camera,
     CameraSuiteViewCameraCallback callback,
     CameraSuiteViewCameraCallback callback,
     void* context);
     void* context);

+ 2 - 6
views/camera_suite_view_guide.c

@@ -1,9 +1,5 @@
 #include "../camera_suite.h"
 #include "../camera_suite.h"
-#include <furi.h>
-#include <furi_hal.h>
-#include <input/input.h>
-#include <gui/elements.h>
-#include <dolphin/dolphin.h>
+#include "camera_suite_view_guide.h"
 
 
 struct CameraSuiteViewGuide {
 struct CameraSuiteViewGuide {
     View* view;
     View* view;
@@ -80,7 +76,7 @@ void camera_suite_view_guide_exit(void* context) {
 
 
 void camera_suite_view_guide_enter(void* context) {
 void camera_suite_view_guide_enter(void* context) {
     furi_assert(context);
     furi_assert(context);
-    CameraSuiteViewGuide* instance = context;
+    CameraSuiteViewGuide* instance = (CameraSuiteViewGuide*)context;
     with_view_model(
     with_view_model(
         instance->view,
         instance->view,
         CameraSuiteViewGuideModel * model,
         CameraSuiteViewGuideModel * model,

+ 0 - 1
views/camera_suite_view_guide.h

@@ -1,6 +1,5 @@
 #pragma once
 #pragma once
 
 
-#include <gui/view.h>
 #include "../helpers/camera_suite_custom_event.h"
 #include "../helpers/camera_suite_custom_event.h"
 
 
 typedef struct CameraSuiteViewGuide CameraSuiteViewGuide;
 typedef struct CameraSuiteViewGuide CameraSuiteViewGuide;

+ 1 - 4
views/camera_suite_view_start.c

@@ -1,8 +1,5 @@
 #include "../camera_suite.h"
 #include "../camera_suite.h"
-#include <furi.h>
-#include <furi_hal.h>
-#include <input/input.h>
-#include <gui/elements.h>
+#include "camera_suite_view_start.h"
 
 
 void camera_suite_view_start_set_callback(
 void camera_suite_view_start_set_callback(
     CameraSuiteViewStart* instance,
     CameraSuiteViewStart* instance,

+ 0 - 1
views/camera_suite_view_start.h

@@ -1,6 +1,5 @@
 #pragma once
 #pragma once
 
 
-#include <gui/view.h>
 #include "../helpers/camera_suite_custom_event.h"
 #include "../helpers/camera_suite_custom_event.h"
 
 
 typedef void (*CameraSuiteViewStartCallback)(CameraSuiteCustomEvent event, void* context);
 typedef void (*CameraSuiteViewStartCallback)(CameraSuiteCustomEvent event, void* context);

+ 41 - 51
views/camera_suite_view_wifi_camera.c

@@ -1,16 +1,22 @@
 #include "../camera_suite.h"
 #include "../camera_suite.h"
 #include "camera_suite_view_wifi_camera.h"
 #include "camera_suite_view_wifi_camera.h"
 
 
+#include "../helpers/camera_suite_haptic.h"
+#include "../helpers/camera_suite_led.h"
+#include "../helpers/camera_suite_speaker.h"
+#include "../helpers/camera_suite_custom_event.h"
+// #include "../helpers/camera_suite_uart.h"
+
 static void camera_suite_view_wifi_camera_draw(Canvas* canvas, void* wifi_model) {
 static void camera_suite_view_wifi_camera_draw(Canvas* canvas, void* wifi_model) {
     furi_assert(canvas);
     furi_assert(canvas);
     furi_assert(wifi_model);
     furi_assert(wifi_model);
 
 
-    CameraSuiteViewWiFiCameraModel* model = wifi_model;
+    UartDumpModel* model = wifi_model;
 
 
     canvas_clear(canvas);
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
     canvas_set_color(canvas, ColorBlack);
     canvas_set_font(canvas, FontSecondary);
     canvas_set_font(canvas, FontSecondary);
-    canvas_draw_frame(canvas, 0, 0, FRAME_WIDTH, FRAME_HEIGHT);
+    canvas_draw_frame(canvas, 0, 0, FLIPPER_SCREEN_HEIGHT, FLIPPER_SCREEN_HEIGHT);
 
 
     canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, "Starting WiFi Stream at:");
     canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, "Starting WiFi Stream at:");
 
 
@@ -22,6 +28,7 @@ static int32_t camera_suite_wifi_camera_worker(void* wifi_view_instance) {
     furi_assert(wifi_view_instance);
     furi_assert(wifi_view_instance);
 
 
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
+    CameraSuite* app_instance = instance->context;
 
 
     while(1) {
     while(1) {
         uint32_t events =
         uint32_t events =
@@ -38,14 +45,13 @@ static int32_t camera_suite_wifi_camera_worker(void* wifi_view_instance) {
             do {
             do {
                 size_t buffer_size = 320;
                 size_t buffer_size = 320;
                 uint8_t data[buffer_size];
                 uint8_t data[buffer_size];
-                length =
-                    furi_stream_buffer_receive(instance->wifi_rx_stream, data, buffer_size, 0);
+                length = furi_stream_buffer_receive(app_instance->rx_stream, data, buffer_size, 0);
                 if(length > 0) {
                 if(length > 0) {
                     data[length] = '\0';
                     data[length] = '\0';
 
 
                     with_view_model(
                     with_view_model(
                         instance->view,
                         instance->view,
-                        CameraSuiteViewWiFiCameraModel * model,
+                        UartDumpModel * model,
                         {
                         {
                             furi_string_cat_printf(model->log, "%s", data);
                             furi_string_cat_printf(model->log, "%s", data);
 
 
@@ -61,7 +67,7 @@ static int32_t camera_suite_wifi_camera_worker(void* wifi_view_instance) {
             } while(length > 0);
             } while(length > 0);
 
 
             with_view_model(
             with_view_model(
-                instance->view, CameraSuiteViewWiFiCameraModel * model, { UNUSED(model); }, true);
+                instance->view, UartDumpModel * model, { UNUSED(model); }, true);
         }
         }
     }
     }
 
 
@@ -74,6 +80,7 @@ static bool
     furi_assert(input_event);
     furi_assert(input_event);
 
 
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
+    CameraSuite* app_instance = instance->context;
     uint8_t data[1];
     uint8_t data[1];
 
 
     if(input_event->type == InputTypeRelease) {
     if(input_event->type == InputTypeRelease) {
@@ -81,7 +88,7 @@ static bool
         default:
         default:
             with_view_model(
             with_view_model(
                 instance->view,
                 instance->view,
-                CameraSuiteViewWiFiCameraModel * model,
+                UartDumpModel * model,
                 {
                 {
                     UNUSED(model);
                     UNUSED(model);
                     // Stop all sounds, reset the LED.
                     // Stop all sounds, reset the LED.
@@ -97,17 +104,18 @@ static bool
         case InputKeyBack: {
         case InputKeyBack: {
             with_view_model(
             with_view_model(
                 instance->view,
                 instance->view,
-                CameraSuiteViewWiFiCameraModel * model,
+                UartDumpModel * model,
                 {
                 {
                     UNUSED(model);
                     UNUSED(model);
 
 
                     // Stop camera WiFi stream.
                     // Stop camera WiFi stream.
                     data[0] = 'w';
                     data[0] = 'w';
-                    furi_hal_serial_tx(instance->wifi_serial_handle, data, 1);
+                    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
                     furi_delay_ms(50);
                     furi_delay_ms(50);
 
 
                     // Go back to the main menu.
                     // Go back to the main menu.
-                    instance->callback(CameraSuiteCustomEventSceneCameraBack, instance->context);
+                    instance->callback(
+                        CameraSuiteCustomEventSceneWiFiCameraBack, instance->context);
                 },
                 },
                 true);
                 true);
             break;
             break;
@@ -131,7 +139,7 @@ static void camera_suite_view_wifi_camera_exit(void* wifi_view_instance) {
     UNUSED(wifi_view_instance);
     UNUSED(wifi_view_instance);
 }
 }
 
 
-static void camera_suite_view_wifi_camera_model_init(CameraSuiteViewWiFiCameraModel* const model) {
+static void camera_suite_view_wifi_camera_model_init(UartDumpModel* const model) {
     model->log = furi_string_alloc();
     model->log = furi_string_alloc();
     furi_string_reserve(model->log, 4096);
     furi_string_reserve(model->log, 4096);
 }
 }
@@ -140,20 +148,21 @@ static void camera_suite_view_wifi_camera_enter(void* wifi_view_instance) {
     furi_assert(wifi_view_instance);
     furi_assert(wifi_view_instance);
 
 
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
+    CameraSuite* app_instance = instance->context;
 
 
     // Start wifi camera stream.
     // Start wifi camera stream.
     uint8_t data[1] = {'W'};
     uint8_t data[1] = {'W'};
-    furi_hal_serial_tx(instance->wifi_serial_handle, data, 1);
+    furi_hal_serial_tx(app_instance->serial_handle, data, 1);
     furi_delay_ms(50);
     furi_delay_ms(50);
 
 
     with_view_model(
     with_view_model(
         instance->view,
         instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
+        UartDumpModel * model,
         { camera_suite_view_wifi_camera_model_init(model); },
         { camera_suite_view_wifi_camera_model_init(model); },
         true);
         true);
 }
 }
 
 
-static void wifi_camera_on_irq_cb(
+static void wifi_camera_callback(
     FuriHalSerialHandle* handle,
     FuriHalSerialHandle* handle,
     FuriHalSerialRxEvent event,
     FuriHalSerialRxEvent event,
     void* wifi_view_instance) {
     void* wifi_view_instance) {
@@ -161,47 +170,27 @@ static void wifi_camera_on_irq_cb(
     furi_assert(wifi_view_instance);
     furi_assert(wifi_view_instance);
 
 
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
     CameraSuiteViewWiFiCamera* instance = wifi_view_instance;
+    CameraSuite* app_instance = instance->context;
 
 
     if(event == FuriHalSerialRxEventData) {
     if(event == FuriHalSerialRxEventData) {
         uint8_t data = furi_hal_serial_async_rx(handle);
         uint8_t data = furi_hal_serial_async_rx(handle);
-        furi_stream_buffer_send(instance->wifi_rx_stream, &data, 1, 0);
-        furi_thread_flags_set(furi_thread_get_id(instance->wifi_worker_thread), WorkerEventRx);
+        furi_stream_buffer_send(app_instance->rx_stream, &data, 1, 0);
+        furi_thread_flags_set(furi_thread_get_id(app_instance->worker_thread), WorkerEventRx);
     }
     }
 }
 }
 
 
 CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
 CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
-    // Allocate memory for the instance
     CameraSuiteViewWiFiCamera* instance = malloc(sizeof(CameraSuiteViewWiFiCamera));
     CameraSuiteViewWiFiCamera* instance = malloc(sizeof(CameraSuiteViewWiFiCamera));
 
 
     // Allocate the view object
     // Allocate the view object
     instance->view = view_alloc();
     instance->view = view_alloc();
 
 
     // Allocate model
     // Allocate model
-    view_allocate_model(
-        instance->view, ViewModelTypeLocking, sizeof(CameraSuiteViewWiFiCameraModel));
+    view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(UartDumpModel));
 
 
-    // Set context for the view (furi_assert crashes in events without this)
+    // Set context for the view
     view_set_context(instance->view, instance);
     view_set_context(instance->view, instance);
 
 
-    // Allocate a stream buffer
-    instance->wifi_rx_stream = furi_stream_buffer_alloc(1024, 1);
-
-    // Allocate a thread for this camera to run on.
-    // @NOTICE: THIS SEEMINGLY BREAKS THE CAMERA VIEW THREAD...
-    FuriThread* thread = furi_thread_alloc_ex(
-        "Camera_Suite_WiFi_Rx_Thread", 1024, camera_suite_wifi_camera_worker, instance);
-    instance->wifi_worker_thread = thread;
-    furi_thread_start(instance->wifi_worker_thread);
-
-    // Set up UART thread.
-    instance->wifi_serial_handle = furi_hal_serial_control_acquire(UART_CH);
-    furi_check(instance->wifi_serial_handle);
-    furi_hal_serial_init(instance->wifi_serial_handle, 230400);
-
-    // Enable UART1 and set the IRQ callback.
-    furi_hal_serial_async_rx_start(
-        instance->wifi_serial_handle, wifi_camera_on_irq_cb, instance, false);
-
     // Set draw callback
     // Set draw callback
     view_set_draw_callback(instance->view, (ViewDrawCallback)camera_suite_view_wifi_camera_draw);
     view_set_draw_callback(instance->view, (ViewDrawCallback)camera_suite_view_wifi_camera_draw);
 
 
@@ -214,9 +203,13 @@ CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
     // Set exit callback
     // Set exit callback
     view_set_exit_callback(instance->view, camera_suite_view_wifi_camera_exit);
     view_set_exit_callback(instance->view, camera_suite_view_wifi_camera_exit);
 
 
+    // Allocate the UART worker thread for the camera.
+    // CameraSuite* app_instance = instance->context;
+    // camera_suite_uart_alloc(app_instance, wifi_camera_callback);
+
     with_view_model(
     with_view_model(
         instance->view,
         instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
+        UartDumpModel * model,
         { camera_suite_view_wifi_camera_model_init(model); },
         { camera_suite_view_wifi_camera_model_init(model); },
         true);
         true);
 
 
@@ -226,23 +219,20 @@ CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
 void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* instance) {
 void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* instance) {
     furi_assert(instance);
     furi_assert(instance);
 
 
+    CameraSuite* app_instance = instance->context;
+
     // Free the worker thread.
     // Free the worker thread.
-    furi_thread_flags_set(furi_thread_get_id(instance->wifi_worker_thread), WorkerEventStop);
-    furi_thread_join(instance->wifi_worker_thread);
-    furi_thread_free(instance->wifi_worker_thread);
+    furi_thread_flags_set(furi_thread_get_id(app_instance->worker_thread), WorkerEventStop);
+    furi_thread_join(app_instance->worker_thread);
+    furi_thread_free(app_instance->worker_thread);
 
 
     // Free the allocated stream buffer.
     // Free the allocated stream buffer.
-    furi_stream_buffer_free(instance->wifi_rx_stream);
+    furi_stream_buffer_free(app_instance->rx_stream);
 
 
-    // Deinitialize the UART.
-    furi_hal_serial_deinit(instance->wifi_serial_handle);
-    furi_hal_serial_control_release(instance->wifi_serial_handle);
+    // camera_suite_uart_free(app_instance);
 
 
     with_view_model(
     with_view_model(
-        instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
-        { furi_string_free(model->log); },
-        true);
+        instance->view, UartDumpModel * model, { furi_string_free(model->log); }, true);
     view_free(instance->view);
     view_free(instance->view);
     free(instance);
     free(instance);
 }
 }

+ 9 - 19
views/camera_suite_view_wifi_camera.h

@@ -1,35 +1,25 @@
 #pragma once
 #pragma once
 
 
-#include <furi_hal.h>
-#include <furi_hal_serial.h>
-#include <furi_hal_serial_control.h>
-
-#include "../helpers/camera_suite_haptic.h"
-#include "../helpers/camera_suite_led.h"
-#include "../helpers/camera_suite_speaker.h"
-#include "../helpers/camera_suite_custom_event.h"
-
 typedef void (*CameraSuiteViewWiFiCameraCallback)(CameraSuiteCustomEvent event, void* context);
 typedef void (*CameraSuiteViewWiFiCameraCallback)(CameraSuiteCustomEvent event, void* context);
 
 
 typedef struct CameraSuiteViewWiFiCamera {
 typedef struct CameraSuiteViewWiFiCamera {
+    CameraSuiteViewWiFiCameraCallback callback;
     View* view;
     View* view;
-    CameraSuiteViewCameraCallback callback;
     void* context;
     void* context;
-    FuriHalSerialHandle* wifi_serial_handle;
-    FuriStreamBuffer* wifi_rx_stream;
-    FuriThread* wifi_worker_thread;
 } CameraSuiteViewWiFiCamera;
 } CameraSuiteViewWiFiCamera;
 
 
-typedef struct {
+typedef struct UartWiFiModel {
     FuriString* log;
     FuriString* log;
     size_t log_strlen;
     size_t log_strlen;
-} CameraSuiteViewWiFiCameraModel;
+} UartWiFiModel;
 
 
-// Function Prototypes
-CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc();
-void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* wifi_view_instance);
-View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* wifi_view_instance);
 void camera_suite_view_wifi_camera_set_callback(
 void camera_suite_view_wifi_camera_set_callback(
     CameraSuiteViewWiFiCamera* wifi_view_instance,
     CameraSuiteViewWiFiCamera* wifi_view_instance,
     CameraSuiteViewWiFiCameraCallback callback,
     CameraSuiteViewWiFiCameraCallback callback,
     void* context);
     void* context);
+
+CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc();
+
+void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* wifi_view_instance);
+
+View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* wifi_view_instance);