Wire up setter and countdown
This commit is contained in:
+109
-9
@@ -1,12 +1,20 @@
|
|||||||
#include <pebble.h>
|
#include <pebble.h>
|
||||||
|
|
||||||
|
// types
|
||||||
|
typedef struct SetterTime {
|
||||||
|
uint8_t HourWIP;
|
||||||
|
uint8_t MinuteWIP;
|
||||||
|
uint8_t HourSet;
|
||||||
|
uint8_t MinuteSet;
|
||||||
|
} __attribute__((__packed__)) SetterTime;
|
||||||
|
|
||||||
// layer-age
|
// layer-age
|
||||||
static Window *s_window;
|
static Window *s_window;
|
||||||
static Layer *s_top_bar_layer;
|
static Layer *s_top_bar_layer;
|
||||||
static Layer *s_bottom_bar_layer;
|
static Layer *s_bottom_bar_layer;
|
||||||
static BitmapLayer *s_clock_bmp_layer;
|
static BitmapLayer *s_clock_bmp_layer;
|
||||||
static BitmapLayer *s_check_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 TextLayer *s_setter_txt_layer;
|
||||||
static Layer *s_highlight_layer;
|
static Layer *s_highlight_layer;
|
||||||
|
|
||||||
@@ -16,6 +24,7 @@ static GBitmap *s_check_bmp;
|
|||||||
|
|
||||||
// global vars
|
// global vars
|
||||||
static uint8_t s_highlight_pos = 0;
|
static uint8_t s_highlight_pos = 0;
|
||||||
|
static struct SetterTime s_setter_time;
|
||||||
|
|
||||||
// constants
|
// constants
|
||||||
static const uint8_t s_edge_bar_height = ((PBL_DISPLAY_HEIGHT / 7) * 2);
|
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) {
|
static void select_click_handler(void *recognizer, void *ctx) {
|
||||||
if (s_highlight_pos == 2) {
|
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;
|
s_highlight_pos = 0;
|
||||||
} else {
|
} else {
|
||||||
s_highlight_pos++;
|
s_highlight_pos++;
|
||||||
@@ -45,6 +136,8 @@ static void back_click_handler(void *recognizer, void *ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void click_config_provider(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_SELECT, select_click_handler);
|
||||||
window_single_click_subscribe(BUTTON_ID_BACK, back_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() {
|
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);
|
Layer *window_layer = window_get_root_layer(s_window);
|
||||||
|
|
||||||
// top&bottom bars
|
// 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));
|
layer_add_child(window_layer, bitmap_layer_get_layer(s_check_bmp_layer));
|
||||||
|
|
||||||
// remaining time
|
// 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));
|
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_remaining_txt_layer, GTextAlignmentCenter);
|
text_layer_set_text_alignment(s_countdown_txt_layer, GTextAlignmentCenter);
|
||||||
text_layer_set_text_color(s_remaining_txt_layer, GColorWhite);
|
text_layer_set_text_color(s_countdown_txt_layer, GColorWhite);
|
||||||
text_layer_set_background_color(s_remaining_txt_layer, GColorClear);
|
text_layer_set_background_color(s_countdown_txt_layer, GColorClear);
|
||||||
text_layer_set_font(s_remaining_txt_layer, fonts_get_system_font(FONT_KEY_LECO_32_BOLD_NUMBERS));
|
text_layer_set_font(s_countdown_txt_layer, fonts_get_system_font(FONT_KEY_LECO_32_BOLD_NUMBERS));
|
||||||
text_layer_set_text(s_remaining_txt_layer, "00:00:00");
|
text_layer_set_text(s_countdown_txt_layer, "00:00:00");
|
||||||
layer_add_child(window_layer, text_layer_get_layer(s_remaining_txt_layer));
|
layer_add_child(window_layer, text_layer_get_layer(s_countdown_txt_layer));
|
||||||
|
|
||||||
// highlighter
|
// 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)));
|
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_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"));
|
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));
|
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() {
|
static void setter_window_unload() {
|
||||||
layer_destroy(s_highlight_layer);
|
layer_destroy(s_highlight_layer);
|
||||||
text_layer_destroy(s_setter_txt_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_check_bmp_layer);
|
||||||
bitmap_layer_destroy(s_clock_bmp_layer);
|
bitmap_layer_destroy(s_clock_bmp_layer);
|
||||||
gbitmap_destroy(s_check_bmp);
|
gbitmap_destroy(s_check_bmp);
|
||||||
|
|||||||
Reference in New Issue
Block a user