2015-05-08 2 views
0

Я делаю супер простое наблюдение для гальки с использованием SDK 2. Компоненты и установки часов собираются, но часы не обновляются. Я прикрепил свой код ниже. Есть идеи?Как мне заставить эти часы обновлять каждую минуту службой тикера?

#include <pebble.h> 

static Window *s_main_window; 
static TextLayer *s_time_layer; 
static TextLayer *s_date_layer; 

static GFont s_time_font; 

static BitmapLayer *s_background_layer; 
static GBitmap *s_background_bitmap; 


static void update_time() { 
    // Get a tm structure 
    time_t temp = time(NULL); 
    struct tm *tick_time = localtime(&temp); 

    // Create a long-lived buffer 
    static char buffer[] = ">00:00"; 

    // Write the current hours and minutes into the buffer 
    if(clock_is_24h_style() == true) { 
    //Use 2h hour format 
    strftime(buffer, sizeof(">00:00"), ">%H:%M", tick_time); 
    } else { 
    //Use 12 hour format 
    strftime(buffer, sizeof(">00:00"), ">%I:%M", tick_time); 
    } 

    // Display this time on the TextLayer 
    text_layer_set_text(s_time_layer, buffer); 
} 

static void update_date(){ 
    time_t temp = time(NULL); 
    struct tm *tick_time = localtime(&temp); 
    static char buffer[] = ">00/00/00"; 
    strftime(buffer, sizeof(">00/00/00"), ">%D", tick_time); 
    text_layer_set_text(s_date_layer, buffer); 
} 


static void main_window_load(Window *window) { 

    //Create Gbitmap, then set to created bitmap layer 
    s_background_bitmap = gbitmap_create_with_resource(RESOURCE_ID_lenny); 
    s_background_layer = bitmap_layer_create(GRect(0, 0, 144, 168)); 
    bitmap_layer_set_bitmap(s_background_layer, s_background_bitmap); 
    layer_add_child(window_get_root_layer(window), bitmap_layer_get_layer(s_background_layer)); 


    // Create time TextLayer 
    s_time_layer = text_layer_create(GRect(5, 90, 144, 50)); 
    text_layer_set_background_color(s_time_layer, GColorClear); 
    text_layer_set_text_color(s_time_layer, GColorBlack); 
    text_layer_set_text(s_time_layer, ">00:00"); 


    //Create date TextLayer 
    s_date_layer = text_layer_create(GRect(5, 115, 144, 50)); 
    text_layer_set_background_color(s_date_layer, GColorClear); 
    text_layer_set_text_color(s_date_layer, GColorBlack); 
    text_layer_set_text(s_date_layer, ">00/00/00"); 


    //Create GFont 
    s_time_font = fonts_load_custom_font(resource_get_handle(RESOURCE_ID_arial25)); 

    //Apply to TextLayer 
    text_layer_set_font(s_time_layer, s_time_font); 
    text_layer_set_text_alignment(s_time_layer, GTextAlignmentLeft); 

    text_layer_set_font(s_date_layer, s_time_font); 
    text_layer_set_text_alignment(s_date_layer, GTextAlignmentLeft); 

    // Add it as a child layer to the Window's root layer 
    layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_time_layer)); 
    layer_add_child(window_get_root_layer(window), text_layer_get_layer(s_date_layer)); 

    // Make sure the time is displayed from the start 
    update_time(); 
    update_date(); 
} 

static void main_window_unload(Window *window) { 
    //Unload GFont 
    fonts_unload_custom_font(s_time_font); 

    // Destroy TextLayer 
    text_layer_destroy(s_time_layer); 

    //Destroy Gbitmap 
    gbitmap_destroy(s_background_bitmap); 

    //Destroy BitmapLayer 
    bitmap_layer_destroy(s_background_layer); 

    //Destroy datelayer 
    text_layer_destroy(s_date_layer); 
} 

static void tick_handler(struct tm *tick_time, TimeUnits units_changed) { 
    update_time(); 
} 

    static void tick_handler_date(struct tm *tick_time, TimeUnits units_changed){ 
    update_date(); 
} 

static void init() { 
    // Create main Window element and assign to pointer 
    s_main_window = window_create(); 

    // Set handlers to manage the elements inside the Window 
    window_set_window_handlers(s_main_window, (WindowHandlers) { 
    .load = main_window_load, 
    .unload = main_window_unload 
    }); 

    // Show the Window on the watch, with animated=true 
    window_stack_push(s_main_window, true); 

    // Register with TickTimerService 
    tick_timer_service_subscribe(MINUTE_UNIT, tick_handler); 

    tick_timer_service_subscribe(DAY_UNIT, tick_handler_date); 
} 

static void deinit() { 
    // Destroy Window 
    window_destroy(s_main_window); 
} 

int main(void) { 
    init(); 
    app_event_loop(); 
    deinit(); 
} 

Используется шрифт истинного типа, а также png. Они могут быть заменены чем-либо для целей тестирования до тех пор, пока также будут изменены ссылочные идентификаторы в коде. Любая помощь приветствуется. Благодаря !

ответ

0

Это потому, что вы переопределения проверки каждую минуту и ​​обновление времени здесь:

tick_timer_service_subscribe(DAY_UNIT, tick_handler_date); 

tick_timer_service_subscribe занимает блок и указатель на функцию. Когда вы вызываете его во второй раз, вы перегружаете блок и указатель функции.

Вместо этого вы должны позвонить ему один раз с MINUTE_UNIT и tick_handler. Затем внутри tick_handler напишите новую функцию под названием update_date_and_time. Эта функция делает то, что она говорит, обновляет дату и время. Вы будете ненужно обновлять дату большую часть времени, но это нормально, потому что вы правильно обновите время.

+0

Вы - находка! Огромное спасибо. – Metaxu

 Смежные вопросы

  • Нет связанных вопросов^_^