def test_LayerTrigger_ExtruderTriggerWait(self): """Test wait on extruder""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = LayerTrigger(self.Settings) trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on every layer change # home the axis position.update("G28") # add the current state pos = position.get_position(0) state = position.Extruder.get_state(0) state.IsPrimed = False # Use on extruding start for this test. trigger.ExtruderTriggers = ExtruderTriggers(True, None, None, None, None, None, None, None, None, None) state.IsExtrudingStart = False pos.IsLayerChange = True trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # update again with no change trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # set the trigger and try again state.IsExtrudingStart = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_LayerTrigger_ExtruderTriggerWait(self): """Test wait on extruder""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) # home the axis and send another command to make sure the previous instruction was homed position.Update("G28") position.Update("PreviousHomed") trigger = LayerTrigger(self.Settings) trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on every layer change #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = False # Use on extruding start for this test. trigger.ExtruderTriggers = ExtruderTriggers(True,None,None,None,None,None,None,None,None,None) position.Extruder.IsExtrudingStart = False position.IsLayerChange = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # update again with no change trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # set the trigger and try again position.Extruder.IsExtrudingStart = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False)
def test_TimerTrigger_ExtruderTriggerWait(self): """Test wait on extruder""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) # home the axis position.update("G28") trigger = TimerTrigger(self.Settings) trigger.RequireZHop = False # no zhop required trigger.IntervalSeconds = 1 # Use on extruding start for this test. trigger.ExtruderTriggers = ExtruderTriggers( True, None, None, None, None, None, None, None, None, None) # set the extruder trigger position.Extruder.get_state(0).IsExtrudingStart = True # will not wait or trigger because not enough time has elapsed trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # add 1 second to the state and try again trigger.get_state(0).TriggerStartTime = time.time() - 1.01 # send another command and try again position.update("PreviousPositionIsNowHomed") # set the extruder trigger position.Extruder.get_state(0).IsExtrudingStart = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_extruderTriggers_NoFilter(self): """Test the extruder triggers""" # test with no filters - should trigger self.Extruder.reset() state = ExtruderState() self.Extruder.add_state(state) state.is_primed = False # turn this off so we don't have to account for this default state triggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) self.assertTrue(self.Extruder.is_triggered(triggers))
def test_extruderTriggers_on_primed(self): self.Extruder.reset() state = ExtruderState() self.Extruder.add_state(state) triggers = ExtruderTriggers(None, None, True, None, None, None, None, None, None, None) # test True with true filter state.is_primed = True self.assertTrue(self.Extruder.is_triggered(triggers)) # test False with True filter state.is_primed = False self.assertTrue(not self.Extruder.is_triggered(triggers)) # test on_primed - False Filter triggers = ExtruderTriggers(None, None, False, None, None, None, None, None, None, None) # test True with False filter state.is_primed = True self.assertTrue(not self.Extruder.is_triggered(triggers)) # test False with False filter state.is_primed = False self.assertTrue(not self.Extruder.is_triggered(triggers))
def test_TimerTrigger(self): """Test the timer trigger""" # use a short trigger time so that the test doesn't take too long self.Settings.profiles.current_snapshot().timer_trigger_seconds = 2 position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = TimerTrigger(self.Settings) trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) # Ignore extruder trigger.require_zhop = False # no zhop required trigger.height_increment = 0 # Trigger on any height change # test initial state self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # set interval time to 0, send another command and test again (should not trigger, no homed axis) trigger.interval_seconds = 0 position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Home all axis and try again with interval seconds 1 - should not trigger since the timer will start after # the home command trigger.interval_seconds = 2 position.update("g28") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # send another command and try again, should not trigger cause we haven't waited 2 seconds yet position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Set the last trigger time to 1 before the previous LastTrigger time(equal to interval seconds), should not # trigger trigger.get_state(0).trigger_start_time = time.time() - 1.01 position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Set the last trigger time to 1 before the previous LastTrigger time(equal to interval seconds), should trigger trigger.trigger_start_time = time.time() - 2.01 position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_extruderTriggers_OnDetracting(self): # test OnDetracting self.Extruder.reset() state = ExtruderState() self.Extruder.add_state(state) triggers = ExtruderTriggers(None, None, None, None, None, None, None, None, True, None) # test True with true filter state.IsDetracting = True state.IsPrimed = False # turn this off so we don't have to account for this default state self.assertTrue(self.Extruder.is_triggered(triggers)) # test False with True filter state.IsDetracting = False self.assertTrue(not self.Extruder.is_triggered(triggers)) # test OnDetracting - False Filter triggers = ExtruderTriggers(None, None, None, None, None, None, None, None, False, None) # test True with False filter state.IsDetracting = True self.assertTrue(not self.Extruder.is_triggered(triggers)) # test False with False filter state.IsDetracting = False self.assertTrue(not self.Extruder.is_triggered(triggers))
def test_extruderTriggers_on_extruding_start(self): self.Extruder.reset() state = ExtruderState() self.Extruder.add_state(state) # test on_extruding_start - True Filter triggers = ExtruderTriggers(True, None, None, None, None, None, None, None, None, None) # test True with true filter state.is_extruding_start = True state.is_primed = False # turn this off so we don't have to account for this default state self.assertTrue(self.Extruder.is_triggered(triggers)) # test False with True filter state.is_extruding_start = False self.assertTrue(not self.Extruder.is_triggered(triggers)) # test on_extruding_start - False Filter triggers = ExtruderTriggers(False, None, None, None, None, None, None, None, None, None) # test True with False filter state.is_extruding_start = True self.assertTrue(not self.Extruder.is_triggered(triggers)) # test False with False filter state.is_extruding_start = False self.assertTrue(not self.Extruder.is_triggered(triggers))
def test_extruderTriggers_on_deretracted(self): # test on_deretracted self.Extruder.reset() state = ExtruderState() self.Extruder.add_state(state) triggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, True) # test True with true filter state.is_deretracted = True state.is_primed = False # turn this off so we don't have to account for this default state self.assertTrue(self.Extruder.is_triggered(triggers)) # test False with True filter state.is_deretracted = False self.assertTrue(not self.Extruder.is_triggered(triggers)) # test on_deretracted - False Filter triggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, False) # test True with False filter state.is_deretracted = True self.assertTrue(not self.Extruder.is_triggered(triggers)) # test False with False filter state.is_deretracted = False self.assertTrue(not self.Extruder.is_triggered(triggers))
def test_TimerTrigger(self): """Test the timer trigger""" # use a short trigger time so that the test doesn't take too long self.Settings.CurrentSnapshot().timer_trigger_seconds = 2 position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = TimerTrigger(self.Settings) trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) #Ignore extruder trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on any height change # test initial state self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # set interval time to 0, send another command and test again (should not trigger, no homed axis) trigger.IntervalSeconds = 0 position.Update("g0 x0 y0 z.2 e1") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # Home all axis and try again with interval seconds 1 - should not trigger since the timer will start after the home command trigger.IntervalSeconds = 2 position.Update("g28") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # send another command and try again, should not trigger cause we haven't waited 2 seconds yet position.Update("g0 x0 y0 z.2 e1") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # Set the last trigger time to 1 before the previous LastTrigger time(equal to interval seconds), should not trigger trigger.TriggerStartTime = time.time() - 1.01 position.Update("g0 x0 y0 z.2 e1") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # Set the last trigger time to 1 before the previous LastTrigger time(equal to interval seconds), should trigger trigger.TriggerStartTime = time.time() - 2.01 position.Update("g0 x0 y0 z.2 e1") trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False)
def __init__(self, octolapse_settings): # call parent constructor super(GcodeTrigger, self).__init__(octolapse_settings) try: self.SnapshotCommand = self.Printer.snapshot_command except ValueError as e: self.Settings.current_debug_profile().log_exception(e) self.Type = "gcode" self.RequireZHop = self.Snapshot.require_zhop if self.Snapshot.extruder_state_requirements_enabled: self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.trigger_on_extruding_start, self.Snapshot.trigger_on_extruding, self.Snapshot.trigger_on_primed, self.Snapshot.trigger_on_retracting_start, self.Snapshot.trigger_on_retracting, self.Snapshot.trigger_on_partially_retracted, self.Snapshot.trigger_on_retracted, self.Snapshot.trigger_on_detracting_start, self.Snapshot.trigger_on_detracting, self.Snapshot.trigger_on_detracted) message = ( "Extruder Triggers - OnExtrudingStart:{0}, OnExtruding:{1}, OnPrimed:{2}, " "OnRetractingStart:{3} OnRetracting:{4}, OnPartiallyRetracted:{5}, OnRetracted:{6}, " "ONDetractingStart:{7}, OnDetracting:{8}, OnDetracted:{9}" ).format(self.Snapshot.trigger_on_extruding_start, self.Snapshot.trigger_on_extruding, self.Snapshot.trigger_on_primed, self.Snapshot.trigger_on_retracting_start, self.Snapshot.trigger_on_retracting, self.Snapshot.trigger_on_partially_retracted, self.Snapshot.trigger_on_retracted, self.Snapshot.trigger_on_detracting_start, self.Snapshot.trigger_on_detracting, self.Snapshot.trigger_on_detracted) self.Settings.current_debug_profile().log_trigger_create(message) # Logging message = "Creating Gcode Trigger - Gcode Command:{0}, RequireZHop:{1}" message = message.format(self.Printer.snapshot_command, self.Snapshot.require_zhop) self.Settings.current_debug_profile().log_trigger_create(message) # add an initial state self.add_state(GcodeTriggerState())
def __init__(self, octolapse_settings): super(TimerTrigger, self).__init__(octolapse_settings) self.Type = "timer" if self.Snapshot.extruder_state_requirements_enabled: self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.trigger_on_extruding_start, self.Snapshot.trigger_on_extruding, self.Snapshot.trigger_on_primed, self.Snapshot.trigger_on_retracting_start, self.Snapshot.trigger_on_retracting, self.Snapshot.trigger_on_partially_retracted, self.Snapshot.trigger_on_retracted, self.Snapshot.trigger_on_detracting_start, self.Snapshot.trigger_on_detracting, self.Snapshot.trigger_on_detracted) message = ("Extruder Triggers - OnExtrudingStart:{0}, " "OnExtruding:{1}, OnPrimed:{2}, OnRetractingStart:{3} " "OnRetracting:{4}, OnPartiallyRetracted:{5}, " "OnRetracted:{6}, ONDetractingStart:{7}, " "OnDetracting:{8}, OnDetracted:{9}").format( self.Snapshot.trigger_on_extruding_start, self.Snapshot.trigger_on_extruding, self.Snapshot.trigger_on_primed, self.Snapshot.trigger_on_retracting_start, self.Snapshot.trigger_on_retracting, self.Snapshot.trigger_on_partially_retracted, self.Snapshot.trigger_on_retracted, self.Snapshot.trigger_on_detracting_start, self.Snapshot.trigger_on_detracting, self.Snapshot.trigger_on_detracted) self.Settings.current_debug_profile().log_trigger_create(message) self.IntervalSeconds = self.Snapshot.timer_trigger_seconds self.RequireZHop = self.Snapshot.require_zhop # Log output message = ( "Creating Timer Trigger - Seconds:{0}, RequireZHop:{1}").format( self.Snapshot.timer_trigger_seconds, self.Snapshot.require_zhop) self.Settings.current_debug_profile().log_trigger_create(message) # add initial state initial_state = TimerTriggerState() self.add_state(initial_state)
def __init__(self, octolapse_settings): super(LayerTrigger, self).__init__(octolapse_settings) self.Type = "layer" if self.Snapshot.extruder_state_requirements_enabled: self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.trigger_on_extruding_start, self.Snapshot.trigger_on_extruding, self.Snapshot.trigger_on_primed, self.Snapshot.trigger_on_retracting_start, self.Snapshot.trigger_on_retracting, self.Snapshot.trigger_on_partially_retracted, self.Snapshot.trigger_on_retracted, self.Snapshot.trigger_on_detracting_start, self.Snapshot.trigger_on_detracting, self.Snapshot.trigger_on_detracted) message = ("Extruder Triggers - OnExtrudingStart:{0}, " "OnExtruding:{1}, OnPrimed:{2}, OnRetractingStart:{3} " "OnRetracting:{4}, OnPartiallyRetracted:{5}, " "OnRetracted:{6}, ONDetractingStart:{7}, " "OnDetracting:{8}, OnDetracted:{9}").format( self.Snapshot.trigger_on_extruding_start, self.Snapshot.trigger_on_extruding, self.Snapshot.trigger_on_primed, self.Snapshot.trigger_on_retracting_start, self.Snapshot.trigger_on_retracting, self.Snapshot.trigger_on_partially_retracted, self.Snapshot.trigger_on_retracted, self.Snapshot.trigger_on_detracting_start, self.Snapshot.trigger_on_detracting, self.Snapshot.trigger_on_detracted) self.Settings.current_debug_profile().log_trigger_create(message) # Configuration Variables self.RequireZHop = self.Snapshot.require_zhop self.HeightIncrement = self.Snapshot.layer_trigger_height if self.HeightIncrement == 0: self.HeightIncrement = None # debug output message = ( "Creating Layer Trigger - TriggerHeight:{0} (none = layer change), RequiresZHop:{1}" ).format(self.Snapshot.layer_trigger_height, self.Snapshot.require_zhop) self.Settings.current_debug_profile().log_trigger_create(message) self.add_state(LayerTriggerState())
def test_TimerTrigger_ExtruderTriggerWait(self): """Test wait on extruder""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) # home the axis position.Update("G28") trigger = TimerTrigger(self.Settings) trigger.RequireZHop = False # no zhop required trigger.IntervalSeconds = 1 #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = False # Use on extruding start for this test. trigger.ExtruderTriggers = ExtruderTriggers(True, None, None, None, None, None, None, None, None, None) position.Extruder.IsExtrudingStart = False trigger.TriggerStartTime = time.time() - 1.01 # will not wait or trigger because the previous position state was not homed trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # send another command and try again position.Update("PreviousPositionIsNowHomed") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # update again with no change trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # set the trigger and try again position.Extruder.IsExtrudingStart = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False)
def __init__(self, octolapseSettings): self.Settings = octolapseSettings self.Snapshot = self.Settings.CurrentSnapshot() self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.timer_trigger_on_extruding_start, self.Snapshot.timer_trigger_on_extruding, self.Snapshot.timer_trigger_on_primed, self.Snapshot.timer_trigger_on_retracting_start, self.Snapshot.timer_trigger_on_retracting, self.Snapshot.timer_trigger_on_partially_retracted, self.Snapshot.timer_trigger_on_retracted, self.Snapshot.timer_trigger_on_detracting_start, self.Snapshot.timer_trigger_on_detracting, self.Snapshot.timer_trigger_on_detracted) self.IntervalSeconds = self.Snapshot.timer_trigger_seconds self.RequireZHop = self.Snapshot.timer_trigger_require_zhop self.IntervalSeconds = self.Snapshot.timer_trigger_seconds # create state variables self.Reset() # Log output self.Settings.CurrentDebugProfile().LogTriggerCreate( "Creating Timer Trigger - Seconds:{0}, RequireZHop:{1}".format( self.Snapshot.timer_trigger_seconds, self.Snapshot.timer_trigger_require_zhop)) self.Settings.CurrentDebugProfile().LogTriggerCreate( "Extruder Triggers - OnExtrudingStart:{0}, OnExtruding:{1}, OnPrimed:{2}, OnRetractingStart:{3} OnRetracting:{4}, OnPartiallyRetracted:{5}, OnRetracted:{6}, ONDetractingStart:{7}, OnDetracting:{8}, OnDetracted:{9}" .format(self.Snapshot.timer_trigger_on_extruding_start, self.Snapshot.timer_trigger_on_extruding, self.Snapshot.timer_trigger_on_primed, self.Snapshot.timer_trigger_on_retracting_start, self.Snapshot.timer_trigger_on_retracting, self.Snapshot.timer_trigger_on_partially_retracted, self.Snapshot.timer_trigger_on_retracted, self.Snapshot.timer_trigger_on_detracting_start, self.Snapshot.timer_trigger_on_detracting, self.Snapshot.timer_trigger_on_detracted))
def __init__(self, octolapseSettings): self.Settings = octolapseSettings #utilities and profiles self.Snapshot = self.Settings.CurrentSnapshot() self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.layer_trigger_on_extruding_start, self.Snapshot.layer_trigger_on_extruding, self.Snapshot.layer_trigger_on_primed, self.Snapshot.layer_trigger_on_retracting_start, self.Snapshot.layer_trigger_on_retracting, self.Snapshot.layer_trigger_on_partially_retracted, self.Snapshot.layer_trigger_on_retracted, self.Snapshot.layer_trigger_on_detracting_start, self.Snapshot.layer_trigger_on_detracting, self.Snapshot.layer_trigger_on_detracted) # Configuration Variables self.RequireZHop = self.Snapshot.layer_trigger_require_zhop self.HeightIncrement = self.Snapshot.layer_trigger_height if (self.HeightIncrement == 0): self.HeightIncrement = None self.Reset() # debug output self.Settings.CurrentDebugProfile().LogTriggerCreate( "Creating Layer Trigger - TriggerHeight:{0} (none = layer change), RequiresZHop:{1}" .format(self.Snapshot.layer_trigger_height, self.Snapshot.layer_trigger_require_zhop)) self.Settings.CurrentDebugProfile().LogTriggerCreate( "Extruder Triggers - OnExtrudingStart:{0}, OnExtruding:{1}, OnPrimed:{2}, OnRetractingStart:{3} OnRetracting:{4}, OnPartiallyRetracted:{5}, OnRetracted:{6}, ONDetractingStart:{7}, OnDetracting:{8}, OnDetracted:{9}" .format(self.Snapshot.layer_trigger_on_extruding_start, self.Snapshot.layer_trigger_on_extruding, self.Snapshot.layer_trigger_on_primed, self.Snapshot.layer_trigger_on_retracting_start, self.Snapshot.layer_trigger_on_retracting, self.Snapshot.layer_trigger_on_partially_retracted, self.Snapshot.layer_trigger_on_retracted, self.Snapshot.layer_trigger_on_detracting_start, self.Snapshot.layer_trigger_on_detracting, self.Snapshot.layer_trigger_on_detracted))
def __init__(self, octolapseSettings): # call parent constructor super(GcodeTrigger, self).__init__(octolapseSettings) self.SnapshotCommand = GetGcodeFromString( self.Printer.snapshot_command) self.Type = "gcode" self.RequireZHop = self.Snapshot.gcode_trigger_require_zhop self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.gcode_trigger_on_extruding_start, self.Snapshot.gcode_trigger_on_extruding, self.Snapshot.gcode_trigger_on_primed, self.Snapshot.gcode_trigger_on_retracting_start, self.Snapshot.gcode_trigger_on_retracting, self.Snapshot.gcode_trigger_on_partially_retracted, self.Snapshot.gcode_trigger_on_retracted, self.Snapshot.gcode_trigger_on_detracting_start, self.Snapshot.gcode_trigger_on_detracting, self.Snapshot.gcode_trigger_on_detracted) # Logging self.Settings.CurrentDebugProfile().LogTriggerCreate( "Creating Gcode Trigger - Gcode Command:{0}, RequireZHop:{1}". format(self.Printer.snapshot_command, self.Snapshot.gcode_trigger_require_zhop)) self.Settings.CurrentDebugProfile().LogTriggerCreate( "Extruder Triggers - OnExtrudingStart:{0}, OnExtruding:{1}, OnPrimed:{2}, OnRetractingStart:{3} OnRetracting:{4}, OnPartiallyRetracted:{5}, OnRetracted:{6}, ONDetractingStart:{7}, OnDetracting:{8}, OnDetracted:{9}" .format(self.Snapshot.gcode_trigger_on_extruding_start, self.Snapshot.gcode_trigger_on_extruding, self.Snapshot.gcode_trigger_on_primed, self.Snapshot.gcode_trigger_on_retracting_start, self.Snapshot.gcode_trigger_on_retracting, self.Snapshot.gcode_trigger_on_partially_retracted, self.Snapshot.gcode_trigger_on_retracted, self.Snapshot.gcode_trigger_on_detracting_start, self.Snapshot.gcode_trigger_on_detracting, self.Snapshot.gcode_trigger_on_detracted)) # add an initial state self.AddState(GcodeTriggerState())
def __init__(self, octolapseSettings): super(TimerTrigger, self).__init__(octolapseSettings) self.Type = "timer" self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.timer_trigger_on_extruding_start, self.Snapshot.timer_trigger_on_extruding, self.Snapshot.timer_trigger_on_primed, self.Snapshot.timer_trigger_on_retracting_start, self.Snapshot.timer_trigger_on_retracting, self.Snapshot.timer_trigger_on_partially_retracted, self.Snapshot.timer_trigger_on_retracted, self.Snapshot.timer_trigger_on_detracting_start, self.Snapshot.timer_trigger_on_detracting, self.Snapshot.timer_trigger_on_detracted) self.IntervalSeconds = self.Snapshot.timer_trigger_seconds self.RequireZHop = self.Snapshot.timer_trigger_require_zhop # Log output self.Settings.CurrentDebugProfile().LogTriggerCreate( "Creating Timer Trigger - Seconds:{0}, RequireZHop:{1}".format( self.Snapshot.timer_trigger_seconds, self.Snapshot.timer_trigger_require_zhop)) self.Settings.CurrentDebugProfile().LogTriggerCreate( "Extruder Triggers - OnExtrudingStart:{0}, OnExtruding:{1}, OnPrimed:{2}, OnRetractingStart:{3} OnRetracting:{4}, OnPartiallyRetracted:{5}, OnRetracted:{6}, ONDetractingStart:{7}, OnDetracting:{8}, OnDetracted:{9}" .format(self.Snapshot.timer_trigger_on_extruding_start, self.Snapshot.timer_trigger_on_extruding, self.Snapshot.timer_trigger_on_primed, self.Snapshot.timer_trigger_on_retracting_start, self.Snapshot.timer_trigger_on_retracting, self.Snapshot.timer_trigger_on_partially_retracted, self.Snapshot.timer_trigger_on_retracted, self.Snapshot.timer_trigger_on_detracting_start, self.Snapshot.timer_trigger_on_detracting, self.Snapshot.timer_trigger_on_detracted)) # add initial state initialState = TimerTriggerState() self.AddState(initialState)
def __init__(self, octolapseSettings): self.Settings = octolapseSettings self.Printer = self.Settings.CurrentPrinter() self.Snapshot = self.Settings.CurrentSnapshot() self.RequireZHop = self.Snapshot.gcode_trigger_require_zhop self.ExtruderTriggers = ExtruderTriggers( self.Snapshot.gcode_trigger_on_extruding_start, self.Snapshot.gcode_trigger_on_extruding, self.Snapshot.gcode_trigger_on_primed, self.Snapshot.gcode_trigger_on_retracting_start, self.Snapshot.gcode_trigger_on_retracting, self.Snapshot.gcode_trigger_on_partially_retracted, self.Snapshot.gcode_trigger_on_retracted, self.Snapshot.gcode_trigger_on_detracting_start, self.Snapshot.gcode_trigger_on_detracting, self.Snapshot.gcode_trigger_on_detracted) # state tracking variables self.Reset() # Logging self.Settings.CurrentDebugProfile().LogTriggerCreate( "Creating Gcode Trigger - Gcode Command:{0}, RequireZHop:{1}". format(self.Printer.snapshot_command, self.Snapshot.gcode_trigger_require_zhop)) self.Settings.CurrentDebugProfile().LogTriggerCreate( "Extruder Triggers - OnExtrudingStart:{0}, OnExtruding:{1}, OnPrimed:{2}, OnRetractingStart:{3} OnRetracting:{4}, OnPartiallyRetracted:{5}, OnRetracted:{6}, ONDetractingStart:{7}, OnDetracting:{8}, OnDetracted:{9}" .format(self.Snapshot.gcode_trigger_on_extruding_start, self.Snapshot.gcode_trigger_on_extruding, self.Snapshot.gcode_trigger_on_primed, self.Snapshot.gcode_trigger_on_retracting_start, self.Snapshot.gcode_trigger_on_retracting, self.Snapshot.gcode_trigger_on_partially_retracted, self.Snapshot.gcode_trigger_on_retracted, self.Snapshot.gcode_trigger_on_detracting_start, self.Snapshot.gcode_trigger_on_detracting, self.Snapshot.gcode_trigger_on_detracted))
def test_LayerTrigger_ExtruderTriggers(self): """Test All Extruder Triggers""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) # home the axis position.Update("G28") trigger = LayerTrigger(self.Settings) trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on every layer change #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # Try on extruding start right after home, should fail trigger.ExtruderTriggers = ExtruderTriggers(True,None,None,None,None,None,None,None,None,None) position.Extruder.IsExtrudingStart = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # Try again, should trigger because the previous state was homed position.Update("m114"); position.Extruder.IsExtrudingStart = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on extruding trigger.ExtruderTriggers = ExtruderTriggers(None,True,None,None,None,None,None,None,None,None) position.Extruder.IsExtruding = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on primed trigger.ExtruderTriggers = ExtruderTriggers(None,None,True,None,None,None,None,None,None,None) position.Extruder.IsPrimed = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on retracting start trigger.ExtruderTriggers = ExtruderTriggers(None,None,None,True,None,None,None,None,None,None) position.Extruder.IsRetractingStart = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on retracting trigger.ExtruderTriggers = ExtruderTriggers(None,None,None,None,True,None,None,None,None,None) position.Extruder.IsRetracting = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on partially retracted trigger.ExtruderTriggers = ExtruderTriggers(None,None,None,None,None,True,None,None,None,None) position.Extruder.IsPartiallyRetracted = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on retracted trigger.ExtruderTriggers = ExtruderTriggers(None,None,None,None,None,None,True,None,None,None) position.Extruder.IsRetracted = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None,None,None,None,None,None,None,True,None,None) position.Extruder.IsDetractingStart = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None,None,None,None,None,None,None,None,True,None) position.Extruder.IsDetracting = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None,None,None,None,None,None,None,None,None,True) position.Extruder.IsDetracted = True trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False)
def test_LayerTrigger_HeightChange(self): """Test the layer trigger height change """ position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = LayerTrigger(self.Settings) trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) # Ignore extruder trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = .25 # Trigger every .25 # test initial state self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # send commands that normally would trigger a layer change, but without all axis homed. position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # cur increment 0.25 position.update("g28") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # extrude at height 0.2, should trigger position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # cur increment 0.25 # move to higher layer, but do not extrude (no layer change) position.update("g0 x1 y1 z.4") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x2 y2 z.4") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # cur increment 0.25 # return to previous layer, do not extrude position.update("g0 x2 y2 z.2") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x4 y4 z.2") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # cur increment 0.25 # extrude again on current layer position.update("g0 x2 y2 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # cur increment 0.25 # move up two times, down and extrude (this should trigger after the final command position.update("g0 x2 y2 z.4") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x2 y2 z.6") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x2 y2 z.4 e1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # cur increment 0.5 # This should never happen in a print, but test extruding on previous layers # move down to previous layer, extrude, position.update("g0 x2 y2 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # move back to current layer (.4), extrude (no trigger) position.update("g0 x2 y2 z.4 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # move up one more layer and extrude (trigger) position.update("g0 x2 y2 z.6 e1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # test very close to height increment (.74) # move up one more layer and extrude (trigger) position.update("g0 x2 y2 z0.74 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # now it should trigger position.update("m114") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Test at the increment (.75) position.update("g0 x2 y2 z0.7500 e1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_LayerTrigger_LayerChange_ZHop(self): """Test the layer trigger for layer changes triggers""" self.Settings.current_snapshot().layer_trigger_require_zhop = True self.Settings.current_printer().z_hop = .5 position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = LayerTrigger(self.Settings) trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) # Ignore extruder trigger.HeightIncrement = 0 # Trigger on any height change # test initial state self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # send commands that normally would trigger a layer change, but without all axis homed. position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Home all axis and try again, will not trigger or wait, previous axis not homed position.update("g28") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Waiting on ZHop position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # try zhop position.update("g0 x0 y0 z.7 ") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # extrude on current layer, no trigger (wait on zhop) position.update("g0 x0 y0 z.7 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # do not extrude on current layer, still waiting position.update("g0 x0 y0 z.7 ") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # partial hop, but close enough based on our printer measurement tolerance (0.005) position.update("g0 x0 y0 z1.1999") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # creat wait state position.update("g0 x0 y0 z1.3 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # move down (should never happen, should behave properly anyway) position.update("g0 x0 y0 z.8") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # move back up to current layer (should NOT trigger zhop) position.update("g0 x0 y0 z1.3") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # move up a bit, not enough to trigger zhop position.update("g0 x0 y0 z1.795") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # move up a bit, just enough to trigger zhop position.update("g0 x0 y0 z1.7951") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_TimerTrigger_ExtruderTriggers(self): """Test All Extruder Triggers""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) # home the axis position.update("G28") trigger = TimerTrigger(self.Settings) trigger.interval_seconds = 1 trigger.require_zhop = False # no zhop required # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # Try on extruding start - previous position not homed, do not trigger trigger.ExtruderTriggers = ExtruderTriggers(True, None, None, None, None, None, None, None, None, None) trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertTrue(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # send another command, now the previous state has been homed, should trigger position.update("AnotherCommandNowPreviousHomed") # set is extruding start, wont be set by the above command! position.Extruder.StateHistory[0].is_extruding_start = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on extruding trigger.ExtruderTriggers = ExtruderTriggers(None, True, None, None, None, None, None, None, None, None) state.is_extruding = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on primed trigger.ExtruderTriggers = ExtruderTriggers(None, None, True, None, None, None, None, None, None, None) state.is_primed = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on retracting start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, True, None, None, None, None, None, None) state.is_retracting_start = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on retracting trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, True, None, None, None, None, None) state.is_retracting = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on partially retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, True, None, None, None, None) state.is_partially_retracted = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, True, None, None, None) state.is_retracted = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on deretracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, True, None, None) state.is_deretracting_start = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on deretracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, True, None) state.is_deretracting = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the extruder state = ExtruderState() position.Extruder.StateHistory[0] = state # try out on deretracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, True) state.is_deretracted = True trigger.get_state(0).trigger_start_time = time.time() - 1.01 trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_TimerTrigger_ExtruderTriggers(self): """Test All Extruder Triggers""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) # home the axis position.Update("G28") trigger = TimerTrigger(self.Settings) trigger.IntervalSeconds = 1 trigger.RequireZHop = False # no zhop required #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # Try on extruding start - previous position not homed, do not trigger trigger.ExtruderTriggers = ExtruderTriggers(True, None, None, None, None, None, None, None, None, None) position.Extruder.IsExtrudingStart = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # send another command, now the previous state has been homed, should trigger position.Update("AnotherCommandNowPreviousHomed") position.Extruder.IsExtrudingStart = True # set is extruding start, wont be set by the above command! trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on extruding trigger.ExtruderTriggers = ExtruderTriggers(None, True, None, None, None, None, None, None, None, None) position.Extruder.IsExtruding = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on primed trigger.ExtruderTriggers = ExtruderTriggers(None, None, True, None, None, None, None, None, None, None) position.Extruder.IsPrimed = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on retracting start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, True, None, None, None, None, None, None) position.Extruder.IsRetractingStart = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on retracting trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, True, None, None, None, None, None) position.Extruder.IsRetracting = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on partially retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, True, None, None, None, None) position.Extruder.IsPartiallyRetracted = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, True, None, None, None) position.Extruder.IsRetracted = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, True, None, None) position.Extruder.IsDetractingStart = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, True, None) position.Extruder.IsDetracting = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) #Reset the extruder position.Extruder.Reset() position.Extruder.IsPrimed = False trigger.IsWaiting = True # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, True) position.Extruder.IsDetracted = True trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False)
def test_LayerTrigger_LayerChange(self): """Test the layer trigger for layer changes triggers""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = LayerTrigger(self.Settings) trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) # Ignore extruder trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on any height change # test initial state self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # send commands that normally would trigger a layer change, but without all axis homed. position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Home all axis and try again position.update("g28") trigger.update(position) position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # extrude again on the same layer and make sure it does NOT trigger position.update("g0 x1 y1 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # move to higher layer, but do not extrude (no layer change) position.update("g0 x1 y1 z.4") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x2 y2 z.4") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # return to previous layer, do not extrude position.update("g0 x2 y2 z.2") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x4 y4 z.2") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # extrude again on current layer position.update("g0 x2 y2 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # move up two times, down and extrude (this should trigger after the final command position.update("g0 x2 y2 z.4") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x2 y2 z.6") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) position.update("g0 x2 y2 z.4 e1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # This should never happen in a print, but test extruding on previous layers # move down to previous layer, extrude, position.update("g0 x2 y2 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # move back to current layer (.4), extrude (no trigger) position.update("g0 x2 y2 z.4 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # move up one more layer and extrude (trigger) position.update("g0 x2 y2 z.6 e1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_LayerTrigger_ExtruderTriggers(self): """Test All Extruder Triggers""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) # home the axis position.update("G28") trigger = LayerTrigger(self.Settings) trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on every layer change # get the current extruder state state = position.Extruder.get_state(0) # Try on extruding start right after home, should fail since we haven't extruded yet trigger.ExtruderTriggers = ExtruderTriggers(True, None, None, None, None, None, None, None, None, None) state.IsExtrudingStart = True trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Try again, should trigger after the extrusion position.update("G1 E1") trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on extruding state.IsExtruding = True trigger.ExtruderTriggers = ExtruderTriggers(None, True, None, None, None, None, None, None, None, None) trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on primed trigger.ExtruderTriggers = ExtruderTriggers(None, None, True, None, None, None, None, None, None, None) state.IsPrimed = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on retracting start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, True, None, None, None, None, None, None) state.IsRetractingStart = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on retracting trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, True, None, None, None, None, None) state.IsRetracting = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on partially retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, True, None, None, None, None) state.IsPartiallyRetracted = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, True, None, None, None) state.IsRetracted = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, True, None, None) state.IsDetractingStart = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False # try out on detracting Start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, True, None) state.IsDetracting = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # Reset the previous extruder state state = ExtruderState() position.Extruder.StateHistory[0] = state state.IsPrimed = False trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, True) state.IsDetracted = True trigger.update(position) self.assertTrue(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_LayerTrigger_ExtruderTriggers_NotHomed(self): """Make sure nothing triggers when the axis aren't homed""" position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = LayerTrigger(self.Settings) trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on every layer change position.Extruder.PrinterRetractionLength = 4 # Try on extruding start trigger.ExtruderTriggers = ExtruderTriggers(True, None, None, None, None, None, None, None, None, None) position.update("g0 x0 y0 z.2 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # try out on extruding trigger.ExtruderTriggers = ExtruderTriggers(None, True, None, None, None, None, None, None, None, None) position.update("g0 x0 y0 z.3 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # try out on primed trigger.ExtruderTriggers = ExtruderTriggers(None, None, True, None, None, None, None, None, None, None) position.update("g0 x0 y0 z.4 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # try out on retracting start trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, True, None, None, None, None, None, None) position.update("g0 x0 y0 z.5 e-1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # try out on retracting trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, True, None, None, None, None, None) position.update("g0 x0 y0 z.5 e-1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # try out on partially retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, True, None, None, None, None) position.update("g0 x0 y0 z.5 e-1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # try out on retracted trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, True, None, None, None) position.update("g0 x0 y0 z.5 e-1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0)) # try out on detracting trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, True, None, None, None) position.update("g0 x0 y0 z.5 e1") trigger.update(position) self.assertFalse(trigger.is_triggered(0)) self.assertFalse(trigger.is_waiting(0))
def test_LayerTrigger_LayerChange_DefaultExtruderTriggers(self): position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = LayerTrigger(self.Settings) trigger.ExtruderTriggers = ExtruderTriggers(False, True, True, False, None, None, True, True, None, False) trigger.RequireZHop = False # no zhop required trigger.HeightIncrement = 0 # Trigger on any height change # create some gcode gcode = [] # get the startup gcode gcode.extend(self.GetPrintStartGcode) # start layer 1 gcode.append(('G1 Z0.250 F7200.000', False, "")) # start priming extruder gcode.append( ('G1 X50.0 E80.0 F1000.0', False, "ExtrudingStart")) # forbidden gcode.append(('G1 X160.0 E20.0 F1000.0', True, "Extruding")) gcode.append(('G1 Z0.200 F7200.000', False, "Extruding")) gcode.append(('G1 X220.0 E13 F1000.0', False, "Extruding")) gcode.append(('G1 X240.0 E0 F1000.0', False, "Extruding")) # Object print is starting gcode.append(('G1 E-4.00000 F3000.00000', False, "On Retracting, OnRetractingStart")) gcode.append(('G1 Z0.700 F7200.000', False, "FullyRetracted, Zhop")) gcode.append( ('G1 X117.061 Y98.921 F7200.000', False, "FullyRetracted, Zhop")) gcode.append(('G1 Z0.200 F7200.000', False, "FullyRetracted")) gcode.append( ('G1 E4.00000 F3000.00000', False, "DetractingStart, Detracted")) gcode.append(('M204 S1000', False, "Primed")) gcode.append(('G1 F1800', False, "Primed")) # start extruding gcode.append(('G1 X117.508 Y98.104 E0.02922', False, "ExtrudingStart")) # forbidden gcode.append(('G1 X117.947 Y97.636 E0.02011', False, "Extruding")) gcode.append(('G1 X118.472 Y97.267 E0.02011', False, "Extruding")) gcode.append(('G1 X119.061 Y97.013 E0.02011', False, "Extruding")) gcode.append(('G1 X119.690 Y96.884 E0.02011', False, "Extruding")) gcode.append(('G1 X130.004 Y96.869 E0.32341', False, "Extruding")) gcode.append(('G1 X131.079 Y97.061 E0.03423', False, "Extruding")) # Retraction gcode.append(('G1 E-2.40000 F3000.00000', False, "RetractingStart, Retracting, PartiallyRetracted")) gcode.append(('G1 F5760', False, "Retracting, PartiallyRetracted")) gcode.append(('G1 X119.824 Y97.629 E-0.50464', False, "Retracting, PartiallyRetracted")) gcode.append(('G1 F5760', False, "Retracting, PartiallyRetracted")) gcode.append(('G1 X121.876 Y97.628 E-1.01536', False, "Retracting, PartiallyRetracted")) gcode.append( ('G1 E-0.08000 F3000.00000', False, "Retracting, Fully Retracted")) # Retracted, Zhop gcode.append(('G1 Z0.700 F7200.000', False, "FullyRetracted, Zhop")) # Moved while lifted gcode.append( ('G1 X120.587 Y100.587 F7200.000', False, "FullyRetracted, Zhop")) gcode.append(('G1 Z0.200 F7200.000', False, "FullyRetracted")) # Zhop complete gcode.append( ('G1 E4.00000 F3000.00000', False, "DetractingStart, Detracted")) # Retraction Complete gcode.append(('G1 F1800', False, "Primed")) # primed gcode.append( ('G1 X129.413 Y100.587 E0.27673', False, "ExtrudingStart")) gcode.append(('G1 X129.413 Y109.413 E0.27673', False, "Extruding")) gcode.append(('G1 X120.587 Y109.413 E0.27673', False, "Extruding")) gcode.append(('G1 X120.587 Y100.647 E0.27485', False, "Extruding")) gcode.append(('G1 X120.210 Y100.210 F7200.000', False, "Extruding")) # layer 2 # after layer change # retract gcode.append(('G1 E-4.00000 F3000.00000', False, "RetractingStart")) # zhop gcode.append(('G1 Z0.900 F7200.000', False, "FullyRetracted, Zhop")) # move while lifted gcode.append( ('G1 X133.089 Y99.490 F7200.000', False, "FullyRetracted, Zhop")) # end zhop gcode.append(('G1 Z0.400 F7200.000', False, "FullyRetracted")) # detract gcode.append(('G1 E4.00000 F3000.00000', False, "DetractingStart")) gcode.append(('G1 F3000', False, "Detracted, Primed")) # start etruding gcode.append( ('G1 X133.128 Y110.149 E0.33418', False, "ExtrudingStart")) gcode.append(('G1 X132.942 Y111.071 E0.02950', True, "Extruding")) gcode.append(('G1 X132.492 Y111.896 E0.02950', False, "Extruding")) gcode.append(('G1 X132.020 Y112.393 E0.02148', False, "Extruding")) gcode.append(('G1 X131.447 Y112.777 E0.02161', False, "Extruding")) # layer 3 gcode.append(('G1 Z2.600 F7200.000', False, "Primed")) gcode.append(('G1 X120.632 Y100.632 F7200.000', False, "Primed")) gcode.append(('M204 S800', False, "Primed")) gcode.append(('G1 F1200', False, "Primed")) gcode.append( ('G1 X129.368 Y100.632 E0.29570', False, "ExtrudingStart")) gcode.append(('G1 X129.368 Y109.368 E0.29570', True, "Extruding")) gcode.append(('G1 X120.632 Y109.368 E0.29570', False, "Extruding")) gcode.append(('G1 X120.632 Y100.692 E0.29367', False, "Extruding")) gcode.append(('M204 S1000', False, "Primed")) gcode.append(('G1 X120.225 Y100.225 F7200.000', False, "Extruding")) gcode.append(('M204 S800', False, "Primed")) gcode.append(('G1 F1200', False, "Extruding")) gcode.append(('G1 X129.775 Y100.225 E0.32326', False, "Extruding")) # layer 4 gcode.append(('G1 Z2.800 F7200.000', False, "Primed")) gcode.append(('G1 X120.632 Y109.368 F7200.000', False, "Primed")) gcode.append(('M204 S800', False, "Primed")) gcode.append(('G1 F1200', False, "Primed")) gcode.append( ('G1 X120.632 Y100.632 E0.29570', False, "ExtrudingStart")) gcode.append(('G1 X129.368 Y100.632 E0.29570', True, "Extruding")) gcode.append(('G1 X129.368 Y109.368 E0.29570', False, "Extruding")) gcode.append(('G1 X120.692 Y109.368 E0.29367', False, "Extruding")) gcode.append(('M204 S1000', False, "Primed")) gcode.append(('G1 X120.225 Y109.775 F7200.000', False, "")) gcode.append(('M204 S800', False, "Primed")) gcode.append(('G1 F1200', False, "Primed")) gcode.append( ('G1 X120.225 Y100.225 E0.32326', False, "ExtrudingStart")) gcode.append(('G1 X129.775 Y100.225 E0.32326', False, "Extruding")) gcode.append(('G1 X129.775 Y109.775 E0.32326', False, "Extruding")) gcode.append(('G1 X120.285 Y109.775 E0.32123', False, "Extruding")) # loop through all of the Gcode and test triggering for command in gcode: gcode_command = command[0] should_trigger = command[1] comment = command[2] position.update(gcode_command) trigger.update(position) self.assertTrue( trigger.is_triggered(0) == should_trigger, "Should have triggered on {0} command. Command comment:". format(gcode_command, comment))
def test_extruderTriggers_Mixed(self): # Test mixed nones, trues and falses self.Extruder.reset() state = ExtruderState() self.Extruder.add_state(state) triggers = ExtruderTriggers(None, True, False, None, True, False, None, True, False, None) # Forbidden Due to is_primed state.is_extruding_start = True state.is_extruding = True state.is_primed = True state.is_retracting_start = True state.is_retracting = True state.is_partially_retracted = False state.is_retracted = True state.is_deretracting_start = True state.is_deretracting = False state.is_deretracted = True self.assertTrue(not self.Extruder.is_triggered(triggers)) # True - is extruding state.is_extruding_start = False state.is_extruding = True state.is_primed = False state.is_retracting_start = True state.is_retracting = False state.is_partially_retracted = False state.is_retracted = True state.is_deretracting_start = False state.is_deretracting = False state.is_deretracted = True self.assertTrue(self.Extruder.is_triggered(triggers)) # Test all false states and all Nones state.is_extruding_start = True state.is_extruding = True state.is_primed = True state.is_retracting_start = True state.is_retracting = True state.is_partially_retracted = True state.is_retracted = True state.is_deretracting_start = True state.is_deretracting = True state.is_deretracted = True triggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) self.assertTrue(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(False, True, True, True, True, True, True, True, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, False, True, True, True, True, True, True, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, False, True, True, True, True, True, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, True, False, True, True, True, True, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, True, True, False, True, True, True, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, True, True, True, False, True, True, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, True, True, True, True, False, True, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, True, True, True, True, True, False, True, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, True, True, True, True, True, True, False, True) self.assertFalse(self.Extruder.is_triggered(triggers)) triggers = ExtruderTriggers(True, True, True, True, True, True, True, True, True, False) self.assertFalse(self.Extruder.is_triggered(triggers))
def test_TimerTrigger_LayerChange_ZHop(self): """Test the layer trigger for layer changes triggers""" self.Settings.CurrentSnapshot().timer_trigger_require_zhop = True self.Settings.CurrentPrinter().z_hop = .5 position = Position(self.Settings, self.OctoprintPrinterProfile, False) trigger = TimerTrigger(self.Settings) trigger.ExtruderTriggers = ExtruderTriggers(None, None, None, None, None, None, None, None, None, None) #Ignore extruder trigger.IntervalSeconds = 1 # test initial state self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # send commands that normally would trigger a layer change, but without all axis homed. position.Update("g0 x0 y0 z.2 e1") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) # Home all axis and try again, wait on zhop position.Update("g28") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == False) position.Update("g0 x0 y0 z.2 e1") trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # try zhop position.Update("g0 x0 y0 z.7 ") trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) # extrude on current layer, no trigger (wait on zhop) position.Update("g0 x0 y0 z.7 e1") trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # do not extrude on current layer, still waiting position.Update("g0 x0 y0 z.7 ") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # partial hop, but close enough based on our printer measurement tolerance (0.005) position.Update("g0 x0 y0 z1.1999") trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False) # creat wait state position.Update("g0 x0 y0 z1.3 e1") trigger.TriggerStartTime = time.time() - 1.01 trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # move down (should never happen, should behave properly anyway) position.Update("g0 x0 y0 z.8") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # move back up to current layer (should NOT trigger zhop) position.Update("g0 x0 y0 z1.3") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # move up a bit, not enough to trigger zhop position.Update("g0 x0 y0 z1.79749") trigger.Update(position) self.assertTrue(trigger.IsTriggered == False) self.assertTrue(trigger.IsWaiting == True) # move up a bit, just enough to trigger zhop position.Update("g0 x0 y0 z1.79751") trigger.Update(position) self.assertTrue(trigger.IsTriggered == True) self.assertTrue(trigger.IsWaiting == False)