Source

pebble / th10 / src / th10.c

Trammell Hudson 166ffc0 
























Trammell Hudson e5f8a12 


Trammell Hudson 166ffc0 









Trammell Hudson e5f8a12 





Trammell Hudson 166ffc0 



Trammell Hudson e5f8a12 





Trammell Hudson 166ffc0 









Trammell Hudson e5f8a12 







Trammell Hudson 166ffc0 
























Trammell Hudson e5f8a12 









Trammell Hudson 166ffc0 











































Trammell Hudson e5f8a12 




Trammell Hudson 166ffc0 








Trammell Hudson e5f8a12 




































Trammell Hudson 166ffc0 






















Trammell Hudson e5f8a12 


Trammell Hudson 166ffc0 



Trammell Hudson e5f8a12 
Trammell Hudson 166ffc0 






Trammell Hudson e5f8a12 
Trammell Hudson 166ffc0 



















Trammell Hudson e5f8a12 
Trammell Hudson 166ffc0 

















/** \file
 * TH10 -- Torgoen T10 analog style
 *
 */
#include "pebble_os.h"
#include "pebble_app.h"
#include "pebble_fonts.h"
#include "pebble_th.h"

#define UUID { 0x06, 0x97, 0xE5, 0x7F, 0x60, 0xF7, 0x43, 0xC5, 0x80, 0xC4, 0x35, 0x9D, 0xB2, 0x7E, 0xCD, 0xEE }

PBL_APP_INFO(
	UUID,
	"TH10",
	"hudson",
	1, 0, // Version
	RESOURCE_ID_IMAGE_MENU_ICON,
	APP_INFO_WATCH_FACE
);


static Window window;
static Layer hand_layer;
static Layer bg_layer;
static PblTm now;
static GFont font_time;

static int use_24hour;


// Dimensions of the watch face
#define W PEBBLE_SCREEN_WIDTH
#define H PEBBLE_SCREEN_HEIGHT
#define R (W/2 - 2)

// Hour hand
static GPath hour_path;
static GPoint hour_points[] = {
	{  -8, -25 },
	{ -10, -45 },
	{   0,  -60 },
	{ +10, -45 },
	{  +8, -25 },
	{  -8, -25 },
};

static GPath minute_path;
static GPoint minute_points[] = {
	{ -5, -20 },
	{ -9, -50 },
	{  0, -72 },
	{ +9, -50 },
	{ +5, -20 },
	{ -5, -20 },
};

static GPath major_tick_path;
static GPoint major_tick_points[] = {
	{ -4, 60 },
	{ +4, 60 },
	{ +4, 84 },
	{ -4, 84 },
};

static GPath hour_tick_path;
static GPoint hour_tick_points[] = {
	{ -4, 70 },
	{ +4, 70 },
	{ +4, 84 },
	{ -4, 84 },
};

static GPath minor_tick_path;
static GPoint minor_tick_points[] = {
	{ 0, 72 },
	{ 0, 84 },
};

static void
hand_layer_update(
        Layer * const me,
        GContext * ctx
)
{
	(void) me;

	// Draw the minute hand outline in black and filled with white
	int minute_angle = (now.tm_min * TRIG_MAX_ANGLE) / 60;

	gpath_rotate_to(&minute_path, minute_angle);
	graphics_context_set_stroke_color(ctx, GColorBlack);
	gpath_draw_outline(ctx, &minute_path);
	graphics_context_set_fill_color(ctx, GColorWhite);
	gpath_draw_filled(ctx, &minute_path);

	// Draw the hour hand outline in black and filled with white
	// above the minute hand
	int hour_angle;
	if (use_24hour)
	{
		hour_angle = ((now.tm_hour * 60 + now.tm_min) * TRIG_MAX_ANGLE) / (60 * 24);
	} else {
		int hour = now.tm_hour;
		if (hour > 12)
			hour -= 12;
		hour_angle = ((hour * 60 + now.tm_min) * TRIG_MAX_ANGLE) / (60 * 12);
	}

	gpath_rotate_to(&hour_path, hour_angle);
	graphics_context_set_stroke_color(ctx, GColorBlack);
	gpath_draw_outline(ctx, &hour_path);
	graphics_context_set_fill_color(ctx, GColorWhite);
	gpath_draw_filled(ctx, &hour_path);

}


/** Called once per minute */
static void
handle_tick(
	AppContextRef ctx,
	PebbleTickEvent * const event
)
{
	(void) ctx;

	now = *event->tick_time;

	layer_mark_dirty(&hand_layer);
}


/** Draw the initial background image */
static void
bg_layer_update(
        Layer * const me,
        GContext * ctx
)
{
	(void) me;

	graphics_context_set_stroke_color(ctx, GColorWhite);
	graphics_context_set_fill_color(ctx, GColorWhite);

	// Draw the center circle
	graphics_draw_circle(ctx, GPoint(W/2,H/2), 3);

	// Draw the outside marks
	for (int min = 0 ; min < 60 ; min++)
	{
		const int angle = (min * TRIG_MAX_ANGLE) / 60;
		if ((min % 15) == 0)
		{
			gpath_rotate_to(&hour_tick_path, angle);
			gpath_draw_filled(ctx, &hour_tick_path);
		} else
		if ((min % 5) == 0)
		{
			gpath_rotate_to(&major_tick_path, angle);
			gpath_draw_filled(ctx, &major_tick_path);
		} else {
			gpath_rotate_to(&minor_tick_path, angle);
			gpath_draw_outline(ctx, &minor_tick_path);
		}
	}

	// And the large labels
	graphics_text_draw(ctx,
		use_24hour ? "24" : "12",
		font_time,
		GRect(W/2-30,8,60,50),
		GTextOverflowModeTrailingEllipsis,
		GTextAlignmentCenter,
		NULL
	);

	graphics_text_draw(ctx,
		use_24hour ? "06" : "3",
		font_time,
		GRect(W/2,H/2-22,70,50),
		GTextOverflowModeTrailingEllipsis,
		GTextAlignmentRight,
		NULL
	);

	graphics_text_draw(ctx,
		use_24hour ? "12" : "6",
		font_time,
		GRect(W/2-30,120,60,50),
		GTextOverflowModeTrailingEllipsis,
		GTextAlignmentCenter,
		NULL
	);

	graphics_text_draw(ctx,
		use_24hour ? "18" : "9",
		font_time,
		GRect(W/2-70,H/2-22,60,50),
		GTextOverflowModeTrailingEllipsis,
		GTextAlignmentLeft,
		NULL
	);
}

#define GPATH_INIT(PATH, POINTS) ({ \
	GPathInfo __info = { sizeof(POINTS) / sizeof(*POINTS), POINTS }; \
	gpath_init(PATH, &__info); \
	})

static void
handle_init(
	AppContextRef ctx
)
{
	(void) ctx;

	GPATH_INIT(&hour_path, hour_points);
	gpath_move_to(&hour_path, GPoint(W/2,H/2));

	GPATH_INIT(&minute_path, minute_points);
	gpath_move_to(&minute_path, GPoint(W/2,H/2));

	GPATH_INIT(&major_tick_path, major_tick_points);
	gpath_move_to(&major_tick_path, GPoint(W/2,H/2));

	GPATH_INIT(&hour_tick_path, hour_tick_points);
	gpath_move_to(&hour_tick_path, GPoint(W/2,H/2));

	GPATH_INIT(&minor_tick_path, minor_tick_points);
	gpath_move_to(&minor_tick_path, GPoint(W/2,H/2));

	get_time(&now);
	use_24hour = clock_is_24h_style();

	window_init(&window, "Main");
	window_stack_push(&window, true);
	window_set_background_color(&window, GColorBlack);

	resource_init_current_app(&RESOURCES);

	font_time = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_GILLSANS_32));

	layer_init(&bg_layer, GRect(0, 0, W, H));
	layer_add_child(&window.layer, &bg_layer);
	bg_layer.update_proc = bg_layer_update;
	layer_mark_dirty(&bg_layer);

	layer_init(&hand_layer, GRect(0, 0, W, H));
	layer_add_child(&window.layer, &hand_layer);
	hand_layer.update_proc = hand_layer_update;
	layer_mark_dirty(&hand_layer);
}


static void
handle_deinit(
	AppContextRef ctx
)
{
	(void) ctx;

	fonts_unload_custom_font(font_time);
}


void
pbl_main(
	void * const params
)
{
	PebbleAppHandlers handlers = {
		.init_handler	= &handle_init,
		.deinit_handler = &handle_deinit,
		.tick_info	= {
			.tick_handler = &handle_tick,
			.tick_units = MINUTE_UNIT,
		},
	};

	app_event_loop(params, &handlers);
}