Sfoglia il codice sorgente

Use new UART in RC and convert app to c++

Cody Tolene 1 anno fa
parent
commit
6a62353d71

+ 6 - 7
camera_suite.c → camera_suite.cpp

@@ -1,29 +1,28 @@
 #include "camera_suite.h"
-#include <stdlib.h>
 
 bool camera_suite_custom_event_callback(void* context, uint32_t event) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     return scene_manager_handle_custom_event(app->scene_manager, event);
 }
 
 void camera_suite_tick_event_callback(void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     scene_manager_handle_tick_event(app->scene_manager);
 }
 
 // Leave app if back button pressed.
 bool camera_suite_navigation_event_callback(void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     return scene_manager_handle_back_event(app->scene_manager);
 }
 
 CameraSuite* camera_suite_app_alloc() {
-    CameraSuite* app = malloc(sizeof(CameraSuite));
-    app->gui = furi_record_open(RECORD_GUI);
-    app->notification = furi_record_open(RECORD_NOTIFICATION);
+    CameraSuite* app = static_cast<CameraSuite*>(malloc(sizeof(CameraSuite)));
+    app->gui = static_cast<Gui*>(furi_record_open(RECORD_GUI));
+    app->notification = static_cast<NotificationApp*>(furi_record_open(RECORD_NOTIFICATION));
 
     // Turn backlight on.
     notification_message(app->notification, &sequence_display_backlight_on);

+ 9 - 1
camera_suite.h

@@ -1,7 +1,6 @@
 #pragma once
 
 #include <furi.h>
-#include <furi_hal.h>
 #include <gui/gui.h>
 #include <gui/modules/button_menu.h>
 #include <gui/modules/submenu.h>
@@ -19,6 +18,8 @@
 #include "views/camera_suite_view_wifi_camera.h"
 #include "helpers/camera_suite_storage.h"
 
+#define WORKER_EVENTS_MASK (WorkerEventStop | WorkerEventRx)
+
 #define TAG "Camera Suite"
 
 typedef struct {
@@ -89,3 +90,10 @@ typedef enum {
     CameraSuiteLedOff,
     CameraSuiteLedOn,
 } CameraSuiteLedState;
+
+typedef enum {
+    // Reserved for StreamBuffer internal event
+    WorkerEventReserved = (1 << 0),
+    WorkerEventStop = (1 << 1),
+    WorkerEventRx = (1 << 2),
+} WorkerEventFlags;

+ 4 - 4
helpers/camera_suite_haptic.c → helpers/camera_suite_haptic.cpp

@@ -1,8 +1,8 @@
-#include "camera_suite_haptic.h"
 #include "../camera_suite.h"
+#include "camera_suite_haptic.h"
 
 void camera_suite_play_happy_bump(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     if(app->haptic != 1) {
         return;
     }
@@ -12,7 +12,7 @@ void camera_suite_play_happy_bump(void* context) {
 }
 
 void camera_suite_play_bad_bump(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     if(app->haptic != 1) {
         return;
     }
@@ -22,7 +22,7 @@ void camera_suite_play_bad_bump(void* context) {
 }
 
 void camera_suite_play_long_bump(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     if(app->haptic != 1) {
         return;
     }

+ 2 - 0
helpers/camera_suite_haptic.h

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

+ 3 - 3
helpers/camera_suite_led.c → helpers/camera_suite_led.cpp

@@ -1,8 +1,8 @@
-#include "camera_suite_led.h"
 #include "../camera_suite.h"
+#include "camera_suite_led.h"
 
 void camera_suite_led_set_rgb(void* context, int red, int green, int blue) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     if(app->led != 1) {
         return;
     }
@@ -29,7 +29,7 @@ void camera_suite_led_set_rgb(void* context, int red, int green, int blue) {
 }
 
 void camera_suite_led_reset(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     notification_message(app->notification, &sequence_reset_red);
     notification_message(app->notification, &sequence_reset_green);
     notification_message(app->notification, &sequence_reset_blue);

+ 2 - 0
helpers/camera_suite_led.h

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

+ 3 - 3
helpers/camera_suite_speaker.c → helpers/camera_suite_speaker.cpp

@@ -1,10 +1,10 @@
-#include "camera_suite_speaker.h"
 #include "../camera_suite.h"
+#include "camera_suite_speaker.h"
 
 #define NOTE_INPUT 587.33f
 
 void camera_suite_play_input_sound(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     if(app->speaker != 1) {
         return;
     }
@@ -15,7 +15,7 @@ void camera_suite_play_input_sound(void* context) {
 }
 
 void camera_suite_stop_all_sound(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     if(app->speaker != 1) {
         return;
     }

+ 2 - 0
helpers/camera_suite_speaker.h

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

+ 3 - 3
helpers/camera_suite_storage.c → helpers/camera_suite_storage.cpp

@@ -1,7 +1,7 @@
 #include "camera_suite_storage.h"
 
 static Storage* camera_suite_open_storage() {
-    return furi_record_open(RECORD_STORAGE);
+    return static_cast<Storage*>(furi_record_open(RECORD_STORAGE));
 }
 
 static void camera_suite_close_storage() {
@@ -15,7 +15,7 @@ static void camera_suite_close_config_file(FlipperFormat* file) {
 }
 
 void camera_suite_save_settings(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
 
     FURI_LOG_D(TAG, "Saving Settings");
     Storage* storage = camera_suite_open_storage();
@@ -70,7 +70,7 @@ void camera_suite_save_settings(void* context) {
 }
 
 void camera_suite_read_settings(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     Storage* storage = camera_suite_open_storage();
     FlipperFormat* fff_file = flipper_format_file_alloc(storage);
 

+ 2 - 5
helpers/camera_suite_storage.h

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

+ 0 - 0
scenes/camera_suite_scene.c → scenes/camera_suite_scene.cpp


+ 7 - 7
scenes/camera_suite_scene_app_settings.c → scenes/camera_suite_scene_app_settings.cpp

@@ -32,7 +32,7 @@ const uint32_t led_value[2] = {
 };
 
 static void camera_suite_scene_app_settings_set_haptic(VariableItem* item) {
-    CameraSuite* app = variable_item_get_context(item);
+    CameraSuite* app = static_cast<CameraSuite*>(variable_item_get_context(item));
     uint8_t index = variable_item_get_current_value_index(item);
 
     variable_item_set_current_value_text(item, haptic_text[index]);
@@ -40,26 +40,26 @@ static void camera_suite_scene_app_settings_set_haptic(VariableItem* item) {
 }
 
 static void camera_suite_scene_app_settings_set_speaker(VariableItem* item) {
-    CameraSuite* app = variable_item_get_context(item);
+    CameraSuite* app = static_cast<CameraSuite*>(variable_item_get_context(item));
     uint8_t index = variable_item_get_current_value_index(item);
     variable_item_set_current_value_text(item, speaker_text[index]);
     app->speaker = speaker_value[index];
 }
 
 static void camera_suite_scene_app_settings_set_led(VariableItem* item) {
-    CameraSuite* app = variable_item_get_context(item);
+    CameraSuite* app = static_cast<CameraSuite*>(variable_item_get_context(item));
     uint8_t index = variable_item_get_current_value_index(item);
     variable_item_set_current_value_text(item, led_text[index]);
     app->led = led_value[index];
 }
 
 void camera_suite_scene_app_settings_submenu_callback(void* context, uint32_t index) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     view_dispatcher_send_custom_event(app->view_dispatcher, index);
 }
 
 void camera_suite_scene_app_settings_on_enter(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     VariableItem* item;
     uint8_t value_index;
 
@@ -96,7 +96,7 @@ void camera_suite_scene_app_settings_on_enter(void* context) {
 }
 
 bool camera_suite_scene_app_settings_on_event(void* context, SceneManagerEvent event) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     UNUSED(app);
     bool consumed = false;
     if(event.type == SceneManagerEventTypeCustom) {
@@ -105,7 +105,7 @@ bool camera_suite_scene_app_settings_on_event(void* context, SceneManagerEvent e
 }
 
 void camera_suite_scene_app_settings_on_exit(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     variable_item_list_set_selected_item(app->variable_item_list, 0);
     variable_item_list_reset(app->variable_item_list);
 }

+ 8 - 8
scenes/camera_suite_scene_cam_settings.c → scenes/camera_suite_scene_cam_settings.cpp

@@ -50,7 +50,7 @@ const uint32_t jpeg_value[2] = {
 };
 
 static void camera_suite_scene_cam_settings_set_camera_orientation(VariableItem* item) {
-    CameraSuite* app = variable_item_get_context(item);
+    CameraSuite* app = static_cast<CameraSuite*>(variable_item_get_context(item));
     uint8_t index = variable_item_get_current_value_index(item);
 
     variable_item_set_current_value_text(item, orientation_text[index]);
@@ -58,7 +58,7 @@ static void camera_suite_scene_cam_settings_set_camera_orientation(VariableItem*
 }
 
 static void camera_suite_scene_cam_settings_set_camera_dither(VariableItem* item) {
-    CameraSuite* app = variable_item_get_context(item);
+    CameraSuite* app = static_cast<CameraSuite*>(variable_item_get_context(item));
     uint8_t index = variable_item_get_current_value_index(item);
 
     variable_item_set_current_value_text(item, dither_text[index]);
@@ -66,7 +66,7 @@ static void camera_suite_scene_cam_settings_set_camera_dither(VariableItem* item
 }
 
 static void camera_suite_scene_cam_settings_set_flash(VariableItem* item) {
-    CameraSuite* app = variable_item_get_context(item);
+    CameraSuite* app = static_cast<CameraSuite*>(variable_item_get_context(item));
     uint8_t index = variable_item_get_current_value_index(item);
 
     variable_item_set_current_value_text(item, flash_text[index]);
@@ -74,7 +74,7 @@ static void camera_suite_scene_cam_settings_set_flash(VariableItem* item) {
 }
 
 static void camera_suite_scene_cam_settings_set_jpeg(VariableItem* item) {
-    CameraSuite* app = variable_item_get_context(item);
+    CameraSuite* app = static_cast<CameraSuite*>(variable_item_get_context(item));
     uint8_t index = variable_item_get_current_value_index(item);
 
     variable_item_set_current_value_text(item, jpeg_text[index]);
@@ -82,12 +82,12 @@ static void camera_suite_scene_cam_settings_set_jpeg(VariableItem* item) {
 }
 
 void camera_suite_scene_cam_settings_submenu_callback(void* context, uint32_t index) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     view_dispatcher_send_custom_event(app->view_dispatcher, index);
 }
 
 void camera_suite_scene_cam_settings_on_enter(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     VariableItem* item;
     uint8_t value_index;
 
@@ -138,7 +138,7 @@ void camera_suite_scene_cam_settings_on_enter(void* context) {
 }
 
 bool camera_suite_scene_cam_settings_on_event(void* context, SceneManagerEvent event) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     UNUSED(app);
     bool consumed = false;
     if(event.type == SceneManagerEventTypeCustom) {
@@ -147,7 +147,7 @@ bool camera_suite_scene_cam_settings_on_event(void* context, SceneManagerEvent e
 }
 
 void camera_suite_scene_cam_settings_on_exit(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     variable_item_list_set_selected_item(app->variable_item_list, 0);
     variable_item_list_reset(app->variable_item_list);
 }

+ 4 - 4
scenes/camera_suite_scene_camera.c → scenes/camera_suite_scene_camera.cpp

@@ -4,20 +4,20 @@
 
 void camera_suite_view_camera_callback(CameraSuiteCustomEvent event, void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     view_dispatcher_send_custom_event(app->view_dispatcher, event);
 }
 
 void camera_suite_scene_camera_on_enter(void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     camera_suite_view_camera_set_callback(
         app->camera_suite_view_camera, camera_suite_view_camera_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, CameraSuiteViewIdCamera);
 }
 
 bool camera_suite_scene_camera_on_event(void* context, SceneManagerEvent event) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     bool consumed = false;
 
     if(event.type == SceneManagerEventTypeCustom) {
@@ -47,6 +47,6 @@ bool camera_suite_scene_camera_on_event(void* context, SceneManagerEvent event)
 }
 
 void camera_suite_scene_camera_on_exit(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     UNUSED(app);
 }

+ 4 - 4
scenes/camera_suite_scene_guide.c → scenes/camera_suite_scene_guide.cpp

@@ -4,20 +4,20 @@
 
 void camera_suite_view_guide_callback(CameraSuiteCustomEvent event, void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     view_dispatcher_send_custom_event(app->view_dispatcher, event);
 }
 
 void camera_suite_scene_guide_on_enter(void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     camera_suite_view_guide_set_callback(
         app->camera_suite_view_guide, camera_suite_view_guide_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, CameraSuiteViewIdGuide);
 }
 
 bool camera_suite_scene_guide_on_event(void* context, SceneManagerEvent event) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     bool consumed = false;
 
     if(event.type == SceneManagerEventTypeCustom) {
@@ -46,6 +46,6 @@ bool camera_suite_scene_guide_on_event(void* context, SceneManagerEvent event) {
 }
 
 void camera_suite_scene_guide_on_exit(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     UNUSED(app);
 }

+ 4 - 4
scenes/camera_suite_scene_menu.c → scenes/camera_suite_scene_menu.cpp

@@ -14,12 +14,12 @@ enum SubmenuIndex {
 };
 
 void camera_suite_scene_menu_submenu_callback(void* context, uint32_t index) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     view_dispatcher_send_custom_event(app->view_dispatcher, index);
 }
 
 void camera_suite_scene_menu_on_enter(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
 
     submenu_add_item(
         app->submenu,
@@ -63,7 +63,7 @@ void camera_suite_scene_menu_on_enter(void* context) {
 }
 
 bool camera_suite_scene_menu_on_event(void* context, SceneManagerEvent event) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     UNUSED(app);
     if(event.type == SceneManagerEventTypeBack) {
         // Exit application.
@@ -102,6 +102,6 @@ bool camera_suite_scene_menu_on_event(void* context, SceneManagerEvent event) {
 }
 
 void camera_suite_scene_menu_on_exit(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     submenu_reset(app->submenu);
 }

+ 4 - 4
scenes/camera_suite_scene_start.c → scenes/camera_suite_scene_start.cpp

@@ -4,20 +4,20 @@
 
 void camera_suite_scene_start_callback(CameraSuiteCustomEvent event, void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     view_dispatcher_send_custom_event(app->view_dispatcher, event);
 }
 
 void camera_suite_scene_start_on_enter(void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     camera_suite_view_start_set_callback(
         app->camera_suite_view_start, camera_suite_scene_start_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, CameraSuiteViewIdStartscreen);
 }
 
 bool camera_suite_scene_start_on_event(void* context, SceneManagerEvent event) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     bool consumed = false;
 
     if(event.type == SceneManagerEventTypeCustom) {
@@ -50,6 +50,6 @@ bool camera_suite_scene_start_on_event(void* context, SceneManagerEvent event) {
 }
 
 void camera_suite_scene_start_on_exit(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     UNUSED(app);
 }

+ 4 - 4
scenes/camera_suite_scene_wifi_camera.c → scenes/camera_suite_scene_wifi_camera.cpp

@@ -4,20 +4,20 @@
 
 void camera_suite_view_wifi_camera_callback(CameraSuiteCustomEvent event, void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     view_dispatcher_send_custom_event(app->view_dispatcher, event);
 }
 
 void camera_suite_scene_wifi_camera_on_enter(void* context) {
     furi_assert(context);
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     camera_suite_view_wifi_camera_set_callback(
         app->camera_suite_view_wifi_camera, camera_suite_view_wifi_camera_callback, app);
     view_dispatcher_switch_to_view(app->view_dispatcher, CameraSuiteViewIdWiFiCamera);
 }
 
 bool camera_suite_scene_wifi_camera_on_event(void* context, SceneManagerEvent event) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     bool consumed = false;
 
     if(event.type == SceneManagerEventTypeCustom) {
@@ -46,6 +46,6 @@ bool camera_suite_scene_wifi_camera_on_event(void* context, SceneManagerEvent ev
 }
 
 void camera_suite_scene_wifi_camera_on_exit(void* context) {
-    CameraSuite* app = context;
+    CameraSuite* app = static_cast<CameraSuite*>(context);
     UNUSED(app);
 }

+ 123 - 111
views/camera_suite_view_camera.c → views/camera_suite_view_camera.cpp

@@ -1,12 +1,5 @@
 #include "../camera_suite.h"
-#include <furi.h>
-#include <furi_hal.h>
-#include <input/input.h>
-#include <gui/elements.h>
-#include <dolphin/dolphin.h>
-#include "../helpers/camera_suite_haptic.h"
-#include "../helpers/camera_suite_speaker.h"
-#include "../helpers/camera_suite_led.h"
+#include "camera_suite_view_camera.h"
 
 static void draw_pixel_by_orientation(Canvas* canvas, uint8_t x, uint8_t y, uint8_t orientation) {
     furi_assert(canvas);
@@ -36,11 +29,11 @@ static void draw_pixel_by_orientation(Canvas* canvas, uint8_t x, uint8_t y, uint
     }
 }
 
-static void camera_suite_view_camera_draw(Canvas* canvas, void* model) {
+static void camera_suite_view_camera_draw(Canvas* canvas, void* uart_dump_model) {
     furi_assert(canvas);
-    furi_assert(model);
+    furi_assert(uart_dump_model);
 
-    UartDumpModel* uartDumpModel = model;
+    UartDumpModel* model = static_cast<UartDumpModel*>(uart_dump_model);
 
     // Clear the screen.
     canvas_set_color(canvas, ColorBlack);
@@ -53,14 +46,14 @@ static void camera_suite_view_camera_draw(Canvas* canvas, void* model) {
         uint8_t y = p / ROW_BUFFER_LENGTH; // 0 .. 63
 
         for(uint8_t i = 0; i < 8; ++i) {
-            if((uartDumpModel->pixels[p] & (1 << (7 - i))) != 0) {
-                draw_pixel_by_orientation(canvas, (x * 8) + i, y, uartDumpModel->orientation);
+            if((model->pixels[p] & (1 << (7 - i))) != 0) {
+                draw_pixel_by_orientation(canvas, (x * 8) + i, y, model->orientation);
             }
         }
     }
 
     // Draw the pinout guide if the camera is not initialized.
-    if(!uartDumpModel->is_initialized) {
+    if(!model->is_initialized) {
         // Clear the screen.
         canvas_clear(canvas);
 
@@ -156,13 +149,13 @@ static void camera_suite_view_camera_draw(Canvas* canvas, void* model) {
     }
 }
 
-static void save_image_to_flipper_sd_card(void* model) {
-    furi_assert(model);
+static void save_image_to_flipper_sd_card(void* uart_dump_model) {
+    furi_assert(uart_dump_model);
 
-    UartDumpModel* uartDumpModel = model;
+    UartDumpModel* model = static_cast<UartDumpModel*>(uart_dump_model);
 
     // This pointer is used to access the storage.
-    Storage* storage = furi_record_open(RECORD_STORAGE);
+    Storage* storage = static_cast<Storage*>(furi_record_open(RECORD_STORAGE));
 
     // This pointer is used to access the filesystem.
     File* file = storage_file_alloc(storage);
@@ -179,7 +172,7 @@ static void save_image_to_flipper_sd_card(void* model) {
     FuriString* file_name = furi_string_alloc();
 
     // Get the current date and time.
-    FuriHalRtcDateTime datetime = {0};
+    FuriHalRtcDateTime datetime = {};
     furi_hal_rtc_get_datetime(&datetime);
 
     // Create the file name.
@@ -201,9 +194,9 @@ static void save_image_to_flipper_sd_card(void* model) {
     // Free the file name after use.
     furi_string_free(file_name);
 
-    if(!uartDumpModel->is_inverted) {
+    if(!model->is_inverted) {
         for(size_t i = 0; i < FRAME_BUFFER_LENGTH; ++i) {
-            uartDumpModel->pixels[i] = ~uartDumpModel->pixels[i];
+            model->pixels[i] = ~model->pixels[i];
         }
     }
 
@@ -222,7 +215,7 @@ static void save_image_to_flipper_sd_card(void* model) {
         // @todo - Save image based on orientation.
         for(size_t i = 64; i > 0; --i) {
             for(size_t j = 0; j < ROW_BUFFER_LENGTH; ++j) {
-                row_buffer[j] = uartDumpModel->pixels[((i - 1) * ROW_BUFFER_LENGTH) + j];
+                row_buffer[j] = model->pixels[((i - 1) * ROW_BUFFER_LENGTH) + j];
             }
             storage_file_write(file, row_buffer, ROW_BUFFER_LENGTH);
         }
@@ -235,33 +228,33 @@ static void save_image_to_flipper_sd_card(void* model) {
     storage_file_free(file);
 }
 
-static void
-    camera_suite_view_camera_model_init(UartDumpModel* const model, CameraSuite* instance_context) {
+static void camera_suite_view_camera_model_init(UartDumpModel* model, CameraSuite* app_instance) {
     furi_assert(model);
-    furi_assert(instance_context);
+    furi_assert(app_instance);
 
     model->is_dithering_enabled = true;
     model->is_inverted = false;
-    uint32_t orientation = instance_context->orientation;
+    uint32_t orientation = app_instance->orientation;
     model->orientation = orientation;
-
     for(size_t i = 0; i < FRAME_BUFFER_LENGTH; i++) {
         model->pixels[i] = 0;
     }
 }
 
-static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
-    furi_assert(context);
-    furi_assert(event);
+static bool camera_suite_view_camera_input(InputEvent* input_event, void* camera_view_instance) {
+    furi_assert(camera_view_instance);
+    furi_assert(input_event);
 
-    CameraSuiteViewCamera* instance = context;
+    CameraSuiteViewCamera* instance = static_cast<CameraSuiteViewCamera*>(camera_view_instance);
+    uint8_t data[1];
 
-    if(event->type == InputTypeRelease) {
-        switch(event->key) {
-        default: // Stop all sounds, reset the LED.
-            with_view_model(
+    if(input_event->type == InputTypeRelease) {
+        if(input_event->key) {
+            // Stop all sounds, reset the LED.
+            with_view_model_cpp(
                 instance->view,
-                UartDumpModel * model,
+                UartDumpModel*,
+                model,
                 {
                     UNUSED(model);
                     camera_suite_play_bad_bump(instance->context);
@@ -269,19 +262,20 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
                     camera_suite_led_set_rgb(instance->context, 0, 0, 0);
                 },
                 true);
-            break;
         }
-    } else if(event->type == InputTypePress) {
-        switch(event->key) {
+    } else if(input_event->type == InputTypePress) {
+        switch(input_event->key) {
         case InputKeyBack: {
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                UartDumpModel * model,
+                UartDumpModel*,
+                model,
                 {
                     UNUSED(model);
 
                     // Stop camera stream.
-                    furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'s'}, 1);
+                    data[0] = 's';
+                    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
                     furi_delay_ms(50);
 
                     // Go back to the main menu.
@@ -291,9 +285,10 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
             break;
         }
         case InputKeyLeft: {
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                UartDumpModel * model,
+                UartDumpModel*,
+                model,
                 {
                     // Play sound.
                     camera_suite_play_happy_bump(instance->context);
@@ -302,13 +297,15 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
 
                     if(model->is_inverted) {
                         // Camera: Set invert to false on the ESP32-CAM.
-                        furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'i'}, 1);
+                        data[0] = 'i';
+                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
                         furi_delay_ms(50);
 
                         model->is_inverted = false;
                     } else {
                         // Camera: Set invert to true on the ESP32-CAM.
-                        furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'I'}, 1);
+                        data[0] = 'I';
+                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
                         furi_delay_ms(50);
 
                         model->is_inverted = true;
@@ -320,9 +317,10 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
             break;
         }
         case InputKeyRight: {
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                UartDumpModel * model,
+                UartDumpModel*,
+                model,
                 {
                     // Play sound.
                     camera_suite_play_happy_bump(instance->context);
@@ -331,13 +329,15 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
 
                     if(model->is_dithering_enabled) {
                         // Camera: Disable dithering.
-                        furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'d'}, 1);
+                        data[0] = 'd';
+                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
                         furi_delay_ms(50);
 
                         model->is_dithering_enabled = false;
                     } else {
                         // Camera: Enable dithering.
-                        furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'D'}, 1);
+                        data[0] = 'D';
+                        furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
                         furi_delay_ms(50);
 
                         model->is_dithering_enabled = true;
@@ -349,9 +349,10 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
             break;
         }
         case InputKeyUp: {
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                UartDumpModel * model,
+                UartDumpModel*,
+                model,
                 {
                     UNUSED(model);
 
@@ -361,7 +362,8 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
                     camera_suite_led_set_rgb(instance->context, 0, 0, 255);
 
                     // Camera: Increase contrast.
-                    furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'C'}, 1);
+                    data[0] = 'C';
+                    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
                     furi_delay_ms(50);
 
                     instance->callback(CameraSuiteCustomEventSceneCameraUp, instance->context);
@@ -370,9 +372,10 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
             break;
         }
         case InputKeyDown: {
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                UartDumpModel * model,
+                UartDumpModel*,
+                model,
                 {
                     UNUSED(model);
 
@@ -382,7 +385,8 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
                     camera_suite_led_set_rgb(instance->context, 0, 0, 255);
 
                     // Camera: Reduce contrast.
-                    furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'c'}, 1);
+                    data[0] = 'c';
+                    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
                     furi_delay_ms(50);
 
                     instance->callback(CameraSuiteCustomEventSceneCameraDown, instance->context);
@@ -391,9 +395,10 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
             break;
         }
         case InputKeyOk: {
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                UartDumpModel * model,
+                UartDumpModel*,
+                model,
                 {
                     // Play sound.
                     camera_suite_play_long_bump(instance->context);
@@ -401,7 +406,8 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
                     camera_suite_led_set_rgb(instance->context, 0, 0, 255);
 
                     // @todo - Save picture directly to ESP32-CAM.
-                    // furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'P'}, 1);
+                    // data[0] = 'P';
+                    // furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
 
                     // Save currently displayed image to the Flipper Zero SD card.
                     save_image_to_flipper_sd_card(model);
@@ -421,56 +427,60 @@ static bool camera_suite_view_camera_input(InputEvent* event, void* context) {
     return false;
 }
 
-static void camera_suite_view_camera_exit(void* context) {
-    furi_assert(context);
+static void camera_suite_view_camera_exit(void* camera_view_instance) {
+    UNUSED(camera_view_instance);
 }
 
-static void camera_suite_view_camera_enter(void* context) {
-    furi_assert(context);
+static void camera_suite_view_camera_enter(void* camera_view_instance) {
+    furi_assert(camera_view_instance);
 
-    // Get the camera suite instance context.
-    CameraSuiteViewCamera* instance = (CameraSuiteViewCamera*)context;
+    CameraSuiteViewCamera* instance = static_cast<CameraSuiteViewCamera*>(camera_view_instance);
+
+    uint8_t data[1];
 
     // Get the camera suite instance context.
-    CameraSuite* instance_context = instance->context;
+    CameraSuite* app_context = static_cast<CameraSuite*>(instance->context);
 
-    // Start camera stream.
-    furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'S'}, 1);
+    // Start serial stream to Flipper Zero.
+    data[0] = 'S';
+    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
     furi_delay_ms(50);
 
     // Get/set dither type.
-    uint8_t dither_type = instance_context->dither;
-    furi_hal_uart_tx(FuriHalUartIdUSART1, &dither_type, 1);
+    uint8_t dither_type = app_context->dither;
+    furi_hal_serial_tx(instance->camera_serial_handle, &dither_type, 1);
     furi_delay_ms(50);
 
     // Make sure the camera is not inverted.
-    furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'i'}, 1);
+    data[0] = 'i';
+    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
     furi_delay_ms(50);
 
     // 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.
-    uint8_t flash_state = instance_context->flash ? 'F' : 'f';
-    furi_hal_uart_tx(FuriHalUartIdUSART1, &flash_state, 1);
+    data[0] = app_context->flash ? 'F' : 'f';
+    furi_hal_serial_tx(instance->camera_serial_handle, data, 1);
     furi_delay_ms(50);
 
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        UartDumpModel * model,
-        { camera_suite_view_camera_model_init(model, instance_context); },
+        UartDumpModel*,
+        model,
+        { camera_suite_view_camera_model_init(model, app_context); },
         true);
 }
 
-static void camera_on_irq_cb(UartIrqEvent uartIrqEvent, uint8_t data, void* context) {
-    furi_assert(uartIrqEvent);
-    furi_assert(data);
-    furi_assert(context);
+static void camera_on_irq_cb(
+    FuriHalSerialHandle* handle,
+    FuriHalSerialRxEvent event,
+    void* camera_view_instance) {
+    furi_assert(handle);
+    furi_assert(camera_view_instance);
 
-    // Cast `context` to `CameraSuiteViewCamera*` and store it in `instance`.
-    CameraSuiteViewCamera* instance = context;
+    CameraSuiteViewCamera* instance = static_cast<CameraSuiteViewCamera*>(camera_view_instance);
 
-    // If `uartIrqEvent` is `UartIrqEventRXNE`, send the data to the
-    // `camera_rx_stream` and set the `WorkerEventRx` flag.
-    if(uartIrqEvent == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        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);
     }
@@ -524,15 +534,15 @@ static void process_ringbuffer(UartDumpModel* model, uint8_t const byte) {
     }
 }
 
-static int32_t camera_suite_camera_worker(void* context) {
-    furi_assert(context);
+static int32_t camera_suite_camera_worker(void* camera_view_instance) {
+    furi_assert(camera_view_instance);
 
-    CameraSuiteViewCamera* instance = context;
+    CameraSuiteViewCamera* instance = static_cast<CameraSuiteViewCamera*>(camera_view_instance);
 
     while(1) {
         // Wait for any event on the worker thread.
         uint32_t events =
-            furi_thread_flags_wait(CAMERA_WORKER_EVENTS_MASK, FuriFlagWaitAny, FuriWaitForever);
+            furi_thread_flags_wait(WORKER_EVENTS_MASK, FuriFlagWaitAny, FuriWaitForever);
 
         // Check if an error occurred.
         furi_check((events & FuriFlagError) == 0);
@@ -552,9 +562,10 @@ static int32_t camera_suite_camera_worker(void* context) {
                 length =
                     furi_stream_buffer_receive(instance->camera_rx_stream, data, buffer_size, 0);
                 if(length > 0) {
-                    with_view_model(
+                    with_view_model_cpp(
                         instance->view,
-                        UartDumpModel * model,
+                        UartDumpModel*,
+                        model,
                         {
                             // Process the data.
                             for(size_t i = 0; i < length; i++) {
@@ -565,8 +576,8 @@ static int32_t camera_suite_camera_worker(void* context) {
                 }
             } while(length > 0);
 
-            with_view_model(
-                instance->view, UartDumpModel * model, { UNUSED(model); }, true);
+            with_view_model_cpp(
+                instance->view, UartDumpModel*, model, { UNUSED(model); }, true);
         }
     }
 
@@ -575,7 +586,8 @@ static int32_t camera_suite_camera_worker(void* context) {
 
 CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
     // Allocate memory for the instance
-    CameraSuiteViewCamera* instance = malloc(sizeof(CameraSuiteViewCamera));
+    CameraSuiteViewCamera* instance =
+        static_cast<CameraSuiteViewCamera*>(malloc(sizeof(CameraSuiteViewCamera)));
 
     // Allocate the view object
     instance->view = view_alloc();
@@ -607,14 +619,14 @@ CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
     instance->camera_worker_thread = thread;
     furi_thread_start(instance->camera_worker_thread);
 
-    // Disable console.
-    furi_hal_console_disable();
-
-    // 115200 is the default baud rate for the ESP32-CAM.
-    furi_hal_uart_set_br(FuriHalUartIdUSART1, 230400);
+    // 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_uart_set_irq_cb(FuriHalUartIdUSART1, camera_on_irq_cb, instance);
+    furi_hal_serial_async_rx_start(
+        instance->camera_serial_handle, camera_on_irq_cb, instance, false);
 
     return instance;
 }
@@ -622,20 +634,20 @@ CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
 void camera_suite_view_camera_free(CameraSuiteViewCamera* instance) {
     furi_assert(instance);
 
-    // Remove the IRQ callback.
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, NULL, NULL);
-
     // 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);
 
     // Free the allocated stream buffer.
     furi_stream_buffer_free(instance->camera_rx_stream);
 
-    // Re-enable the console.
-    // furi_hal_console_enable();
+    // Deinitialize the UART.
+    furi_hal_serial_deinit(instance->camera_serial_handle);
+    furi_hal_serial_control_release(instance->camera_serial_handle);
 
-    with_view_model(
-        instance->view, UartDumpModel * model, { UNUSED(model); }, true);
+    with_view_model_cpp(
+        instance->view, UartDumpModel*, model, { UNUSED(model); }, true);
     view_free(instance->view);
     free(instance);
 }
@@ -646,11 +658,11 @@ View* camera_suite_view_camera_get_view(CameraSuiteViewCamera* instance) {
 }
 
 void camera_suite_view_camera_set_callback(
-    CameraSuiteViewCamera* instance,
+    CameraSuiteViewCamera* camera_view_instance,
     CameraSuiteViewCameraCallback callback,
     void* context) {
-    furi_assert(instance);
+    furi_assert(camera_view_instance);
     furi_assert(callback);
-    instance->callback = callback;
-    instance->context = context;
+    camera_view_instance->callback = callback;
+    camera_view_instance->context = context;
 }

+ 21 - 23
views/camera_suite_view_camera.h

@@ -1,19 +1,12 @@
 #pragma once
 
-#include <furi.h>
 #include <furi_hal.h>
-#include <furi_hal_uart.h>
-#include <gui/elements.h>
-#include <gui/gui.h>
-#include <gui/icon_i.h>
-#include <gui/modules/dialog_ex.h>
-#include <gui/view.h>
-#include <gui/view_dispatcher.h>
-#include <notification/notification.h>
-#include <notification/notification_messages.h>
-#include <storage/filesystem_api_defines.h>
-#include <storage/storage.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
@@ -26,26 +19,31 @@
 #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};
 
-typedef enum {
-    WorkerEventReserved = (1 << 0), // Reserved for StreamBuffer internal event
-    WorkerEventStop = (1 << 1),
-    WorkerEventRx = (1 << 2),
-} WorkerEventFlags;
-
-#define CAMERA_WORKER_EVENTS_MASK (WorkerEventStop | WorkerEventRx)
-
 // Forward declaration
 typedef void (*CameraSuiteViewCameraCallback)(CameraSuiteCustomEvent event, void* context);
 
 typedef struct CameraSuiteViewCamera {
     CameraSuiteViewCameraCallback callback;
     FuriStreamBuffer* camera_rx_stream;
+    FuriHalSerialHandle* camera_serial_handle;
     FuriThread* camera_worker_thread;
     NotificationApp* notification;
     View* view;
@@ -66,9 +64,9 @@ typedef struct UartDumpModel {
 
 // Function Prototypes
 CameraSuiteViewCamera* camera_suite_view_camera_alloc();
-View* camera_suite_view_camera_get_view(CameraSuiteViewCamera* camera_suite_static);
-void camera_suite_view_camera_free(CameraSuiteViewCamera* camera_suite_static);
+View* camera_suite_view_camera_get_view(CameraSuiteViewCamera* camera_view_instance);
+void camera_suite_view_camera_free(CameraSuiteViewCamera* camera_view_instance);
 void camera_suite_view_camera_set_callback(
-    CameraSuiteViewCamera* camera_suite_view_camera,
+    CameraSuiteViewCamera* camera_view_instance,
     CameraSuiteViewCameraCallback callback,
     void* context);

+ 17 - 12
views/camera_suite_view_guide.c → views/camera_suite_view_guide.cpp

@@ -43,15 +43,18 @@ static void camera_suite_view_guide_model_init(CameraSuiteViewGuideModel* const
     model->some_value = 1;
 }
 
-bool camera_suite_view_guide_input(InputEvent* event, void* context) {
-    furi_assert(context);
-    CameraSuiteViewGuide* instance = context;
+bool camera_suite_view_guide_input(InputEvent* event, void* grid_view_instance) {
+    furi_assert(grid_view_instance);
+
+    CameraSuiteViewGuide* instance = static_cast<CameraSuiteViewGuide*>(grid_view_instance);
+
     if(event->type == InputTypeRelease) {
         switch(event->key) {
         case InputKeyBack:
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                CameraSuiteViewGuideModel * model,
+                CameraSuiteViewGuideModel*,
+                model,
                 {
                     UNUSED(model);
                     // Go back to the main menu.
@@ -79,15 +82,16 @@ void camera_suite_view_guide_exit(void* context) {
 void camera_suite_view_guide_enter(void* context) {
     furi_assert(context);
     CameraSuiteViewGuide* instance = (CameraSuiteViewGuide*)context;
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        CameraSuiteViewGuideModel * model,
+        CameraSuiteViewGuideModel*,
+        model,
         { camera_suite_view_guide_model_init(model); },
         true);
 }
 
 CameraSuiteViewGuide* camera_suite_view_guide_alloc() {
-    CameraSuiteViewGuide* instance = malloc(sizeof(CameraSuiteViewGuide));
+    CameraSuiteViewGuide* instance = (CameraSuiteViewGuide*)malloc(sizeof(CameraSuiteViewGuide));
     instance->view = view_alloc();
     view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(CameraSuiteViewGuideModel));
     view_set_context(instance->view, instance); // furi_assert crashes in events without this
@@ -96,9 +100,10 @@ CameraSuiteViewGuide* camera_suite_view_guide_alloc() {
     view_set_enter_callback(instance->view, camera_suite_view_guide_enter);
     view_set_exit_callback(instance->view, camera_suite_view_guide_exit);
 
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        CameraSuiteViewGuideModel * model,
+        CameraSuiteViewGuideModel*,
+        model,
         { camera_suite_view_guide_model_init(model); },
         true);
 
@@ -108,8 +113,8 @@ CameraSuiteViewGuide* camera_suite_view_guide_alloc() {
 void camera_suite_view_guide_free(CameraSuiteViewGuide* instance) {
     furi_assert(instance);
 
-    with_view_model(
-        instance->view, CameraSuiteViewGuideModel * model, { UNUSED(model); }, true);
+    with_view_model_cpp(
+        instance->view, CameraSuiteViewGuideModel*, model, { UNUSED(model); }, true);
     view_free(instance->view);
     free(instance);
 }

+ 16 - 12
views/camera_suite_view_start.c → views/camera_suite_view_start.cpp

@@ -107,14 +107,15 @@ static void camera_suite_view_start_model_init(CameraSuiteViewStartModel* const
 
 bool camera_suite_view_start_input(InputEvent* event, void* context) {
     furi_assert(context);
-    CameraSuiteViewStart* instance = context;
+    CameraSuiteViewStart* instance = static_cast<CameraSuiteViewStart*>(context);
     if(event->type == InputTypeRelease) {
         switch(event->key) {
         case InputKeyBack:
             // Exit application.
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                CameraSuiteViewStartModel * model,
+                CameraSuiteViewStartModel*,
+                model,
                 {
                     UNUSED(model);
                     instance->callback(CameraSuiteCustomEventStartBack, instance->context);
@@ -123,9 +124,10 @@ bool camera_suite_view_start_input(InputEvent* event, void* context) {
             break;
         case InputKeyOk:
             // Start the application.
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                CameraSuiteViewStartModel * model,
+                CameraSuiteViewStartModel*,
+                model,
                 {
                     UNUSED(model);
                     instance->callback(CameraSuiteCustomEventStartOk, instance->context);
@@ -151,16 +153,17 @@ void camera_suite_view_start_exit(void* context) {
 void camera_suite_view_start_enter(void* context) {
     furi_assert(context);
     CameraSuiteViewStart* instance = (CameraSuiteViewStart*)context;
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        CameraSuiteViewStartModel * model,
+        CameraSuiteViewStartModel*,
+        model,
         { camera_suite_view_start_model_init(model); },
         true);
 }
 
 CameraSuiteViewStart* camera_suite_view_start_alloc() {
     // Allocate memory for the instance
-    CameraSuiteViewStart* instance = malloc(sizeof(CameraSuiteViewStart));
+    CameraSuiteViewStart* instance = (CameraSuiteViewStart*)malloc(sizeof(CameraSuiteViewStart));
 
     // Allocate the view object
     instance->view = view_alloc();
@@ -177,9 +180,10 @@ CameraSuiteViewStart* camera_suite_view_start_alloc() {
     // Set input callback
     view_set_input_callback(instance->view, camera_suite_view_start_input);
 
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        CameraSuiteViewStartModel * model,
+        CameraSuiteViewStartModel*,
+        model,
         { camera_suite_view_start_model_init(model); },
         true);
 
@@ -189,8 +193,8 @@ CameraSuiteViewStart* camera_suite_view_start_alloc() {
 void camera_suite_view_start_free(CameraSuiteViewStart* instance) {
     furi_assert(instance);
 
-    with_view_model(
-        instance->view, CameraSuiteViewStartModel * model, { UNUSED(model); }, true);
+    with_view_model_cpp(
+        instance->view, CameraSuiteViewStartModel*, model, { UNUSED(model); }, true);
     view_free(instance->view);
     free(instance);
 }

+ 86 - 78
views/camera_suite_view_wifi_camera.c → views/camera_suite_view_wifi_camera.cpp

@@ -1,28 +1,12 @@
 #include "../camera_suite.h"
-#include <furi.h>
-#include <furi_hal.h>
-#include <input/input.h>
-#include <gui/elements.h>
-#include <dolphin/dolphin.h>
-#include "../helpers/camera_suite_haptic.h"
-#include "../helpers/camera_suite_speaker.h"
-#include "../helpers/camera_suite_led.h"
+#include "camera_suite_view_wifi_camera.h"
 
-void camera_suite_view_wifi_camera_set_callback(
-    CameraSuiteViewWiFiCamera* instance,
-    CameraSuiteViewWiFiCameraCallback callback,
-    void* context) {
-    furi_assert(instance);
-    furi_assert(callback);
-    instance->callback = callback;
-    instance->context = context;
-}
-
-static void camera_suite_view_wifi_camera_draw(Canvas* canvas, void* model) {
+static void camera_suite_view_wifi_camera_draw(Canvas* canvas, void* wifi_model) {
     furi_assert(canvas);
-    furi_assert(model);
+    furi_assert(wifi_model);
 
-    CameraSuiteViewWiFiCameraModel* instance = model;
+    CameraSuiteViewWiFiCameraModel* model =
+        static_cast<CameraSuiteViewWiFiCameraModel*>(wifi_model);
 
     canvas_clear(canvas);
     canvas_set_color(canvas, ColorBlack);
@@ -32,18 +16,18 @@ static void camera_suite_view_wifi_camera_draw(Canvas* canvas, void* model) {
     canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, "Starting WiFi Stream at:");
 
     // Draw log from camera.
-    canvas_draw_str_aligned(
-        canvas, 3, 13, AlignLeft, AlignTop, furi_string_get_cstr(instance->log));
+    canvas_draw_str_aligned(canvas, 3, 13, AlignLeft, AlignTop, furi_string_get_cstr(model->log));
 }
 
-static int32_t camera_suite_wifi_camera_worker(void* context) {
-    furi_assert(context);
+static int32_t camera_suite_wifi_camera_worker(void* wifi_view_instance) {
+    furi_assert(wifi_view_instance);
 
-    CameraSuiteViewWiFiCamera* instance = context;
+    CameraSuiteViewWiFiCamera* instance =
+        static_cast<CameraSuiteViewWiFiCamera*>(wifi_view_instance);
 
     while(1) {
         uint32_t events =
-            furi_thread_flags_wait(WIFI_WORKER_EVENTS_MASK, FuriFlagWaitAny, FuriWaitForever);
+            furi_thread_flags_wait(WORKER_EVENTS_MASK, FuriFlagWaitAny, FuriWaitForever);
 
         // Check if an error occurred.
         furi_check((events & FuriFlagError) == 0);
@@ -61,9 +45,10 @@ static int32_t camera_suite_wifi_camera_worker(void* context) {
                 if(length > 0) {
                     data[length] = '\0';
 
-                    with_view_model(
+                    with_view_model_cpp(
                         instance->view,
-                        CameraSuiteViewWiFiCameraModel * model,
+                        CameraSuiteViewWiFiCameraModel*,
+                        model,
                         {
                             furi_string_cat_printf(model->log, "%s", data);
 
@@ -78,26 +63,30 @@ static int32_t camera_suite_wifi_camera_worker(void* context) {
                 }
             } while(length > 0);
 
-            with_view_model(
-                instance->view, CameraSuiteViewWiFiCameraModel * model, { UNUSED(model); }, true);
+            with_view_model_cpp(
+                instance->view, CameraSuiteViewWiFiCameraModel*, model, { UNUSED(model); }, true);
         }
     }
 
     return 0;
 }
 
-static bool camera_suite_view_wifi_camera_input(InputEvent* event, void* context) {
-    furi_assert(context);
-    furi_assert(event);
+static bool
+    camera_suite_view_wifi_camera_input(InputEvent* input_event, void* wifi_view_instance) {
+    furi_assert(wifi_view_instance);
+    furi_assert(input_event);
 
-    CameraSuiteViewWiFiCamera* instance = context;
+    CameraSuiteViewWiFiCamera* instance =
+        static_cast<CameraSuiteViewWiFiCamera*>(wifi_view_instance);
+    uint8_t data[1];
 
-    if(event->type == InputTypeRelease) {
-        switch(event->key) {
+    if(input_event->type == InputTypeRelease) {
+        switch(input_event->key) {
         default:
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                CameraSuiteViewWiFiCameraModel * model,
+                CameraSuiteViewWiFiCameraModel*,
+                model,
                 {
                     UNUSED(model);
                     // Stop all sounds, reset the LED.
@@ -108,17 +97,19 @@ static bool camera_suite_view_wifi_camera_input(InputEvent* event, void* context
                 true);
             break;
         }
-    } else if(event->type == InputTypePress) {
-        switch(event->key) {
+    } else if(input_event->type == InputTypePress) {
+        switch(input_event->key) {
         case InputKeyBack: {
-            with_view_model(
+            with_view_model_cpp(
                 instance->view,
-                CameraSuiteViewWiFiCameraModel * model,
+                CameraSuiteViewWiFiCameraModel*,
+                model,
                 {
                     UNUSED(model);
 
                     // Stop camera WiFi stream.
-                    furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'w'}, 1);
+                    data[0] = 'w';
+                    furi_hal_serial_tx(instance->wifi_serial_handle, data, 1);
                     furi_delay_ms(50);
 
                     // Go back to the main menu.
@@ -142,8 +133,8 @@ static bool camera_suite_view_wifi_camera_input(InputEvent* event, void* context
     return false;
 }
 
-static void camera_suite_view_wifi_camera_exit(void* context) {
-    furi_assert(context);
+static void camera_suite_view_wifi_camera_exit(void* wifi_view_instance) {
+    UNUSED(wifi_view_instance);
 }
 
 static void camera_suite_view_wifi_camera_model_init(CameraSuiteViewWiFiCameraModel* const model) {
@@ -151,33 +142,37 @@ static void camera_suite_view_wifi_camera_model_init(CameraSuiteViewWiFiCameraMo
     furi_string_reserve(model->log, 4096);
 }
 
-static void camera_suite_view_wifi_camera_enter(void* context) {
-    furi_assert(context);
+static void camera_suite_view_wifi_camera_enter(void* wifi_view_instance) {
+    furi_assert(wifi_view_instance);
 
-    // Get the camera suite instance context.
-    CameraSuiteViewWiFiCamera* instance = (CameraSuiteViewWiFiCamera*)context;
+    CameraSuiteViewWiFiCamera* instance =
+        static_cast<CameraSuiteViewWiFiCamera*>(wifi_view_instance);
 
     // Start wifi camera stream.
-    furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'W'}, 1);
+    uint8_t data[1] = {'W'};
+    furi_hal_serial_tx(instance->wifi_serial_handle, data, 1);
+    furi_delay_ms(50);
 
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
+        CameraSuiteViewWiFiCameraModel*,
+        model,
         { camera_suite_view_wifi_camera_model_init(model); },
         true);
 }
 
-static void wifi_camera_on_irq_cb(UartIrqEvent uartIrqEvent, uint8_t data, void* context) {
-    furi_assert(uartIrqEvent);
-    furi_assert(data);
-    furi_assert(context);
+static void wifi_camera_on_irq_cb(
+    FuriHalSerialHandle* handle,
+    FuriHalSerialRxEvent event,
+    void* wifi_view_instance) {
+    furi_assert(handle);
+    furi_assert(wifi_view_instance);
 
-    // Cast `context` to `CameraSuiteViewWiFiCamera*` and store it in `instance`.
-    CameraSuiteViewWiFiCamera* instance = context;
+    CameraSuiteViewWiFiCamera* instance =
+        static_cast<CameraSuiteViewWiFiCamera*>(wifi_view_instance);
 
-    // If `uartIrqEvent` is `UartIrqEventRXNE`, send the data to the
-    // `wifi_rx_stream` and set the `WorkerEventRx` flag.
-    if(uartIrqEvent == UartIrqEventRXNE) {
+    if(event == FuriHalSerialRxEventData) {
+        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);
     }
@@ -185,7 +180,8 @@ static void wifi_camera_on_irq_cb(UartIrqEvent uartIrqEvent, uint8_t data, void*
 
 CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
     // Allocate memory for the instance
-    CameraSuiteViewWiFiCamera* instance = malloc(sizeof(CameraSuiteViewWiFiCamera));
+    CameraSuiteViewWiFiCamera* instance =
+        (CameraSuiteViewWiFiCamera*)malloc(sizeof(CameraSuiteViewWiFiCamera));
 
     // Allocate the view object
     instance->view = view_alloc();
@@ -207,14 +203,14 @@ CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
     instance->wifi_worker_thread = thread;
     furi_thread_start(instance->wifi_worker_thread);
 
-    // Disable console.
-    furi_hal_console_disable();
-
-    // 115200 is the default baud rate for the ESP32-CAM.
-    furi_hal_uart_set_br(FuriHalUartIdUSART1, 230400);
+    // 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_uart_set_irq_cb(FuriHalUartIdUSART1, wifi_camera_on_irq_cb, instance);
+    furi_hal_serial_async_rx_start(
+        instance->wifi_serial_handle, wifi_camera_on_irq_cb, instance, false);
 
     // Set draw callback
     view_set_draw_callback(instance->view, (ViewDrawCallback)camera_suite_view_wifi_camera_draw);
@@ -228,9 +224,10 @@ CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
     // Set exit callback
     view_set_exit_callback(instance->view, camera_suite_view_wifi_camera_exit);
 
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
+        CameraSuiteViewWiFiCameraModel*,
+        model,
         { camera_suite_view_wifi_camera_model_init(model); },
         true);
 
@@ -240,21 +237,22 @@ CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
 void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* instance) {
     furi_assert(instance);
 
-    // Remove the IRQ callback.
-    furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, NULL, NULL);
-
     // 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);
 
     // Free the allocated stream buffer.
     furi_stream_buffer_free(instance->wifi_rx_stream);
 
-    // Re-enable the console.
-    furi_hal_console_enable();
+    // Deinitialize the UART.
+    furi_hal_serial_deinit(instance->wifi_serial_handle);
+    furi_hal_serial_control_release(instance->wifi_serial_handle);
 
-    with_view_model(
+    with_view_model_cpp(
         instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
+        CameraSuiteViewWiFiCameraModel*,
+        model,
         { furi_string_free(model->log); },
         true);
     view_free(instance->view);
@@ -265,3 +263,13 @@ View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* instance
     furi_assert(instance);
     return instance->view;
 }
+
+void camera_suite_view_wifi_camera_set_callback(
+    CameraSuiteViewWiFiCamera* instance,
+    CameraSuiteViewWiFiCameraCallback callback,
+    void* context) {
+    furi_assert(instance);
+    furi_assert(callback);
+    instance->callback = callback;
+    instance->context = context;
+}

+ 10 - 22
views/camera_suite_view_wifi_camera.h

@@ -1,31 +1,21 @@
 #pragma once
 
-#include <gui/modules/text_box.h>
-
-#include <furi.h>
 #include <furi_hal.h>
-#include <furi_hal_uart.h>
-#include <gui/elements.h>
-#include <gui/gui.h>
-#include <gui/icon_i.h>
-#include <gui/modules/dialog_ex.h>
-#include <gui/view.h>
-#include <gui/view_dispatcher.h>
-#include <notification/notification.h>
-#include <notification/notification_messages.h>
-#include <storage/filesystem_api_defines.h>
-#include <storage/storage.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 WIFI_WORKER_EVENTS_MASK (WorkerEventStop | WorkerEventRx)
-
 typedef void (*CameraSuiteViewWiFiCameraCallback)(CameraSuiteCustomEvent event, void* context);
 
 typedef struct CameraSuiteViewWiFiCamera {
     View* view;
     CameraSuiteViewCameraCallback callback;
     void* context;
+    FuriHalSerialHandle* wifi_serial_handle;
     FuriStreamBuffer* wifi_rx_stream;
     FuriThread* wifi_worker_thread;
 } CameraSuiteViewWiFiCamera;
@@ -35,13 +25,11 @@ typedef struct {
     size_t log_strlen;
 } CameraSuiteViewWiFiCameraModel;
 
+// Function Prototypes
 CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc();
-
-View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* camera_suite_static);
-
-void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* camera_suite_static);
-
+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(
-    CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera,
+    CameraSuiteViewWiFiCamera* wifi_view_instance,
     CameraSuiteViewWiFiCameraCallback callback,
     void* context);