Почему мой циферблат Pebble не обновляет время каждую минуту?

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

Что я делаю не так?

В 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).


person Antrikshy    schedule 18.11.2014    source источник


Ответы (1)


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 */
    }
}
person indiv    schedule 18.11.2014
comment
Спасибо за отличное объяснение. Мой циферблат действительно показывает время сейчас. Мне было интересно, почему у них были параметры в tick_handler. Я предполагаю, что функция подписки ожидает их (например, обратные вызовы в JS), поэтому я не могу просто удалить их. Мне все еще любопытно, почему эта структура ™ существует, когда можно просто использовать localtime для ее создания при необходимости. - person Antrikshy; 20.11.2014
comment
Отличное объяснение @indiv! Antrikshy: Tick_timer перезвонит вам именно тогда, когда изменится секунда или минута. Это лучше, чем установка таймера, который будит вас каждую секунду (или каждую минуту) и не будет точно синхронизирован с фактическим изменением времени. - person sarfata; 21.11.2014