diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c index 9d44f4d5b..77df1ec31 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -54,6 +54,18 @@ static void xtreme_app_scene_misc_lcd_color_changed(VariableItem* item) { notification_message(app->notification, &sequence_display_backlight_on); } +const char* const charge_cap_names[] = + {"50%", "60%", "70%", "80%", "90%", "100%"}; +const int32_t charge_cap_values[COUNT_OF(charge_cap_names)] = + {50, 60, 70, 80, 90, 100}; +static void xtreme_app_scene_misc_charge_cap_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, charge_cap_names[index]); + XTREME_SETTINGS()->charge_cap = charge_cap_values[index]; + app->save_settings = true; +} + void xtreme_app_scene_misc_on_enter(void* context) { XtremeApp* app = context; XtremeSettings* xtreme_settings = XTREME_SETTINGS(); @@ -110,6 +122,18 @@ void xtreme_app_scene_misc_on_enter(void* context) { variable_item_set_current_value_text(item, rgb_backlight_get_color_text(value_index)); variable_item_set_locked(item, !xtreme_settings->rgb_backlight, "Needs RGB\nBacklight!"); + item = variable_item_list_add( + var_item_list, + "Charge Cap %", + COUNT_OF(charge_cap_names), + xtreme_app_scene_misc_charge_cap_changed, + app); + value_index = value_index_uint32( + xtreme_settings->anim_speed, charge_cap_values, COUNT_OF(charge_cap_names)); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, charge_cap_names[value_index]); + + variable_item_list_set_enter_callback( var_item_list, xtreme_app_scene_misc_var_item_list_callback, app); diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index c7e00beb6..aeb646a52 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -472,6 +472,21 @@ static void power_check_battery_level_change(Power* power) { } } +static void power_check_charge_cap(Power* power) { + if(power->info.charge >= XTREME_SETTINGS()->charge_cap) { + if(!power->info.is_charge_cap_suppressing_charging) { // Suppress charging if charge reaches custom cap + power->info.is_charge_cap_suppressing_charging = true; + furi_hal_power_suppress_charge_enter(); + } + } else { + if(power->info.is_charge_cap_suppressing_charging) { // Start charging again if charge below custom cap + power->info.is_charge_cap_suppressing_charging = false; + furi_hal_power_suppress_charge_exit(); + } + } +} + + void power_trigger_ui_update(Power* power) { view_port_update(power->battery_view_port); } @@ -491,6 +506,7 @@ int32_t power_srv(void* p) { } power_auto_shutdown_arm(power); power_update_info(power); + power->info.is_charge_cap_suppressing_charging = false; // default false furi_record_create(RECORD_POWER, power); while(1) { @@ -506,6 +522,9 @@ int32_t power_srv(void* p) { // Check and notify about battery level change power_check_battery_level_change(power); + // Check charge cap, compare with user setting and suppress/unsuppress charging + power_check_charge_cap(power); + // Update battery view port if(need_refresh) { view_port_update(power->battery_view_port); diff --git a/applications/services/power/power_service/power.h b/applications/services/power/power_service/power.h index 4a8f07a89..01e61827a 100644 --- a/applications/services/power/power_service/power.h +++ b/applications/services/power/power_service/power.h @@ -48,6 +48,7 @@ typedef struct { typedef struct { bool gauge_is_ok; bool is_charging; + bool is_charge_cap_suppressing_charging; float current_charger; float current_gauge; diff --git a/assets/protobuf b/assets/protobuf index f71c4b7f7..1f6b4a08c 160000 --- a/assets/protobuf +++ b/assets/protobuf @@ -1 +1 @@ -Subproject commit f71c4b7f750f2539a1fed08925d8da3abdc80ff9 +Subproject commit 1f6b4a08c5d05c2b17926a3ba79f60109638932f diff --git a/lib/STM32CubeWB b/lib/STM32CubeWB new file mode 160000 index 000000000..a9e29b431 --- /dev/null +++ b/lib/STM32CubeWB @@ -0,0 +1 @@ +Subproject commit a9e29b431f6dac95b6fc860a717834f35b7f78e5 diff --git a/lib/xtreme/settings.c b/lib/xtreme/settings.c index aeab97e8a..55e969136 100644 --- a/lib/xtreme/settings.c +++ b/lib/xtreme/settings.c @@ -30,6 +30,7 @@ XtremeSettings xtreme_settings = { .bad_bt_remember = false, // OFF .butthurt_timer = 21600, // 6 H .rgb_backlight = false, // OFF + .charge_cap = 100, // 100% }; void XTREME_SETTINGS_LOAD() { @@ -91,6 +92,8 @@ void XTREME_SETTINGS_LOAD() { flipper_format_read_int32(file, "butthurt_timer", &x->butthurt_timer, 1); flipper_format_rewind(file); flipper_format_read_bool(file, "rgb_backlight", &x->rgb_backlight, 1); + flipper_format_rewind(file); + flipper_format_read_uint32(file, "charge_cap", &x->charge_cap, 1); } flipper_format_free(file); furi_record_close(RECORD_STORAGE); @@ -127,6 +130,7 @@ void XTREME_SETTINGS_SAVE() { flipper_format_write_bool(file, "bad_bt_remember", &x->bad_bt_remember, 1); flipper_format_write_int32(file, "butthurt_timer", &x->butthurt_timer, 1); flipper_format_write_bool(file, "rgb_backlight", &x->rgb_backlight, 1); + flipper_format_write_uint32(file, "charge_cap", &x->charge_cap, 1); } flipper_format_free(file); furi_record_close(RECORD_STORAGE); diff --git a/lib/xtreme/xtreme.h b/lib/xtreme/xtreme.h index b1eb408bf..9382c0b81 100644 --- a/lib/xtreme/xtreme.h +++ b/lib/xtreme/xtreme.h @@ -38,6 +38,7 @@ typedef struct { bool bad_bt_remember; int32_t butthurt_timer; bool rgb_backlight; + uint32_t charge_cap; } XtremeSettings; void XTREME_SETTINGS_SAVE();