Exemple #1
0
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);
}
Exemple #2
0
/*
  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;
    }
}