diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 252be5027..c6e1147d7 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -442,7 +442,7 @@ static void power_auto_poweroff_timer_callback(void* context) { Power* power = context; //Dont poweroff device if charger connected - if (furi_hal_power_is_charging()) { + if(furi_hal_power_is_charging()) { FURI_LOG_D(TAG, "We dont auto_power_off until battery is charging"); power_start_auto_poweroff_timer(power); } else { @@ -548,6 +548,24 @@ static void power_message_callback(FuriEventLoopObject* object, void* context) { } } +static void power_charge_supress(Power* power) { + // if charge_supress_percent selected (not OFF) and current charge level equal or higher than selected level + // then we start supression if we not supress it before. + if(power->settings.charge_supress_percent && + power->info.charge >= power->settings.charge_supress_percent) { + if(!power->charge_is_supressed) { + power->charge_is_supressed = true; + furi_hal_power_suppress_charge_enter(); + } + // disable supression if charge_supress_percent OFF but charge still supressed + } else { + if(power->charge_is_supressed) { + power->charge_is_supressed = false; + furi_hal_power_suppress_charge_exit(); + } + } +} + static void power_tick_callback(void* context) { furi_assert(context); Power* power = context; @@ -560,6 +578,8 @@ static void power_tick_callback(void* context) { power_check_charging_state(power); // Check and notify about battery level change power_check_battery_level_change(power); + // charge supress arm/disarm + power_charge_supress(power); // Update battery view port if(need_refresh) { view_port_update(power->battery_view_port); @@ -585,7 +605,7 @@ static void power_storage_callback(const void* message, void* context) { } } -// load inital settings from file for power service +// loading and initializing power service settings static void power_init_settings(Power* power) { Storage* storage = furi_record_open(RECORD_STORAGE); furi_pubsub_subscribe(storage_get_pubsub(storage), power_storage_callback, power); @@ -598,6 +618,7 @@ static void power_init_settings(Power* power) { power_settings_load(&power->settings); power_settings_apply(power); furi_record_close(RECORD_STORAGE); + power->charge_is_supressed = false; } static Power* power_alloc(void) { @@ -661,7 +682,7 @@ int32_t power_srv(void* p) { Power* power = power_alloc(); - // load inital settings for power service + // power service settings initialization power_init_settings(power); power_update_info(power); diff --git a/applications/services/power/power_service/power_i.h b/applications/services/power/power_service/power_i.h index 40b4a1ef4..09f8e7816 100644 --- a/applications/services/power/power_service/power_i.h +++ b/applications/services/power/power_service/power_i.h @@ -41,6 +41,7 @@ struct Power { bool app_running; FuriPubSub* input_events_pubsub; FuriPubSubSubscription* input_events_subscription; + bool charge_is_supressed; }; typedef enum { diff --git a/applications/services/power/power_service/power_settings.h b/applications/services/power/power_service/power_settings.h index c07199cf8..63f24e097 100644 --- a/applications/services/power/power_service/power_settings.h +++ b/applications/services/power/power_service/power_settings.h @@ -6,7 +6,6 @@ typedef struct { uint32_t auto_poweroff_delay_ms; uint8_t charge_supress_percent; - bool charge_is_supressed; } PowerSettings; #ifdef __cplusplus diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_start.c b/applications/settings/power_settings_app/scenes/power_settings_scene_start.c index 0d23d3915..2b8bd773f 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_start.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_start.c @@ -15,10 +15,11 @@ const char* const auto_poweroff_delay_text[AUTO_POWEROFF_DELAY_COUNT] = const uint32_t auto_poweroff_delay_value[AUTO_POWEROFF_DELAY_COUNT] = {0, 300000, 600000, 900000, 1800000, 2700000, 3600000, 5400000}; -#define CHARGE_SUPRESS_PERCENT_COUNT 2 -const char* const charge_supress_percent_text[CHARGE_SUPRESS_PERCENT_COUNT] = {"OFF", "80%"}; +#define CHARGE_SUPRESS_PERCENT_COUNT 6 +const char* const charge_supress_percent_text[CHARGE_SUPRESS_PERCENT_COUNT] = + {"OFF", "90%", "85%", "80%", "75%", "70%"}; -const uint32_t charge_supress_percent_value[CHARGE_SUPRESS_PERCENT_COUNT] = {0, 80}; +const uint32_t charge_supress_percent_value[CHARGE_SUPRESS_PERCENT_COUNT] = {0, 90, 85, 80, 75, 70}; // change variable_item_list visible text and charge_supress_percent_settings when user change item in variable_item_list static void power_settings_scene_start_charge_supress_percent_changed(VariableItem* item) { @@ -72,7 +73,7 @@ void power_settings_scene_start_on_enter(void* context) { item = variable_item_list_add( variable_item_list, - "Safe charging", + "Safe Charging", CHARGE_SUPRESS_PERCENT_COUNT, power_settings_scene_start_charge_supress_percent_changed, app);