toolhead: Avoid using a dummy_move for an empty move_queue

Explicitly check for when the move_queue is empty and only call
move.calc_junction() when there is a previous move.  This avoids the
need to create a dummy "sentinal" move object and it simplifies the
code.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2016-07-07 16:08:00 -04:00
parent 9bb1ae079f
commit 5829aa8bd7
1 changed files with 3 additions and 11 deletions

View File

@ -25,8 +25,6 @@ class Move:
# Find max start junction velocity using approximated # Find max start junction velocity using approximated
# centripetal velocity as described at: # centripetal velocity as described at:
# https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/ # https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/
if not prev_move.move_d:
return
junction_cos_theta = -((self.axes_d[0] * prev_move.axes_d[0] junction_cos_theta = -((self.axes_d[0] * prev_move.axes_d[0]
+ self.axes_d[1] * prev_move.axes_d[1]) + self.axes_d[1] * prev_move.axes_d[1])
/ (self.move_d * prev_move.move_d)) / (self.move_d * prev_move.move_d))
@ -68,15 +66,10 @@ class Move:
# Class to track a list of pending move requests and to facilitate # Class to track a list of pending move requests and to facilitate
# "look-ahead" across moves to reduce acceleration between moves. # "look-ahead" across moves to reduce acceleration between moves.
class MoveQueue: class MoveQueue:
def __init__(self, dummy_move): def __init__(self):
self.dummy_move = dummy_move
self.queue = [] self.queue = []
self.prev_junction_max = 0. self.prev_junction_max = 0.
self.junction_flush = 0. self.junction_flush = 0.
def prev_move(self):
if self.queue:
return self.queue[-1]
return self.dummy_move
def flush(self, lazy=False): def flush(self, lazy=False):
next_junction_max = 0. next_junction_max = 0.
can_flush = not lazy can_flush = not lazy
@ -108,6 +101,7 @@ class MoveQueue:
if len(self.queue) == 1: if len(self.queue) == 1:
self.junction_flush = move.junction_max self.junction_flush = move.junction_max
return return
move.calc_junction(self.queue[-2])
self.junction_flush -= move.junction_delta self.junction_flush -= move.junction_delta
if self.junction_flush <= 0.: if self.junction_flush <= 0.:
self.flush(lazy=True) self.flush(lazy=True)
@ -122,8 +116,7 @@ class ToolHead:
self.kin = cartesian.CartKinematics(printer, config) self.kin = cartesian.CartKinematics(printer, config)
self.max_xy_speed, self.max_xy_accel = self.kin.get_max_xy_speed() self.max_xy_speed, self.max_xy_accel = self.kin.get_max_xy_speed()
self.junction_deviation = config.getfloat('junction_deviation', 0.02) self.junction_deviation = config.getfloat('junction_deviation', 0.02)
dummy_move = Move(self, [0.]*4, 0., [0.]*4, 0., 0.) self.move_queue = MoveQueue()
self.move_queue = MoveQueue(dummy_move)
self.commanded_pos = [0., 0., 0., 0.] self.commanded_pos = [0., 0., 0., 0.]
# Print time tracking # Print time tracking
self.buffer_time_high = config.getfloat('buffer_time_high', 5.000) self.buffer_time_high = config.getfloat('buffer_time_high', 5.000)
@ -235,7 +228,6 @@ class ToolHead:
# Common xy move - create move and queue it # Common xy move - create move and queue it
speed = min(speed, self.max_xy_speed) speed = min(speed, self.max_xy_speed)
move = Move(self, newpos, move_d, axes_d, speed, self.max_xy_accel) move = Move(self, newpos, move_d, axes_d, speed, self.max_xy_accel)
move.calc_junction(self.move_queue.prev_move())
self.move_queue.add_move(move) self.move_queue.add_move(move)
def home(self, axis): def home(self, axis):
return self.kin.home(self, axis) return self.kin.home(self, axis)