From de9be9d8e4f396fa9fe3fe55fccbbadd5d169a94 Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Sat, 1 Aug 2026 18:00:22 -0400 Subject: [PATCH] Wire up setter and countdown --- src/c/main.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 109 insertions(+), 9 deletions(-) diff --git a/src/c/main.c b/src/c/main.c index 9f05141..0a1192d 100644 --- a/src/c/main.c +++ b/src/c/main.c @@ -1,12 +1,20 @@ #include +// types +typedef struct SetterTime { + uint8_t HourWIP; + uint8_t MinuteWIP; + uint8_t HourSet; + uint8_t MinuteSet; +} __attribute__((__packed__)) SetterTime; + // layer-age static Window *s_window; static Layer *s_top_bar_layer; static Layer *s_bottom_bar_layer; static BitmapLayer *s_clock_bmp_layer; static BitmapLayer *s_check_bmp_layer; -static TextLayer *s_remaining_txt_layer; +static TextLayer *s_countdown_txt_layer; static TextLayer *s_setter_txt_layer; static Layer *s_highlight_layer; @@ -16,6 +24,7 @@ static GBitmap *s_check_bmp; // global vars static uint8_t s_highlight_pos = 0; +static struct SetterTime s_setter_time; // constants static const uint8_t s_edge_bar_height = ((PBL_DISPLAY_HEIGHT / 7) * 2); @@ -24,8 +33,90 @@ static const GColor s_highlight_color = GColorMediumAquamarine; ///////////////////////////////// +static void update_countdown_display(struct tm *tick_time, TimeUnits units_changed) { + struct tm now_tm = *tick_time; + + // Build the target time today + struct tm target_tm = now_tm; + target_tm.tm_hour = s_setter_time.HourSet; + target_tm.tm_min = s_setter_time.MinuteSet; + target_tm.tm_sec = 0; + + time_t now = mktime(&now_tm); + time_t target = mktime(&target_tm); + + if (target <= now) { + target += SECONDS_PER_DAY; + } + + int32_t diff = (int32_t)(target - now); + + uint8_t hours = diff / 3600; + uint8_t minutes = (diff % 3600) / 60; + uint8_t seconds = diff % 60; + + static char s_countdown_buffer[9]; + snprintf(s_countdown_buffer, sizeof(s_countdown_buffer), + "%02d:%02d:%02d", hours, minutes, seconds); + text_layer_set_text(s_countdown_txt_layer, s_countdown_buffer); +} + +static void update_setter_display() { + static char s_setter_buffer[8]; + snprintf(s_setter_buffer, sizeof(s_setter_buffer), "%02d:%02d", s_setter_time.HourWIP, s_setter_time.MinuteWIP); + text_layer_set_text(s_setter_txt_layer, s_setter_buffer); +} + +static void up_click_handler(void *recognizer, void *ctx) { + switch (s_highlight_pos) { + case 0: + if (s_setter_time.HourWIP == 23) { + s_setter_time.HourWIP = 0; + } else { + s_setter_time.HourWIP++; + } + break; + case 1: + if (s_setter_time.MinuteWIP == 59) { + s_setter_time.MinuteWIP = 0; + } else { + s_setter_time.MinuteWIP++; + } + break; + default: + return; + } + update_setter_display(); +} + +static void down_click_handler(void *recognizer, void *ctx) { + switch (s_highlight_pos) { + case 0: + if (s_setter_time.HourWIP == 0) { + s_setter_time.HourWIP = 23; + } else { + s_setter_time.HourWIP--; + } + break; + case 1: + if (s_setter_time.MinuteWIP == 0) { + s_setter_time.MinuteWIP = 59; + } else { + s_setter_time.MinuteWIP--; + } + break; + default: + return; + } + update_setter_display(); +} + static void select_click_handler(void *recognizer, void *ctx) { if (s_highlight_pos == 2) { + s_setter_time.HourSet = s_setter_time.HourWIP; + s_setter_time.MinuteSet = s_setter_time.MinuteWIP; + time_t now = time(NULL); + update_countdown_display(localtime(&now), SECOND_UNIT); s_highlight_pos = 0; } else { s_highlight_pos++; @@ -45,6 +136,8 @@ static void back_click_handler(void *recognizer, void *ctx) { } static void click_config_provider(void *ctx) { + window_single_repeating_click_subscribe(BUTTON_ID_UP, 60, up_click_handler); + window_single_repeating_click_subscribe(BUTTON_ID_DOWN, 60, down_click_handler); window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler); window_single_click_subscribe(BUTTON_ID_BACK, back_click_handler); } @@ -75,6 +168,11 @@ static void highlight_layer_update_proc(Layer *layer, GContext *ctx) { } static void setter_window_load() { + s_setter_time.HourWIP = 0; + s_setter_time.MinuteWIP = 0; + s_setter_time.HourSet = 0; + s_setter_time.MinuteSet = 0; + Layer *window_layer = window_get_root_layer(s_window); // top&bottom bars @@ -103,13 +201,13 @@ static void setter_window_load() { layer_add_child(window_layer, bitmap_layer_get_layer(s_check_bmp_layer)); // remaining time - s_remaining_txt_layer = text_layer_create(GRect(PBL_IF_ROUND_ELSE(0, 39), PBL_IF_ROUND_ELSE(37, (top_bar_grect.size.h / 2) - (top_bar_grect.size.h / 3)), PBL_IF_ROUND_ELSE(top_bar_grect.size.w, top_bar_grect.size.w - 39), 32)); - text_layer_set_text_alignment(s_remaining_txt_layer, GTextAlignmentCenter); - text_layer_set_text_color(s_remaining_txt_layer, GColorWhite); - text_layer_set_background_color(s_remaining_txt_layer, GColorClear); - text_layer_set_font(s_remaining_txt_layer, fonts_get_system_font(FONT_KEY_LECO_32_BOLD_NUMBERS)); - text_layer_set_text(s_remaining_txt_layer, "00:00:00"); - layer_add_child(window_layer, text_layer_get_layer(s_remaining_txt_layer)); + s_countdown_txt_layer = text_layer_create(GRect(PBL_IF_ROUND_ELSE(0, 39), PBL_IF_ROUND_ELSE(37, (top_bar_grect.size.h / 2) - (top_bar_grect.size.h / 3)), PBL_IF_ROUND_ELSE(top_bar_grect.size.w, top_bar_grect.size.w - 39), 32)); + text_layer_set_text_alignment(s_countdown_txt_layer, GTextAlignmentCenter); + text_layer_set_text_color(s_countdown_txt_layer, GColorWhite); + text_layer_set_background_color(s_countdown_txt_layer, GColorClear); + text_layer_set_font(s_countdown_txt_layer, fonts_get_system_font(FONT_KEY_LECO_32_BOLD_NUMBERS)); + text_layer_set_text(s_countdown_txt_layer, "00:00:00"); + layer_add_child(window_layer, text_layer_get_layer(s_countdown_txt_layer)); // highlighter s_highlight_layer = layer_create(GRect(0, top_bar_grect.size.h, PBL_DISPLAY_WIDTH, PBL_DISPLAY_HEIGHT - (2 * top_bar_grect.size.h))); @@ -123,12 +221,14 @@ static void setter_window_load() { text_layer_set_font(s_setter_txt_layer, fonts_get_system_font(FONT_KEY_LECO_60_NUMBERS_AM_PM)); text_layer_set_text(s_setter_txt_layer, PBL_IF_ROUND_ELSE("00 : 00", "00:00")); layer_add_child(window_layer, text_layer_get_layer(s_setter_txt_layer)); + + tick_timer_service_subscribe(SECOND_UNIT, update_countdown_display); } static void setter_window_unload() { layer_destroy(s_highlight_layer); text_layer_destroy(s_setter_txt_layer); - text_layer_destroy(s_remaining_txt_layer); + text_layer_destroy(s_countdown_txt_layer); bitmap_layer_destroy(s_check_bmp_layer); bitmap_layer_destroy(s_clock_bmp_layer); gbitmap_destroy(s_check_bmp);