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