[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:
		| @@ -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. | ||||
		Reference in New Issue
	
	Block a user