From 1c3b97e52bb4df186a66c1f710eaebf6f5fb6aed Mon Sep 17 00:00:00 2001 From: Stephen Paul Lesniewski Date: Sat, 25 Jan 2014 12:13:10 -0500 Subject: [PATCH] ported to PebbleSDK-2.0BETA7 --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 8 +++ README.md | 6 +- appinfo.json | 27 ++++++++ build/HourGlass.pbw | Bin 10880 -> 0 bytes resources/.DS_Store | Bin 6148 -> 0 bytes resources/img/.DS_Store | Bin 6148 -> 0 bytes resources/src/resource_map.json | 16 ----- src/HourGlass.c | 105 ++++++++++++++++---------------- wscript | 24 ++++++++ 10 files changed, 118 insertions(+), 68 deletions(-) delete mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 appinfo.json delete mode 100644 build/HourGlass.pbw delete mode 100644 resources/.DS_Store delete mode 100644 resources/img/.DS_Store delete mode 100644 resources/src/resource_map.json create mode 100644 wscript diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index b1c5bfa059c2e1011950cdc9d3296cdcc110a8d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKO-sW-5S{IZrl`=1(BtB{NQ+o3cnCqkqmY6J6-|uTKxj&m+C!}d|B(Mi|Bi1z zEEelksLa6Zo1NL&&AwfBvqU7kNz^535|IN{SZSbGAu6u)hg7Vm4ivhND9Z1WFijIw zS=NC8wRUw1X+kk2w6uN=%IKbQN)gQHPTAo!ABRaABIzw0CvjeMI`5)Vt<^U+9mw|8 zMLdeqsh3VhQGV$U)2Sav_hFD-Yr6=FN$v%ij+_U@5D{$;uxDUj+13|vR19yLt=a6T z*Kf;ir#o-US^w~$EqlF#`Md#XemJ{(`^RU4;A#H+QW~F5E;s^coy02AMn76Y)s3@`)Cz#1`N&q`-&jlP*bl^I|L{)Pc{K1irS*J5c< z9~~(4698C)TMKOUmQXp;qHD1)}_K6`(I{ebMb1jwzO*#oZGWxM23;RM5 zdUW`uZcf5A$R#tt3@kHHHPxoN|4)B^|1T$TjTvAD{uKkFcH*CSn3BC)e@sr@wGw&@ qRifIJ1{WzX^i_MCwQwZJcx0dy^v2H}D5kAS9u3ufR?8TbV8FZc9B49WaDFO zu=QiDR*5!Uw{FuqZI#Bd5~W+KktsE;)~Zw0{V{ESL`$MkX;PEYNoLEmV{3bR9{X%a z>!kZ*AT7F+9-jB!_uk)g_q@ON?(n_tM%l1daGOdyy65%0)9)BEgdnm|7xcEb`@Kb; zV9?g?3%F~Vs@-lOjFK!%;+paObRnL|DEz6b?_|HZ&hH6@qJci~r{5Ro?tJhQ)rpD} zl)jlNgap23ggW?lBUg`p`?dOOznVM#_T#_2{U{Hf5R;+^yaBjJ<64amXneoMrQl7# z=QVEB_zM~{&K7`i$c#f~95UmO8D|H;IAq2lGY*;k%K-K#vp<=~e-7aBWVTlWkKF_h zqwQuGNBfO1ing0!2<33BB40R08zQ z4%mQVfa6gDYzOFhA+Q0UYZMz-NJVKn}1TxEuHka2JpZ ztOnKqs{rP`3Ahuu1IPrJ^|u4r08&w807!Fj8;}YxH`4&-tPDs1H(%dxeg8P zhcu?A99zaCGai}o$c#rmqA|x~2w;3NXNBTrY@PfWa^Ts`xro7GIhz+B~zD7 zT{3maDS!kp2e`%ag1M3kFn5?ow*kzn41hVtykgE}0jmJ!;%b1ocqecdz?@xrPnCa? z(_?g`^gQj%KHpX+W+t(vG|CMlj_eidqY!ea+4-&XlvSTnSc*NYOblW5fCI`hTse z>X8psmFLFoFfjZtRiz(AS0mL=os}mu5g~mc^|{N6X>7Msx|j?44e>=mlUb2w)XPH(!JC3mD!Us`y-XcQ3o8e6ux(5P(*&HNCgL#!eCwg121lC z9C57gk+({h*K8ECVv}L(!gOK+{`Svk$()E)D#EVDBYev61-c_bpG8Oq*#cU411hBAGOPjoW=g7qbZ3Ct` zQI~8N&~^!!1^xoK6Yone;C<=CZwTk>8-yS@gYlwttlt~L`%s5BWDB+jJsl77PI05B z1MeW*w&T_yJ@@s$^H`R@0?vBx_-ky_H{Ai<0o?)J0o?)J0o?)J0o?)J0o?)J0o?)J zf&Xs@@S6dD42*u+P*wh(o!Asr72;N}!w*xj?Q0@&y~|&x@<&>2n}t4oUYWWv?Q&IV zQCF{1({&G$dJsz!CTG;3Xr8V}U35C~<`bQaG2NA@iz#YKv3aST#WL4L9ga@Q`29e0 zeYxu}oQdp@`3zyb?tkt9OF|10H0*YV(ExSAb> z9qTJ*@%lddYz%E(X@Yn)M;2qx;tT6<;K;p8(1r3J@LBw4l6dt#S+t$T@dwir%vg*W zk54}rzxr~O+#`R>?P$ZNT7qjjdOZPOmp3$EJ09u_j9BBlhrInEUthplX)fMwwsw01 z-hR)3x3gvlHP-r$KAXR;Tebp8nO0!PdLAf z$Xe6^UoV6`y}_mZ%FwT)zk^k~iti~a+ll>vr`L-L>-8)8C?4_+v!$feUNMT@PH+3k zZtPPk_91((htY9e-cFwfrK2M_sB51V(1oQ=$LgA@TUw6Q)G^+`P%x$x=;m&h&mY~j z*>?DPyLYsA+k$9-(v70j@7cfa)8qI$`U0^?_fw?b=M8lFhZZfjUbhg7@xBxr4#(oD zUw_CbuRebAOKnGW+=@`th)*%Sq`bViqO_vI&SC#=&MZDQ$yN{W%(W5PRbFBr9d$QK zDQjgeHb}l?GunVZe;sG(`r%&MH`(%qc;Dy8?N|np>~xk!NH!JX5yqr~%^#Z>?#5Is QVd07?S)2pExP^QF0p?|rTL1t6 diff --git a/resources/.DS_Store b/resources/.DS_Store deleted file mode 100644 index 4c349a059398a92845d40af7d1b0aa1929ce0f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKQA@)x5KgwK8!GHY*kkZ{$i{Fu@SzL^AB7I~;6&S1wnA-3+qs8XE&d_@js6|) zlACNy!6y-S2bb@1xl72`l1qdTvOD#fLR5tiWl+RI1)47e$5Gd$K%Nqy#5t0Q8$>Sj zUfs!BG&}wx1NiNV!WZ{qcyxNva~`v&=iD$S;V09wPq=^=FlZBAG7MZ;4@1fIV8>w)g(L77Zz5tb zTn=2!!^jLU1I)mNFhIv?d3Qth%iClIn1P=&faik(MYITWgZk)zMn3@n@fxWGY# zjv}-ObAvDfB26lwNtN`(kR~1cisCH7+@MJpQm+j2(8`itC{nKuex<{OvH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 b ? a : b) @@ -22,10 +11,15 @@ PBL_APP_INFO(MY_UUID, ////// Global Variables ///////////////// -Window window; -InverterLayer inverterLayer; -BmpContainer backgroundImage; -Layer displayLayer; +static Window *window; +static Layer *windowLayer; + +static InverterLayer *inverterLayer; + +static GBitmap * backgroundImage; +static BitmapLayer *backgroundLayer; + +static Layer *displayLayer; int sandGrainTick = 0; @@ -188,21 +182,21 @@ const int bottomSandGrainRowAnimationEnd[] = { ////// Callback Functions ///////////////// -void handle_tick(AppContextRef ctx, PebbleTickEvent *event) { +static void handle_tick(struct tm *tick_time, TimeUnits units_changed) { // Tell the application to rerender the layer. - layer_mark_dirty(&displayLayer); + layer_mark_dirty(displayLayer); } -void displayLayer_update_callback(Layer *me, GContext* ctx) { +static void displayLayer_update_callback(Layer *me, GContext* ctx) { // If we're not using the layer, this will prevent compile errors. (void)me; // Getting the time - PblTm time; - get_time( &time ); - const int minutes = time.tm_min; - const int hours = time.tm_hour; + time_t now = time(NULL); + struct tm *time = localtime(&now); + const int minutes = time->tm_min; + const int hours = time->tm_hour; // Drawing the top sand grains. We use the 'dropTopSandGrainOrder' array to determine // what grains are drawn according the hour. This is set up so the grains will empty @@ -222,7 +216,7 @@ void displayLayer_update_callback(Layer *me, GContext* ctx) { // Drawing the bottom sand grains. Same as the above, but instead of emptying, we're // filling them up. - int numBottomGrainsToDraw = minutes - 1; + int numBottomGrainsToDraw = minutes; for(int grain=0; grain < numBottomGrainsToDraw; grain++) { if(grain < 0 || grain >= numBottomSandGrains) // For safety. @@ -285,45 +279,54 @@ void displayLayer_update_callback(Layer *me, GContext* ctx) { sandGrainTick = (sandGrainTick+1) % (BOTTOM_SAND_GRAIN_SIZE*2); } -void handle_init(AppContextRef ctx) { +static void handle_init() { // Initialise the main window - window_init(&window, "Hour Glass"); - window_stack_push(&window, true); - resource_init_current_app(&APP_RESOURCES); - + window = window_create(); + windowLayer = window_get_root_layer(window); + window_stack_push(window, true /* Animated */); + // Set up our background bitmap, pulled from our resources. - bmp_init_container(RESOURCE_ID_HOUR_GLASS_BG, &backgroundImage); - layer_add_child(&window.layer, &backgroundImage.layer.layer); + backgroundImage=gbitmap_create_with_resource(RESOURCE_ID_HOUR_GLASS_BG); + backgroundLayer=bitmap_layer_create(layer_get_frame(windowLayer)); + bitmap_layer_set_bitmap(backgroundLayer, backgroundImage); + layer_add_child(windowLayer, bitmap_layer_get_layer(backgroundLayer)); // Init the layer for the display. - layer_init(&displayLayer, window.layer.frame); - displayLayer.update_proc = &displayLayer_update_callback; - layer_add_child(&window.layer, &displayLayer); + displayLayer=layer_create(layer_get_frame(windowLayer)); + layer_set_update_proc(displayLayer, displayLayer_update_callback); + layer_add_child(windowLayer, displayLayer); // Lastly, set up the in inversion layer to make everything // nice and dark. - inverter_layer_init(&inverterLayer, GRect(0, 0, WATCH_WIDTH, WATCH_HEIGHT)); - layer_add_child(&window.layer, &inverterLayer.layer); + inverterLayer=inverter_layer_create(GRect(0, 0, WATCH_WIDTH, WATCH_HEIGHT)); + layer_add_child(windowLayer, inverter_layer_get_layer(inverterLayer)); + + // tick tock + tick_timer_service_subscribe(SECOND_UNIT, handle_tick); } -void handle_deinit(AppContextRef ctx) { - (void)ctx; - - // Very important, de-init our bitmap image when we're done with it. - bmp_deinit_container(&backgroundImage); +static void handle_deinit() { + tick_timer_service_unsubscribe(); + + // Very important, destroy our layers, bitmap, & windows when we're done with them. + layer_remove_from_parent(inverter_layer_get_layer(inverterLayer)); + inverter_layer_destroy(inverterLayer); + + layer_remove_from_parent(displayLayer); + layer_destroy(displayLayer); + + layer_remove_from_parent(bitmap_layer_get_layer(backgroundLayer)); + bitmap_layer_destroy(backgroundLayer); + gbitmap_destroy(backgroundImage); + + window_destroy(window); } ////// Watchface Entry-point ///////////////// -void pbl_main(void *params) { - PebbleAppHandlers handlers = { - .init_handler = &handle_init, - .deinit_handler = &handle_deinit, - .tick_info = { - .tick_handler = &handle_tick, - .tick_units = SECOND_UNIT - } - }; - app_event_loop(params, &handlers); +int main(void) { + handle_init(); + app_event_loop(); + handle_deinit(); } diff --git a/wscript b/wscript new file mode 100644 index 0000000..0554dc8 --- /dev/null +++ b/wscript @@ -0,0 +1,24 @@ + +# +# This file is the default set of rules to compile a Pebble project. +# +# Feel free to customize this to your needs. +# + +top = '.' +out = 'build' + +def options(ctx): + ctx.load('pebble_sdk') + +def configure(ctx): + ctx.load('pebble_sdk') + +def build(ctx): + ctx.load('pebble_sdk') + + ctx.pbl_program(source=ctx.path.ant_glob('src/**/*.c'), + target='pebble-app.elf') + + ctx.pbl_bundle(elf='pebble-app.elf', + js=ctx.path.ant_glob('src/js/**/*.js'))