Skip to content

Commit 23433ce

Browse files
authored
Merge pull request RogueMaster#58 from theeogflip/dev
Battery Meter
2 parents 7de9c95 + 015fcf2 commit 23433ce

File tree

6 files changed

+95
-1
lines changed

6 files changed

+95
-1
lines changed

applications/desktop/desktop_settings/desktop_settings.h

+1
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,5 @@ typedef struct {
4646
PinCode pin_code;
4747
uint8_t is_locked;
4848
uint32_t auto_lock_delay_ms;
49+
uint8_t displayBatteryPercentage;
4950
} DesktopSettings;

applications/desktop/desktop_settings/scenes/desktop_settings_scene_start.c

+38
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define SCENE_EVENT_SELECT_FAVORITE_SECONDARY 1
99
#define SCENE_EVENT_SELECT_PIN_SETUP 2
1010
#define SCENE_EVENT_SELECT_AUTO_LOCK_DELAY 3
11+
#define SCENE_EVENT_SELECT_BATTERY_DISPLAY 4
1112

1213
#define AUTO_LOCK_DELAY_COUNT 9
1314
const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = {
@@ -25,11 +26,31 @@ const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = {
2526
const uint32_t auto_lock_delay_value[AUTO_LOCK_DELAY_COUNT] =
2627
{0, 10000, 15000, 30000, 60000, 90000, 120000, 300000, 600000};
2728

29+
#define BATTERY_VIEW_COUNT 5
30+
31+
const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = {
32+
"Bar",
33+
"%",
34+
"Inv. %",
35+
"Retro 3",
36+
"Retro 5",
37+
};
38+
39+
const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = {0, 1, 2, 3, 4};
40+
2841
static void desktop_settings_scene_start_var_list_enter_callback(void* context, uint32_t index) {
2942
DesktopSettingsApp* app = context;
3043
view_dispatcher_send_custom_event(app->view_dispatcher, index);
3144
}
3245

46+
static void desktop_settings_scene_start_battery_view_changed(VariableItem* item) {
47+
DesktopSettingsApp* app = variable_item_get_context(item);
48+
uint8_t index = variable_item_get_current_value_index(item);
49+
50+
variable_item_set_current_value_text(item, battery_view_count_text[index]);
51+
app->settings.displayBatteryPercentage = index;
52+
}
53+
3354
static void desktop_settings_scene_start_auto_lock_delay_changed(VariableItem* item) {
3455
DesktopSettingsApp* app = variable_item_get_context(item);
3556
uint8_t index = variable_item_get_current_value_index(item);
@@ -64,6 +85,20 @@ void desktop_settings_scene_start_on_enter(void* context) {
6485
app->settings.auto_lock_delay_ms, auto_lock_delay_value, AUTO_LOCK_DELAY_COUNT);
6586
variable_item_set_current_value_index(item, value_index);
6687
variable_item_set_current_value_text(item, auto_lock_delay_text[value_index]);
88+
89+
item = variable_item_list_add(
90+
variable_item_list,
91+
"Battery View",
92+
BATTERY_VIEW_COUNT,
93+
desktop_settings_scene_start_battery_view_changed,
94+
app);
95+
96+
value_index = value_index_uint32(
97+
app->settings.displayBatteryPercentage,
98+
displayBatteryPercentage_value,
99+
BATTERY_VIEW_COUNT);
100+
variable_item_set_current_value_index(item, value_index);
101+
variable_item_set_current_value_text(item, battery_view_count_text[value_index]);
67102

68103
view_dispatcher_switch_to_view(app->view_dispatcher, DesktopSettingsAppViewVarItemList);
69104
}
@@ -91,6 +126,9 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent even
91126
case SCENE_EVENT_SELECT_AUTO_LOCK_DELAY:
92127
consumed = true;
93128
break;
129+
case SCENE_EVENT_SELECT_BATTERY_DISPLAY:
130+
consumed = true;
131+
break;
94132
}
95133
}
96134
return consumed;

applications/gui/canvas.c

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const CanvasFontParameters canvas_font_params[FontTotalNumber] = {
1212
[FontSecondary] = {.leading_default = 11, .leading_min = 9, .height = 7, .descender = 2},
1313
[FontKeyboard] = {.leading_default = 11, .leading_min = 9, .height = 7, .descender = 2},
1414
[FontBigNumbers] = {.leading_default = 18, .leading_min = 16, .height = 15, .descender = 0},
15+
[FontBatteryPercent] = {.leading_default = 11, .leading_min = 9, .height = 6, .descender = 0},
1516
};
1617

1718
Canvas* canvas_init() {
@@ -132,6 +133,8 @@ void canvas_set_font(Canvas* canvas, Font font) {
132133
u8g2_SetFont(&canvas->fb, u8g2_font_profont11_mr);
133134
} else if(font == FontBigNumbers) {
134135
u8g2_SetFont(&canvas->fb, u8g2_font_profont22_tn);
136+
} else if(font == FontBatteryPercent) {
137+
u8g2_SetFont(&canvas->fb, u8g2_font_5x7_tf); //u8g2_font_micro_tr);
135138
} else {
136139
furi_crash(NULL);
137140
}

applications/gui/canvas.h

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ typedef enum {
2525
FontSecondary,
2626
FontKeyboard,
2727
FontBigNumbers,
28+
FontBatteryPercent,
2829

2930
// Keep last for fonts number calculation
3031
FontTotalNumber,

applications/power/power_service/power.c

+51-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "power_i.h"
22
#include "views/power_off.h"
3+
#include "desktop/desktop_settings/desktop_settings.h"
34

45
#include <furi.h>
56
#include <furi_hal.h>
@@ -14,7 +15,51 @@ void power_draw_battery_callback(Canvas* canvas, void* context) {
1415
canvas_draw_icon(canvas, 0, 0, &I_Battery_26x8);
1516

1617
if(power->info.gauge_is_ok) {
17-
canvas_draw_box(canvas, 2, 2, (power->info.charge + 4) / 5, 4);
18+
19+
char batteryPercentile[5];
20+
snprintf(batteryPercentile, sizeof(batteryPercentile), "%d", power->info.charge);
21+
strcat(batteryPercentile, "%");
22+
23+
if((power->displayBatteryPercentage == 1) && (power->state != PowerStateCharging)) { //if display battery percentage, black background white text
24+
canvas_set_font(canvas, FontBatteryPercent);
25+
canvas_set_color(canvas, ColorBlack);
26+
canvas_draw_box(canvas, 1, 1, 22, 6);
27+
canvas_set_color(canvas, ColorWhite);
28+
canvas_draw_str_aligned(canvas, 12, 4, AlignCenter, AlignCenter, batteryPercentile);
29+
} else if((power->displayBatteryPercentage == 2) && (power->state != PowerStateCharging)) { //if display inverted percentage, white background black text
30+
canvas_set_font(canvas, FontBatteryPercent);
31+
canvas_set_color(canvas, ColorBlack);
32+
canvas_draw_str_aligned(canvas, 12, 4, AlignCenter, AlignCenter, batteryPercentile);
33+
} else if((power->displayBatteryPercentage == 3) && (power->state != PowerStateCharging)) { //Retro style segmented display, 3 parts
34+
if(power->info.charge > 25) {
35+
canvas_draw_box(canvas, 2, 2, 6, 4);
36+
}
37+
if(power->info.charge > 50) {
38+
canvas_draw_box(canvas, 9, 2, 6, 4);
39+
}
40+
if(power->info.charge > 75) {
41+
canvas_draw_box(canvas, 16, 2, 6, 4);
42+
}
43+
} else if((power->displayBatteryPercentage == 4) && (power->state != PowerStateCharging)) { //Retro style segmented display, 5 parts
44+
if(power->info.charge > 10) {
45+
canvas_draw_box(canvas, 2, 2, 3, 4);
46+
}
47+
if(power->info.charge > 30) {
48+
canvas_draw_box(canvas, 6, 2, 3, 4);
49+
}
50+
if(power->info.charge > 50) {
51+
canvas_draw_box(canvas, 10, 2, 3, 4);
52+
}
53+
if(power->info.charge > 70) {
54+
canvas_draw_box(canvas, 14, 2, 3, 4);
55+
}
56+
if(power->info.charge > 90) {
57+
canvas_draw_box(canvas, 18, 2, 3, 4);
58+
}
59+
} else { //default bar display, added here to serve as fallback/default behaviour.
60+
canvas_draw_box(canvas, 2, 2, (power->info.charge + 4) / 5, 4);
61+
}
62+
1863
if(power->state == PowerStateCharging) {
1964
canvas_set_bitmap_mode(canvas, 1);
2065
canvas_set_color(canvas, ColorWhite);
@@ -126,6 +171,11 @@ static void power_check_charging_state(Power* power) {
126171

127172
static bool power_update_info(Power* power) {
128173
PowerInfo info;
174+
175+
DesktopSettings* settings = malloc(sizeof(DesktopSettings));
176+
LOAD_DESKTOP_SETTINGS(settings);
177+
power->displayBatteryPercentage = settings->displayBatteryPercentage;
178+
free(settings);
129179

130180
info.gauge_is_ok = furi_hal_power_gauge_is_ok();
131181
info.charge = furi_hal_power_get_pct();

applications/power/power_service/power_i.h

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct Power {
3636

3737
bool battery_low;
3838
bool show_low_bat_level_message;
39+
uint8_t displayBatteryPercentage;
3940
uint8_t battery_level;
4041
uint8_t power_off_timeout;
4142

0 commit comments

Comments
 (0)