[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>
This commit is contained in:
hedger 2022-07-26 15:44:03 +03:00 committed by GitHub
parent 056446dfed
commit 3fa5e18c5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 49 additions and 1 deletions

View File

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

View File

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

View File

@ -2,15 +2,19 @@
#include <furi_hal.h> #include <furi_hal.h>
#include <gui/elements.h> #include <gui/elements.h>
#include "../desktop_i.h"
#include "desktop_view_slideshow.h" #include "desktop_view_slideshow.h"
#include "../desktop_i.h"
#include "../helpers/slideshow.h" #include "../helpers/slideshow.h"
#include "../helpers/slideshow_filename.h" #include "../helpers/slideshow_filename.h"
#define DESKTOP_SLIDESHOW_POWEROFF_SHORT 5000
#define DESKTOP_SLIDESHOW_POWEROFF_LONG (60 * 60 * 1000)
struct DesktopSlideshowView { struct DesktopSlideshowView {
View* view; View* view;
DesktopSlideshowViewCallback callback; DesktopSlideshowViewCallback callback;
void* context; void* context;
FuriTimer* timer;
}; };
typedef struct { typedef struct {
@ -51,14 +55,32 @@ static bool desktop_view_slideshow_input(InputEvent* event, void* context) {
instance->callback(DesktopSlideshowCompleted, instance->context); instance->callback(DesktopSlideshowCompleted, instance->context);
} }
view_commit_model(instance->view, true); 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; 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) { static void desktop_view_slideshow_enter(void* context) {
DesktopSlideshowView* instance = 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); DesktopSlideshowViewModel* model = view_get_model(instance->view);
model->slideshow = slideshow_alloc(); model->slideshow = slideshow_alloc();
if(!slideshow_load(model->slideshow, SLIDESHOW_FS_PATH)) { 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) { static void desktop_view_slideshow_exit(void* context) {
DesktopSlideshowView* instance = context; DesktopSlideshowView* instance = context;
furi_timer_stop(instance->timer);
furi_timer_free(instance->timer);
instance->timer = NULL;
DesktopSlideshowViewModel* model = view_get_model(instance->view); DesktopSlideshowViewModel* model = view_get_model(instance->view);
slideshow_free(model->slideshow); slideshow_free(model->slideshow);
view_commit_model(instance->view, false); view_commit_model(instance->view, false);

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

View File

@ -58,3 +58,16 @@ Run in the root folder of the repo:
```bash ```bash
python scripts/storage.py -p <flipper_cli_port> send assets/resources /ext 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.