From 075df8a0011ee459670ea767b5018746ff4c453a Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Fri, 13 May 2016 14:11:47 -0600 Subject: [PATCH] Works, I guess --- appinfo.json | 51 +++++++++++++ resources/images/io.png | Bin 0 -> 5944 bytes resources/images/menu.png | Bin 0 -> 463 bytes resources/images/oi.png | Bin 0 -> 5927 bytes resources/images/tck.png | Bin 0 -> 1153 bytes src/main.c | 153 ++++++++++++++++++++++++++++++++++++++ src/twatch.h | 42 +++++++++++ wscript | 62 +++++++++++++++ 8 files changed, 308 insertions(+) create mode 100644 appinfo.json create mode 100644 resources/images/io.png create mode 100644 resources/images/menu.png create mode 100644 resources/images/oi.png create mode 100644 resources/images/tck.png create mode 100644 src/main.c create mode 100644 src/twatch.h create mode 100644 wscript diff --git a/appinfo.json b/appinfo.json new file mode 100644 index 0000000..5a7a628 --- /dev/null +++ b/appinfo.json @@ -0,0 +1,51 @@ +{ + "appKeys": {}, + "capabilities": [ + "" + ], + "companyName": "dartcatcher@gmail.com", + "enableMultiJS": false, + "longName": "toioioioioioioioik", + "projectType": "native", + "resources": { + "media": [ + { + "file": "images/io.png", + "name": "IMAGE_IO", + "targetPlatforms": null, + "type": "bitmap" + }, + { + "file": "images/tck.png", + "name": "IMAGE_TCK", + "targetPlatforms": null, + "type": "bitmap" + }, + { + "file": "images/oi.png", + "name": "IMAGE_OI", + "targetPlatforms": null, + "type": "bitmap" + }, + { + "file": "images/menu.png", + "menuIcon": true, + "name": "MENU_IMAGE", + "targetPlatforms": null, + "type": "png" + } + ] + }, + "sdkVersion": "3", + "shortName": "toik", + "targetPlatforms": [ + "aplite", + "basalt", + "chalk" + ], + "uuid": "564f9b82-5a03-494c-8bf1-65e4eb9a5306", + "versionLabel": "1.0", + "watchapp": { + "watchface": true + } +} diff --git a/resources/images/io.png b/resources/images/io.png new file mode 100644 index 0000000000000000000000000000000000000000..90e786d89fd6f302b8c5f18016807d344115902a GIT binary patch literal 5944 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 a0`X6{i6W{PYxNKS0000M*z{LI&sdK z)zoYO%bwmgvdeQk3_GJVtYa_$h#L^Y5bWI27%^utWvd2DS@09I0NC-bIj#Z;a@)BJ zP~^->qH|*Yy&Ow(xDUHjn$l_OyEZrFELe>R>iu~>c04_3D?h2ZO&ui{Re8XM_2%dB zbqktfpj1*j)AA>ebF9@35djg^YpL}tXRMp;r3&qwIj?vuW8IPbSg9lpZ##7Y1l}6B1C+1iXEm13q;x{Qw73sEeZZHw^#)002ovPDHLk FV1hfByIcSO literal 0 HcmV?d00001 diff --git a/resources/images/oi.png b/resources/images/oi.png new file mode 100644 index 0000000000000000000000000000000000000000..49b7c3c0b807498eab4e0da0add43dd552697806 GIT binary patch literal 5927 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 JPDHLkV1n$Ng*N~I literal 0 HcmV?d00001 diff --git a/resources/images/tck.png b/resources/images/tck.png new file mode 100644 index 0000000000000000000000000000000000000000..640a266c6689a8a708448e80bf97f7d0952f9182 GIT binary patch literal 1153 zcmV-{1b+L8P)7 zv(FrQSzlNWv**A5zge?p)>`vl|4lWPU}=>KeHCnH;VDd?2!R1Sj}xmnuOjd;7FKm$ zmRoTcM;c{CmCD^(uoN3Gsi#ZpKtI;uprcowm7lOBS1xMjs9g&#$JO`@BQ;%gTQ+HJ zL9Kl-ZjwL}NCHV{T@w&#u)7uc-E*;Ry_S!nFE`55Nm zLOh3$G1#j>pO|;^B3bzkr}gSQ;|zS8b9?~LVn(NmRUWwk3}Y^S6|LIU!^I{Ni9{li zNF)-8L?V$$Boc}Lkt#vKAzUINztgY>UpC6&@m$0Ocm<;(oOwuVc=Ko6r-#7o03L5R z{1f-%OtFzV8P|xob|&<-3gPABvAI!k8)mn$dob6U9l8W+iGF#lQDKkHVdHa+4K?4} zO<+xv@jcy)@qJEULnq_uV*mJvxW8pG5N^u}Ea_ytw#o3F63#QO6Fca`-3&i$5_qVB zKwFx3K&Ij1rsLgp3(OVIe#U6s0{N_uN+~8~1cq|wD(yCv5%?>2Zb2Oa&CJvKJpZGI zWSLG(#@{)SwLSP*qy5^YJIUxYK#TED-rf z`>}o!ZWQm$lSL=wU7r2TG6R&$DA^bo4G^l zl-RDkiUoTE!rYd5HseBKbq7gun*UZ z&)bY;xVtU^_zHLBetQI0)Fl8* zjJ!Jc+bS$C>!9p>urX&hD)N8FkZ(c$C7RksV5JCpWDMeUF?@IA(cG17?O?k=gcq9a zf516K#zSJv`Q6wr`Ssd|30^L+AHkhCE;HJy_%BKMveVHp+j4P>4tKEMk5B#u4gM<@ TyU+3Z00000NkvXXu0mjfw8Iz2 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..ca290ea --- /dev/null +++ b/src/main.c @@ -0,0 +1,153 @@ +#include + +#define MINLEN 58 +#define HRCIRCLER 30 +#define NRINGS 17 +#define MINCIRCLER 20 + +#define fatness 14 +#define fat(x) (fatness * x) + +static Window *window; +static Layer *s_hr_layer, *s_min_layer; +static GBitmap *oi_bitmap, *io_bitmap, *tck_bitmap; +static BitmapLayer *oi_layer, *tck_layer; + +GRect display_bounds; +GPoint center, mincenter; + +int32_t min_angle; +char hrstr[3], minstr[3], datestr[15]; +bool bt_vibe = true; +bool shape = 0; + +bool bt_connected; + +#define nringcolors 5 +GColor *rings[nringcolors] = { + &GColorVividCerulean, + &GColorChromeYellow, + &GColorCobaltBlue, + &GColorDarkGray, + &GColorWhite, +}; + +static void min_update_proc(Layer *layer, GContext *ctx) { + // +} + +static void hr_update_proc(Layer *layer, GContext *ctx) { + // +} + +static void handle_tick(struct tm *tick_time, TimeUnits units_changed) { + if (units_changed & HOUR_UNIT) { + if (clock_is_24h_style()) { + strftime(hrstr, sizeof(hrstr), "%H", tick_time); + } else { + strftime(hrstr, sizeof(hrstr), "%I", tick_time); + } + layer_mark_dirty(s_hr_layer); + } + + if (units_changed & SECOND_UNIT) { + strftime(minstr, sizeof(minstr), "%M", tick_time); + if (tick_time->tm_sec % 2 == 0) { + bitmap_layer_set_bitmap(oi_layer, oi_bitmap); + } else { + bitmap_layer_set_bitmap(oi_layer, io_bitmap); + } + + layer_mark_dirty(s_min_layer); + } +} + +static void window_load(Window *window) { + Layer *window_layer = window_get_root_layer(window); + + display_bounds = layer_get_bounds(window_layer); + center = grect_center_point(&display_bounds); + + // Minutes + s_min_layer = layer_create(display_bounds); + layer_set_update_proc(s_min_layer, min_update_proc); + + // oioioioi + oi_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_OI); + io_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_IO); + GRect bm_bounds = gbitmap_get_bounds(oi_bitmap); + GRect min_bounds = { + .origin = { + .x = (display_bounds.size.w - bm_bounds.size.w) / 2, + .y = 40, + }, + .size = { + .w = bm_bounds.size.w, + .h = bm_bounds.size.h, + } + }; + oi_layer = bitmap_layer_create(min_bounds); + bitmap_layer_set_compositing_mode(oi_layer, GCompOpSet); + layer_add_child(s_min_layer, bitmap_layer_get_layer(oi_layer)); + + // t_ck + tck_bitmap = gbitmap_create_with_resource(RESOURCE_ID_IMAGE_TCK); + GRect tck_bounds = gbitmap_get_bounds(tck_bitmap); + tck_bounds.origin.x = center.x - (tck_bounds.size.w / 2); + tck_bounds.origin.y = 5; + tck_layer = bitmap_layer_create(tck_bounds); + bitmap_layer_set_compositing_mode(tck_layer, GCompOpSet); + bitmap_layer_set_bitmap(tck_layer, tck_bitmap); + layer_add_child(s_min_layer, bitmap_layer_get_layer(tck_layer)); + + // Hours + s_hr_layer = layer_create(display_bounds); + layer_set_update_proc(s_hr_layer, hr_update_proc); + + layer_add_child(window_layer, s_min_layer); + layer_add_child(window_layer, s_hr_layer); +} + +static void window_unload(Window *window) { + layer_destroy(s_hr_layer); + layer_destroy(s_min_layer); + bitmap_layer_destroy(oi_layer); +} + +static void bt_handler(bool connected) { + bt_connected = connected; + if (bt_vibe && (! connected)) { + vibes_double_pulse(); + } + layer_mark_dirty(s_min_layer); +} + +static void init() { + window = window_create(); + window_set_window_handlers(window, (WindowHandlers) { + .load = window_load, + .unload = window_unload, + }); + window_stack_push(window, true); + + tick_timer_service_subscribe(HOUR_UNIT | MINUTE_UNIT | SECOND_UNIT, handle_tick); + { + time_t now = time(NULL); + struct tm *tick_time = localtime(&now); + handle_tick(tick_time, HOUR_UNIT | MINUTE_UNIT | SECOND_UNIT); + } + + bluetooth_connection_service_subscribe(bt_handler); + bt_connected = bluetooth_connection_service_peek(); +} + +static void deinit() { + tick_timer_service_unsubscribe(); + window_destroy(window); +} + +int main() { + init(); + app_event_loop(); + deinit(); +} diff --git a/src/twatch.h b/src/twatch.h new file mode 100644 index 0000000..691eb24 --- /dev/null +++ b/src/twatch.h @@ -0,0 +1,42 @@ +#include +#pragma once + +#define SECOND_LEN PBL_IF_ROUND_ELSE(77, 72) +#define SECOND_RADIUS 7 +static const GPathInfo SECOND_HAND_POINTS = { + 4, + (GPoint []) { + {2, -70}, + {2, PBL_IF_ROUND_ELSE(-90, -85)}, + {-2, PBL_IF_ROUND_ELSE(-90, -85)}, + {-2, -70} + } +}; + +#define MINUTE_LEN PBL_IF_ROUND_ELSE(-81, -78) +static const GPathInfo MINUTE_HAND_POINTS = { + 7, + (GPoint []) { + {4, 0}, + {4, MINUTE_LEN}, + {3, MINUTE_LEN - 2}, + {0, MINUTE_LEN - 3}, + {-3, MINUTE_LEN - 2}, + {-4, MINUTE_LEN}, + {-4, 0} + } +}; + +#define HOUR_LEN PBL_IF_ROUND_ELSE(-55, -53) +static const GPathInfo HOUR_HAND_POINTS = { + 7, + (GPoint []) { + {5, 0}, + {5, HOUR_LEN}, + {4, HOUR_LEN -2}, + {0, HOUR_LEN - 3}, + {-4, HOUR_LEN - 2}, + {-5, HOUR_LEN}, + {-5, 0} + } +}; diff --git a/wscript b/wscript new file mode 100644 index 0000000..b20f58f --- /dev/null +++ b/wscript @@ -0,0 +1,62 @@ + + # +# This file is the default set of rules to compile a Pebble project. +# +# Feel free to customize this to your needs. +# + +import os.path +try: + from sh import CommandNotFound, jshint, cat, ErrorReturnCode_2 + hint = jshint +except (ImportError, CommandNotFound): + hint = None + +top = '.' +out = 'build' + +def options(ctx): + ctx.load('pebble_sdk') + +def configure(ctx): + ctx.load('pebble_sdk') + +def build(ctx): + if False and hint is not None: + try: + hint([node.abspath() for node in ctx.path.ant_glob("src/**/*.js")], _tty_out=False) # no tty because there are none in the cloudpebble sandbox. + except ErrorReturnCode_2 as e: + ctx.fatal("\nJavaScript linting failed (you can disable this in Project Settings):\n" + e.stdout) + + # Concatenate all our JS files (but not recursively), and only if any JS exists in the first place. + ctx.path.make_node('src/js/').mkdir() + js_paths = ctx.path.ant_glob(['src/*.js', 'src/**/*.js']) + if js_paths: + ctx(rule='cat ${SRC} > ${TGT}', source=js_paths, target='pebble-js-app.js') + has_js = True + else: + has_js = False + + ctx.load('pebble_sdk') + + build_worker = os.path.exists('worker_src') + binaries = [] + + for p in ctx.env.TARGET_PLATFORMS: + ctx.set_env(ctx.all_envs[p]) + ctx.set_group(ctx.env.PLATFORM_NAME) + app_elf='{}/pebble-app.elf'.format(p) + ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'), + target=app_elf) + + if build_worker: + worker_elf='{}/pebble-worker.elf'.format(p) + binaries.append({'platform': p, 'app_elf': app_elf, 'worker_elf': worker_elf}) + ctx.pbl_worker(source=ctx.path.ant_glob('worker_src/**/*.c'), + target=worker_elf) + else: + binaries.append({'platform': p, 'app_elf': app_elf}) + + ctx.set_group('bundle') + ctx.pbl_bundle(binaries=binaries, js='pebble-js-app.js' if has_js else []) + \ No newline at end of file