From 5ce3339a53cffce31cf5ff40c74902571493cf67 Mon Sep 17 00:00:00 2001 From: Alexander Bays Date: Mon, 20 Jan 2025 19:15:41 -0600 Subject: [PATCH] Nightstand: Show battery percentage and show AM/PM in timer mode (#42) * Nightstand: Show battery percentage - Adds battery percentage to the right of the date on 12hr time format "08-01-2025 94%", or in place of the meridian "AM"/"PM" on 24hr. Checks every 1 second time tick. * AM/PM in timer mode --------- Co-authored-by: Willy-JL <49810075+Willy-JL@users.noreply.github.com> --- nightstand_clock/clock_app.c | 46 ++++++++++++++++++++++++++++-------- nightstand_clock/clock_app.h | 3 +++ 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/nightstand_clock/clock_app.c b/nightstand_clock/clock_app.c index e7a61c4a7..6e613c7b2 100644 --- a/nightstand_clock/clock_app.c +++ b/nightstand_clock/clock_app.c @@ -100,7 +100,8 @@ void elements_progress_bar_vertical( uint8_t height, float progress) { furi_assert(canvas); - furi_assert((progress >= 0) && (progress <= 1.0)); + furi_assert(((float)progress >= 0.0f) && ((float)progress <= 1.0f)); + uint8_t width = 9; uint8_t progress_length = roundf((1.f - progress) * (height - 2)); @@ -142,6 +143,7 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) { char time_string[TIME_LEN]; char date_string[DATE_LEN]; char meridian_string[MERIDIAN_LEN]; + char date_pct_string[DATE_PCT_LEN]; char timer_string[20]; if(state->time_format == LocaleTimeFormat24h) { @@ -188,18 +190,42 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) { int32_t elapsed_secs = timer_running ? (curr_ts - timer_start_timestamp) : timer_stopped_seconds; snprintf(timer_string, 20, "%.2ld:%.2ld", elapsed_secs / 60, elapsed_secs % 60); - canvas_draw_str_aligned(canvas, 64, 8, AlignCenter, AlignCenter, time_string); // DRAW TIME + if(state->time_format == LocaleTimeFormat12h) { + canvas_draw_str_aligned( + canvas, 56, 8, AlignCenter, AlignCenter, time_string); // DRAW TIME + } else { + canvas_draw_str_aligned( + canvas, 64, 8, AlignCenter, AlignCenter, time_string); // DRAW TIME + } canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignTop, timer_string); // DRAW TIMER canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 64, 20, AlignCenter, AlignTop, date_string); // DRAW DATE + if(state->time_format == LocaleTimeFormat12h) { + canvas_draw_str_aligned(canvas, 112, 8, AlignCenter, AlignCenter, meridian_string); + } + + snprintf( + date_pct_string, sizeof(date_pct_string), "%s %u%%", date_string, state->battery_pct); + canvas_draw_str_aligned( + canvas, 64, 20, AlignCenter, AlignTop, date_pct_string); // DRAW DATE + BATTERY elements_button_left(canvas, "Reset"); } else { canvas_draw_str_aligned(canvas, 64, 32, AlignCenter, AlignCenter, time_string); canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 65, 17, AlignCenter, AlignCenter, date_string); - if(state->time_format == LocaleTimeFormat12h) - canvas_draw_str_aligned(canvas, 64, 47, AlignCenter, AlignCenter, meridian_string); + if(state->time_format == LocaleTimeFormat12h) { + snprintf( + date_pct_string, + sizeof(date_pct_string), + "%s %u%%", + date_string, + state->battery_pct); + canvas_draw_str_aligned(canvas, 64, 17, AlignCenter, AlignCenter, date_pct_string); + canvas_draw_str_aligned(canvas, 64, 48, AlignCenter, AlignCenter, meridian_string); + } else { + canvas_draw_str_aligned(canvas, 64, 17, AlignCenter, AlignCenter, date_string); + snprintf(date_pct_string, sizeof(date_pct_string), "%u%%", state->battery_pct); + canvas_draw_str_aligned(canvas, 64, 48, AlignCenter, AlignCenter, date_pct_string); + } } if(timer_running) { elements_button_center(canvas, "Stop"); @@ -210,8 +236,8 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) { static void clock_state_init(ClockState* const state) { state->time_format = locale_get_time_format(); - state->date_format = locale_get_date_format(); + state->battery_pct = furi_hal_power_get_pct(); //FURI_LOG_D(TAG, "Time format: %s", state->settings.time_format == H12 ? "12h" : "24h"); //FURI_LOG_D(TAG, "Date format: %s", state->settings.date_format == Iso ? "ISO 8601" : "RFC 5322"); @@ -344,9 +370,9 @@ int32_t clock_app(void* p) { break; } } - } /*else if(event.type == EventTypeTick) { - furi_hal_rtc_get_datetime(&plugin_state->datetime); - }*/ + } else if(event.type == EventTypeTick) { + plugin_state->battery_pct = furi_hal_power_get_pct(); + } furi_mutex_release(plugin_state->mutex); view_port_update(view_port); diff --git a/nightstand_clock/clock_app.h b/nightstand_clock/clock_app.h index 8118e6982..2134601dc 100644 --- a/nightstand_clock/clock_app.h +++ b/nightstand_clock/clock_app.h @@ -16,6 +16,8 @@ #define TIME_LEN 12 #define DATE_LEN 14 #define MERIDIAN_LEN 3 +#define BATTERY_LEN 4 +#define DATE_PCT_LEN 21 typedef enum { EventTypeTick, @@ -36,4 +38,5 @@ typedef struct { uint32_t timer_start_timestamp; uint32_t timer_stopped_seconds; bool timer_running; + uint8_t battery_pct; } ClockState;