Desktop: locked view timeout refactoring, Switch hwmismatch custom view to popup (#744)
Co-authored-by: SG <who.just.the.doctor@gmail.com>
This commit is contained in:
		
							parent
							
								
									832fb1b795
								
							
						
					
					
						commit
						73a13f584f
					
				| @ -40,7 +40,7 @@ Desktop* desktop_alloc() { | ||||
|     desktop->locked_view = desktop_locked_alloc(); | ||||
|     desktop->debug_view = desktop_debug_alloc(); | ||||
|     desktop->first_start_view = desktop_first_start_alloc(); | ||||
|     desktop->hw_mismatch_view = desktop_hw_mismatch_alloc(); | ||||
|     desktop->hw_mismatch_popup = popup_alloc(); | ||||
| 
 | ||||
|     view_dispatcher_add_view( | ||||
|         desktop->view_dispatcher, DesktopViewMain, desktop_main_get_view(desktop->main_view)); | ||||
| @ -61,7 +61,7 @@ Desktop* desktop_alloc() { | ||||
|     view_dispatcher_add_view( | ||||
|         desktop->view_dispatcher, | ||||
|         DesktopViewHwMismatch, | ||||
|         desktop_hw_mismatch_get_view(desktop->hw_mismatch_view)); | ||||
|         popup_get_view(desktop->hw_mismatch_popup)); | ||||
| 
 | ||||
|     // Lock icon
 | ||||
|     desktop->lock_viewport = view_port_alloc(); | ||||
| @ -91,7 +91,7 @@ void desktop_free(Desktop* desktop) { | ||||
|     desktop_locked_free(desktop->locked_view); | ||||
|     desktop_debug_free(desktop->debug_view); | ||||
|     desktop_first_start_free(desktop->first_start_view); | ||||
|     desktop_hw_mismatch_free(desktop->hw_mismatch_view); | ||||
|     popup_free(desktop->hw_mismatch_popup); | ||||
| 
 | ||||
|     furi_record_close("gui"); | ||||
|     desktop->gui = NULL; | ||||
|  | ||||
| @ -7,13 +7,13 @@ | ||||
| 
 | ||||
| #include <gui/gui.h> | ||||
| #include <gui/view_dispatcher.h> | ||||
| #include <gui/modules/popup.h> | ||||
| #include <gui/scene_manager.h> | ||||
| #include <assets_icons.h> | ||||
| #include <storage/storage.h> | ||||
| 
 | ||||
| #include "views/desktop_main.h" | ||||
| #include "views/desktop_first_start.h" | ||||
| #include "views/desktop_hw_mismatch.h" | ||||
| #include "views/desktop_lock_menu.h" | ||||
| #include "views/desktop_locked.h" | ||||
| #include "views/desktop_debug.h" | ||||
| @ -22,9 +22,6 @@ | ||||
| 
 | ||||
| #include "desktop/desktop_settings/desktop_settings.h" | ||||
| 
 | ||||
| #define HINT_TIMEOUT_L 2 | ||||
| #define HINT_TIMEOUT_H 11 | ||||
| 
 | ||||
| typedef enum { | ||||
|     DesktopViewMain, | ||||
|     DesktopViewLockMenu, | ||||
| @ -44,7 +41,7 @@ struct Desktop { | ||||
|     SceneManager* scene_manager; | ||||
| 
 | ||||
|     DesktopFirstStartView* first_start_view; | ||||
|     DesktopHwMismatchView* hw_mismatch_view; | ||||
|     Popup* hw_mismatch_popup; | ||||
|     DesktopMainView* main_view; | ||||
|     DesktopLockMenuView* lock_menu; | ||||
|     DesktopLockedView* locked_view; | ||||
|  | ||||
| @ -1,16 +1,26 @@ | ||||
| #include "../desktop_i.h" | ||||
| #include "../views/desktop_hw_mismatch.h" | ||||
| #include <furi-hal-version.h> | ||||
| 
 | ||||
| void desktop_scene_hw_mismatch_callback(DesktopHwMismatchEvent event, void* context) { | ||||
| #define HW_MISMATCH_BACK_EVENT (0UL) | ||||
| 
 | ||||
| void desktop_scene_hw_mismatch_callback(void* context) { | ||||
|     Desktop* desktop = (Desktop*)context; | ||||
|     view_dispatcher_send_custom_event(desktop->view_dispatcher, event); | ||||
|     view_dispatcher_send_custom_event(desktop->view_dispatcher, HW_MISMATCH_BACK_EVENT); | ||||
| } | ||||
| 
 | ||||
| void desktop_scene_hw_mismatch_on_enter(void* context) { | ||||
|     Desktop* desktop = (Desktop*)context; | ||||
| 
 | ||||
|     desktop_hw_mismatch_set_callback( | ||||
|         desktop->hw_mismatch_view, desktop_scene_hw_mismatch_callback, desktop); | ||||
|     Popup* popup = desktop->hw_mismatch_popup; | ||||
|     char buffer[256]; // strange but smaller buffer not making it
 | ||||
|     snprintf( | ||||
|         buffer, | ||||
|         sizeof(buffer), | ||||
|         "HW target: F%d\nFW target: " TARGET, | ||||
|         furi_hal_version_get_hw_target()); | ||||
|     popup_set_context(popup, desktop); | ||||
|     popup_set_header(popup, "!!!! HW Mismatch !!!!", 60, 14, AlignCenter, AlignCenter); | ||||
|     popup_set_text(popup, buffer, 60, 37, AlignCenter, AlignCenter); | ||||
|     popup_set_callback(popup, desktop_scene_hw_mismatch_callback); | ||||
|     view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewHwMismatch); | ||||
| } | ||||
| 
 | ||||
| @ -20,7 +30,7 @@ bool desktop_scene_hw_mismatch_on_event(void* context, SceneManagerEvent event) | ||||
| 
 | ||||
|     if(event.type == SceneManagerEventTypeCustom) { | ||||
|         switch(event.event) { | ||||
|         case DesktopHwMismatchEventExit: | ||||
|         case HW_MISMATCH_BACK_EVENT: | ||||
|             scene_manager_previous_scene(desktop->scene_manager); | ||||
|             consumed = true; | ||||
|             break; | ||||
| @ -33,5 +43,10 @@ bool desktop_scene_hw_mismatch_on_event(void* context, SceneManagerEvent event) | ||||
| } | ||||
| 
 | ||||
| void desktop_scene_hw_mismatch_on_exit(void* context) { | ||||
|     // Desktop* desktop = (Desktop*)context;
 | ||||
|     Desktop* desktop = (Desktop*)context; | ||||
|     Popup* popup = desktop->hw_mismatch_popup; | ||||
|     popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); | ||||
|     popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); | ||||
|     popup_set_callback(popup, NULL); | ||||
|     popup_set_context(popup, NULL); | ||||
| } | ||||
|  | ||||
| @ -59,7 +59,7 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { | ||||
|             break; | ||||
| 
 | ||||
|         case DesktopMainEventOpenDebug: | ||||
|             scene_manager_next_scene(desktop->scene_manager, DesktopViewDebug); | ||||
|             scene_manager_next_scene(desktop->scene_manager, DesktopSceneDebug); | ||||
|             consumed = true; | ||||
|             break; | ||||
| 
 | ||||
|  | ||||
| @ -1,66 +0,0 @@ | ||||
| #include <furi.h> | ||||
| #include "../desktop_i.h" | ||||
| #include <furi-hal.h> | ||||
| #include <furi-hal-version.h> | ||||
| 
 | ||||
| #include "desktop_hw_mismatch.h" | ||||
| 
 | ||||
| void desktop_hw_mismatch_set_callback( | ||||
|     DesktopHwMismatchView* main_view, | ||||
|     DesktopHwMismatchViewCallback callback, | ||||
|     void* context) { | ||||
|     furi_assert(main_view); | ||||
|     furi_assert(callback); | ||||
|     main_view->callback = callback; | ||||
|     main_view->context = context; | ||||
| } | ||||
| 
 | ||||
| void desktop_hw_mismatch_render(Canvas* canvas, void* model) { | ||||
|     canvas_clear(canvas); | ||||
|     canvas_set_color(canvas, ColorBlack); | ||||
|     canvas_set_font(canvas, FontPrimary); | ||||
|     canvas_draw_str(canvas, 2, 15, "!!!! HW Mismatch !!!!"); | ||||
| 
 | ||||
|     char buffer[64]; | ||||
|     canvas_set_font(canvas, FontSecondary); | ||||
|     snprintf(buffer, 64, "HW target: F%d", furi_hal_version_get_hw_target()); | ||||
|     canvas_draw_str(canvas, 5, 27, buffer); | ||||
|     canvas_draw_str(canvas, 5, 38, "FW target: " TARGET); | ||||
| } | ||||
| 
 | ||||
| View* desktop_hw_mismatch_get_view(DesktopHwMismatchView* hw_mismatch_view) { | ||||
|     furi_assert(hw_mismatch_view); | ||||
|     return hw_mismatch_view->view; | ||||
| } | ||||
| 
 | ||||
| bool desktop_hw_mismatch_input(InputEvent* event, void* context) { | ||||
|     furi_assert(event); | ||||
|     furi_assert(context); | ||||
| 
 | ||||
|     DesktopHwMismatchView* hw_mismatch_view = context; | ||||
| 
 | ||||
|     if(event->type == InputTypeShort) { | ||||
|         hw_mismatch_view->callback(DesktopHwMismatchEventExit, hw_mismatch_view->context); | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| DesktopHwMismatchView* desktop_hw_mismatch_alloc() { | ||||
|     DesktopHwMismatchView* hw_mismatch_view = furi_alloc(sizeof(DesktopHwMismatchView)); | ||||
|     hw_mismatch_view->view = view_alloc(); | ||||
|     view_allocate_model( | ||||
|         hw_mismatch_view->view, ViewModelTypeLocking, sizeof(DesktopHwMismatchViewModel)); | ||||
|     view_set_context(hw_mismatch_view->view, hw_mismatch_view); | ||||
|     view_set_draw_callback(hw_mismatch_view->view, (ViewDrawCallback)desktop_hw_mismatch_render); | ||||
|     view_set_input_callback(hw_mismatch_view->view, desktop_hw_mismatch_input); | ||||
| 
 | ||||
|     return hw_mismatch_view; | ||||
| } | ||||
| 
 | ||||
| void desktop_hw_mismatch_free(DesktopHwMismatchView* hw_mismatch_view) { | ||||
|     furi_assert(hw_mismatch_view); | ||||
| 
 | ||||
|     view_free(hw_mismatch_view->view); | ||||
|     free(hw_mismatch_view); | ||||
| } | ||||
| @ -1,38 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <gui/gui_i.h> | ||||
| #include <gui/view.h> | ||||
| #include <gui/canvas.h> | ||||
| #include <gui/elements.h> | ||||
| #include <furi.h> | ||||
| 
 | ||||
| typedef enum { | ||||
|     DesktopHwMismatchEventExit, | ||||
| } DesktopHwMismatchEvent; | ||||
| 
 | ||||
| typedef struct DesktopHwMismatchView DesktopHwMismatchView; | ||||
| 
 | ||||
| typedef void (*DesktopHwMismatchViewCallback)(DesktopHwMismatchEvent event, void* context); | ||||
| 
 | ||||
| struct DesktopHwMismatchView { | ||||
|     View* view; | ||||
|     DesktopHwMismatchViewCallback callback; | ||||
|     void* context; | ||||
| }; | ||||
| 
 | ||||
| typedef struct { | ||||
|     IconAnimation* animation; | ||||
|     uint8_t scene_num; | ||||
|     uint8_t hint_timeout; | ||||
|     bool locked; | ||||
| } DesktopHwMismatchViewModel; | ||||
| 
 | ||||
| void desktop_hw_mismatch_set_callback( | ||||
|     DesktopHwMismatchView* hw_mismatch_view, | ||||
|     DesktopHwMismatchViewCallback callback, | ||||
|     void* context); | ||||
| 
 | ||||
| View* desktop_hw_mismatch_get_view(DesktopHwMismatchView* hw_mismatch_view); | ||||
| 
 | ||||
| DesktopHwMismatchView* desktop_hw_mismatch_alloc(); | ||||
| void desktop_hw_mismatch_free(DesktopHwMismatchView* hw_mismatch_view); | ||||
| @ -29,7 +29,7 @@ static void lock_menu_callback(void* context, uint8_t index) { | ||||
|     default: // wip message
 | ||||
|         with_view_model( | ||||
|             lock_menu->view, (DesktopLockMenuViewModel * model) { | ||||
|                 model->hint_timeout = HINT_TIMEOUT_L; | ||||
|                 model->hint_timeout = HINT_TIMEOUT; | ||||
|                 return true; | ||||
|             }); | ||||
|         break; | ||||
|  | ||||
| @ -6,6 +6,8 @@ | ||||
| #include <gui/elements.h> | ||||
| #include <furi.h> | ||||
| 
 | ||||
| #define HINT_TIMEOUT 2 | ||||
| 
 | ||||
| typedef enum { | ||||
|     DesktopLockMenuEventLock, | ||||
|     DesktopLockMenuEventUnlock, | ||||
| @ -25,7 +27,6 @@ struct DesktopLockMenuView { | ||||
| typedef struct { | ||||
|     uint8_t idx; | ||||
|     uint8_t hint_timeout; | ||||
|     bool locked; | ||||
| } DesktopLockMenuViewModel; | ||||
| 
 | ||||
| void desktop_lock_menu_set_callback( | ||||
|  | ||||
| @ -33,7 +33,7 @@ static void desktop_locked_set_scene(DesktopLockedView* locked_view, const Icon* | ||||
| void desktop_locked_update_hint_timeout(DesktopLockedView* locked_view) { | ||||
|     with_view_model( | ||||
|         locked_view->view, (DesktopLockedViewModel * model) { | ||||
|             model->hint_timeout = HINT_TIMEOUT_H; | ||||
|             model->hint_expire_at = osKernelGetTickCount() + osKernelGetTickFreq(); | ||||
|             return true; | ||||
|         }); | ||||
| } | ||||
| @ -59,7 +59,10 @@ void desktop_locked_manage_redraw(DesktopLockedView* locked_view) { | ||||
|             if(!model->animation_seq_end) { | ||||
|                 model->door_left_x = CLAMP(model->door_left_x + 5, 0, -57); | ||||
|                 model->door_right_x = CLAMP(model->door_right_x - 5, 115, 60); | ||||
|             } else { | ||||
|                 model->hint_expire_at = 0; | ||||
|             } | ||||
| 
 | ||||
|             return true; | ||||
|         }); | ||||
| 
 | ||||
| @ -74,7 +77,7 @@ void desktop_locked_reset_counter(DesktopLockedView* locked_view) { | ||||
| 
 | ||||
|     with_view_model( | ||||
|         locked_view->view, (DesktopLockedViewModel * model) { | ||||
|             model->hint_timeout = 0; | ||||
|             model->hint_expire_at = 0; | ||||
|             return true; | ||||
|         }); | ||||
| } | ||||
| @ -94,12 +97,11 @@ void desktop_locked_render(Canvas* canvas, void* model) { | ||||
|         canvas_draw_icon_animation(canvas, 0, -3, m->animation); | ||||
|     } | ||||
| 
 | ||||
|     if(m->hint_timeout) { | ||||
|         m->hint_timeout--; | ||||
| 
 | ||||
|     if(osKernelGetTickCount() < m->hint_expire_at) { | ||||
|         if(!m->animation_seq_end) { | ||||
|             canvas_set_font(canvas, FontPrimary); | ||||
|             elements_multiline_text_framed(canvas, 42, 30, "Locked"); | ||||
| 
 | ||||
|         } else { | ||||
|             canvas_set_font(canvas, FontSecondary); | ||||
|             canvas_draw_icon(canvas, 13, 5, &I_LockPopup_100x49); | ||||
| @ -119,11 +121,7 @@ bool desktop_locked_input(InputEvent* event, void* context) { | ||||
| 
 | ||||
|     DesktopLockedView* locked_view = context; | ||||
|     if(event->type == InputTypeShort) { | ||||
|         with_view_model( | ||||
|             locked_view->view, (DesktopLockedViewModel * model) { | ||||
|                 model->hint_timeout = HINT_TIMEOUT_L; | ||||
|                 return true; | ||||
|             }); | ||||
|         desktop_locked_update_hint_timeout(locked_view); | ||||
| 
 | ||||
|         if(event->key == InputKeyBack) { | ||||
|             uint32_t press_time = HAL_GetTick(); | ||||
| @ -159,6 +157,7 @@ void desktop_locked_enter(void* context) { | ||||
| 
 | ||||
| void desktop_locked_exit(void* context) { | ||||
|     DesktopLockedView* locked_view = context; | ||||
| 
 | ||||
|     with_view_model( | ||||
|         locked_view->view, (DesktopLockedViewModel * model) { | ||||
|             if(model->animation) icon_animation_stop(model->animation); | ||||
|  | ||||
| @ -30,10 +30,11 @@ struct DesktopLockedView { | ||||
| 
 | ||||
| typedef struct { | ||||
|     IconAnimation* animation; | ||||
|     uint32_t hint_expire_at; | ||||
| 
 | ||||
|     uint8_t scene_num; | ||||
|     int8_t door_left_x; | ||||
|     int8_t door_right_x; | ||||
|     uint8_t hint_timeout; | ||||
|     bool animation_seq_end; | ||||
| 
 | ||||
| } DesktopLockedViewModel; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 its your bedtime
						its your bedtime