void event_clocktick_handle(event_t* event, struct TOS_state* state) { event_queue_t* queue = &(state->queue); clock_tick_data_t* data = (clock_tick_data_t*)event->data; atomic TOS_LOCAL_ADDRESS = (short)(event->mote & 0xffff); if (TOS_LOCAL_ADDRESS != event->mote) { dbg(DBG_ERROR, "ERROR in clock tick event handler! Things are probably ver bad....\n"); } if (data->valid) { if (dbg_active(DBG_CLOCK)) { char buf[1024]; printTime(buf, 1024); dbg(DBG_CLOCK, "CLOCK: event handled for mote %i at %s (%i ticks).\n", event->mote, buf, data->interval); } setTime[NODE_NUM] = tos_state.tos_time; event->time = event->time + data->interval; queue_insert_event(queue, event); if (!data->disabled) { TOS_ISSUE_INTERRUPT(SIG_OUTPUT_COMPARE2)(); } else { interruptPending[NODE_NUM] = 1; } } else { //dbg(DBG_CLOCK, "CLOCK: invalid event discarded.\n"); event_cleanup(event); } }
void queue_insert_event(event_queue_t* queue, event_t* event) { if (dbg_active(DBG_QUEUE)) { char ftime[128]; ftime[0] = 0; printOtherTime(ftime, 128, event->time); dbg(DBG_QUEUE, "Inserting event with time %s.\n", ftime); } pthread_mutex_lock(&(queue->lock)); heap_insert(&(queue->heap), event, event->time); pthread_mutex_unlock(&(queue->lock)); }
event_t* queue_pop_event(event_queue_t* queue) { long long ftime; event_t* event; pthread_mutex_lock(&(queue->lock)); event = (event_t*)(heap_pop_min_data(&(queue->heap), &ftime)); pthread_mutex_unlock(&(queue->lock)); if(dbg_active(DBG_QUEUE)) { char timeStr[128]; timeStr[0] = 0; printOtherTime(timeStr, 128, ftime); dbg(DBG_QUEUE, "Popping event for mote %i with time %s.\n", event->mote, timeStr); } if (queue->pause > 0 && event->pause) { sleep(queue->pause); //dbg(DBG_ALL, "\n"); } return event; }