From e40620fd108d63b03e07e3e0a1e4900727b0ed63 Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Mon, 22 May 2023 22:45:16 +0300 Subject: [PATCH] clock --- applications/services/desktop/desktop.c | 72 +++++++++++++++++------ applications/services/desktop/desktop_i.h | 4 ++ 2 files changed, 58 insertions(+), 18 deletions(-) diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 6d9db3b5d..050f6bcbd 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -48,6 +48,16 @@ static void desktop_dummy_mode_icon_draw_callback(Canvas* canvas, void* context) canvas_draw_icon(canvas, 0, 0, &I_GameMode_11x8); } +static uint8_t desktop_clock_get_num_w(uint8_t num) { + if(num == 1) { + return 3; + } else { + return 5; + } +} + +static const char* digit[10] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; + static void desktop_clock_draw_callback(Canvas* canvas, void* context) { //UNUSED(context); furi_assert(context); @@ -56,19 +66,19 @@ static void desktop_clock_draw_callback(Canvas* canvas, void* context) { Desktop* desktop = context; // canvas_draw_icon(canvas, 0, 0, &I_GameMode_11x8); - const char* s[4]; - - s[0] = "4"; - s[1] = "4"; - s[2] = "4"; - s[3] = "1"; + uint8_t d[4] = { + desktop->minute % 10, + desktop->minute / 10, + desktop->hour % 10, + desktop->hour / 10, + }; canvas_set_font(canvas, FontPrimary); - uint8_t new_w = ((strcmp(s[0], "1") == 0) ? 3 : 5) + //c1 - ((strcmp(s[1], "1") == 0) ? 3 : 5) + //c2 - ((strcmp(s[2], "1") == 0) ? 3 : 5) + //c3 - ((strcmp(s[3], "1") == 0) ? 3 : 5) + //c4 + uint8_t new_w = desktop_clock_get_num_w(d[0]) + //c1 + desktop_clock_get_num_w(d[1]) + //c2 + desktop_clock_get_num_w(d[2]) + //c3 + desktop_clock_get_num_w(d[3]) + //c4 2 + 4; // ":" + 4 separators view_port_set_width(desktop->clock_viewport, new_w); @@ -77,20 +87,20 @@ static void desktop_clock_draw_callback(Canvas* canvas, void* context) { uint8_t y = 8; uint8_t offset_r; - canvas_draw_str_aligned(canvas, x, y, AlignRight, AlignBottom, s[0]); - offset_r = (strcmp(s[0], "1") == 0) ? 3 : 5; + canvas_draw_str_aligned(canvas, x, y, AlignRight, AlignBottom, digit[d[0]]); + offset_r = desktop_clock_get_num_w(d[0]); - canvas_draw_str_aligned(canvas, x -= (offset_r + 1), y, AlignRight, AlignBottom, s[1]); - offset_r = (strcmp(s[1], "1") == 0) ? 3 : 5; + canvas_draw_str_aligned(canvas, x -= (offset_r + 1), y, AlignRight, AlignBottom, digit[d[1]]); + offset_r = desktop_clock_get_num_w(d[1]); canvas_draw_str_aligned(canvas, x -= (offset_r + 1), y - 1, AlignRight, AlignBottom, ":"); offset_r = 2; - canvas_draw_str_aligned(canvas, x -= (offset_r + 1), y, AlignRight, AlignBottom, s[2]); - offset_r = (strcmp(s[2], "1") == 0) ? 3 : 5; + canvas_draw_str_aligned(canvas, x -= (offset_r + 1), y, AlignRight, AlignBottom, digit[d[2]]); + offset_r = desktop_clock_get_num_w(d[2]); - canvas_draw_str_aligned(canvas, x -= (offset_r + 1), y, AlignRight, AlignBottom, s[3]); - offset_r = (strcmp(s[3], "1") == 0) ? 3 : 5; + canvas_draw_str_aligned(canvas, x -= (offset_r + 1), y, AlignRight, AlignBottom, digit[d[3]]); + offset_r = desktop_clock_get_num_w(d[3]); x -= (offset_r + 1); @@ -184,6 +194,20 @@ static void desktop_auto_lock_inhibit(Desktop* desktop) { } } +static void desktop_update_clock_timer_callback(void* context) { + furi_assert(context); + Desktop* desktop = context; + + FuriHalRtcDateTime curr_dt; + furi_hal_rtc_get_datetime(&curr_dt); + + desktop->hour = curr_dt.hour; + desktop->minute = curr_dt.minute; + view_port_update(desktop->clock_viewport); + + // view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopGlobalAutoLock); +} + void desktop_lock(Desktop* desktop) { furi_hal_rtc_set_flag(FuriHalRtcFlagLock); @@ -366,6 +390,17 @@ Desktop* desktop_alloc() { desktop->auto_lock_timer = furi_timer_alloc(desktop_auto_lock_timer_callback, FuriTimerTypeOnce, desktop); + desktop->update_clock_timer = + furi_timer_alloc(desktop_update_clock_timer_callback, FuriTimerTypePeriodic, desktop); + + FuriHalRtcDateTime curr_dt; + furi_hal_rtc_get_datetime(&curr_dt); + + desktop->hour = curr_dt.hour; + desktop->minute = curr_dt.minute; + + furi_timer_start(desktop->update_clock_timer, furi_ms_to_ticks(1000)); + furi_record_create(RECORD_DESKTOP, desktop); return desktop; @@ -419,6 +454,7 @@ void desktop_free(Desktop* desktop) { furi_record_close("menu"); furi_timer_free(desktop->auto_lock_timer); + furi_timer_free(desktop->update_clock_timer); free(desktop); } diff --git a/applications/services/desktop/desktop_i.h b/applications/services/desktop/desktop_i.h index 1d9df7c85..0fac0f34c 100644 --- a/applications/services/desktop/desktop_i.h +++ b/applications/services/desktop/desktop_i.h @@ -71,6 +71,10 @@ struct Desktop { FuriPubSub* input_events_pubsub; FuriPubSubSubscription* input_events_subscription; FuriTimer* auto_lock_timer; + FuriTimer* update_clock_timer; + + uint8_t hour; + uint8_t minute; bool in_transition; };