예제 #1
0
/*
 * slave's time = master's time * k + offset
 */
void update_clock(float k, int64_t offset) {
  k_ = k;
  offset_ = offset;
  if (task_list) {
    set_task_interrupt(task_list->time);
  } else {
    disable_timed_task();
  }
}
예제 #2
0
static inline void run_timed_task() {
  struct TimedTask *task = pop_task_list(&task_list);
  task->task();
  free_timed_task(task);
  if (task_list) {
    set_task_interrupt(task_list->time);
  } else {
    disable_timed_task();
  }
}
예제 #3
0
void runAtTime(void (*schedFunc)(void), struct timeval *tv) {
  struct timeval now;
  struct TimedTask *t;

  getTime(&now);
  if (is_time_earlier(tv, &now)) {
    // error, can't schedule earlier than now
    printf("ERROR: UNABLE TO SCHEDULE TASK DURING PAST TIME\n\r");
    return;
  }

  t = (struct TimedTask *) malloc(sizeof(struct TimedTask));
  t->task = schedFunc;
  t->time = (struct timeval *) malloc(sizeof(struct timeval));
  memcpy(t->time, tv, sizeof(struct timeval));
  t->next_task = NULL;
  t->prev_task = NULL;

  enable_timed_task();
  insert_timed_task(&task_list, t);
  set_task_interrupt(task_list->time);
}