add auto power off timer setting [ci skip]

by @Dmitry422 with little fixes by @xMasterX
This commit is contained in:
MX
2024-12-06 12:18:51 +03:00
parent dd6e0a9b72
commit c9bc05199e
5 changed files with 124 additions and 12 deletions

View File

@@ -19,6 +19,12 @@ static void desktop_auto_lock_arm(Desktop*);
static void desktop_auto_lock_inhibit(Desktop*); static void desktop_auto_lock_inhibit(Desktop*);
static void desktop_start_auto_lock_timer(Desktop*); static void desktop_start_auto_lock_timer(Desktop*);
static void desktop_apply_settings(Desktop*); static void desktop_apply_settings(Desktop*);
//--- auto_power_off_timer
#include <power/power_service/power.h>
static void desktop_start_auto_poweroff_timer(Desktop*);
static void desktop_auto_poweroff_arm(Desktop*);
static void desktop_auto_poweroff_inhibit(Desktop*);
//---
static void desktop_loader_callback(const void* message, void* context) { static void desktop_loader_callback(const void* message, void* context) {
furi_assert(context); furi_assert(context);
@@ -131,6 +137,9 @@ static bool desktop_custom_event_callback(void* context, uint32_t event) {
} }
desktop_auto_lock_inhibit(desktop); desktop_auto_lock_inhibit(desktop);
//--- auto_power_off_timer
desktop_auto_poweroff_inhibit(desktop);
//--
desktop->app_running = true; desktop->app_running = true;
furi_semaphore_release(desktop->animation_semaphore); furi_semaphore_release(desktop->animation_semaphore);
@@ -138,6 +147,9 @@ static bool desktop_custom_event_callback(void* context, uint32_t event) {
} else if(event == DesktopGlobalAfterAppFinished) { } else if(event == DesktopGlobalAfterAppFinished) {
animation_manager_load_and_continue_animation(desktop->animation_manager); animation_manager_load_and_continue_animation(desktop->animation_manager);
desktop_auto_lock_arm(desktop); desktop_auto_lock_arm(desktop);
//--- auto_power_off_timer
desktop_auto_poweroff_arm(desktop);
//---
desktop->app_running = false; desktop->app_running = false;
} else if(event == DesktopGlobalAutoLock) { } else if(event == DesktopGlobalAutoLock) {
@@ -179,6 +191,9 @@ static void desktop_input_event_callback(const void* value, void* context) {
Desktop* desktop = context; Desktop* desktop = context;
if(event->type == InputTypePress) { if(event->type == InputTypePress) {
desktop_start_auto_lock_timer(desktop); desktop_start_auto_lock_timer(desktop);
//--- m96yda
desktop_start_auto_poweroff_timer(desktop);
//---
} }
} }
@@ -213,6 +228,39 @@ static void desktop_auto_lock_inhibit(Desktop* desktop) {
} }
} }
//--- auto_power_off_timer
static void desktop_auto_poweroff_timer_callback(void* context) {
UNUSED(context);
Power* power = furi_record_open(RECORD_POWER);
power_off(power);
}
static void desktop_start_auto_poweroff_timer(Desktop* desktop) {
furi_timer_start(
desktop->auto_poweroff_timer, furi_ms_to_ticks(desktop->settings.auto_poweroff_delay_ms));
}
static void desktop_stop_auto_poweroff_timer(Desktop* desktop) {
furi_timer_stop(desktop->auto_poweroff_timer);
}
static void desktop_auto_poweroff_arm(Desktop* desktop) {
if(desktop->settings.auto_poweroff_delay_ms) {
desktop->input_events_subscription = furi_pubsub_subscribe(
desktop->input_events_pubsub, desktop_input_event_callback, desktop);
desktop_start_auto_poweroff_timer(desktop);
}
}
static void desktop_auto_poweroff_inhibit(Desktop* desktop) {
desktop_stop_auto_poweroff_timer(desktop);
if(desktop->input_events_subscription) {
furi_pubsub_unsubscribe(desktop->input_events_pubsub, desktop->input_events_subscription);
desktop->input_events_subscription = NULL;
}
}
//---
static void desktop_clock_timer_callback(void* context) { static void desktop_clock_timer_callback(void* context) {
furi_assert(context); furi_assert(context);
Desktop* desktop = context; Desktop* desktop = context;
@@ -238,6 +286,9 @@ static void desktop_apply_settings(Desktop* desktop) {
if(!desktop->app_running && !desktop->locked) { if(!desktop->app_running && !desktop->locked) {
desktop_auto_lock_arm(desktop); desktop_auto_lock_arm(desktop);
//--- auto_power_off_timer
desktop_auto_poweroff_arm(desktop);
//---
} }
desktop->in_transition = false; desktop->in_transition = false;
@@ -373,6 +424,10 @@ static Desktop* desktop_alloc(void) {
desktop->auto_lock_timer = desktop->auto_lock_timer =
furi_timer_alloc(desktop_auto_lock_timer_callback, FuriTimerTypeOnce, desktop); furi_timer_alloc(desktop_auto_lock_timer_callback, FuriTimerTypeOnce, desktop);
//--- auto_power_off_timer
desktop->auto_poweroff_timer =
furi_timer_alloc(desktop_auto_poweroff_timer_callback, FuriTimerTypeOnce, desktop);
//---
desktop->status_pubsub = furi_pubsub_alloc(); desktop->status_pubsub = furi_pubsub_alloc();

View File

@@ -75,6 +75,9 @@ struct Desktop {
FuriTimer* auto_lock_timer; FuriTimer* auto_lock_timer;
FuriTimer* update_clock_timer; FuriTimer* update_clock_timer;
//--- auto_power_off_timer
FuriTimer* auto_poweroff_timer;
//---
AnimationManager* animation_manager; AnimationManager* animation_manager;
FuriSemaphore* animation_semaphore; FuriSemaphore* animation_semaphore;

View File

@@ -6,16 +6,20 @@
#define TAG "DesktopSettings" #define TAG "DesktopSettings"
#define DESKTOP_SETTINGS_VER_13 (13) #define DESKTOP_SETTINGS_VER_14 (14)
#define DESKTOP_SETTINGS_VER (14) #define DESKTOP_SETTINGS_VER (15)
#define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) #define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME)
#define DESKTOP_SETTINGS_MAGIC (0x17) #define DESKTOP_SETTINGS_MAGIC (0x17)
typedef struct { typedef struct {
uint8_t reserved[11]; uint32_t auto_lock_delay_ms;
DesktopSettings settings; uint8_t displayBatteryPercentage;
} DesktopSettingsV13; uint8_t dummy_mode;
uint8_t display_clock;
FavoriteApp favorite_apps[FavoriteAppNumber];
FavoriteApp dummy_apps[DummyAppNumber];
} DesktopSettingsV14;
// Actual size of DesktopSettings v13 // Actual size of DesktopSettings v13
//static_assert(sizeof(DesktopSettingsV13) == 1234); //static_assert(sizeof(DesktopSettingsV13) == 1234);
@@ -37,21 +41,33 @@ void desktop_settings_load(DesktopSettings* settings) {
DESKTOP_SETTINGS_MAGIC, DESKTOP_SETTINGS_MAGIC,
DESKTOP_SETTINGS_VER); DESKTOP_SETTINGS_VER);
} else if(version == DESKTOP_SETTINGS_VER_13) { } else if(version == DESKTOP_SETTINGS_VER_14) {
DesktopSettingsV13* settings_v13 = malloc(sizeof(DesktopSettingsV13)); DesktopSettingsV14* settings_v14 = malloc(sizeof(DesktopSettingsV14));
success = saved_struct_load( success = saved_struct_load(
DESKTOP_SETTINGS_PATH, DESKTOP_SETTINGS_PATH,
settings_v13, settings_v14,
sizeof(DesktopSettingsV13), sizeof(DesktopSettingsV14),
DESKTOP_SETTINGS_MAGIC, DESKTOP_SETTINGS_MAGIC,
DESKTOP_SETTINGS_VER_13); DESKTOP_SETTINGS_VER_14);
if(success) { if(success) {
*settings = settings_v13->settings; settings->auto_lock_delay_ms = settings_v14->auto_lock_delay_ms;
settings->auto_poweroff_delay_ms = 0;
settings->displayBatteryPercentage = settings_v14->displayBatteryPercentage;
settings->dummy_mode = settings_v14->dummy_mode;
settings->display_clock = settings_v14->display_clock;
memcpy(
settings_v14->favorite_apps,
settings->favorite_apps,
sizeof(settings_v14->favorite_apps));
memcpy(
settings_v14->dummy_apps,
settings->dummy_apps,
sizeof(settings_v14->dummy_apps));
} }
free(settings_v13); free(settings_v14);
} }
} while(false); } while(false);

View File

@@ -38,6 +38,9 @@ typedef struct {
typedef struct { typedef struct {
uint32_t auto_lock_delay_ms; uint32_t auto_lock_delay_ms;
//--- auto_power_off_timer
uint32_t auto_poweroff_delay_ms;
//---
uint8_t displayBatteryPercentage; uint8_t displayBatteryPercentage;
uint8_t dummy_mode; uint8_t dummy_mode;
uint8_t display_clock; uint8_t display_clock;

View File

@@ -28,6 +28,15 @@ typedef enum {
DesktopSettingsDummyOkLong, DesktopSettingsDummyOkLong,
} DesktopSettingsEntry; } DesktopSettingsEntry;
// --- auto_power_off_timer
#define AUTO_POWEROFF_DELAY_COUNT 8
const char* const auto_poweroff_delay_text[AUTO_POWEROFF_DELAY_COUNT] =
{"OFF", "5min", "10min", "15min", "30min", "45min", "60min", "90min"};
const uint32_t auto_poweroff_delay_value[AUTO_POWEROFF_DELAY_COUNT] =
{0, 300000, 600000, 900000, 1800000, 2700000, 3600000, 5400000};
// ---
#define AUTO_LOCK_DELAY_COUNT 9 #define AUTO_LOCK_DELAY_COUNT 9
const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = { const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = {
"OFF", "OFF",
@@ -86,6 +95,16 @@ static void desktop_settings_scene_start_clock_enable_changed(VariableItem* item
app->settings.display_clock = index; app->settings.display_clock = index;
} }
// --- auto_power_off_timer
static void desktop_settings_scene_start_auto_poweroff_delay_changed(VariableItem* item) {
DesktopSettingsApp* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, auto_poweroff_delay_text[index]);
app->settings.auto_poweroff_delay_ms = auto_poweroff_delay_value[index];
}
// ---
static void desktop_settings_scene_start_auto_lock_delay_changed(VariableItem* item) { static void desktop_settings_scene_start_auto_lock_delay_changed(VariableItem* item) {
DesktopSettingsApp* app = variable_item_get_context(item); DesktopSettingsApp* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item); uint8_t index = variable_item_get_current_value_index(item);
@@ -115,6 +134,22 @@ void desktop_settings_scene_start_on_enter(void* context) {
variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, auto_lock_delay_text[value_index]); variable_item_set_current_value_text(item, auto_lock_delay_text[value_index]);
// --- auto_power_off_timer
item = variable_item_list_add(
variable_item_list,
"Auto PowerOff",
AUTO_POWEROFF_DELAY_COUNT,
desktop_settings_scene_start_auto_poweroff_delay_changed,
app);
value_index = value_index_uint32(
app->settings.auto_poweroff_delay_ms,
auto_poweroff_delay_value,
AUTO_POWEROFF_DELAY_COUNT);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, auto_poweroff_delay_text[value_index]);
// ---
item = variable_item_list_add( item = variable_item_list_add(
variable_item_list, variable_item_list,
"Battery View", "Battery View",