Просмотр исходного кода

Merge camera_suite from https://github.com/CodyTolene/Flipper-Zero-Camera-Suite

# Conflicts:
#	camera_suite/application.fam
#	camera_suite/helpers/camera_suite_storage.c
#	camera_suite/views/camera_suite_view_camera.c
#	camera_suite/views/camera_suite_view_camera.h
#	camera_suite/views/camera_suite_view_wifi_camera.h
Willy-JL 1 год назад
Родитель
Сommit
6b41446110

+ 1 - 1
camera_suite/application.fam

@@ -7,7 +7,7 @@ App(
     fap_category="GPIO",
     fap_description="A camera suite application for the Flipper Zero ESP32-CAM module.",
     fap_icon="icons/camera_suite.png",
-    fap_version="1.6",
+    fap_version="1.7",
     fap_weburl="https://github.com/CodyTolene/Flipper-Zero-Cam",
     name="[ESP32] Camera Suite",
     order=1,

+ 0 - 0
camera_suite/assets/.gitkeep


+ 0 - 8
camera_suite/camera_suite.c

@@ -72,12 +72,6 @@ CameraSuite* camera_suite_app_alloc() {
         CameraSuiteViewIdCamera,
         camera_suite_view_camera_get_view(app->camera_suite_view_camera));
 
-    app->camera_suite_view_wifi_camera = camera_suite_view_wifi_camera_alloc();
-    view_dispatcher_add_view(
-        app->view_dispatcher,
-        CameraSuiteViewIdWiFiCamera,
-        camera_suite_view_wifi_camera_get_view(app->camera_suite_view_wifi_camera));
-
     app->camera_suite_view_guide = camera_suite_view_guide_alloc();
     view_dispatcher_add_view(
         app->view_dispatcher,
@@ -111,7 +105,6 @@ void camera_suite_app_free(CameraSuite* app) {
     view_dispatcher_remove_view(app->view_dispatcher, CameraSuiteViewIdStartscreen);
     view_dispatcher_remove_view(app->view_dispatcher, CameraSuiteViewIdMenu);
     view_dispatcher_remove_view(app->view_dispatcher, CameraSuiteViewIdCamera);
-    view_dispatcher_remove_view(app->view_dispatcher, CameraSuiteViewIdWiFiCamera);
     view_dispatcher_remove_view(app->view_dispatcher, CameraSuiteViewIdGuide);
     view_dispatcher_remove_view(app->view_dispatcher, CameraSuiteViewIdAppSettings);
     view_dispatcher_remove_view(app->view_dispatcher, CameraSuiteViewIdCamSettings);
@@ -123,7 +116,6 @@ void camera_suite_app_free(CameraSuite* app) {
     // Free remaining resources
     camera_suite_view_start_free(app->camera_suite_view_start);
     camera_suite_view_camera_free(app->camera_suite_view_camera);
-    camera_suite_view_wifi_camera_free(app->camera_suite_view_wifi_camera);
     camera_suite_view_guide_free(app->camera_suite_view_guide);
 
     button_menu_free(app->button_menu);

+ 0 - 3
camera_suite/camera_suite.h

@@ -16,7 +16,6 @@
 #include "views/camera_suite_view_guide.h"
 #include "views/camera_suite_view_start.h"
 #include "views/camera_suite_view_camera.h"
-#include "views/camera_suite_view_wifi_camera.h"
 #include "helpers/camera_suite_storage.h"
 
 #include <assets_icons.h>
@@ -32,7 +31,6 @@ typedef struct {
     VariableItemList* variable_item_list;
     CameraSuiteViewStart* camera_suite_view_start;
     CameraSuiteViewCamera* camera_suite_view_camera;
-    CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera;
     CameraSuiteViewGuide* camera_suite_view_guide;
     uint32_t orientation;
     uint32_t dither;
@@ -48,7 +46,6 @@ typedef enum {
     CameraSuiteViewIdStartscreen,
     CameraSuiteViewIdMenu,
     CameraSuiteViewIdCamera,
-    CameraSuiteViewIdWiFiCamera,
     CameraSuiteViewIdGuide,
     CameraSuiteViewIdAppSettings,
     CameraSuiteViewIdCamSettings,

+ 5 - 0
camera_suite/docs/CHANGELOG.md

@@ -5,6 +5,11 @@
 - Full screen 90 degree and 270 degree fill (#6).
 - WiFi streaming/connection support (#35).
 
+## v1.7
+
+- Add support for new Flipper Zero Firmware UART updates.
+- Remove staged WiFi streaming/connection support for now. Until I can fully test.
+
 ## v1.6
 
 - Add new splash/start screen.

+ 0 - 7
camera_suite/helpers/camera_suite_custom_event.h

@@ -15,13 +15,6 @@ typedef enum {
     CameraSuiteCustomEventSceneCameraRight,
     CameraSuiteCustomEventSceneCameraOk,
     CameraSuiteCustomEventSceneCameraBack,
-    // Scene events: WiFi Camera
-    CameraSuiteCustomEventSceneWiFiCameraUp,
-    CameraSuiteCustomEventSceneWiFiCameraDown,
-    CameraSuiteCustomEventSceneWiFiCameraLeft,
-    CameraSuiteCustomEventSceneWiFiCameraRight,
-    CameraSuiteCustomEventSceneWiFiCameraOk,
-    CameraSuiteCustomEventSceneWiFiCameraBack,
     // Scene events: Guide
     CameraSuiteCustomEventSceneGuideUp,
     CameraSuiteCustomEventSceneGuideDown,

+ 0 - 2
camera_suite/helpers/camera_suite_storage.c

@@ -98,8 +98,6 @@ void camera_suite_read_settings(void* context) {
     }
     furi_string_free(temp_str);
 
-    furi_string_free(temp_str);
-
     if(file_version < BOILERPLATE_SETTINGS_FILE_VERSION) {
         FURI_LOG_I(TAG, "old config version, will be removed.");
         camera_suite_close_config_file(fff_file);

+ 0 - 1
camera_suite/scenes/camera_suite_scene_config.h

@@ -1,7 +1,6 @@
 ADD_SCENE(camera_suite, start, Start)
 ADD_SCENE(camera_suite, menu, Menu)
 ADD_SCENE(camera_suite, camera, Camera)
-ADD_SCENE(camera_suite, wifi_camera, WiFiCamera)
 ADD_SCENE(camera_suite, guide, Guide)
 ADD_SCENE(camera_suite, app_settings, AppSettings)
 ADD_SCENE(camera_suite, cam_settings, CamSettings)

+ 0 - 14
camera_suite/scenes/camera_suite_scene_menu.c

@@ -3,8 +3,6 @@
 enum SubmenuIndex {
     /** Camera. */
     SubmenuIndexSceneCamera = 10,
-    /** WiFi Camera */
-    SubmenuIndexSceneWiFiCamera,
     /** Cam settings menu. */
     SubmenuIndexCamSettings,
     /** App settings menu. */
@@ -28,13 +26,6 @@ void camera_suite_scene_menu_on_enter(void* context) {
         camera_suite_scene_menu_submenu_callback,
         app);
 
-    submenu_add_item(
-        app->submenu,
-        "Stream Camera to WiFi",
-        SubmenuIndexSceneWiFiCamera,
-        camera_suite_scene_menu_submenu_callback,
-        app);
-
     submenu_add_item(
         app->submenu,
         "Camera Settings",
@@ -76,11 +67,6 @@ bool camera_suite_scene_menu_on_event(void* context, SceneManagerEvent event) {
                 app->scene_manager, CameraSuiteSceneMenu, SubmenuIndexSceneCamera);
             scene_manager_next_scene(app->scene_manager, CameraSuiteSceneCamera);
             return true;
-        } else if(event.event == SubmenuIndexSceneWiFiCamera) {
-            scene_manager_set_scene_state(
-                app->scene_manager, CameraSuiteSceneMenu, SubmenuIndexSceneWiFiCamera);
-            scene_manager_next_scene(app->scene_manager, CameraSuiteSceneWiFiCamera);
-            return true;
         } else if(event.event == SubmenuIndexAppSettings) {
             scene_manager_set_scene_state(
                 app->scene_manager, CameraSuiteSceneMenu, SubmenuIndexAppSettings);

+ 0 - 51
camera_suite/scenes/camera_suite_scene_wifi_camera.c

@@ -1,51 +0,0 @@
-#include "../camera_suite.h"
-#include "../helpers/camera_suite_custom_event.h"
-#include "../views/camera_suite_view_wifi_camera.h"
-
-void camera_suite_view_wifi_camera_callback(CameraSuiteCustomEvent event, void* context) {
-    furi_assert(context);
-    CameraSuite* app = 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;
-    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;
-    bool consumed = false;
-
-    if(event.type == SceneManagerEventTypeCustom) {
-        switch(event.event) {
-        case CameraSuiteCustomEventSceneWiFiCameraLeft:
-        case CameraSuiteCustomEventSceneWiFiCameraRight:
-        case CameraSuiteCustomEventSceneWiFiCameraUp:
-        case CameraSuiteCustomEventSceneWiFiCameraDown:
-            // Do nothing.
-            break;
-        case CameraSuiteCustomEventSceneWiFiCameraBack:
-            notification_message(app->notification, &sequence_reset_red);
-            notification_message(app->notification, &sequence_reset_green);
-            notification_message(app->notification, &sequence_reset_blue);
-            if(!scene_manager_search_and_switch_to_previous_scene(
-                   app->scene_manager, CameraSuiteSceneMenu)) {
-                scene_manager_stop(app->scene_manager);
-                view_dispatcher_stop(app->view_dispatcher);
-            }
-            consumed = true;
-            break;
-        }
-    }
-
-    return consumed;
-}
-
-void camera_suite_scene_wifi_camera_on_exit(void* context) {
-    CameraSuite* app = context;
-    UNUSED(app);
-}

+ 18 - 6
camera_suite/views/camera_suite_view_camera.c

@@ -179,10 +179,20 @@ static void save_image_to_flipper_sd_card(void* model) {
     FuriString* file_name = furi_string_alloc();
 
     // Get the current date and time.
+
+    // Not supported in "Release" F0 build.
+    // TODO: Remove when DateTime is supported in "Release" F0 build.
+    // FuriHalRtcDateTime datetime = {0};
+
+    // Only supported in "RC" & "Dev" builds.
+    // TODO: Uncomment when DateTime is supported in "Release" F0 build.
     DateTime datetime = {0};
+
+    // TODO: Uncomment when DateTime is supported in "Release" F0 build.
     furi_hal_rtc_get_datetime(&datetime);
 
-    // Create the file name.
+    // Create the file name using DateTime.
+    // TODO: Uncomment when DateTime is supported in "Release" F0 build.
     furi_string_printf(
         file_name,
         EXT_PATH("DCIM/%.4d%.2d%.2d-%.2d%.2d%.2d.bmp"),
@@ -193,6 +203,10 @@ static void save_image_to_flipper_sd_card(void* model) {
         datetime.minute,
         datetime.second);
 
+    // Just use a random number for now instead of DateTime.
+    // int random_number = rand();
+    // furi_string_printf(file_name, EXT_PATH("DCIM/%d.bmp"), random_number);
+
     // Open the file for writing. If the file does not exist (it shouldn't),
     // create it.
     bool result =
@@ -468,8 +482,6 @@ static void
     // Cast `context` to `CameraSuiteViewCamera*` and store it in `instance`.
     CameraSuiteViewCamera* instance = context;
 
-    // If `uartIrqEvent` is `UartIrqEventRXNE`, send the data to the
-    // `camera_rx_stream` and set the `WorkerEventRx` flag.
     if(event == FuriHalSerialRxEventData) {
         uint8_t data = furi_hal_serial_async_rx(handle);
         furi_stream_buffer_send(instance->camera_rx_stream, &data, 1, 0);
@@ -608,12 +620,12 @@ CameraSuiteViewCamera* camera_suite_view_camera_alloc() {
     instance->camera_worker_thread = thread;
     furi_thread_start(instance->camera_worker_thread);
 
-    // 115200 is the default baud rate for the ESP32-CAM.
+    // Allocate the serial handle for the camera.
     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.
+    // Start the asynchronous receive.
     furi_hal_serial_async_rx_start(instance->serial_handle, camera_on_irq_cb, instance, false);
 
     return instance;
@@ -630,7 +642,7 @@ void camera_suite_view_camera_free(CameraSuiteViewCamera* instance) {
     // Free the allocated stream buffer.
     furi_stream_buffer_free(instance->camera_rx_stream);
 
-    // Re-enable the console.
+    // Deinitialize the serial handle and release the control.
     furi_hal_serial_deinit(instance->serial_handle);
     furi_hal_serial_control_release(instance->serial_handle);
 

+ 18 - 1
camera_suite/views/camera_suite_view_camera.h

@@ -17,9 +17,26 @@
 
 #include "../helpers/camera_suite_custom_event.h"
 
+#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)
+#elif defined momentum_settings
+/**
+ * Enable the following line for "Momentum Firmware" & "Momentum Apps".
+ * 
+ * @see https://github.com/Next-Flip/Momentum-Firmware
+ * @see https://github.com/Next-Flip/Momentum-Apps
+*/
 #include <momentum/momentum.h>
-
 #define UART_CH (momentum_settings.uart_esp_channel)
+#else
+#define UART_CH (FuriHalSerialIdUsart)
+#endif
 
 #define BITMAP_HEADER_LENGTH 62
 #define FRAME_BIT_DEPTH 1

+ 0 - 170
camera_suite/views/camera_suite_view_wifi_camera.c

@@ -1,170 +0,0 @@
-#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"
-
-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) {
-    furi_assert(canvas);
-    furi_assert(model);
-
-    CameraSuiteViewWiFiCameraModel* instance = model;
-
-    canvas_clear(canvas);
-    canvas_set_color(canvas, ColorBlack);
-    canvas_set_font(canvas, FontSecondary);
-    canvas_draw_frame(canvas, 0, 0, FRAME_WIDTH, FRAME_HEIGHT);
-
-    canvas_draw_str_aligned(canvas, 3, 3, AlignLeft, AlignTop, "Feature coming soon!");
-
-    // Draw log from camera.
-    canvas_draw_str_aligned(
-        canvas, 3, 13, AlignLeft, AlignTop, furi_string_get_cstr(instance->log));
-}
-
-static bool camera_suite_view_wifi_camera_input(InputEvent* event, void* context) {
-    furi_assert(context);
-    furi_assert(event);
-
-    CameraSuiteViewWiFiCamera* instance = context;
-
-    if(event->type == InputTypeRelease) {
-        switch(event->key) {
-        default:
-            with_view_model(
-                instance->view,
-                CameraSuiteViewWiFiCameraModel * model,
-                {
-                    UNUSED(model);
-                    // Stop all sounds, reset the LED.
-                    camera_suite_play_bad_bump(instance->context);
-                    camera_suite_stop_all_sound(instance->context);
-                    camera_suite_led_set_rgb(instance->context, 0, 0, 0);
-                },
-                true);
-            break;
-        }
-    } else if(event->type == InputTypePress) {
-        switch(event->key) {
-        case InputKeyBack: {
-            with_view_model(
-                instance->view,
-                CameraSuiteViewWiFiCameraModel * model,
-                {
-                    UNUSED(model);
-
-                    // Stop camera WiFi stream.
-                    // furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'w'}, 1);
-                    // furi_delay_ms(50);
-
-                    // Go back to the main menu.
-                    instance->callback(CameraSuiteCustomEventSceneCameraBack, instance->context);
-                },
-                true);
-            break;
-        }
-        case InputKeyLeft:
-        case InputKeyRight:
-        case InputKeyUp:
-        case InputKeyDown:
-        case InputKeyOk:
-        case InputKeyMAX:
-        default: {
-            break;
-        }
-        }
-    }
-
-    return false;
-}
-
-static void camera_suite_view_wifi_camera_exit(void* context) {
-    furi_assert(context);
-}
-
-static void camera_suite_view_wifi_camera_model_init(CameraSuiteViewWiFiCameraModel* const model) {
-    model->log = furi_string_alloc();
-    furi_string_reserve(model->log, 4096);
-}
-
-static void camera_suite_view_wifi_camera_enter(void* context) {
-    furi_assert(context);
-
-    // Get the camera suite instance context.
-    CameraSuiteViewWiFiCamera* instance = (CameraSuiteViewWiFiCamera*)context;
-
-    // Start wifi camera stream.
-    // furi_hal_uart_tx(FuriHalUartIdUSART1, (uint8_t[]){'W'}, 1);
-
-    with_view_model(
-        instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
-        { camera_suite_view_wifi_camera_model_init(model); },
-        true);
-}
-
-CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera_alloc() {
-    // Allocate memory for the instance
-    CameraSuiteViewWiFiCamera* instance = malloc(sizeof(CameraSuiteViewWiFiCamera));
-
-    // Allocate the view object
-    instance->view = view_alloc();
-
-    // Allocate model
-    view_allocate_model(
-        instance->view, ViewModelTypeLocking, sizeof(CameraSuiteViewWiFiCameraModel));
-
-    // Set context for the view (furi_assert crashes in events without this)
-    view_set_context(instance->view, instance);
-
-    // Set draw callback
-    view_set_draw_callback(instance->view, (ViewDrawCallback)camera_suite_view_wifi_camera_draw);
-
-    // Set input callback
-    view_set_input_callback(instance->view, camera_suite_view_wifi_camera_input);
-
-    // Set enter callback
-    view_set_enter_callback(instance->view, camera_suite_view_wifi_camera_enter);
-
-    // Set exit callback
-    view_set_exit_callback(instance->view, camera_suite_view_wifi_camera_exit);
-
-    with_view_model(
-        instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
-        { camera_suite_view_wifi_camera_model_init(model); },
-        true);
-
-    return instance;
-}
-
-void camera_suite_view_wifi_camera_free(CameraSuiteViewWiFiCamera* instance) {
-    furi_assert(instance);
-
-    with_view_model(
-        instance->view,
-        CameraSuiteViewWiFiCameraModel * model,
-        { furi_string_free(model->log); },
-        true);
-    view_free(instance->view);
-    free(instance);
-}
-
-View* camera_suite_view_wifi_camera_get_view(CameraSuiteViewWiFiCamera* instance) {
-    furi_assert(instance);
-    return instance->view;
-}

+ 0 - 41
camera_suite/views/camera_suite_view_wifi_camera.h

@@ -1,41 +0,0 @@
-#pragma once
-
-#include <gui/modules/text_box.h>
-
-#include <furi.h>
-#include <furi_hal.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 "../helpers/camera_suite_custom_event.h"
-
-typedef void (*CameraSuiteViewWiFiCameraCallback)(CameraSuiteCustomEvent event, void* context);
-
-typedef struct CameraSuiteViewWiFiCamera {
-    View* view;
-    CameraSuiteViewCameraCallback callback;
-    void* context;
-} CameraSuiteViewWiFiCamera;
-
-typedef struct {
-    FuriString* log;
-} CameraSuiteViewWiFiCameraModel;
-
-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_set_callback(
-    CameraSuiteViewWiFiCamera* camera_suite_view_wifi_camera,
-    CameraSuiteViewWiFiCameraCallback callback,
-    void* context);