From 8becdc66e773ae1b61baffe28593b1334dbf58ad Mon Sep 17 00:00:00 2001 From: John Date: Sun, 28 May 2023 21:12:00 +0200 Subject: [PATCH 1/4] Feature: Custom user set charging cap --- .../xtreme_app/scenes/xtreme_app_scene_misc.c | 24 +++++++++++++++++++ .../services/power/power_service/power.c | 19 +++++++++++++++ .../services/power/power_service/power.h | 1 + assets/protobuf | 2 +- lib/STM32CubeWB | 1 + lib/xtreme/settings.c | 4 ++++ lib/xtreme/xtreme.h | 1 + 7 files changed, 51 insertions(+), 1 deletion(-) create mode 160000 lib/STM32CubeWB 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(); From 9fe6dbe0cd631f848a56c4c9fca7d04e0261af2b Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Sun, 28 May 2023 20:37:50 +0100 Subject: [PATCH 2/4] Fix submodules --- assets/protobuf | 2 +- lib/STM32CubeWB | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 160000 lib/STM32CubeWB diff --git a/assets/protobuf b/assets/protobuf index 1f6b4a08c..f71c4b7f7 160000 --- a/assets/protobuf +++ b/assets/protobuf @@ -1 +1 @@ -Subproject commit 1f6b4a08c5d05c2b17926a3ba79f60109638932f +Subproject commit f71c4b7f750f2539a1fed08925d8da3abdc80ff9 diff --git a/lib/STM32CubeWB b/lib/STM32CubeWB deleted file mode 160000 index a9e29b431..000000000 --- a/lib/STM32CubeWB +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a9e29b431f6dac95b6fc860a717834f35b7f78e5 From 11c443b79ac88ba7edcde4102651c747e44a13b3 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Sun, 28 May 2023 20:42:11 +0100 Subject: [PATCH 3/4] Shorter charge cap var name (for format) --- .../main/xtreme_app/scenes/xtreme_app_scene_misc.c | 7 ++----- applications/services/power/power_service/power.c | 11 +++++------ applications/services/power/power_service/power.h | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) 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 77df1ec31..2e3984439 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -54,10 +54,8 @@ 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}; +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); @@ -133,7 +131,6 @@ void xtreme_app_scene_misc_on_enter(void* context) { 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 aeb646a52..423f767b9 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -474,19 +474,18 @@ 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; + if(!power->info.is_charge_capped) { // Suppress charging if charge reaches custom cap + power->info.is_charge_capped = 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; + if(power->info.is_charge_capped) { // Start charging again if charge below custom cap + power->info.is_charge_capped = false; furi_hal_power_suppress_charge_exit(); } } } - void power_trigger_ui_update(Power* power) { view_port_update(power->battery_view_port); } @@ -506,7 +505,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 + power->info.is_charge_capped = false; // default false furi_record_create(RECORD_POWER, power); while(1) { diff --git a/applications/services/power/power_service/power.h b/applications/services/power/power_service/power.h index 01e61827a..8a9d5947d 100644 --- a/applications/services/power/power_service/power.h +++ b/applications/services/power/power_service/power.h @@ -48,7 +48,7 @@ typedef struct { typedef struct { bool gauge_is_ok; bool is_charging; - bool is_charge_cap_suppressing_charging; + bool is_charge_capped; float current_charger; float current_gauge; From 3a21b12818b343665adf756501225f7340279fe3 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Sun, 28 May 2023 21:04:25 +0100 Subject: [PATCH 4/4] Move charge cap setting, more values, fix build --- .../xtreme_app/scenes/xtreme_app_scene_misc.c | 44 ++++++++++--------- lib/xtreme/settings.c | 8 ++-- lib/xtreme/xtreme.h | 2 +- 3 files changed, 28 insertions(+), 26 deletions(-) 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 2e3984439..35bc24d09 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -45,6 +45,17 @@ static void xtreme_app_scene_misc_butthurt_timer_changed(VariableItem* item) { app->require_reboot = true; } +#define CHARGE_CAP_INTV 5 +static void xtreme_app_scene_misc_charge_cap_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + char cap_str[6]; + uint32_t value = (variable_item_get_current_value_index(item) + 1) * CHARGE_CAP_INTV; + snprintf(cap_str, 6, "%lu%%", value); + variable_item_set_current_value_text(item, cap_str); + XTREME_SETTINGS()->charge_cap = value; + app->save_settings = true; +} + static void xtreme_app_scene_misc_lcd_color_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); @@ -54,16 +65,6 @@ 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(); @@ -106,6 +107,18 @@ void xtreme_app_scene_misc_on_enter(void* context) { variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, butthurt_timer_names[value_index]); + char cap_str[6]; + value_index = xtreme_settings->charge_cap / CHARGE_CAP_INTV; + snprintf(cap_str, 6, "%lu%%", (uint32_t)value_index * CHARGE_CAP_INTV); + item = variable_item_list_add( + var_item_list, + "Charge Cap", + 100 / CHARGE_CAP_INTV, + xtreme_app_scene_misc_charge_cap_changed, + app); + variable_item_set_current_value_index(item, value_index - 1); + variable_item_set_current_value_text(item, cap_str); + item = variable_item_list_add(var_item_list, "RGB Backlight", 1, NULL, app); variable_item_set_current_value_text(item, xtreme_settings->rgb_backlight ? "ON" : "OFF"); @@ -120,17 +133,6 @@ 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/lib/xtreme/settings.c b/lib/xtreme/settings.c index 55e969136..2ced296a4 100644 --- a/lib/xtreme/settings.c +++ b/lib/xtreme/settings.c @@ -29,8 +29,8 @@ XtremeSettings xtreme_settings = { .bad_bt = false, // USB .bad_bt_remember = false, // OFF .butthurt_timer = 21600, // 6 H - .rgb_backlight = false, // OFF .charge_cap = 100, // 100% + .rgb_backlight = false, // OFF }; void XTREME_SETTINGS_LOAD() { @@ -91,9 +91,9 @@ void XTREME_SETTINGS_LOAD() { flipper_format_rewind(file); 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_rewind(file); + flipper_format_read_bool(file, "rgb_backlight", &x->rgb_backlight, 1); } flipper_format_free(file); furi_record_close(RECORD_STORAGE); @@ -129,8 +129,8 @@ void XTREME_SETTINGS_SAVE() { flipper_format_write_bool(file, "bad_bt", &x->bad_bt, 1); 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_write_bool(file, "rgb_backlight", &x->rgb_backlight, 1); } flipper_format_free(file); furi_record_close(RECORD_STORAGE); diff --git a/lib/xtreme/xtreme.h b/lib/xtreme/xtreme.h index 9382c0b81..bb5b265e9 100644 --- a/lib/xtreme/xtreme.h +++ b/lib/xtreme/xtreme.h @@ -37,8 +37,8 @@ typedef struct { bool bad_bt; bool bad_bt_remember; int32_t butthurt_timer; - bool rgb_backlight; uint32_t charge_cap; + bool rgb_backlight; } XtremeSettings; void XTREME_SETTINGS_SAVE();