From af8d2369ca34fa34c5008f840e6853fd07b59677 Mon Sep 17 00:00:00 2001 From: SHxKenzuto Date: Tue, 23 Aug 2022 21:20:28 +0200 Subject: [PATCH 1/4] added "Shutdown on Idle" setting under power settings --- applications/power/power_service/power.c | 83 ++++++++++++++++++- applications/power/power_service/power_i.h | 6 ++ applications/power/power_settings.h | 25 ++++++ .../power_settings_app/power_settings_app.c | 4 + .../power_settings_app/power_settings_app.h | 7 ++ .../scenes/power_settings_scene_config.h | 1 + .../power_settings_scene_shutdown_idle.c | 78 +++++++++++++++++ .../scenes/power_settings_scene_start.c | 9 ++ applications/power/power_settings_filename.h | 3 + 9 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 applications/power/power_settings.h create mode 100644 applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c create mode 100644 applications/power/power_settings_filename.h diff --git a/applications/power/power_service/power.c b/applications/power/power_service/power.c index 9036ae1ce..6c23d6b88 100644 --- a/applications/power/power_service/power.c +++ b/applications/power/power_service/power.c @@ -37,6 +37,65 @@ static ViewPort* power_battery_view_port_alloc(Power* power) { return battery_view_port; } +static void power_start_auto_shutdown_timer(Power* power) { + furi_timer_start(power->auto_shutdown_timer, furi_ms_to_ticks(power->shutdown_idle_delay_ms)); +} + +static void power_stop_auto_shutdown_timer(Power* power) { + furi_timer_stop(power->auto_shutdown_timer); +} + +static void power_input_event_callback(const void* value, void* context) { + furi_assert(value); + furi_assert(context); + const InputEvent* event = value; + Power* power = context; + if(event->type == InputTypePress) { + power_start_auto_shutdown_timer(power); + } +} + +static void power_auto_shutdown_arm(Power* power) { + if(power->shutdown_idle_delay_ms) { + power->input_events_subscription = + furi_pubsub_subscribe(power->input_events_pubsub, power_input_event_callback, power); + power_start_auto_shutdown_timer(power); + } +} + +static void power_auto_shutdown_inhibit(Power* power) { + power_stop_auto_shutdown_timer(power); + if(power->input_events_subscription) { + furi_pubsub_unsubscribe(power->input_events_pubsub, power->input_events_subscription); + power->input_events_subscription = NULL; + } +} + + + +static void power_auto_shutdown_timer_callback(void* context) { + furi_assert(context); + Power* power = context; + power_auto_shutdown_inhibit(power); + power_off(power); +} + +static void auto_shutdown_update(Power* power) { + uint32_t old_time = power->shutdown_idle_delay_ms; + LOAD_POWER_SETTINGS(&power->shutdown_idle_delay_ms); + if(power->shutdown_idle_delay_ms) { + if(power->shutdown_idle_delay_ms != old_time) { + if(old_time) { + power_start_auto_shutdown_timer(power); + } else { + power_auto_shutdown_arm(power); + } + } + }else if(old_time){ + power_auto_shutdown_inhibit(power); + } +} + Power* power_alloc() { Power* power = malloc(sizeof(Power)); @@ -47,6 +106,9 @@ Power* power_alloc() { // Pubsub power->event_pubsub = furi_pubsub_alloc(); + power->input_events_pubsub = furi_record_open(RECORD_INPUT_EVENTS); + power->input_events_subscription = NULL; + // State initialization power->state = PowerStateNotCharging; power->battery_low = false; @@ -69,6 +131,10 @@ Power* power_alloc() { power->battery_view_port = power_battery_view_port_alloc(power); power->show_low_bat_level_message = true; + //Auto shutdown timer + power->auto_shutdown_timer = + furi_timer_alloc(power_auto_shutdown_timer_callback, FuriTimerTypeOnce, power); + return power; } @@ -87,6 +153,12 @@ void power_free(Power* power) { // FuriPubSub furi_pubsub_free(power->event_pubsub); + furi_pubsub_free(power->input_events_pubsub); + + if(power->input_events_subscription) { + furi_pubsub_unsubscribe(power->input_events_pubsub, power->input_events_subscription); + power->input_events_subscription = NULL; + } // Records furi_record_close(RECORD_NOTIFICATION); @@ -202,10 +274,19 @@ static void power_check_battery_level_change(Power* power) { int32_t power_srv(void* p) { UNUSED(p); Power* power = power_alloc(); + if(!LOAD_POWER_SETTINGS(&power->shutdown_idle_delay_ms)) { + memset(&power->shutdown_idle_delay_ms, 0, sizeof(uint32_t)); + SAVE_POWER_SETTINGS(&power->shutdown_idle_delay_ms); + } + power_auto_shutdown_arm(power); power_update_info(power); furi_record_create(RECORD_POWER, power); while(1) { + + //Check current setting for automatic shutdown + auto_shutdown_update(power); + // Update data from gauge and charger bool need_refresh = power_update_info(power); @@ -228,7 +309,7 @@ int32_t power_srv(void* p) { furi_delay_ms(1000); } - + power_auto_shutdown_inhibit(power); power_free(power); return 0; diff --git a/applications/power/power_service/power_i.h b/applications/power/power_service/power_i.h index c7181d0a1..f93d91c02 100755 --- a/applications/power/power_service/power_i.h +++ b/applications/power/power_service/power_i.h @@ -8,6 +8,7 @@ #include #include "views/power_off.h" +#include "power/power_settings.h" #include @@ -28,6 +29,8 @@ struct Power { Gui* gui; NotificationApp* notification; FuriPubSub* event_pubsub; + FuriPubSub* input_events_pubsub; + FuriPubSubSubscription* input_events_subscription; PowerEvent event; PowerState state; @@ -38,6 +41,9 @@ struct Power { uint8_t battery_level; uint8_t power_off_timeout; + uint32_t shutdown_idle_delay_ms; + FuriTimer* auto_shutdown_timer; + FuriMutex* api_mtx; }; diff --git a/applications/power/power_settings.h b/applications/power/power_settings.h new file mode 100644 index 000000000..52ae02934 --- /dev/null +++ b/applications/power/power_settings.h @@ -0,0 +1,25 @@ +#include +#include +#include "power_settings_filename.h" + +#define POWER_SETTINGS_VER (1) + +#define POWER_SETTINGS_PATH INT_PATH(POWER_SETTINGS_FILE_NAME) +#define POWER_SETTINGS_MAGIC (0x21) + +#define SAVE_POWER_SETTINGS(x) \ + saved_struct_save( \ + POWER_SETTINGS_PATH, \ + (x), \ + sizeof(uint32_t), \ + POWER_SETTINGS_MAGIC, \ + POWER_SETTINGS_VER) + + +#define LOAD_POWER_SETTINGS(x) \ + saved_struct_load( \ + POWER_SETTINGS_PATH, \ + (x), \ + sizeof(uint32_t), \ + POWER_SETTINGS_MAGIC, \ + POWER_SETTINGS_VER) diff --git a/applications/power/power_settings_app/power_settings_app.c b/applications/power/power_settings_app/power_settings_app.c index b01f32f75..c900fcd75 100644 --- a/applications/power/power_settings_app/power_settings_app.c +++ b/applications/power/power_settings_app/power_settings_app.c @@ -45,11 +45,13 @@ PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) { PowerSettingsAppViewBatteryInfo, battery_info_get_view(app->batery_info)); app->submenu = submenu_alloc(); + app->variable_item_list = variable_item_list_alloc(); view_dispatcher_add_view( app->view_dispatcher, PowerSettingsAppViewSubmenu, submenu_get_view(app->submenu)); app->dialog = dialog_ex_alloc(); view_dispatcher_add_view( app->view_dispatcher, PowerSettingsAppViewDialog, dialog_ex_get_view(app->dialog)); + view_dispatcher_add_view(app->view_dispatcher, PowerSettingsAppViewVariableItemList, variable_item_list_get_view(app->variable_item_list)); // Set first scene scene_manager_next_scene(app->scene_manager, first_scene); @@ -63,8 +65,10 @@ void power_settings_app_free(PowerSettingsApp* app) { battery_info_free(app->batery_info); view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewSubmenu); submenu_free(app->submenu); + variable_item_list_free(app->variable_item_list); view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewDialog); dialog_ex_free(app->dialog); + view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewVariableItemList); // View dispatcher view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); diff --git a/applications/power/power_settings_app/power_settings_app.h b/applications/power/power_settings_app/power_settings_app.h index 8429b54b4..32e4e5928 100644 --- a/applications/power/power_settings_app/power_settings_app.h +++ b/applications/power/power_settings_app/power_settings_app.h @@ -10,7 +10,9 @@ #include "views/battery_info.h" #include #include +#include +#include "power/power_settings.h" #include "scenes/power_settings_scene.h" typedef struct { @@ -22,10 +24,15 @@ typedef struct { Submenu* submenu; DialogEx* dialog; PowerInfo info; + VariableItemList* variable_item_list; + uint32_t shutdown_idle_delay_ms; } PowerSettingsApp; typedef enum { PowerSettingsAppViewBatteryInfo, PowerSettingsAppViewSubmenu, PowerSettingsAppViewDialog, + PowerSettingsAppViewVariableItemList } PowerSettingsAppView; + + diff --git a/applications/power/power_settings_app/scenes/power_settings_scene_config.h b/applications/power/power_settings_app/scenes/power_settings_scene_config.h index cc8656dcf..3b4fc26cc 100755 --- a/applications/power/power_settings_app/scenes/power_settings_scene_config.h +++ b/applications/power/power_settings_app/scenes/power_settings_scene_config.h @@ -2,3 +2,4 @@ ADD_SCENE(power_settings, start, Start) ADD_SCENE(power_settings, battery_info, BatteryInfo) ADD_SCENE(power_settings, reboot, Reboot) ADD_SCENE(power_settings, power_off, PowerOff) +ADD_SCENE(power_settings,shutdown_idle, ShutdownIdle) diff --git a/applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c b/applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c new file mode 100644 index 000000000..cd07ac49f --- /dev/null +++ b/applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c @@ -0,0 +1,78 @@ +#include "../power_settings_app.h" +#include + +#define SHUTDOWN_IDLE_DELAY_COUNT 8 +#define SCENE_EVENT_SELECT_SHUTDOWN_IDLE_DELAY 0 + +const char* const shutdown_idle_delay_text[SHUTDOWN_IDLE_DELAY_COUNT] = { + "OFF", + "15min", + "30min", + "1h", + "6h", + "12h", + "24h", + "48h" +}; + +const uint32_t shutdown_idle_delay_value[SHUTDOWN_IDLE_DELAY_COUNT] = + {0, 900000, 1800000, 3600000, 21600000, 43200000, 86400000, 172800000}; + + static void power_settings_scene_shutodwn_idle_callback(void* context, uint32_t index) { + PowerSettingsApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void power_settings_scene_start_shutdown_idle_delay_changed(VariableItem* item) { + PowerSettingsApp* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, shutdown_idle_delay_text[index]); + app->shutdown_idle_delay_ms = shutdown_idle_delay_value[index]; +} + +void power_settings_scene_shutdown_idle_on_enter(void* context) { + PowerSettingsApp* app = context; + LOAD_POWER_SETTINGS(&app->shutdown_idle_delay_ms); + VariableItemList* variable_item_list = app->variable_item_list; + VariableItem* item; + uint8_t value_index; + + item = variable_item_list_add( + variable_item_list, + "Set Time", + SHUTDOWN_IDLE_DELAY_COUNT, + power_settings_scene_start_shutdown_idle_delay_changed, + app); + + + variable_item_list_set_enter_callback( + variable_item_list, power_settings_scene_shutodwn_idle_callback, app); + + value_index = value_index_uint32( + app->shutdown_idle_delay_ms, shutdown_idle_delay_value, SHUTDOWN_IDLE_DELAY_COUNT); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, shutdown_idle_delay_text[value_index]); + + view_dispatcher_switch_to_view(app->view_dispatcher, PowerSettingsAppViewVariableItemList); +} + +bool power_settings_scene_shutdown_idle_on_event(void* context, SceneManagerEvent event) { + UNUSED(context); + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + switch(event.event) { + case SCENE_EVENT_SELECT_SHUTDOWN_IDLE_DELAY: + consumed = true; + break; + } + } + return consumed; +} + +void power_settings_scene_shutdown_idle_on_exit(void* context) { + PowerSettingsApp* app = context; + SAVE_POWER_SETTINGS(&app->shutdown_idle_delay_ms); + variable_item_list_reset(app->variable_item_list); +} diff --git a/applications/power/power_settings_app/scenes/power_settings_scene_start.c b/applications/power/power_settings_app/scenes/power_settings_scene_start.c index 63f123d89..e54b6374d 100755 --- a/applications/power/power_settings_app/scenes/power_settings_scene_start.c +++ b/applications/power/power_settings_app/scenes/power_settings_scene_start.c @@ -4,6 +4,7 @@ enum PowerSettingsSubmenuIndex { PowerSettingsSubmenuIndexBatteryInfo, PowerSettingsSubmenuIndexReboot, PowerSettingsSubmenuIndexOff, + PowerSettingsSubmenuShutdownIdle }; static void power_settings_scene_start_submenu_callback(void* context, uint32_t index) { @@ -34,6 +35,12 @@ void power_settings_scene_start_on_enter(void* context) { PowerSettingsSubmenuIndexOff, power_settings_scene_start_submenu_callback, app); + submenu_add_item( + submenu, + "Shutdown on Idle", + PowerSettingsSubmenuShutdownIdle, + power_settings_scene_start_submenu_callback, + app); submenu_set_selected_item( submenu, scene_manager_get_scene_state(app->scene_manager, PowerSettingsAppSceneStart)); @@ -51,6 +58,8 @@ bool power_settings_scene_start_on_event(void* context, SceneManagerEvent event) scene_manager_next_scene(app->scene_manager, PowerSettingsAppSceneReboot); } else if(event.event == PowerSettingsSubmenuIndexOff) { scene_manager_next_scene(app->scene_manager, PowerSettingsAppScenePowerOff); + }else if(event.event == PowerSettingsSubmenuShutdownIdle){ + scene_manager_next_scene(app->scene_manager, PowerSettingsAppSceneShutdownIdle); } scene_manager_set_scene_state(app->scene_manager, PowerSettingsAppSceneStart, event.event); consumed = true; diff --git a/applications/power/power_settings_filename.h b/applications/power/power_settings_filename.h new file mode 100644 index 000000000..6a3be534c --- /dev/null +++ b/applications/power/power_settings_filename.h @@ -0,0 +1,3 @@ +#pragma once + +#define POWER_SETTINGS_FILE_NAME ".power.settings" \ No newline at end of file From 44e3842682a9d88771f79ee3b9c274e51f58c48f Mon Sep 17 00:00:00 2001 From: SHxKenzuto Date: Tue, 23 Aug 2022 23:12:22 +0200 Subject: [PATCH 2/4] fix issues Shutdown on idle --- applications/power/power_service/power.c | 7 ++----- applications/power/power_settings.h | 13 ++---------- .../power_settings_app/power_settings_app.c | 5 ++++- .../power_settings_app/power_settings_app.h | 2 -- .../scenes/power_settings_scene_config.h | 2 +- .../power_settings_scene_shutdown_idle.c | 21 +++++-------------- .../scenes/power_settings_scene_start.c | 4 ++-- 7 files changed, 16 insertions(+), 38 deletions(-) diff --git a/applications/power/power_service/power.c b/applications/power/power_service/power.c index fa0eba40e..1c4118cab 100644 --- a/applications/power/power_service/power.c +++ b/applications/power/power_service/power.c @@ -71,8 +71,6 @@ static void power_auto_shutdown_inhibit(Power* power) { } } - - static void power_auto_shutdown_timer_callback(void* context) { furi_assert(context); Power* power = context; @@ -91,7 +89,7 @@ static void auto_shutdown_update(Power* power) { power_auto_shutdown_arm(power); } } - }else if(old_time){ + } else if(old_time) { power_auto_shutdown_inhibit(power); } } @@ -277,7 +275,7 @@ int32_t power_srv(void* p) { UNUSED(p); Power* power = power_alloc(); if(!LOAD_POWER_SETTINGS(&power->shutdown_idle_delay_ms)) { - memset(&power->shutdown_idle_delay_ms, 0, sizeof(uint32_t)); + power->shutdown_idle_delay_ms = 0; SAVE_POWER_SETTINGS(&power->shutdown_idle_delay_ms); } power_auto_shutdown_arm(power); @@ -285,7 +283,6 @@ int32_t power_srv(void* p) { furi_record_create(RECORD_POWER, power); while(1) { - //Check current setting for automatic shutdown auto_shutdown_update(power); diff --git a/applications/power/power_settings.h b/applications/power/power_settings.h index 52ae02934..0f2afa295 100644 --- a/applications/power/power_settings.h +++ b/applications/power/power_settings.h @@ -9,17 +9,8 @@ #define SAVE_POWER_SETTINGS(x) \ saved_struct_save( \ - POWER_SETTINGS_PATH, \ - (x), \ - sizeof(uint32_t), \ - POWER_SETTINGS_MAGIC, \ - POWER_SETTINGS_VER) - + POWER_SETTINGS_PATH, (x), sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER) #define LOAD_POWER_SETTINGS(x) \ saved_struct_load( \ - POWER_SETTINGS_PATH, \ - (x), \ - sizeof(uint32_t), \ - POWER_SETTINGS_MAGIC, \ - POWER_SETTINGS_VER) + POWER_SETTINGS_PATH, (x), sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER) diff --git a/applications/power/power_settings_app/power_settings_app.c b/applications/power/power_settings_app/power_settings_app.c index c900fcd75..ec010ee71 100644 --- a/applications/power/power_settings_app/power_settings_app.c +++ b/applications/power/power_settings_app/power_settings_app.c @@ -51,7 +51,10 @@ PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) { app->dialog = dialog_ex_alloc(); view_dispatcher_add_view( app->view_dispatcher, PowerSettingsAppViewDialog, dialog_ex_get_view(app->dialog)); - view_dispatcher_add_view(app->view_dispatcher, PowerSettingsAppViewVariableItemList, variable_item_list_get_view(app->variable_item_list)); + view_dispatcher_add_view( + app->view_dispatcher, + PowerSettingsAppViewVariableItemList, + variable_item_list_get_view(app->variable_item_list)); // Set first scene scene_manager_next_scene(app->scene_manager, first_scene); diff --git a/applications/power/power_settings_app/power_settings_app.h b/applications/power/power_settings_app/power_settings_app.h index 32e4e5928..3ce42892b 100644 --- a/applications/power/power_settings_app/power_settings_app.h +++ b/applications/power/power_settings_app/power_settings_app.h @@ -34,5 +34,3 @@ typedef enum { PowerSettingsAppViewDialog, PowerSettingsAppViewVariableItemList } PowerSettingsAppView; - - diff --git a/applications/power/power_settings_app/scenes/power_settings_scene_config.h b/applications/power/power_settings_app/scenes/power_settings_scene_config.h index 3b4fc26cc..b6a6d4d05 100755 --- a/applications/power/power_settings_app/scenes/power_settings_scene_config.h +++ b/applications/power/power_settings_app/scenes/power_settings_scene_config.h @@ -2,4 +2,4 @@ ADD_SCENE(power_settings, start, Start) ADD_SCENE(power_settings, battery_info, BatteryInfo) ADD_SCENE(power_settings, reboot, Reboot) ADD_SCENE(power_settings, power_off, PowerOff) -ADD_SCENE(power_settings,shutdown_idle, ShutdownIdle) +ADD_SCENE(power_settings, shutdown_idle, ShutdownIdle) diff --git a/applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c b/applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c index cd07ac49f..b6c36a890 100644 --- a/applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c +++ b/applications/power/power_settings_app/scenes/power_settings_scene_shutdown_idle.c @@ -4,21 +4,13 @@ #define SHUTDOWN_IDLE_DELAY_COUNT 8 #define SCENE_EVENT_SELECT_SHUTDOWN_IDLE_DELAY 0 -const char* const shutdown_idle_delay_text[SHUTDOWN_IDLE_DELAY_COUNT] = { - "OFF", - "15min", - "30min", - "1h", - "6h", - "12h", - "24h", - "48h" -}; +const char* const shutdown_idle_delay_text[SHUTDOWN_IDLE_DELAY_COUNT] = + {"OFF", "15min", "30min", "1h", "6h", "12h", "24h", "48h"}; const uint32_t shutdown_idle_delay_value[SHUTDOWN_IDLE_DELAY_COUNT] = {0, 900000, 1800000, 3600000, 21600000, 43200000, 86400000, 172800000}; - static void power_settings_scene_shutodwn_idle_callback(void* context, uint32_t index) { +static void power_settings_scene_shutodwn_idle_callback(void* context, uint32_t index) { PowerSettingsApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } @@ -34,7 +26,7 @@ static void power_settings_scene_start_shutdown_idle_delay_changed(VariableItem* void power_settings_scene_shutdown_idle_on_enter(void* context) { PowerSettingsApp* app = context; LOAD_POWER_SETTINGS(&app->shutdown_idle_delay_ms); - VariableItemList* variable_item_list = app->variable_item_list; + VariableItemList* variable_item_list = app->variable_item_list; VariableItem* item; uint8_t value_index; @@ -45,7 +37,6 @@ void power_settings_scene_shutdown_idle_on_enter(void* context) { power_settings_scene_start_shutdown_idle_delay_changed, app); - variable_item_list_set_enter_callback( variable_item_list, power_settings_scene_shutodwn_idle_callback, app); @@ -62,10 +53,8 @@ bool power_settings_scene_shutdown_idle_on_event(void* context, SceneManagerEven bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - switch(event.event) { - case SCENE_EVENT_SELECT_SHUTDOWN_IDLE_DELAY: + if(event.event == SCENE_EVENT_SELECT_SHUTDOWN_IDLE_DELAY) { consumed = true; - break; } } return consumed; diff --git a/applications/power/power_settings_app/scenes/power_settings_scene_start.c b/applications/power/power_settings_app/scenes/power_settings_scene_start.c index e54b6374d..47c5b85c3 100755 --- a/applications/power/power_settings_app/scenes/power_settings_scene_start.c +++ b/applications/power/power_settings_app/scenes/power_settings_scene_start.c @@ -35,7 +35,7 @@ void power_settings_scene_start_on_enter(void* context) { PowerSettingsSubmenuIndexOff, power_settings_scene_start_submenu_callback, app); - submenu_add_item( + submenu_add_item( submenu, "Shutdown on Idle", PowerSettingsSubmenuShutdownIdle, @@ -58,7 +58,7 @@ bool power_settings_scene_start_on_event(void* context, SceneManagerEvent event) scene_manager_next_scene(app->scene_manager, PowerSettingsAppSceneReboot); } else if(event.event == PowerSettingsSubmenuIndexOff) { scene_manager_next_scene(app->scene_manager, PowerSettingsAppScenePowerOff); - }else if(event.event == PowerSettingsSubmenuShutdownIdle){ + } else if(event.event == PowerSettingsSubmenuShutdownIdle) { scene_manager_next_scene(app->scene_manager, PowerSettingsAppSceneShutdownIdle); } scene_manager_set_scene_state(app->scene_manager, PowerSettingsAppSceneStart, event.event); From a3ade922e298461cf3f892b723279152b121e196 Mon Sep 17 00:00:00 2001 From: Aleksandr Kutuzov Date: Thu, 29 Sep 2022 03:07:47 +0900 Subject: [PATCH 3/4] Power: free variable_item_list after removing from view dispatcher --- .../settings/power_settings_app/power_settings_app.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/applications/settings/power_settings_app/power_settings_app.c b/applications/settings/power_settings_app/power_settings_app.c index ec010ee71..460fccf15 100644 --- a/applications/settings/power_settings_app/power_settings_app.c +++ b/applications/settings/power_settings_app/power_settings_app.c @@ -66,18 +66,24 @@ void power_settings_app_free(PowerSettingsApp* app) { // Views view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewBatteryInfo); battery_info_free(app->batery_info); + view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewSubmenu); submenu_free(app->submenu); - variable_item_list_free(app->variable_item_list); + view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewDialog); dialog_ex_free(app->dialog); + view_dispatcher_remove_view(app->view_dispatcher, PowerSettingsAppViewVariableItemList); + variable_item_list_free(app->variable_item_list); + // View dispatcher view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); + // Records furi_record_close(RECORD_POWER); furi_record_close(RECORD_GUI); + free(app); } From 82f23547278080bfd80fcea1552960fb81fd0cf5 Mon Sep 17 00:00:00 2001 From: SHxKenzuto Date: Mon, 10 Oct 2022 23:39:29 +0200 Subject: [PATCH 4/4] event based check for auto shutdown timer setting --- .../services/power/power_service/power.c | 35 ++++++++++--------- .../services/power/power_service/power.h | 8 +++++ .../services/power/power_service/power_api.c | 5 +++ .../services/power/power_service/power_i.h | 1 + .../power_settings_app/power_settings_app.c | 3 ++ .../power_settings_app/power_settings_app.h | 1 + .../power_settings_scene_shutdown_idle.c | 1 + firmware/targets/f7/api_symbols.csv | 3 +- 8 files changed, 39 insertions(+), 18 deletions(-) diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index d871046c3..b77b6760c 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -42,6 +42,10 @@ static void power_stop_auto_shutdown_timer(Power* power) { furi_timer_stop(power->auto_shutdown_timer); } +static uint32_t power_is_running_auto_shutdown_timer(Power* power) { + return furi_timer_is_running(power->auto_shutdown_timer); +} + static void power_input_event_callback(const void* value, void* context) { furi_assert(value); furi_assert(context); @@ -54,8 +58,10 @@ static void power_input_event_callback(const void* value, void* context) { static void power_auto_shutdown_arm(Power* power) { if(power->shutdown_idle_delay_ms) { - power->input_events_subscription = - furi_pubsub_subscribe(power->input_events_pubsub, power_input_event_callback, power); + if(power->input_events_subscription == NULL) { + power->input_events_subscription = furi_pubsub_subscribe( + power->input_events_pubsub, power_input_event_callback, power); + } power_start_auto_shutdown_timer(power); } } @@ -75,18 +81,14 @@ static void power_auto_shutdown_timer_callback(void* context) { power_off(power); } -static void auto_shutdown_update(Power* power) { - uint32_t old_time = power->shutdown_idle_delay_ms; - LOAD_POWER_SETTINGS(&power->shutdown_idle_delay_ms); +static void power_shutdown_time_changed_callback(const void* event, void* context) { + furi_assert(event); + furi_assert(context); + Power* power = context; + power->shutdown_idle_delay_ms = *(uint32_t*)event; if(power->shutdown_idle_delay_ms) { - if(power->shutdown_idle_delay_ms != old_time) { - if(old_time) { - power_start_auto_shutdown_timer(power); - } else { - power_auto_shutdown_arm(power); - } - } - } else if(old_time) { + power_auto_shutdown_arm(power); + } else if(power_is_running_auto_shutdown_timer(power)) { power_auto_shutdown_inhibit(power); } } @@ -100,7 +102,8 @@ Power* power_alloc() { // Pubsub power->event_pubsub = furi_pubsub_alloc(); - + power->settings_events = furi_pubsub_alloc(); + furi_pubsub_subscribe(power->settings_events, power_shutdown_time_changed_callback, power); power->input_events_pubsub = furi_record_open(RECORD_INPUT_EVENTS); power->input_events_subscription = NULL; @@ -150,6 +153,7 @@ void power_free(Power* power) { // FuriPubSub furi_pubsub_free(power->event_pubsub); + furi_pubsub_free(power->settings_events); furi_pubsub_free(power->input_events_pubsub); if(power->input_events_subscription) { @@ -285,9 +289,6 @@ int32_t power_srv(void* p) { furi_record_create(RECORD_POWER, power); while(1) { - //Check current setting for automatic shutdown - auto_shutdown_update(power); - // Update data from gauge and charger bool need_refresh = power_update_info(power); diff --git a/applications/services/power/power_service/power.h b/applications/services/power/power_service/power.h index bdf5fa529..3144a46e4 100644 --- a/applications/services/power/power_service/power.h +++ b/applications/services/power/power_service/power.h @@ -80,6 +80,14 @@ void power_get_info(Power* power, PowerInfo* info); */ FuriPubSub* power_get_pubsub(Power* power); +/** Get power settings events pubsub handler + * + * @param power Power instance + * + * @return FuriPubSub instance + */ +FuriPubSub* power_get_settings_events_pubsub(Power* power); + /** Check battery health * * @return true if battery is healthy diff --git a/applications/services/power/power_service/power_api.c b/applications/services/power/power_service/power_api.c index 8185b7cd5..ef25ca019 100644 --- a/applications/services/power/power_service/power_api.c +++ b/applications/services/power/power_service/power_api.c @@ -38,6 +38,11 @@ FuriPubSub* power_get_pubsub(Power* power) { return power->event_pubsub; } +FuriPubSub* power_get_settings_events_pubsub(Power* power) { + furi_assert(power); + return power->settings_events; +} + bool power_is_battery_healthy(Power* power) { furi_assert(power); bool is_healthy = false; diff --git a/applications/services/power/power_service/power_i.h b/applications/services/power/power_service/power_i.h index dbd9fd240..38dc59224 100644 --- a/applications/services/power/power_service/power_i.h +++ b/applications/services/power/power_service/power_i.h @@ -30,6 +30,7 @@ struct Power { Gui* gui; NotificationApp* notification; FuriPubSub* event_pubsub; + FuriPubSub* settings_events; FuriPubSub* input_events_pubsub; FuriPubSubSubscription* input_events_subscription; PowerEvent event; diff --git a/applications/settings/power_settings_app/power_settings_app.c b/applications/settings/power_settings_app/power_settings_app.c index 460fccf15..016439c0d 100644 --- a/applications/settings/power_settings_app/power_settings_app.c +++ b/applications/settings/power_settings_app/power_settings_app.c @@ -25,6 +25,9 @@ PowerSettingsApp* power_settings_app_alloc(uint32_t first_scene) { app->gui = furi_record_open(RECORD_GUI); app->power = furi_record_open(RECORD_POWER); + //PubSub + app->settings_events = power_get_settings_events_pubsub(app->power); + // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&power_settings_scene_handlers, app); diff --git a/applications/settings/power_settings_app/power_settings_app.h b/applications/settings/power_settings_app/power_settings_app.h index 9d2221b48..c128215d0 100644 --- a/applications/settings/power_settings_app/power_settings_app.h +++ b/applications/settings/power_settings_app/power_settings_app.h @@ -26,6 +26,7 @@ typedef struct { PowerInfo info; VariableItemList* variable_item_list; uint32_t shutdown_idle_delay_ms; + FuriPubSub* settings_events; } PowerSettingsApp; typedef enum { diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_shutdown_idle.c b/applications/settings/power_settings_app/scenes/power_settings_scene_shutdown_idle.c index b6c36a890..30304bec6 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_shutdown_idle.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_shutdown_idle.c @@ -63,5 +63,6 @@ bool power_settings_scene_shutdown_idle_on_event(void* context, SceneManagerEven void power_settings_scene_shutdown_idle_on_exit(void* context) { PowerSettingsApp* app = context; SAVE_POWER_SETTINGS(&app->shutdown_idle_delay_ms); + furi_pubsub_publish(app->settings_events, &app->shutdown_idle_delay_ms); variable_item_list_reset(app->variable_item_list); } diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index c9e2371f4..66eb07574 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,2.2,, +Version,+,2.3,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -1786,6 +1786,7 @@ Function,-,pow10f,float,float Function,-,power_enable_low_battery_level_notification,void,"Power*, _Bool" Function,+,power_get_info,void,"Power*, PowerInfo*" Function,+,power_get_pubsub,FuriPubSub*,Power* +Function,+,power_get_settings_events_pubsub,FuriPubSub*,Power* Function,+,power_is_battery_healthy,_Bool,Power* Function,+,power_off,void,Power* Function,+,power_reboot,void,PowerBootMode