2014-11-18 3 views
4

Я изучаю разработку часов. Я внимательно слежу за руководством Pebble, поэтому 80% моего кода совпадает с кодом примера. Я, вероятно, пропустил что-то очень маленькое, но мое лицо, похоже, не правильно подписано на службу времени.Почему мой Pebble watchface не обновляет время каждую минуту?

Что я делаю неправильно?

В init(), у меня есть:

tick_timer_service_subscribe(MINUTE_UNIT, tick_handler); 
tick_timer_service_subscribe(DAY_UNIT, tick_handler); 

Вот tick_handler:

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

Вот update_time:

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

    static char time_buffer[] = "00:00"; 
    static char date_buffer[] = "00/00/00"; 

    if (clock_is_24h_style() == true) { 
    strftime(time_buffer, sizeof(time_buffer), "%H:%M", tick_time); 
    } else { 
    strftime(time_buffer, sizeof(time_buffer), "%I:%M", tick_time); 
    } 
    text_layer_set_text(s_time_layer, time_buffer); 

    strftime(date_buffer, sizeof(date_buffer), "%D", tick_time); 
    text_layer_set_text(s_date_layer, date_buffer); 
} 

Лицо обновляет только время, когда он сначала загружает (по телефону update_time).

ответ

9

TimeUnits - это небольшая маска. Вы устанавливаете маску, а затем вызываете tick_timer_service_subscribe один раз. Второй звонок с использованием DAY_UNITS изменяет вашу подписку. Для того, чтобы подписаться на оба блока, вы битовые или ваши биты маски:

tick_timer_service_subscribe(MINUTE_UNIT | DAY_UNIT, tick_handler); 

Обратите внимание, как ваш обработчик клещ имеет TimeUnits аргумент. Этот аргумент говорит вам, какой блок вызвал обработчик. В вашем случае вы всегда хотите обновить время и, похоже, DAY_UNIT является избыточным. Но вы можете это сделать:

static void tick_handler(struct tm *tick_time, TimeUnits units_changed) { 
    if((units_changed & MINUTE_UNIT) != 0) { 
     /* Minutes changed */ 
    } 

    if((units_changed & DAY_UNIT) != 0) { 
     /* Days changed */ 
    } 
} 
+0

Благодарим вас за отличное объяснение. Мое наблюдение на самом деле показывает время. Мне было интересно, почему у них были параметры в 'tick_handler'. Я предполагаю, что функция подписки ожидает их (например, обратные вызовы в JS), поэтому я не могу просто удалить их. Мне все еще интересно, почему это struct ™ существует, когда можно просто использовать 'localtime' для генерации, когда это необходимо. – Antrikshy

+0

Gread explain @indiv! Antrikshy: Tick_timer перезвонит вам точно, когда смена секунд или минут. Это лучше, чем установка таймера, который пробуждает вас каждую секунду (или каждую минуту) и не будет точно синхронизироваться с фактическим изменением времени. – sarfata