[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:
parent
056446dfed
commit
3fa5e18c5a
@ -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;
|
||||
|
@ -35,6 +35,7 @@ typedef enum {
|
||||
DesktopAnimationEventInteractAnimation,
|
||||
|
||||
DesktopSlideshowCompleted,
|
||||
DesktopSlideshowPoweroff,
|
||||
|
||||
// Global events
|
||||
DesktopGlobalBeforeAppStarted,
|
||||
|
@ -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
Normal file
BIN
assets/slideshow/first_start/frame_00.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 602 B |
BIN
assets/slideshow/first_start/frame_01.png
Normal file
BIN
assets/slideshow/first_start/frame_01.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 558 B |
BIN
assets/slideshow/first_start/frame_02.png
Normal file
BIN
assets/slideshow/first_start/frame_02.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 562 B |
BIN
assets/slideshow/first_start/frame_03.png
Normal file
BIN
assets/slideshow/first_start/frame_03.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 595 B |
BIN
assets/slideshow/first_start/frame_04.png
Normal file
BIN
assets/slideshow/first_start/frame_04.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 548 B |
BIN
assets/slideshow/first_start/frame_05.png
Normal file
BIN
assets/slideshow/first_start/frame_05.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 579 B |
@ -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.
|
Loading…
Reference in New Issue
Block a user