void clock_init() { clock_layer1 = text_layer_create(GRect(5,CLOCK_POS,150,50)); setup_text_layer(clock_layer1, RESOURCE_ID_FONT_DROIDSANS_38); clock_layer2 = text_layer_create(GRect(5,CLOCK_POS+33,175,50)); setup_text_layer(clock_layer2, RESOURCE_ID_FONT_DROIDSANS_37); clock_layer3 = text_layer_create(GRect(5,CLOCK_POS+66,150,50)); setup_text_layer(clock_layer3, RESOURCE_ID_FONT_DROIDSANS_37); clock_layer4 = text_layer_create(GRect(0,CLOCK_POS+23,144,60)); setup_text_layer(clock_layer4, RESOURCE_ID_FONT_EXO_50); text_layer_set_text_alignment(clock_layer4, GTextAlignmentCenter); text_layer_set_text_color(clock_layer1, GColorWhite); text_layer_set_text_color(clock_layer2, GColorWhite); text_layer_set_text_color(clock_layer3, GColorWhite); text_layer_set_text_color(clock_layer4, GColorWhite); // subscription time_t now = time(NULL); struct tm *tick_time; tick_time = localtime(&now); handle_clock_tick(tick_time, MINUTE_UNIT); tick_timer_service_subscribe(MINUTE_UNIT, handle_clock_tick); }
/* Initialization */ void handle_init( void ) { window = window_create(); window_stack_push( window, true ); Layer *window_layer = window_get_root_layer( window ); // Read persistent data if ( persist_exists( SETTING_STATUS_KEY ) ) { current_status = persist_read_int( SETTING_STATUS_KEY ); } else { current_status = STATUS_ON; } if ( persist_exists( SETTING_WEATHERSTATUS_KEY ) ) { weather_status = persist_read_int( SETTING_WEATHERSTATUS_KEY ); } else { weather_status = WEATHER_ON; } if ( persist_exists( SETTING_LANGUAGE_KEY ) ) { current_language = persist_read_int( SETTING_LANGUAGE_KEY ); } else { current_language = LANG_EN; } if ( persist_exists( SETTING_FORMAT_KEY ) ) { current_format = persist_read_int( SETTING_FORMAT_KEY ); } else { current_format = FORMAT_WEEK; } if ( persist_exists( SETTING_INVERT_KEY ) ) { invert_format = persist_read_int( SETTING_INVERT_KEY ); } else { invert_format = INVERT_ON; } if ( persist_exists( BLUETOOTHVIBE_KEY ) ) { bluetoothvibe_status = persist_read_int( BLUETOOTHVIBE_KEY ); } else { bluetoothvibe_status = BLUETOOTHVIBE_ON; } if ( persist_exists( HOURLYVIBE_KEY ) ) { hourlyvibe_status = persist_read_int( HOURLYVIBE_KEY ); } else { hourlyvibe_status = HOURLYVIBE_ON; } if ( persist_exists( SECS_KEY ) ) { secs_status = persist_read_int( SECS_KEY ); } else { secs_status = SECS_ON; } // Read watchface settings from persistent data or use default values current_status = persist_exists( SETTING_STATUS_KEY ) ? persist_read_int( SETTING_STATUS_KEY ) : STATUS_ON; weather_status = persist_exists( SETTING_WEATHERSTATUS_KEY ) ? persist_read_int( SETTING_WEATHERSTATUS_KEY ) : WEATHER_ON; current_language = persist_exists( SETTING_LANGUAGE_KEY ) ? persist_read_int( SETTING_LANGUAGE_KEY ) : LANG_EN; current_format = persist_exists( SETTING_FORMAT_KEY ) ? persist_read_int( SETTING_FORMAT_KEY ) : FORMAT_WEEK; invert_format = persist_exists( SETTING_INVERT_KEY ) ? persist_read_int( SETTING_INVERT_KEY ) : INVERT_ON; bluetoothvibe_status = persist_exists( BLUETOOTHVIBE_KEY ) ? persist_read_int( BLUETOOTHVIBE_KEY ) : BLUETOOTHVIBE_ON; hourlyvibe_status = persist_exists( HOURLYVIBE_KEY ) ? persist_read_int( HOURLYVIBE_KEY ) : HOURLYVIBE_ON; secs_status = persist_exists( SECS_KEY ) ? persist_read_int( SECS_KEY ) : SECS_ON; // Background image background_image = gbitmap_create_with_resource( RESOURCE_ID_IMAGE_BACKGROUND ); background_layer = bitmap_layer_create( layer_get_frame( window_layer ) ); bitmap_layer_set_bitmap( background_layer, background_image ); layer_add_child( window_layer, bitmap_layer_get_layer( background_layer ) ); // Initial settings Tuplet initial_values[] = { TupletInteger( SETTING_STATUS_KEY, current_status ) , TupletInteger( SETTING_WEATHERSTATUS_KEY, weather_status ) , TupletInteger( SETTING_LANGUAGE_KEY, current_language ) , TupletInteger( SETTING_FORMAT_KEY, current_format ) , TupletInteger( SETTING_INVERT_KEY, invert_format ) , TupletInteger( BLUETOOTHVIBE_KEY, bluetoothvibe_status ) , TupletInteger( HOURLYVIBE_KEY, hourlyvibe_status ) , TupletInteger( SECS_KEY, secs_status ) , TupletInteger( SETTING_ICON_KEY, (uint8_t) 14) , TupletCString( SETTING_TEMPERATURE_KEY, "") }; // Open AppMessage to transfers app_message_open( 256 , 256 ); // Initialize AppSync app_sync_init( &app, sync_buffer , sizeof( sync_buffer ) , initial_values , ARRAY_LENGTH( initial_values ) , tuple_changed_callback , app_error_callback , NULL ); // Perform sync app_sync_set( &app, initial_values, ARRAY_LENGTH( initial_values ) ); appStarted = true; // Adjust GRect for Hours, Minutes and Blink to compensate for missing AM/PM indicator if ( clock_is_24h_style() ) { TIME_RECT.origin.y = TIME_RECT.origin.y + 1; } // Load fonts font_time = fonts_load_custom_font( resource_get_handle( RESOURCE_ID_FONT_LCARS_68 ) ); font_days = fonts_load_custom_font( resource_get_handle( RESOURCE_ID_FONT_LCARS_20 ) ); font_date = fonts_load_custom_font( resource_get_handle( RESOURCE_ID_FONT_LCARS_25 ) ); // Setup time layer text_time_layer = setup_text_layer( TIME_RECT, GTextAlignmentRight, font_time ); #ifdef PBL_COLOR text_layer_set_text_color(text_time_layer, GColorChromeYellow); #endif layer_add_child( window_layer, text_layer_get_layer( text_time_layer ) ); // Setup AM/PM name layer text_ampm_layer = setup_text_layer( AMPM_RECT, GTextAlignmentLeft, font_days ); layer_add_child( window_layer, text_layer_get_layer( text_ampm_layer ) ); // Setup days line layer text_days_layer = setup_text_layer( DAYS_RECT, GTextAlignmentLeft, font_days ); #ifdef PBL_COLOR text_layer_set_text_color(text_days_layer, GColorDarkGray); #endif layer_add_child( window_layer, text_layer_get_layer( text_days_layer ) ); text_layer_set_text( text_days_layer, day_lines[current_language] ); // Setup date layer text_date_layer = setup_text_layer( ( current_status == STATUS_ON ) ? DATE_RECT : OFF_DATE_RECT , GTextAlignmentLeft , font_date ); #ifdef PBL_COLOR text_layer_set_text_color(text_date_layer, GColorChromeYellow); #endif layer_add_child( window_layer, text_layer_get_layer( text_date_layer ) ); // Setup week layer text_week_layer = setup_text_layer( ( current_status == STATUS_ON ) ? WEEK_RECT : OFF_WEEK_RECT , GTextAlignmentLeft , font_date ); #ifdef PBL_COLOR text_layer_set_text_color(text_week_layer, GColorChromeYellow); #endif layer_add_child( window_layer, text_layer_get_layer( text_week_layer ) ); // Setup weather info Layer *weather_holder = layer_create(GRect(0, 0, 144, 168 )); layer_add_child(window_layer, weather_holder); icon_layer = bitmap_layer_create( ( weather_status == WEATHER_ON ) ? ICON_RECT : EMPTY_RECT ); // icon_layer = bitmap_layer_create( ICON_RECT ); layer_add_child(weather_holder, bitmap_layer_get_layer(icon_layer)); temp_layer = setup_text_layer( ( weather_status == WEATHER_ON ) ? TEMP_RECT : EMPTY_RECT , GTextAlignmentLeft , font_days ); //temp_layer = setup_text_layer( TEMP_RECT, GTextAlignmentLeft, font_days ); layer_add_child(weather_holder, text_layer_get_layer(temp_layer)); // Setup battery layer battery_layer = bitmap_layer_create( ( current_status == STATUS_ON ) ? BATT_RECT : EMPTY_RECT ); layer_add_child( window_layer, bitmap_layer_get_layer( battery_layer ) ); // Setup bluetooth layer bluetooth_layer = bitmap_layer_create( ( current_status == STATUS_ON ) ? BT_RECT : EMPTY_RECT ); layer_add_child( window_layer, bitmap_layer_get_layer( bluetooth_layer ) ); // Add inverter layer (indicator for the current day of the week) currentDayLayer = inverter_layer_create( EMPTY_RECT ); layer_add_child( window_layer, inverter_layer_get_layer( currentDayLayer ) ); // Setup seconds name layer text_secs_layer = setup_text_layer( SECS_RECT, GTextAlignmentLeft, font_days ); layer_add_child( window_layer, text_layer_get_layer( text_secs_layer ) ); // Subscribe to services tick_timer_service_subscribe( SECOND_UNIT, handle_tick ); // Force update to avoid a blank screen at startup of the watchface update_time(); }
void update_time(PblTm* t){ memset(row_1_oldbuf,0,20); memset(row_3_oldbuf,0,20); memset(row_4_oldbuf,0,20); memset(row_5_oldbuf,0,20); strcat(row_1_oldbuf,row_1_buffer); strcat(row_3_oldbuf,row_3_buffer); strcat(row_4_oldbuf,row_4_buffer); strcat(row_5_oldbuf,row_5_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(7,57,2,8,0); // longest strings? //GetTime(t->tm_hour,t->tm_sec,t->tm_mday,t->tm_mon,t->tm_wday); int spacing = 0; row_1_oldx = row_1_x; row_2_oldx = row_2_x; row_3_oldx = row_3_x; row_4_oldx = row_4_x; row_5_oldx = row_5_x; 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; row_1_x = row_2_x = row_3_x = row_4_x = row_5_x = 20; 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; tenplusone = false; } int magic = 0; bool haschanged = false; setup_text_layer(&row_2,&anim_2,row_2_x,row_2_y,row_2_oldx,row_2_oldy,fontUhr,0,false,false); text_layer_set_text(&row_2,ROW_2_BUFFER); if (strcmp(row_1_oldbuf,row_1_buffer)) { haschanged = true; } else { haschanged = false; } if (haschanged && firstblood != true) { setup_text_layer(&row_1,&anim_1,-144,row_1_oldy,row_1_oldx,row_1_oldy,fontHour,0,false,true); text_layer_set_text(&row_1,row_1_oldbuf); setup_text_layer(&row_1b,&anim_1b,row_1_x,row_1_y,144,row_1_y,fontHour,magic,true,true); text_layer_set_text(&row_1b,row_1_buffer); } else { setup_text_layer(&row_1,&anim_1,row_1_x,row_1_y,row_1_oldx,row_1_oldy,fontHour,0,true,true); text_layer_set_text(&row_1,row_1_buffer); text_layer_set_text(&row_1b,STR_SPACE); } if (strcmp(row_3_oldbuf,row_3_buffer)) { haschanged = true; } else { haschanged = false; } 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 } if (magic == 0) { if (haschanged) { if (tenplusone) { setup_text_layer(&row_3,&anim_3,row_3_x,row_3_y,144,row_3_y,fontMinutes,magic,true,false); text_layer_set_text(&row_3,row_3_buffer); text_layer_set_text(&row_3b,STR_SPACE); } else { setup_text_layer(&row_3,&anim_3,-144,row_3_oldy,row_3_oldx,row_3_oldy,fontMinutes,magic,false,false); text_layer_set_text(&row_3,row_3_oldbuf); setup_text_layer(&row_3b,&anim_3b,row_3_x,row_3_y,144,row_3_y,fontMinutes,magic,true,false); text_layer_set_text(&row_3b,row_3_buffer); } } else { setup_text_layer(&row_3,&anim_3,row_3_x,row_3_y,row_3_oldx,row_3_oldy,fontMinutes,magic,false,false); text_layer_set_text(&row_3,row_3_buffer); text_layer_set_text(&row_3b,STR_SPACE); } } else { setup_text_layer(&row_3,&anim_3,row_3_x,row_3_y,row_3_oldx,row_3_oldy,fontMinutes,magic,false,false); if (magic == 1) { text_layer_set_text(&row_3,row_3_oldbuf); } else { text_layer_set_text(&row_3,row_3_buffer); } text_layer_set_text(&row_3b,STR_SPACE); } if (strcmp(row_4_oldbuf,row_4_buffer)) { haschanged = true; } else { haschanged = false; } 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 } if (tenplusone) { setup_text_layer(&row_4,&anim_4,row_4_x,row_4_y,row_3_oldx,row_3_oldy,fontMinutes,0,false,false); text_layer_set_text(&row_4,row_4_buffer); text_layer_set_text(&row_4b,STR_SPACE); } else if (magic == 0) { if (haschanged) { setup_text_layer(&row_4,&anim_4,-144,row_4_oldy,row_4_oldx,row_4_oldy,fontMinutes,magic,false,false); text_layer_set_text(&row_4,row_4_oldbuf); setup_text_layer(&row_4b,&anim_4b,row_4_x,row_4_y,144,row_4_y,fontMinutes,magic,true,false); text_layer_set_text(&row_4b,row_4_buffer); } else { setup_text_layer(&row_4,&anim_4,row_4_x,row_4_y,row_4_oldx,row_4_oldy,fontMinutes,magic,false,false); text_layer_set_text(&row_4,row_4_buffer); text_layer_set_text(&row_4b,STR_SPACE); } } else { setup_text_layer(&row_4,&anim_4,row_4_x,row_4_y,row_4_oldx,row_4_oldy,fontMinutes,magic,false,false); if (magic == 1) { text_layer_set_text(&row_4,row_4_oldbuf); } else { text_layer_set_text(&row_4,row_4_buffer); } text_layer_set_text(&row_4b,STR_SPACE); } if (strcmp(row_5_oldbuf,row_5_buffer)) { haschanged = true; } else { haschanged = false; } if (haschanged && firstblood != true) { setup_text_layer(&row_5,&anim_5,-144,row_5_oldy,row_5_oldx,row_5_oldy,fontDate,0,false,false); text_layer_set_text(&row_5,row_5_oldbuf); setup_text_layer(&row_5b,&anim_5b,row_5_x,row_5_y,144,row_5_y,fontDate,magic,true,false); text_layer_set_text(&row_5b,row_5_buffer); } else { setup_text_layer(&row_5,&anim_5,row_5_x,row_5_y,row_5_oldx,row_5_oldy,fontDate,0,true,false); text_layer_set_text(&row_5,row_5_buffer); text_layer_set_text(&row_5b,STR_SPACE); } if (firstblood) { firstblood = false; } }