void command_start_group(uint32_t *args) { sched_del_timer(&group_timer); group_timer.func = group_end_event; group_timer.waketime = args[0]; sched_add_timer(&group_timer); }
static void light_tracker_stop(light_tracker_state_t* lts) { if (lts->is_done) return ; move_stop(); if (lts->timer != NULL) { sched_del_timer(lts->timer); lts->timer = NULL; } lts->is_done = 1; }
static void object_avoider_stop(object_avoider_state_t* oas) { if (oas->is_done) return ; move_stop(); if (oas->timer != NULL) { sched_del_timer(oas->timer); oas->timer = NULL; } oas->is_done = 1; }
// Stop all moves for a given stepper (used in end stop homing). IRQs // must be off. void stepper_stop(struct stepper *s) { sched_del_timer(&s->time); s->next_step_time = 0; s->position = -stepper_get_position(s); s->count = 0; s->flags = (s->flags & SF_INVERT_STEP) | SF_NEED_RESET; gpio_out_write(s->dir_pin, 0); gpio_out_write(s->step_pin, s->flags & SF_INVERT_STEP); while (s->first) { struct stepper_move *next = s->first->next; move_free(s->first); s->first = next; } }
void command_end_group(uint32_t *args) { sched_del_timer(&group_timer); }
static void light_tracker_next(light_tracker_state_t* lts) { switch (lts->state) { case LIGHT_TRACKER_STATE_INIT: { lts->state = LIGHT_TRACKER_STATE_SENSE; /* fallthru */ } case LIGHT_TRACKER_STATE_SENSE: { void (*rotate)(void); unsigned short cur_level; unsigned short cur_delta; cur_level = adc_read(LIGHT_ADC_CHANNEL); if (cur_level >= ADC_QUANTIZE_5_10(2.35)) if (cur_level <= ADC_QUANTIZE_5_10(2.65)) { /* found, we are done */ lts->state = LIGHT_TRACKER_STATE_DONE; break; } if (cur_level >= ADC_QUANTIZE_5_10(2.5)) { cur_delta = cur_level - ADC_QUANTIZE_5_10(2.5); rotate = move_rotate_left; } else { cur_delta = ADC_QUANTIZE_5_10(2.5) - cur_level; rotate = move_rotate_right; } if (lts->prev_delta < cur_delta) { /* diverging, we are done */ lts->state = LIGHT_TRACKER_STATE_DONE; break; } lts->prev_delta = cur_delta; lts->rem_delta = cur_delta; rotate(); lts->timer = sched_add_timer(0, on_light_tracker_timer, 0); lts->state = LIGHT_TRACKER_STATE_ROTATE; break; } case LIGHT_TRACKER_STATE_ROTATE: { unsigned int tmp; if (!lts->rem_delta) { /* rotation done */ move_stop(); sched_del_timer(lts->timer); lts->timer = NULL; lts->state = LIGHT_TRACKER_STATE_SENSE; break; } tmp = delta_to_freq(lts->rem_delta); if (tmp > SCHED_MAX_FREQ) tmp = SCHED_MAX_FREQ; sched_set_timer_freq(lts->timer, tmp); tmp = freq_to_delta(tmp); if (tmp > lts->rem_delta) tmp = lts->rem_delta; lts->rem_delta -= tmp; lts->state = LIGHT_TRACKER_STATE_WAIT; is_rotation_done = 0; sched_enable_timer(lts->timer); break; } case LIGHT_TRACKER_STATE_WAIT: { /* wait for the rotation to finish */ if (!is_rotation_done) break; sched_disable_timer(lts->timer); lts->state = LIGHT_TRACKER_STATE_ROTATE; break; } case LIGHT_TRACKER_STATE_DONE: default: { light_tracker_stop(lts); break; } } }