def __init__(self, printer, config): self.printer = printer self.reactor = printer.reactor self.extruder = printer.objects.get('extruder') if self.extruder is None: self.extruder = extruder.DummyExtruder() kintypes = {'cartesian': cartesian.CartKinematics, 'delta': delta.DeltaKinematics} self.kin = config.getchoice('kinematics', kintypes)(printer, config) self.max_speed = config.getfloat('max_velocity') self.max_accel = config.getfloat('max_accel') self.max_accel_to_decel = config.getfloat('max_accel_to_decel' , self.max_accel * 0.5) self.junction_deviation = config.getfloat('junction_deviation', 0.02) self.move_queue = MoveQueue(self.extruder.lookahead) self.commanded_pos = [0., 0., 0., 0.] # Print time tracking self.buffer_time_high = config.getfloat('buffer_time_high', 5.000) self.buffer_time_low = config.getfloat('buffer_time_low', 0.150) self.move_flush_time = config.getfloat('move_flush_time', 0.050) self.motor_off_delay = config.getfloat('motor_off_time', 60.000) self.print_time = 0. self.need_check_stall = -1. self.print_time_stall = 0 self.motor_off_time = self.reactor.NEVER self.flush_timer = self.reactor.register_timer(self._flush_handler)
def __init__(self, printer, config): self.printer = printer self.reactor = printer.reactor self.extruder = extruder.DummyExtruder() kintypes = { 'cartesian': cartesian.CartKinematics, 'corexy': corexy.CoreXYKinematics, 'delta': delta.DeltaKinematics } self.kin = config.getchoice('kinematics', kintypes)(printer, config) self.max_speed = config.getfloat('max_velocity', above=0.) self.max_accel = config.getfloat('max_accel', above=0.) self.max_accel_to_decel = config.getfloat('max_accel_to_decel', self.max_accel * 0.5, above=0., maxval=self.max_accel) self.junction_deviation = config.getfloat('junction_deviation', 0.02, above=0.) self.move_queue = MoveQueue() self.move_queue.set_extruder(self.extruder) self.commanded_pos = [0., 0., 0., 0.] # Print time tracking self.buffer_time_low = config.getfloat('buffer_time_low', 1.000, above=0.) self.buffer_time_high = config.getfloat('buffer_time_high', 2.000, above=self.buffer_time_low) self.buffer_time_start = config.getfloat('buffer_time_start', 0.250, above=0.) self.move_flush_time = config.getfloat('move_flush_time', 0.050, above=0.) self.print_time = 0. self.last_print_end_time = self.reactor.monotonic() self.need_check_stall = -1. self.print_stall = 0 self.synch_print_time = True self.forced_synch = False self.flush_timer = self.reactor.register_timer(self._flush_handler) self.move_queue.set_flush_time(self.buffer_time_high) # Motor off tracking self.motor_off_time = config.getfloat('motor_off_time', 600.000, minval=0.) self.motor_off_timer = self.reactor.register_timer( self._motor_off_handler) # Determine the maximum velocity a cartesian axis could have # before cornering. The 8. was determined experimentally. xy_halt = math.sqrt(8. * self.junction_deviation * self.max_accel) self.kin.set_max_jerk(xy_halt, self.max_speed, self.max_accel) for e in extruder.get_printer_extruders(printer): e.set_max_jerk(xy_halt, self.max_speed, self.max_accel)
def __init__(self, printer, config): self.printer = printer self.reactor = printer.get_reactor() self.all_mcus = printer.lookup_module_objects('mcu') self.mcu = self.all_mcus[0] self.max_velocity = config.getfloat('max_velocity', above=0.) self.max_accel = config.getfloat('max_accel', above=0.) self.max_accel_to_decel = config.getfloat('max_accel_to_decel', self.max_accel * 0.5, above=0., maxval=self.max_accel) self.junction_deviation = config.getfloat('junction_deviation', 0.02, minval=0.) self.move_queue = MoveQueue() self.commanded_pos = [0., 0., 0., 0.] # Print time tracking self.buffer_time_low = config.getfloat('buffer_time_low', 1.000, above=0.) self.buffer_time_high = config.getfloat('buffer_time_high', 2.000, above=self.buffer_time_low) self.buffer_time_start = config.getfloat('buffer_time_start', 0.250, above=0.) self.move_flush_time = config.getfloat('move_flush_time', 0.050, above=0.) self.print_time = 0. self.last_print_start_time = 0. self.need_check_stall = -1. self.print_stall = 0 self.sync_print_time = True self.idle_flush_print_time = 0. self.flush_timer = self.reactor.register_timer(self._flush_handler) self.move_queue.set_flush_time(self.buffer_time_high) # Motor off tracking self.need_motor_off = False self.motor_off_time = config.getfloat('motor_off_time', 600., above=0.) self.motor_off_timer = self.reactor.register_timer( self._motor_off_handler, self.reactor.NOW) # Create kinematics class self.extruder = extruder.DummyExtruder() self.move_queue.set_extruder(self.extruder) kintypes = { 'cartesian': cartesian.CartKinematics, 'corexy': corexy.CoreXYKinematics, 'delta': delta.DeltaKinematics } self.kin = config.getchoice('kinematics', kintypes)(self, printer, config)
def __init__(self, config): self.printer = printer = config.get_printer() self.logger = printer.logger.getChild('toolhead') self.logger.info("toolhead '{}' created".format(config.section)) self.reactor = printer.get_reactor() self.all_mcus = printer.lookup_module_objects('mcu') self.mcu = self.all_mcus[0] self.max_velocity = config.getfloat('max_velocity', above=0.) self.max_accel = config.getfloat('max_accel', above=0.) self.max_accel_to_decel_ratio = config.getfloat( 'max_accel_to_decel_ratio', default=1.0, above=0., maxval=1.) max_accel_to_decel = config.getfloat( 'max_accel_to_decel', default=None , above=0., maxval=self.max_accel) if max_accel_to_decel is None: max_accel_to_decel = self.max_accel * self.max_accel_to_decel_ratio self.max_accel_to_decel = min(max_accel_to_decel, self.max_accel) self.junction_deviation = config.getfloat( 'junction_deviation', 0.02, minval=0.) self.config_max_velocity = self.max_velocity self.config_max_accel = self.max_accel self.config_junction_deviation = self.junction_deviation self.move_queue = MoveQueue() self.commanded_pos = [0., 0., 0., 0.] # Print time tracking self.buffer_time_low = config.getfloat( 'buffer_time_low', 1.000, above=0.) self.buffer_time_high = config.getfloat( 'buffer_time_high', 2.000, above=self.buffer_time_low) self.buffer_time_start = config.getfloat( 'buffer_time_start', 0.250, above=0.) self.move_flush_time = config.getfloat( 'move_flush_time', 0.050, above=0.) self.print_time = 0. self.last_print_start_time = 0. self.need_check_stall = -1. self.print_stall = 0 self.sync_print_time = True self.idle_flush_print_time = 0. self.flush_timer = self.reactor.register_timer(self._flush_handler) self.move_queue.set_flush_time(self.buffer_time_high) # Motor off tracking self.need_motor_off = False self.motor_off_time = config.getfloat('motor_off_time', 600., above=0.) self.motor_off_timer = self.reactor.register_timer( self._motor_off_handler, self.reactor.NOW) # Create kinematics class self.extruder = extruder.DummyExtruder() self.move_queue.set_extruder(self.extruder) self.homing_order = config.get('homing_order', 'XYZ').upper() self.require_home_after_motor_off = config.getboolean( 'require_home_after_motor_off', True) self.sw_limit_check_enabled = config.getboolean( 'sw_limit_check_enabled', True) self.allow_move_wo_homing = config.getboolean( 'allow_move_without_home', False) kintypes = {'cartesian': cartesian.CartKinematics, 'corexy': corexy.CoreXYKinematics, 'coreyx': corexy.CoreYXKinematics, 'delta': delta.DeltaKinematics} self.kin = config.getchoice('kinematics', kintypes)(self, config) # Pause/Idle position self.idle_position = idle_position = config.get('idle_position', default='') if not idle_position: idle_x = config.getfloat("idle_position_x", default=.0) idle_y = config.getfloat("idle_position_y", default=.0) idle_z_lift = config.getfloat("idle_position_z_lift", default=.4) idle_travel_s = config.getint("idle_position_travel_speed", default=6000) moves = [] if idle_z_lift: moves.append("G1 Z%s F%s" % (idle_z_lift, idle_travel_s)) moves.append("G1 X%s Y%s F%s" % (idle_x, idle_y, idle_travel_s)) self.idle_position = "\n".join(moves) self.logger.info("Idle position: X:%s Y:%s Zlift:%s" % ( idle_x, idle_y, idle_z_lift)) else: self.logger.info("Idle position script: '%s'" % self.idle_position.replace("\n", ", ")) # SET_VELOCITY_LIMIT command gcode = self.printer.lookup_object('gcode') gcode.register_command('SET_VELOCITY_LIMIT', self.cmd_SET_VELOCITY_LIMIT, desc=self.cmd_SET_VELOCITY_LIMIT_help) gcode.register_command('M204', self.cmd_M204, desc=self.cmd_M204_help) gcode.register_command('IDLE_POSITION', self.move_to_idle_pos, desc="Move head to defined idle position") self.logger.info("Kinematic created: %s" % self.kin.name) self.logger.info("max_accel: %s" % (self.max_accel,)) self.logger.info("max_accel_to_decel: %s" % (self.max_accel_to_decel,)) self.motor_cbs = [] self.z_hop_detect_cntr = 0 self.z_hop_detect = None self.layer_change_cb = []