void move_alloc_c (gfc_array_char * from, GFC_INTEGER_4 from_length __attribute__((unused)), gfc_array_char * to, GFC_INTEGER_4 to_length __attribute__((unused))) { move_alloc (from, to); }
// Schedule a set of steps with a given timing void command_queue_step(uint32_t *args) { struct stepper *s = stepper_oid_lookup(args[0]); struct stepper_move *m = move_alloc(); m->interval = args[1]; m->count = args[2]; if (!m->count) shutdown("Invalid count parameter"); m->add = args[3]; m->next = NULL; m->flags = 0; irq_disable(); uint8_t flags = s->flags; if (!!(flags & SF_LAST_DIR) != !!(flags & SF_NEXT_DIR)) { flags ^= SF_LAST_DIR; m->flags |= MF_DIR; } flags &= ~SF_NO_NEXT_CHECK; if (m->count == 1 && (m->flags || flags & SF_LAST_RESET)) // count=1 moves after a reset or dir change can have small intervals flags |= SF_NO_NEXT_CHECK; s->flags = flags & ~SF_LAST_RESET; if (s->count) { if (s->first) *s->plast = m; else s->first = m; s->plast = &m->next; } else if (flags & SF_NEED_RESET) { move_free(m); } else { s->first = m; stepper_load_next(s, s->next_step_time + m->interval); sched_add_timer(&s->time); } irq_enable(); }