فهرست منبع

[FL-2692, FL-2604, FL-2632] New first start sequence (#1456)

* desktop: restored automatic power off & manual power off on slideshow view; assets: added frames for new first start sequence; docs: added info on slideshow compilation
* desktop: restarting long timer on OK button release

Co-authored-by: あく <alleteam@gmail.com>
hedger 3 سال پیش
والد
کامیت
3fa5e18c5a

+ 8 - 0
applications/desktop/scenes/desktop_scene_slideshow.c

@@ -3,6 +3,7 @@
 #include "../desktop_i.h"
 #include "../views/desktop_view_slideshow.h"
 #include "../views/desktop_events.h"
+#include <power/power_service/power.h>
 
 void desktop_scene_slideshow_callback(DesktopEvent event, void* context) {
     Desktop* desktop = (Desktop*)context;
@@ -22,6 +23,7 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) {
     Desktop* desktop = (Desktop*)context;
     bool consumed = false;
     Storage* storage = NULL;
+    Power* power = NULL;
 
     if(event.type == SceneManagerEventTypeCustom) {
         switch(event.event) {
@@ -32,6 +34,12 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) {
             scene_manager_previous_scene(desktop->scene_manager);
             consumed = true;
             break;
+        case DesktopSlideshowPoweroff:
+            power = furi_record_open(RECORD_POWER);
+            power_off(power);
+            furi_record_close(RECORD_POWER);
+            consumed = true;
+            break;
 
         default:
             break;

+ 1 - 0
applications/desktop/views/desktop_events.h

@@ -35,6 +35,7 @@ typedef enum {
     DesktopAnimationEventInteractAnimation,
 
     DesktopSlideshowCompleted,
+    DesktopSlideshowPoweroff,
 
     // Global events
     DesktopGlobalBeforeAppStarted,

+ 27 - 1
applications/desktop/views/desktop_view_slideshow.c

@@ -2,15 +2,19 @@
 #include <furi_hal.h>
 #include <gui/elements.h>
 
-#include "../desktop_i.h"
 #include "desktop_view_slideshow.h"
+#include "../desktop_i.h"
 #include "../helpers/slideshow.h"
 #include "../helpers/slideshow_filename.h"
 
+#define DESKTOP_SLIDESHOW_POWEROFF_SHORT 5000
+#define DESKTOP_SLIDESHOW_POWEROFF_LONG (60 * 60 * 1000)
+
 struct DesktopSlideshowView {
     View* view;
     DesktopSlideshowViewCallback callback;
     void* context;
+    FuriTimer* timer;
 };
 
 typedef struct {
@@ -51,14 +55,32 @@ static bool desktop_view_slideshow_input(InputEvent* event, void* context) {
             instance->callback(DesktopSlideshowCompleted, instance->context);
         }
         view_commit_model(instance->view, true);
+    } else if(event->key == InputKeyOk) {
+        if(event->type == InputTypePress) {
+            furi_timer_start(instance->timer, DESKTOP_SLIDESHOW_POWEROFF_SHORT);
+        } else if(event->type == InputTypeRelease) {
+            furi_timer_stop(instance->timer);
+            furi_timer_start(instance->timer, DESKTOP_SLIDESHOW_POWEROFF_LONG);
+        }
     }
 
     return true;
 }
 
+static void desktop_first_start_timer_callback(void* context) {
+    DesktopSlideshowView* instance = context;
+    instance->callback(DesktopSlideshowPoweroff, instance->context);
+}
+
 static void desktop_view_slideshow_enter(void* context) {
     DesktopSlideshowView* instance = context;
 
+    furi_assert(instance->timer == NULL);
+    instance->timer =
+        furi_timer_alloc(desktop_first_start_timer_callback, FuriTimerTypeOnce, instance);
+
+    furi_timer_start(instance->timer, DESKTOP_SLIDESHOW_POWEROFF_LONG);
+
     DesktopSlideshowViewModel* model = view_get_model(instance->view);
     model->slideshow = slideshow_alloc();
     if(!slideshow_load(model->slideshow, SLIDESHOW_FS_PATH)) {
@@ -70,6 +92,10 @@ static void desktop_view_slideshow_enter(void* context) {
 static void desktop_view_slideshow_exit(void* context) {
     DesktopSlideshowView* instance = context;
 
+    furi_timer_stop(instance->timer);
+    furi_timer_free(instance->timer);
+    instance->timer = NULL;
+
     DesktopSlideshowViewModel* model = view_get_model(instance->view);
     slideshow_free(model->slideshow);
     view_commit_model(instance->view, false);

BIN
assets/slideshow/first_start/frame_00.png


BIN
assets/slideshow/first_start/frame_01.png


BIN
assets/slideshow/first_start/frame_02.png


BIN
assets/slideshow/first_start/frame_03.png


BIN
assets/slideshow/first_start/frame_04.png


BIN
assets/slideshow/first_start/frame_05.png


+ 13 - 0
scripts/ReadMe.md

@@ -58,3 +58,16 @@ Run in the root folder of the repo:
 ```bash
 python scripts/storage.py -p <flipper_cli_port> send assets/resources /ext
 ```
+
+
+# Slideshow creation
+
+Put fullscreen slideshow frames in .png format into `assets/slideshow/my_show` folder, named frame_xx.png, where xx is zero-padded frame number, starting with #0.
+
+Then run 
+
+```bash
+python scripts/slideshow.py -i assets/slideshow/my_show/ -o assets/slideshow/my_show/.slideshow
+```
+
+Upload generated .slideshow file to Flipper's internal storage and restart it.