stepper: Require an explicit reset_step_clock after stepper_stop()

If the stepper is stopped by the endstop code, then ignore any further
stepper moves until a reset_step_clock command is received.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2019-01-28 20:38:58 -05:00 committed by KevinOConnor
parent 378402b4d6
commit b9b03dd082
1 changed files with 9 additions and 5 deletions

View File

@ -1,6 +1,6 @@
// Handling of stepper drivers. // Handling of stepper drivers.
// //
// Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net> // Copyright (C) 2016-2019 Kevin O'Connor <kevin@koconnor.net>
// //
// This file may be distributed under the terms of the GNU GPLv3 license. // This file may be distributed under the terms of the GNU GPLv3 license.
@ -51,8 +51,10 @@ struct stepper {
enum { POSITION_BIAS=0x40000000 }; enum { POSITION_BIAS=0x40000000 };
enum { SF_LAST_DIR=1<<0, SF_NEXT_DIR=1<<1, SF_INVERT_STEP=1<<2, enum {
SF_HAVE_ADD=1<<3, SF_LAST_RESET=1<<4, SF_NO_NEXT_CHECK=1<<5 }; SF_LAST_DIR=1<<0, SF_NEXT_DIR=1<<1, SF_INVERT_STEP=1<<2, SF_HAVE_ADD=1<<3,
SF_LAST_RESET=1<<4, SF_NO_NEXT_CHECK=1<<5, SF_NEED_RESET=1<<6
};
// Setup a stepper for the next move in its queue // Setup a stepper for the next move in its queue
static uint_fast8_t static uint_fast8_t
@ -226,6 +228,8 @@ command_queue_step(uint32_t *args)
else else
s->first = m; s->first = m;
s->plast = &m->next; s->plast = &m->next;
} else if (flags & SF_NEED_RESET) {
move_free(m);
} else { } else {
s->first = m; s->first = m;
stepper_load_next(s, s->next_step_time + m->interval); stepper_load_next(s, s->next_step_time + m->interval);
@ -258,7 +262,7 @@ command_reset_step_clock(uint32_t *args)
if (s->count) if (s->count)
shutdown("Can't reset time when stepper active"); shutdown("Can't reset time when stepper active");
s->next_step_time = waketime; s->next_step_time = waketime;
s->flags |= SF_LAST_RESET; s->flags = (s->flags & !SF_NEED_RESET) | SF_LAST_RESET;
irq_enable(); irq_enable();
} }
DECL_COMMAND(command_reset_step_clock, "reset_step_clock oid=%c clock=%u"); DECL_COMMAND(command_reset_step_clock, "reset_step_clock oid=%c clock=%u");
@ -299,7 +303,7 @@ stepper_stop(struct stepper *s)
s->next_step_time = 0; s->next_step_time = 0;
s->position = -stepper_get_position(s); s->position = -stepper_get_position(s);
s->count = 0; s->count = 0;
s->flags &= SF_INVERT_STEP; s->flags = (s->flags & SF_INVERT_STEP) | SF_NEED_RESET;
gpio_out_write(s->dir_pin, 0); gpio_out_write(s->dir_pin, 0);
gpio_out_write(s->step_pin, s->flags & SF_INVERT_STEP); gpio_out_write(s->step_pin, s->flags & SF_INVERT_STEP);
while (s->first) { while (s->first) {