commit 5219f33b14247a2300bca3f89fb12559199b3056 Author: Peter Marquardt Date: Wed Apr 24 18:28:59 2013 +0200 Version 1.3 diff --git a/filmplakat.png b/filmplakat.png new file mode 100644 index 0000000..164d82f Binary files /dev/null and b/filmplakat.png differ diff --git a/resources/src/fonts/roboto/LICENSE.txt b/resources/src/fonts/roboto/LICENSE.txt new file mode 100755 index 0000000..75b5248 --- /dev/null +++ b/resources/src/fonts/roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/resources/src/fonts/roboto/Roboto-BoldItalic_30.ttf b/resources/src/fonts/roboto/Roboto-BoldItalic_30.ttf new file mode 100755 index 0000000..286782d Binary files /dev/null and b/resources/src/fonts/roboto/Roboto-BoldItalic_30.ttf differ diff --git a/resources/src/fonts/roboto/Roboto-Italic_12.ttf b/resources/src/fonts/roboto/Roboto-Italic_12.ttf new file mode 100755 index 0000000..c6ffa37 Binary files /dev/null and b/resources/src/fonts/roboto/Roboto-Italic_12.ttf differ diff --git a/resources/src/fonts/roboto/Roboto-Italic_30.ttf b/resources/src/fonts/roboto/Roboto-Italic_30.ttf new file mode 100755 index 0000000..c6ffa37 Binary files /dev/null and b/resources/src/fonts/roboto/Roboto-Italic_30.ttf differ diff --git a/resources/src/fonts/roboto/Roboto-LightItalic_28.ttf b/resources/src/fonts/roboto/Roboto-LightItalic_28.ttf new file mode 100755 index 0000000..cc2b538 Binary files /dev/null and b/resources/src/fonts/roboto/Roboto-LightItalic_28.ttf differ diff --git a/resources/src/images/menu_icon_filmplakat.png b/resources/src/images/menu_icon_filmplakat.png new file mode 100644 index 0000000..804eb58 Binary files /dev/null and b/resources/src/images/menu_icon_filmplakat.png differ diff --git a/resources/src/resource_map.json b/resources/src/resource_map.json new file mode 100644 index 0000000..cef0de8 --- /dev/null +++ b/resources/src/resource_map.json @@ -0,0 +1,33 @@ +{ + "friendlyVersion": "0.1", + "versionDefName": "APP_RESOURCES", + + "media": [ + {"type": "png", + "defName": "IMAGE_MENU_ICON", + "file": "images/menu_icon_filmplakat.png" + }, + {"type":"font", + "characterRegex": "[einzwdrvfünschbatulö]", + "defName":"FONT_ROBOTO_BOLDITALIC_30", + "file":"fonts/roboto/Roboto-BoldItalic_30.ttf" + }, + {"type":"font", + "characterRegex": "[einzwdrvfünschbatulög]", + "trackingAdjust": -2, + "defName":"FONT_ROBOTO_ITALIC_30", + "file":"fonts/roboto/Roboto-Italic_30.ttf" + }, + {"type":"font", + "characterRegex": "[uhr]", + "trackingAdjust": -2, + "defName":"FONT_ROBOTO_LIGHTITALIC_28", + "file":"fonts/roboto/Roboto-LightItalic_28.ttf" + }, + {"type":"font", + "characterRegex": "[0-9 .MDFSJAONoiranuebäzplgstmkv]", + "defName":"FONT_ROBOTO_ITALIC_12", + "file":"fonts/roboto/Roboto-Italic_12.ttf" + } + ] +} diff --git a/src/filmplakat.c b/src/filmplakat.c new file mode 100644 index 0000000..811d9b7 --- /dev/null +++ b/src/filmplakat.c @@ -0,0 +1,427 @@ +#include "pebble_os.h" +#include "pebble_app.h" +#include "pebble_fonts.h" + +#define DEBUG 0 + +#define MY_UUID { 0x42, 0x35, 0x46, 0xE7, 0x54, 0x18, 0x4F, 0x47, 0x96, 0x63, 0xF0, 0xDB, 0x98, 0x7C, 0x04, 0x40 } +PBL_APP_INFO(MY_UUID, + "Filmplakat", "lastfuture", + 1, 3, /* App version */ + RESOURCE_ID_IMAGE_MENU_ICON, +#if DEBUG + APP_INFO_STANDARD_APP +#else + APP_INFO_WATCH_FACE +#endif +); + +void itoa(int num, char* buffer) { + const char digits[11] = "0123456789"; + if(num > 99) { + buffer[0] = '9'; + buffer[1] = '9'; + return; + } else if(num > 9) { + buffer[0] = digits[num / 10]; + } else { + buffer[0] = '0'; + } + buffer[1] = digits[num % 10]; +} + +Window window; +TextLayer row_1, row_2, row_3, row_4, row_5; +PropertyAnimation anim_1, anim_2, anim_3, anim_4, anim_5; +static char row_1_buffer[20], row_3_buffer[20], row_4_buffer[20], row_3_oldbuf[20], row_4_oldbuf[20], row_5_buffer[20]; +static int row_1_x, row_2_x, row_3_x, row_4_x, row_5_x, row_1_y, row_2_y, row_3_y, row_4_y, row_5_y; +static bool row_3_asc, row_4_asc, has_row_3, has_row_4, firstblood; +GFont fontHour, fontUhr, fontMinutes, fontDate; + +PblTm t; + + +///////////////////////////////////////////////////////////////////////// + +#include "string.h" +static const char* MONTHS[] = { + "Januar", + "Februar", + "März", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Dezember", +}; +static const char* WEEKDAYS[] = { + "So", + "Mo", + "Di", + "Mi", + "Do", + "Fr", + "Sa", +}; +static const char* TEENS[] = { + "null", + "ein", + "zwei", + "drei", + "vier", + "fünf", + "sechs", + "sieben", + "acht", + "neun", + "zehn", + "elf", + "zwölf", + "dreizehn", + "vierzehn", + "fünfzehn", + "sechzehn", + "siebzehn", + "achtzehn", + "neunzehn", +}; +static const char* TENS[] = { + "zwanzig", + "dreissig", + "vierzig", + "fünfzig", + "sechzig", +}; +static const bool TEENS_ASC[] = { + true, + true, + false, + true, + true, + true, + false, + true, + true, + false, + true, + true, + false, + true, + true, + true, + false, + true, + true, + false, +}; +static const bool TENS_ASC[] = { + false, + true, + false, + true, + true, +}; + +static const char* STR_UND = "und"; +static const char* STR_SPACE = " "; +static const char* STR_DOT = "."; +static const char* STR_S = "s"; + +static const char* ROW_2_BUFFER = "uhr"; + +static const int UHR_ASC = 25; +static const int MINUTES_ASC = 23; +static const int MINUTES2_ASC = 25; +static const int DATE_ASC = 34; + +static const int MINUTES_X = 3; +static const int MINUTES2_X = 3; + +void setup_text_layer(TextLayer* row, PropertyAnimation *this_anim, int x, int y, int oldx, int oldy, GFont font, int magic){ + text_layer_set_text_color(row, GColorWhite); + text_layer_set_background_color(row, GColorClear); + layer_add_child(&window.layer, &row->layer); + text_layer_set_font(row,font); + + int speed = 1000; + int distance = oldy - y; + + if (distance < 0) { distance *= -1; } + + if (firstblood) { + speed = 600; + } else { + speed = distance * 90; + } + + GRect start_rect = GRect(oldx,oldy,144-oldx-1,50); + GRect target_rect = GRect(x,y,144-x-1,50); + + if (magic == 1) { // disappear + start_rect = GRect(oldx,oldy,144-oldx-1,50); + target_rect = GRect(oldx,oldy,144-x-1,0); + speed = 300; + } else if (magic == 2) { // reappear + start_rect = GRect(x,y,144-oldx-1,0); + target_rect = GRect(x,y,144-x-1,50); + } else if (magic == 3) { // and stay down + start_rect = GRect(oldx,oldy,144-oldx-1,0); + target_rect = GRect(x,y,144-x-1,0); + speed = 100; + } else { + } + + layer_set_frame(&row->layer, start_rect); + property_animation_init_layer_frame(this_anim, &row->layer, NULL, &target_rect); + + animation_set_duration(&this_anim->animation, speed); + animation_set_curve(&this_anim->animation, AnimationCurveEaseInOut); + + animation_schedule(&this_anim->animation); +} + +void GetTime(int hours, int minutes, int day, int month, int weekday){ + + has_row_3 = false; + has_row_4 = false; + + int hours12h = hours % 12; + if (hours == 12) { hours12h = 12; } + strcat(row_1_buffer, TEENS[hours12h]); + + if (minutes == 0) { + } else if (minutes < 20) { + strcat(row_3_buffer, TEENS[minutes]); + if (minutes == 1) { + strcat(row_3_buffer, STR_S); + } + has_row_3 = true; + row_3_asc = TEENS_ASC[minutes]; + } else { + int tenner = minutes/10; + int oner = minutes % 10; + if (oner == 0) { + strcat(row_3_buffer, TENS[tenner-2]); + row_3_asc = TENS_ASC[tenner-2]; + has_row_3 = true; + } else { + strcat(row_3_buffer, TEENS[oner]); + strcat(row_3_buffer, STR_UND); + row_3_asc = TEENS_ASC[oner]; + has_row_3 = true; + strcat(row_4_buffer, TENS[tenner-2]); + row_4_asc = TENS_ASC[tenner-2]; + has_row_4 = true; + } + } + + char daynum[] = "xx"; + itoa(day,daynum); + strcat(row_5_buffer, WEEKDAYS[weekday]); + strcat(row_5_buffer, STR_SPACE); + strcat(row_5_buffer, daynum); + strcat(row_5_buffer, STR_DOT); + strcat(row_5_buffer, STR_SPACE); + strcat(row_5_buffer, MONTHS[month]); +} + +void update_time(PblTm* t){ + + memset(row_3_oldbuf,0,20); + memset(row_4_oldbuf,0,20); + + strcat(row_3_oldbuf,row_3_buffer); + strcat(row_4_oldbuf,row_4_buffer); + + memset(row_1_buffer,0,20); + memset(row_3_buffer,0,20); + memset(row_4_buffer,0,20); + memset(row_5_buffer,0,20); + + bool has_row_3_old = has_row_3; + bool has_row_4_old = has_row_4; + + strcat(row_1_buffer, STR_SPACE); // workaround for weird "z" bug + + GetTime(t->tm_hour,t->tm_min,t->tm_mday,t->tm_mon,t->tm_wday); + //GetTime(t->tm_hour,t->tm_sec,t->tm_mday,t->tm_mon,t->tm_wday); + + int spacing = 0; + + int row_1_oldx = row_1_x; + int row_2_oldx = row_2_x; + int row_3_oldx = row_3_x; + int row_4_oldx = row_4_x; + int row_5_oldx = row_5_x; + + int row_1_oldy = row_1_y; + int row_2_oldy = row_2_y; + int row_3_oldy = row_3_y; + int row_4_oldy = row_4_y; + int row_5_oldy = row_5_y; + + row_1_x = row_2_x = row_3_x = row_4_x = row_5_x = 26; + + row_1_y = spacing; + spacing += UHR_ASC; + row_2_y = spacing; + if (has_row_3) { + if (row_3_asc) { spacing += MINUTES_ASC; } else { spacing += MINUTES_ASC-MINUTES_X; } + } + row_3_y = spacing; + if (has_row_4) { + if (row_4_asc) { spacing += MINUTES2_ASC; } else { spacing += MINUTES2_ASC-MINUTES2_X; } + } + row_4_y = spacing; + spacing += DATE_ASC; + row_5_y = spacing; + + row_1_x -= row_1_y/5; + row_2_x -= row_2_y/5; + row_3_x -= row_3_y/5; + row_4_x -= row_4_y/5; + row_5_x -= row_5_y/5; + row_1_x -= 7; + row_5_x += 4; + + spacing += 22; + + int y_offset = (168-spacing)/2; + + row_1_y += y_offset; + row_2_y += y_offset; + row_3_y += y_offset; + row_4_y += y_offset; + row_5_y += y_offset; + + if (firstblood) { + has_row_3_old = has_row_3; + has_row_4_old = has_row_4; + memset(row_3_oldbuf,0,20); + memset(row_4_oldbuf,0,20); + strcat(row_3_oldbuf,row_3_buffer); + strcat(row_4_oldbuf,row_4_buffer); + + int sidestoggle = -144; + + row_1_oldx = sidestoggle; + sidestoggle *= -1; + row_2_oldx = sidestoggle; + if (has_row_3) { sidestoggle *= -1; }; + row_3_oldx = sidestoggle; + if (has_row_4) { sidestoggle *= -1; }; + row_4_oldx = sidestoggle; + sidestoggle *= -1; + row_5_oldx = sidestoggle; + + row_1_oldy = row_1_y; + row_2_oldy = row_2_y; + row_3_oldy = row_3_y; + row_4_oldy = row_4_y; + row_5_oldy = row_5_y; + } + + + setup_text_layer(&row_1,&anim_1,row_1_x,row_1_y,row_1_oldx,row_1_oldy,fontHour,0); + text_layer_set_text(&row_1,row_1_buffer); + + setup_text_layer(&row_2,&anim_2,row_2_x,row_2_y,row_2_oldx,row_2_oldy,fontUhr,0); + text_layer_set_text(&row_2,ROW_2_BUFFER); + + int magic = 0; + + if (has_row_3 == has_row_3_old && has_row_3 == true) { + magic = 0; + } else if (has_row_3 == has_row_3_old && has_row_3 == false) { + magic = 3; // stay down + } else if (has_row_3 != has_row_3_old && has_row_3 == false) { + magic = 1; // disappear + } else if (has_row_3 != has_row_3_old && has_row_3 == true) { + magic = 2; // reappear + } + setup_text_layer(&row_3,&anim_3,row_3_x,row_3_y,row_3_oldx,row_3_oldy,fontMinutes,magic); + if (magic == 1) { + text_layer_set_text(&row_3,row_3_oldbuf); + } else { + text_layer_set_text(&row_3,row_3_buffer); + } + + if (has_row_4 == has_row_4_old && has_row_4 == true) { + magic = 0; + } else if (has_row_4 == has_row_4_old && has_row_4 == false) { + magic = 3; // stay down + } else if (has_row_4 != has_row_4_old && has_row_4 == false) { + magic = 1; // disappear + } else if (has_row_4 != has_row_4_old && has_row_4 == true) { + magic = 2; // reappear + } + setup_text_layer(&row_4,&anim_4,row_4_x,row_4_y,row_4_oldx,row_4_oldy,fontMinutes,magic); + if (magic == 1) { + text_layer_set_text(&row_4,row_4_oldbuf); + } else { + text_layer_set_text(&row_4,row_4_buffer); + } + + setup_text_layer(&row_5,&anim_5,row_5_x,row_5_y,row_5_oldx,row_5_oldy,fontDate,0); + text_layer_set_text(&row_5,row_5_buffer); + + if (firstblood) { + firstblood = false; + } +} + + +static void handle_minute_tick(AppContextRef app_ctx, PebbleTickEvent* e) { + update_time(e->tick_time); +} + +void handle_init(AppContextRef ctx) { + (void)ctx; + + firstblood = true; + + window_init(&window, "Clock_Window"); + window_stack_push(&window, true /* Animated */); + window_set_background_color(&window, GColorBlack); + resource_init_current_app(&APP_RESOURCES); + + fontHour = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_ROBOTO_BOLDITALIC_30)); + fontUhr = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_ROBOTO_LIGHTITALIC_28)); + fontMinutes = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_ROBOTO_ITALIC_30)); + fontDate = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_FONT_ROBOTO_ITALIC_12)); + + memset(row_3_buffer,0,20); + memset(row_4_buffer,0,20); + + row_1_x = row_2_x = row_3_x = row_4_x = row_5_x = 13; + row_1_y = row_2_y = row_3_y = row_4_y = row_5_y = 168/2; + row_1_y -= 30; + row_2_y -= 10; + row_3_y += 10; + row_4_y += 30; + row_5_y += 50; + + text_layer_init(&row_5, window.layer.frame); + text_layer_init(&row_4, window.layer.frame); + text_layer_init(&row_3, window.layer.frame); + text_layer_init(&row_2, window.layer.frame); + text_layer_init(&row_1, window.layer.frame); + + get_time(&t); +} + + +void pbl_main(void *params) { + PebbleAppHandlers handlers = { + .init_handler = &handle_init, + .tick_info = { + .tick_handler = &handle_minute_tick, + .tick_units = MINUTE_UNIT + } + }; + app_event_loop(params, &handlers); +}