summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@unpythonic.net>2013-03-03 17:45:46 -0600
committerJeff Epler <jepler@unpythonic.net>2013-03-03 17:59:26 -0600
commit659a377bd711dbd3def39fb36ca3554d89ad4b8c (patch)
treeb3e4969c61d9a3edd2ab7748323c727cbce421ed
parent780f8bdc8edb1abf889fd10c3b58b60c70e62ead (diff)
parentcbe6de772a58d1ad669eb6f38b7bd1d8a4e4d5ef (diff)
downloadlinuxcnc-659a377bd711dbd3def39fb36ca3554d89ad4b8c.tar.gz
linuxcnc-659a377bd711dbd3def39fb36ca3554d89ad4b8c.zip
Merge branch 'v2.5_branch'
Conflicts: VERSION src/emc/nml_intf/canon.hh src/emc/rs274ngc/interp_convert.cc src/po/de.po src/po/hu.po
-rw-r--r--configs/USC_encod/README6
-rw-r--r--configs/USC_encod/univstep.ini241
-rw-r--r--configs/USC_encod/univstep.tbl4
-rw-r--r--configs/USC_encod/univstep_io.hal82
-rw-r--r--configs/USC_encod/univstep_load.hal35
-rw-r--r--configs/USC_encod/univstep_motion.hal47
-rw-r--r--configs/USC_encod/univstep_servo.hal95
-rw-r--r--debian/changelog30
-rw-r--r--docs/src/code/Code_Notes.txt421
-rw-r--r--scripts/.gitignore1
-rwxr-xr-xscripts/latencyhistogram.in8
-rw-r--r--src/emc/iotask/ioControl.cc3
-rw-r--r--src/emc/nml_intf/canon.hh3
-rw-r--r--src/emc/rs274ngc/interp_convert.cc84
-rw-r--r--src/emc/task/emccanon.cc18
-rwxr-xr-xsrc/emc/usr_intf/axis/scripts/axis.py2
-rwxr-xr-xsrc/emc/usr_intf/pncconf/pncconf.py6
-rw-r--r--src/po/de.po31
-rw-r--r--src/po/hu.po457
-rw-r--r--src/po/zh_HK.po42
-rw-r--r--tests/linuxcncrsh/skip0
-rw-r--r--tests/t0/nonrandom/skip0
-rw-r--r--tests/t0/random-with-t0/skip0
-rw-r--r--tests/t0/random-without-t0/skip0
-rw-r--r--tests/toolchanger/.gitignore5
-rw-r--r--tests/toolchanger/README14
-rw-r--r--tests/toolchanger/core_sim.hal53
-rwxr-xr-xtests/toolchanger/shared-checkresult6
-rwxr-xr-xtests/toolchanger/subs/M10029
l---------tests/toolchanger/toolno-pocket-differ/nonrandom/checkresult1
-rw-r--r--tests/toolchanger/toolno-pocket-differ/nonrandom/expected-gcode-output217
-rw-r--r--tests/toolchanger/toolno-pocket-differ/nonrandom/sim.ini83
-rw-r--r--tests/toolchanger/toolno-pocket-differ/nonrandom/skip0
l---------tests/toolchanger/toolno-pocket-differ/nonrandom/test.sh1
l---------tests/toolchanger/toolno-pocket-differ/random/checkresult1
-rw-r--r--tests/toolchanger/toolno-pocket-differ/random/expected-gcode-output217
-rw-r--r--tests/toolchanger/toolno-pocket-differ/random/sim.ini83
-rw-r--r--tests/toolchanger/toolno-pocket-differ/random/skip0
l---------tests/toolchanger/toolno-pocket-differ/random/test.sh1
-rwxr-xr-xtests/toolchanger/toolno-pocket-differ/shared-test.sh151
-rw-r--r--tests/toolchanger/toolno-pocket-differ/simpockets.tbl.orig3
41 files changed, 2324 insertions, 157 deletions
diff --git a/configs/USC_encod/README b/configs/USC_encod/README
new file mode 100644
index 000000000..f1bd1c87f
--- /dev/null
+++ b/configs/USC_encod/README
@@ -0,0 +1,6 @@
+A configuration for the Universal Stepper card from Pico
+systems. This configuration includes motion connections
+and an IO set for handling estop within HAL. ini file
+parameters INPUT_SCALE are for the encoder counts/user
+unit, OUTPUT_SCALE is the scaling for the drive steps
+per user unit (which can be different).
diff --git a/configs/USC_encod/univstep.ini b/configs/USC_encod/univstep.ini
new file mode 100644
index 000000000..0c1a2cb46
--- /dev/null
+++ b/configs/USC_encod/univstep.ini
@@ -0,0 +1,241 @@
+# ini file for Universal Stepper Controller with encoders
+
+# General section -------------------------------------------------------------
+[EMC]
+
+# Version of this INI file
+VERSION = $Revision$
+
+# Name of machine, for use with display, etc.
+MACHINE = UNIVSTEP_Encoder
+
+# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
+DEBUG = 0
+# DEBUG = 0x00000007
+# DEBUG = 0x7FFFFFFF
+
+# Sections for display options ------------------------------------------------
+[DISPLAY]
+
+# Name of display program, e.g., xemc
+DISPLAY = axis
+# DISPLAY = usrmot
+# DISPLAY = tkemc
+# Cycle time, in seconds, that display will sleep between polls
+CYCLE_TIME = 0.100
+
+# Path to help file
+HELP_FILE = tkemc.txt
+
+# Initial display setting for position, RELATIVE or MACHINE
+POSITION_OFFSET = RELATIVE
+
+# Initial display setting for position, COMMANDED or ACTUAL
+POSITION_FEEDBACK = ACTUAL
+
+# Highest value that will be allowed for feed override, 1.0 = 100%
+MAX_FEED_OVERRIDE = 1.2
+
+# Prefix to be used
+PROGRAM_PREFIX = ../../nc_files/
+
+# Introductory graphic
+INTRO_GRAPHIC = emc2.gif
+INTRO_TIME = 2
+
+# Enable popup balloon help
+BALLOON_HELP = 1
+
+# Task controller section -----------------------------------------------------
+[TASK]
+
+# Name of task controller program, e.g., milltask
+TASK = milltask
+
+# Cycle time, in seconds, that task controller will sleep between polls
+CYCLE_TIME = 0.010
+
+# Part program interpreter section --------------------------------------------
+[RS274NGC]
+
+# File containing interpreter variables
+PARAMETER_FILE = univstep.var
+
+# Motion control section ------------------------------------------------------
+[EMCMOT]
+
+EMCMOT = motmod
+
+# Timeout for comm to emcmot, in seconds
+COMM_TIMEOUT = 1.0
+
+# Interval between tries to emcmot, in seconds
+COMM_WAIT = 0.010
+
+# Servo task period, in nanoseconds
+SERVO_PERIOD = 1000000
+
+# Hardware Abstraction Layer section --------------------------------------------------
+[HAL]
+
+# The run script first uses halcmd to execute any HALFILE
+# files, and then to execute any individual HALCMD commands.
+#
+
+# list of hal config files to run through halcmd
+# files are executed in the order in which they appear
+HALFILE = univstep_load.hal
+HALFILE = univstep_servo.hal
+HALFILE = univstep_motion.hal
+HALFILE = univstep_io.hal
+
+# list of halcmd commands to execute
+# commands are executed in the order in which they appear
+#HALCMD = save neta
+
+# Trajectory planner section --------------------------------------------------
+[TRAJ]
+
+AXES = 4
+# COORDINATES = X Y Z R P W
+COORDINATES = X Y Z A
+HOME = 0 0 0 0
+LINEAR_UNITS = inch
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 0.0167
+MAX_VELOCITY = 1.20
+DEFAULT_ACCELERATION = 15.0
+MAX_ACCELERATION = 20.0
+
+# Axes sections ---------------------------------------------------------------
+
+# First axis
+[AXIS_0]
+
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 1.20
+MAX_ACCELERATION = 20.0
+PID_MAX_VEL = 1.25
+BACKLASH = 0.000
+INPUT_SCALE = 10000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -10.0
+MAX_LIMIT = 30.0
+FERROR = 0.0100
+MIN_FERROR = 0.1
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 0.0
+HOME_LATCH_VEL = 0.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+DEADBAND = 0.000126
+P = 150
+I = 100
+D = 0.1
+BIAS = 0.0
+FF0 = 0
+FF1 = 1
+FF2 = 0.0
+
+
+# Second axis
+[AXIS_1]
+
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 1.20
+MAX_ACCELERATION = 20.0
+PID_MAX_VEL = 1.25
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -10.0
+MAX_LIMIT = 30.0
+FERROR = 0.010
+MIN_FERROR = 0.001
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 0.0
+HOME_LATCH_VEL = 0.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+DEADBAND = 0.000126
+P = 150
+I = 100
+D = 0.1
+BIAS = 0.0
+FF0 = 0
+FF1 = 1
+FF2 = 0.0
+
+# Third axis
+[AXIS_2]
+
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 1.20
+MAX_ACCELERATION = 20.0
+PID_MAX_VEL = 1.25
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -10.0
+MAX_LIMIT = 30.0
+FERROR = 0.010
+MIN_FERROR = 0.001
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 0.0
+HOME_LATCH_VEL = 0.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+DEADBAND = 0.000126
+P = 150
+I = 100
+D = 0.1
+BIAS = 0.0
+FF0 = 0
+FF1 = 1
+FF2 = 0.0
+
+# Fourth axis
+[AXIS_3]
+
+TYPE = ANGULAR
+HOME = 0.0
+MAX_VELOCITY = 65
+MAX_ACCELERATION = 20.0
+PID_MAX_VEL = 66
+BACKLASH = 0.000
+INPUT_SCALE = 11.11111111
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -3600.0
+MAX_LIMIT = 3600.0
+FERROR = 0.1
+MIN_FERROR = 0.2
+HOME_OFFSET = 0.0
+HOME_SEARCH_VEL = 0.0
+HOME_LATCH_VEL = 0.0
+HOME_USE_INDEX = NO
+HOME_IGNORE_LIMITS = NO
+DEADBAND = 0.046
+P = 150
+I = 100
+D = 0.1
+BIAS = 0.0
+FF0 = 0
+FF1 = 1
+FF2 = 0.0
+
+
+# section for main IO controller parameters -----------------------------------
+[EMCIO]
+
+# Name of IO controller program, e.g., io
+EMCIO = io
+
+# cycle time, in seconds
+CYCLE_TIME = 0.100
+
+# tool table file
+TOOL_TABLE = univstep.tbl
diff --git a/configs/USC_encod/univstep.tbl b/configs/USC_encod/univstep.tbl
new file mode 100644
index 000000000..c0b72de06
--- /dev/null
+++ b/configs/USC_encod/univstep.tbl
@@ -0,0 +1,4 @@
+T1 P1 D0.125000 Z+0.511000 ;1/8 end mill
+T2 P2 D0.062500 Z+0.100000 ;1/16 end mill
+T3 P3 D0.201000 Z+1.273000 ;#7 tap drill
+T99999 P99999 Z+0.100000 ;big tool number
diff --git a/configs/USC_encod/univstep_io.hal b/configs/USC_encod/univstep_io.hal
new file mode 100644
index 000000000..8e69d0214
--- /dev/null
+++ b/configs/USC_encod/univstep_io.hal
@@ -0,0 +1,82 @@
+# HAL config file for Pico Systems USC board
+#
+# Connect motion controller I/Os
+#
+
+# connect limit/home switch outputs to motion controller
+net Xminlim <= ppmc.0.din.01.in
+net Xminlim => axis.0.neg-lim-sw-in
+net Xmaxlim <= ppmc.0.din.02.in
+net Xmaxlim => axis.0.pos-lim-sw-in
+net Xhome <= ppmc.0.din.00.in
+net Xhome => axis.0.home-sw-in
+
+net Yminlim <= ppmc.0.din.05.in
+net Yminlim => axis.1.neg-lim-sw-in
+net Ymaxlim <= ppmc.0.din.06.in
+net Ymaxlim => axis.1.pos-lim-sw-in
+net Yhome <= ppmc.0.din.04.in
+net Yhome => axis.1.home-sw-in
+
+net Zminlim <= ppmc.0.din.09.in
+net Zminlim => axis.2.neg-lim-sw-in
+net Zmaxlim <= ppmc.0.din.10.in
+net Zmaxlim => axis.2.pos-lim-sw-in
+net Zhome <= ppmc.0.din.08.in
+net Zhome => axis.2.home-sw-in
+
+net Aminlim <= ppmc.0.din.12.in
+net Aminlim => axis.3.neg-lim-sw-in
+net Amaxlim <= ppmc.0.din.13.in
+net Amaxlim => axis.3.pos-lim-sw-in
+net Ahome <= ppmc.0.din.11.in
+net Ahome => axis.3.home-sw-in
+
+
+# connect index pulses to motion controller
+# uncomment these lines only if you have a Rev 2 USC board
+#newsig Xindex bit
+#newsig Yindex bit
+#newsig Zindex bit
+#linksp Xindex <= ppmc.0.encoder.00.index-enable
+#linksp Xindex => axis.0.index-enable
+#linksp Yindex <= ppmc.0.encoder.01.index-enable
+#linksp Yindex => axis.1.index-enable
+#linksp Zindex <= ppmc.0.encoder.02.index-enable
+#linksp Zindex => axis.2.index-enable
+
+#
+# Connect I/O controller I/Os
+#
+
+# connect e-stop write/sense to I/O controller
+# and univstep's fault with estop's output, so estop FF is reset, but
+# prevent continued estop signal from univstep from holding FF cleared
+net ppmcEstop ppmc.0.din.15.in-not
+net ppmcEstop and2.0.in0
+net EstopOkIn estop-latch.0.fault-in
+net EstopOkIn and2.0.out
+net EstopOkOut <= ppmc.0.dout.07.out
+net EstopOkOut iocontrol.0.emc-enable-in
+net EstopOkOut estop-latch.0.ok-out
+net EstopOkOut and2.0.in1
+net emc-estop-out iocontrol.0.user-enable-out
+net emc-estop-out estop-latch.0.ok-in
+net emc-estop-reset iocontrol.0.user-request-enable
+net emc-estop-reset estop-latch.0.reset
+
+# connect spindle fwd/rev to I/O controller
+net SpindleFwd <= ppmc.0.dout.00.out
+net SpindleFwd => motion.spindle-forward
+net SpindleRev <= ppmc.0.dout.01.out
+net SpindleRev => motion.spindle-reverse
+
+# connect spindle brake to I/O controller
+net SpindleBrakeOn <= ppmc.0.dout.02.out
+net SpindleBrakeOn => motion.spindle-brake
+
+# connect mist/flood coolant to I/O controller
+net MistOn <= ppmc.0.dout.03.out
+net MistOn => iocontrol.0.coolant-mist
+net FloodOn <= ppmc.0.dout.04.out
+net FloodOn => iocontrol.0.coolant-flood
diff --git a/configs/USC_encod/univstep_load.hal b/configs/USC_encod/univstep_load.hal
new file mode 100644
index 000000000..3093810bc
--- /dev/null
+++ b/configs/USC_encod/univstep_load.hal
@@ -0,0 +1,35 @@
+# sample file pulls all load commands into a single file
+# when emc2 starts it loads iocontrol
+
+# kinematics
+loadrt trivkins
+# motion controller, get name and thread periods from ini file
+loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
+
+# next load the PID module, for four PID loops
+loadrt pid num_chan=4
+
+# install driver
+loadrt hal_ppmc
+
+# make some signals for the scope for tuning.
+loadrt ddt count=4
+# add components for E-stop logic
+loadrt estop_latch count=1
+loadrt and2 count=1
+
+# set up the realtime thread
+# read inputs first
+addf ppmc.0.read servo-thread
+# then run the motion controller
+addf motion-command-handler servo-thread
+addf and2.0 servo-thread
+addf estop-latch.0 servo-thread
+addf motion-controller servo-thread
+# then the PID loops
+addf pid.0.do-pid-calcs servo-thread
+addf pid.1.do-pid-calcs servo-thread
+addf pid.2.do-pid-calcs servo-thread
+addf pid.3.do-pid-calcs servo-thread
+# write outputs last
+addf ppmc.0.write servo-thread
diff --git a/configs/USC_encod/univstep_motion.hal b/configs/USC_encod/univstep_motion.hal
new file mode 100644
index 000000000..dd0e64f4e
--- /dev/null
+++ b/configs/USC_encod/univstep_motion.hal
@@ -0,0 +1,47 @@
+# HAL config file for Pico Systems USC board with encoders
+
+# set sane pulse timing - these are basically Gecko numbers
+# both pulse width and space are set to 3.5 uS, to prevent
+# problems if the outputs are inverted externally
+setp ppmc.0.stepgen.00-03.pulse-width-ns 3500
+setp ppmc.0.stepgen.00-03.pulse-space-min-ns 3500
+# setup time is set to 1 uS
+setp ppmc.0.stepgen.00-03.setup-time-ns 1000
+
+# connect position feedback signals to encoders
+net Xpos-fb <= ppmc.0.encoder.00.position
+net Ypos-fb <= ppmc.0.encoder.01.position
+net Zpos-fb <= ppmc.0.encoder.02.position
+net Apos-fb <= ppmc.0.encoder.03.position
+
+# get feedback scaling from ini file
+setp ppmc.0.encoder.00.scale [AXIS_0]INPUT_SCALE
+setp ppmc.0.encoder.01.scale [AXIS_1]INPUT_SCALE
+setp ppmc.0.encoder.02.scale [AXIS_2]INPUT_SCALE
+setp ppmc.0.encoder.03.scale [AXIS_3]INPUT_SCALE
+
+# connect PID output signals to step generators
+net Xoutput => ppmc.0.stepgen.00.velocity
+net Youtput => ppmc.0.stepgen.01.velocity
+net Zoutput => ppmc.0.stepgen.02.velocity
+net Aoutput => ppmc.0.stepgen.03.velocity
+
+# connect axis enables to step generators
+net Xenable => ppmc.0.stepgen.00.enable
+net Yenable => ppmc.0.stepgen.01.enable
+net Zenable => ppmc.0.stepgen.02.enable
+net Aenable => ppmc.0.stepgen.03.enable
+
+# set output scaling from ini file
+# input and output scales should (normally) be the same for a USC
+setp ppmc.0.stepgen.00.scale [AXIS_0]OUTPUT_SCALE
+setp ppmc.0.stepgen.01.scale [AXIS_1]OUTPUT_SCALE
+setp ppmc.0.stepgen.02.scale [AXIS_2]OUTPUT_SCALE
+setp ppmc.0.stepgen.03.scale [AXIS_3]OUTPUT_SCALE
+
+# add a couple of tuning test links
+# if these are useful will want to add them to the other axes as well
+# or make these setup with the tuning script
+net Xoutput ddt.0.in
+net Xpos-fb ddt.1.in
+
diff --git a/configs/USC_encod/univstep_servo.hal b/configs/USC_encod/univstep_servo.hal
new file mode 100644
index 000000000..4dfe8c605
--- /dev/null
+++ b/configs/USC_encod/univstep_servo.hal
@@ -0,0 +1,95 @@
+# HAL config file for servos -- expanded from core_servo.hal
+# for a full four axis setup
+
+# create four position feedback signals
+
+# connect position feedback to PID loop
+net Xpos-fb => pid.0.feedback
+net Ypos-fb => pid.1.feedback
+net Zpos-fb => pid.2.feedback
+net Apos-fb => pid.3.feedback
+
+# connect position feedback to motion module
+net Xpos-fb => axis.0.motor-pos-fb
+net Ypos-fb => axis.1.motor-pos-fb
+net Zpos-fb => axis.2.motor-pos-fb
+net Apos-fb => axis.3.motor-pos-fb
+
+# create PID to DAC output signals
+
+# connect output signals to output of PID loops
+net Xoutput <= pid.0.output
+net Youtput <= pid.1.output
+net Zoutput <= pid.2.output
+net Aoutput <= pid.3.output
+
+# set PID loop output limits to +/-1.00
+setp pid.0.maxoutput [AXIS_0]PID_MAX_VEL
+setp pid.1.maxoutput [AXIS_1]PID_MAX_VEL
+setp pid.2.maxoutput [AXIS_2]PID_MAX_VEL
+setp pid.3.maxoutput [AXIS_3]PID_MAX_VEL
+
+# set PID loop gains
+setp pid.0.Pgain [AXIS_0]P
+setp pid.0.Igain [AXIS_0]I
+setp pid.0.Dgain [AXIS_0]D
+setp pid.0.bias [AXIS_0]BIAS
+setp pid.0.FF0 [AXIS_0]FF0
+setp pid.0.FF1 [AXIS_0]FF1
+setp pid.0.FF2 [AXIS_0]FF2
+setp pid.0.deadband [AXIS_0]DEADBAND
+
+setp pid.1.Pgain [AXIS_1]P
+setp pid.1.Igain [AXIS_1]I
+setp pid.1.Dgain [AXIS_1]D
+setp pid.1.bias [AXIS_1]BIAS
+setp pid.1.FF0 [AXIS_1]FF0
+setp pid.1.FF1 [AXIS_1]FF1
+setp pid.1.FF2 [AXIS_1]FF2
+setp pid.1.deadband [AXIS_1]DEADBAND
+
+setp pid.2.Pgain [AXIS_2]P
+setp pid.2.Igain [AXIS_2]I
+setp pid.2.Dgain [AXIS_2]D
+setp pid.2.bias [AXIS_2]BIAS
+setp pid.2.FF0 [AXIS_2]FF0
+setp pid.2.FF1 [AXIS_2]FF1
+setp pid.2.FF2 [AXIS_2]FF2
+setp pid.2.deadband [AXIS_2]DEADBAND
+
+setp pid.3.Pgain [AXIS_3]P
+setp pid.3.Igain [AXIS_3]I
+setp pid.3.Dgain [AXIS_3]D
+setp pid.3.bias [AXIS_3]BIAS
+setp pid.3.FF0 [AXIS_3]FF0
+setp pid.3.FF1 [AXIS_3]FF1
+setp pid.3.FF2 [AXIS_3]FF2
+setp pid.3.deadband [AXIS_3]DEADBAND
+
+# create four position command signals
+
+# connect position commands to motion controller
+net Xpos-cmd <= axis.0.motor-pos-cmd
+net Ypos-cmd <= axis.1.motor-pos-cmd
+net Zpos-cmd <= axis.2.motor-pos-cmd
+net Apos-cmd <= axis.3.motor-pos-cmd
+
+# connect position commands to PID input
+net Xpos-cmd => pid.0.command
+net Ypos-cmd => pid.1.command
+net Zpos-cmd => pid.2.command
+net Apos-cmd => pid.3.command
+
+# create bit signals to enable/disable the PID loops
+
+# connect the signals to the motion controller
+net Xenable <= axis.0.amp-enable-out
+net Yenable <= axis.1.amp-enable-out
+net Zenable <= axis.2.amp-enable-out
+net Aenable <= axis.3.amp-enable-out
+
+# connect the signals to the PID blocks
+net Xenable => pid.0.enable
+net Yenable => pid.1.enable
+net Zenable => pid.2.enable
+net Aenable => pid.3.enable
diff --git a/debian/changelog b/debian/changelog
index 1b83ded57..41e629185 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,33 @@
+linuxcnc (1:2.5.2) lucid; urgency=low
+
+ * AXIS: Allow the setting of the top end of the Max Velocity slider
+ according to [DISPLAY]MAX_LINEAR_VELOCITY as the docs say
+ * Components: Fix mux16's debounce function
+ * Components: LCD character display driver
+ * Components: New multiclick component detects single, double, triple clicks
+ * Docs: Many improvements
+ * Gremlin: Better error reporting for gcode errors
+ * Gremlin: Fix rotated axes display
+ * Halui: Include tool length offsets in relative position outputs
+ * Hostmot2: Fixes to sserial
+ * Kins: Fix teleop jogging of ABC axes in the negative direction
+ * Modbus: Fix TCP communication time out error
+ * New config: Gecko G540
+ * New config: Smithy 1240combined_mm
+ * PID: Optional new error-previous-target mode to reduce ferrors detected
+ by motion. This is especially useful for torque-mode loops and those
+ tunings that use large I gains
+ * pncconf: Many fixes
+ * PPMC: Better error checking for hardware problems causing miscommunication
+ * Tool Table: Many fixes to tool table handling, making tool tables on
+ nonrandom setups using mismatched tool and pocket numbers work correctly
+ * Translations: German for tooledit
+ * Translations: Many improvements to French
+ * Utilities: new latencyhistogram program that shows details about latency
+ * Utilities: sim_pin, a script that simulates writing to hal pins
+
+ -- Chris Radek <chris@timeguy.com> Sun, 03 Mar 2013 17:07:57 -0600
+
linuxcnc (1:2.5.1) lucid; urgency=low
* Motion: fix incorrect spindle direction after G43 in CSS+M4 mode
diff --git a/docs/src/code/Code_Notes.txt b/docs/src/code/Code_Notes.txt
index 607c24f77..ac3c8bbee 100644
--- a/docs/src/code/Code_Notes.txt
+++ b/docs/src/code/Code_Notes.txt
@@ -1012,3 +1012,424 @@ Recompile, and the new message should be there. The next part is to
send such messages from somewhere, and receive them in another place,
and do some stuff with it.
+
+== The Tool Table and Toolchanger
+
+LinuxCNC interfaces with toolchanger hardware, and has an internal
+toolchanger abstraction. LinuxCNC manages tool information in a tool
+table file.
+
+
+=== Toolchanger abstraction in LinuxCNC
+
+LinuxCNC supports two kinds of toolchanger hardware,
+called _nonrandom_ and _random_. The ini setting
+<<sub:[EMCIO]-Section,[EMCIO]RANDOM_TOOLCHANGER>> controls which of
+these kinds of hardware LinuxCNC thinks it's connected to.
+
+
+==== Nonrandom Toolchangers
+
+Nonrandom toolchanger hardware puts each tool back in the pocket it was
+originally loaded from.
+
+Examples of nonrandom toolchanger hardware are the "manual" toolchanger,
+lathe tool turrents, and rack toolchangers.
+
+When configured for a nonrandom toolchanger, LinuxCNC does not change the
+pocket number in the tool table file as tools are loaded and unloaded.
+Internal to LinuxCNC, on tool change the tool information is *copied*
+from the tool table's source pocket to pocket 0 (which represents the
+spindle), replacing whatever tool information was previously there.
+
+NOTE: In LinuxCNC configured for nonrandom toolchanger, tool 0 (T0) has
+special meaning: "no tool". T0 may not appear in the tool table file, and
+changing to T0 will result in LinuxCNC thinking it's got an empty spindle.
+
+
+==== Random Toolchangers
+
+Random toolchanger hardware swaps the tool in the spindle (if any) with
+the requested tool on tool change. Thus the pocket that a tool resides
+in changes as it is swapped in and out of the spindle.
+
+An example of random toolchanger hardware is a carousel toolchanger.
+
+When configured for a random toolchanger, LinuxCNC swaps the pocket number
+of the old and the new tool in the tool table file when tools are loaded.
+Internal to LinuxCNC, on tool change, the tool information is *swapped*
+between the tool table's source pocket and pocket 0 (which represents
+the spindle). So after a tool change, pocket 0 in the tool table has
+the tool information for the new tool, and the pocket that the new tool
+came from has the tool information for the old tool (the tool that was
+in the spindle before the tool change), if any.
+
+NOTE: In LinuxCNC configured for random toolchanger, tool 0 (T0) has *no*
+special meaning. It is treated exactly like any other tool in the tool
+table. It is customary to use T0 to represent "no tool" (ie, a tool with
+zero TLO), so that the spindle can be conveniently emptied when needed.
+
+
+=== The Tool Table
+
+LinuxCNC keeps track of tools in a file called the _tool table_.
+The tool table records the following information for each tool:
+
+tool number::
+
+ An integer that uniquely identifies this tool. Tool numbers are
+ handled differently by LinuxCNC when configured for random and
+ nonrandom toolchangers:
+
+ * When LinuxCNC is configured for a nonrandom toolchanger this
+ number must be positive. T0 gets special handling and is not
+ allowed to appear in the tool table.
+
+ * When LinuxCNC is configured for a random toolchanger this number
+ must be non-negative. T0 is allowed in the tool table, and is
+ usually used to represent "no tool", ie the empty pocket.
+
+pocket number::
+
+ An integer that identifies the pocket or slot in the toolchanger
+ hardware where the tool resides. Pocket numbers are handled
+ differently by LinuxCNC when configured for random and nonrandom
+ toolchangers:
+
+ * When LinuxCNC is configured for a nonrandom toolchanger, the pocket
+ number in the tool file can be any positive integer (pocket
+ 0 is not allowed). LinuxCNC silently compactifies the pocket
+ numbers when it loads the tool file, so there may be a difference
+ between the pocket numbers in the tool file and the internal
+ pocket numbers used by LinuxCNC-with-nonrandom-toolchanger.
+
+ * When LinuxCNC is configured for a random toolchanger, the pocket
+ numbers in the tool file must be between 0 and 55, inclusive.
+ Pockets 1-55 are in the toolchanger, pocket 0 is the spindle.
+
+diameter::
+
+ Diameter of the tool, in machine units.
+
+tool length offset::
+
+ Tool length offset (also called TLO), in up to 9 axes, in machine
+ units. Axes that don't have a specified TLO get 0.
+
+
+=== Gcodes affecting tools
+
+The gcodes that use or affect tool information are:
+
+
+==== Txxx
+
+Tells the toolchanger hardware to prepare to switch to a specified
+tool +xxx+.
+
+Handled by +Interp::convert_tool_select()+.
+
+. The machine is asked to prepare to switch to the selected tool by
+ calling the Canon function +SELECT_POCKET()+ with the pocket number
+ of the requested tool.
+
+ .. (saicanon) No-op.
+
+ .. (emccanon) Builds an +EMC_TOOL_PREPARE+ message with the requested
+ pocket number and sends it to Task, which sends it on
+ to IO. IO gets the message and asks HAL to prepare
+ the pocket by setting +iocontrol.0.tool-prep-pocket+,
+ +iocontrol.0.tool-prep-number+, and +iocontrol.0.tool-prepare+.
+ IO then repeatedly calls +read_tool_inputs()+ to poll the HAL pin
+ +iocontrol.0.tool-prepared+, which signals from the toolchanger
+ hardware, via HAL, to IO that the requested tool prep is complete.
+ When that pin goes True, IO sets +emcioStatus.tool.pocketPrepped+
+ to the requested tool's pocket number.
+
+. Back in interp, +settings->selected_pocket+ is assigned the pocket
+ number of the requested tool _xxx_.
+
+==== M6
+
+Tells the toolchanger to switch to the currently selected tool (selected
+by the previous Txxx command).
+
+Handled by +Interp::convert_tool_change()+.
+
+. The machine is asked to change to the selected tool
+ by calling the Canon function +CHANGE_TOOL()+ with
+ +settings->selected_pocket+.
+
+ .. (saicanon) Sets sai's +_active_slot+ to the passed-in pocket
+ number. Tool information is copied from the selected pocket
+ of of the tool table (ie, from sai's +_tools[_active_slot]+)
+ to the spindle (aka sai's +_tools[0]+).
+
+ .. (emccanon) Sends an +EMC_TOOL_LOAD+ message to Task, which
+ sends it to IO. IO sets +emcioStatus.tool.toolInSpindle+
+ to the tool number of the tool in the pocket identified
+ by +emcioStatus.tool.pocketPrepped+ (set by +Txxx+
+ aka +SELECT_POCKET()+). It then requests that the
+ toolchanger hardware perform a tool change, by setting
+ the HAL pin +iocontrol.0.tool-change+ to True. Later,
+ IO's +read_tool_inputs()+ will sense that the HAL pin
+ +iocontrol.0.tool_changed+ has been set to True, indicating the
+ toolchanger has completed the tool change. When this happens,
+ it calls +load_tool()+ to update the machine state.
+
+ ... +load_tool()+ with a nonrandom toolchanger
+ config copies the tool information from the selected pocket
+ to the spindle (pocket 0).
+
+ ... +load_tool()+ with a random toolchanger config swaps tool
+ information between pocket 0 (the spindle) and the selected
+ pocket, then saves the tool table.
+
+. Back in interp, +settings->current_pocket+ is assigned the new
+ tool from +settings->selected_pocket+ (set by +Txxx+). The relevant
+ numbered parameters (<<sub:numbered-parameters,#5400-#5413>>) are
+ updated with the new tool information from pocket 0 (spindle).
+
+
+==== G43/G43.1/G49
+
+Apply tool length offset. G43 uses the TLO of the currently loaded tool,
+or of a specified tool if the H-word is given in the block. G43.1 gets
+TLO from axis-words in the block. G49 cancels the TLO (it uses 0 for
+the offset for all axes).
+
+Handled by +Interp::convert_tool_length_offset()+.
+
+. It starts by building an +EmcPose+ containing the 9-axis offsets
+ to use. For +G43.1+, these tool offsets come from axis words in the
+ current block. For +G43+ these offsets come from the current tool
+ (the tool in pocket 0), or from the tool specified by the H-word in
+ the block. For G49, the offsets are all 0.
+
+. The offsets are passed to Canon's +USE_TOOL_LENGTH_OFFSET()+ function.
+
+ .. (saicanon) Records the TLO in +_tool_offset+.
+
+ .. (emccanon) Builds an +EMC_TRAJ_SET_OFFSET+ message containing the
+ offsets and sends it to Task. Task copies the offsets to
+ +emcStatus->task.toolOffset+ and sends them on to Motion via
+ an +EMCMOT_SET_OFFSET+ command. Motion copies the offsets
+ to +emcmotStatus->tool_offset+, where it gets used to offset
+ future motions.
+
+. Back in interp, the offsets are recorded in +settings->tool_offset+.
+ The effective pocket is recorded in +settings->tool_offset_index+,
+ though this value is never used.
+
+
+==== G10 L1/L10/L11
+
+Modifies the tool table.
+
+Handled by +Interp::convert_setup_tool()+.
+
+. Picks the tool number out of the P-word in the block and finds the
+ pocket for that tool:
+
+ .. With a nonrandom toolchanger config this is always the
+ pocket number in the toolchanger (even when the tool is in
+ the spindle).
+
+ .. With a random toolchanger config, if the tool is currently
+ loaded it uses pocket 0 (pocket 0 means "the spindle"),
+ and if the tool is not loaded it uses the pocket number in
+ the tool changer. (This difference is important.)
+
+. Figures out what the new offsets should be.
+
+. The new tool information (diameter, offsets, angles, and orientation),
+ along with the tool number and pocket number, are passed to the Canon
+ call SET_TOOL_TABLE_ENTRY().
+
+ .. (saicanon) Copy the new tool information to the specified pocket
+ (in sai's internal tool table, +_tools+).
+
+ .. (emccanon) Build an +EMC_TOOL_SET_OFFSET+ message with the new
+ tool information, and send it to Task, which passes it
+ to IO. IO updates the specified pocket in its internal
+ copy of the tool table (+emcioStatus.tool.toolTable+), and
+ if the specified tool is currently loaded (it is compared to
+ +emcioStatus.tool.toolInSpindle+) then the new tool information
+ is copied to pocket 0 (the spindle) as well. (FIXME: that's a
+ buglet, should only be copied on nonrandom machines.) Finally IO
+ saves the new tool table.
+
+. Back in interp, if the modified tool is currently loaded in the
+ spindle, and if the machine is a non-random toolchanger, then
+ the new tool information is copied from the tool's home pocket
+ to pocket 0 (the spindle) in interp's copy of the tool table,
+ +settings->tool_table+. (This copy is not needed on random tool
+ changer machines because there, tools don't have a home pocket and
+ instead we just updated the tool in pocket 0 directly.)
+
+. The relevant numbered parameters
+ (<<sub:numbered-parameters,#5400-#5413>>) are updated from the tool
+ information in the spindle (by copying the information from interp's
+ +settings->tool_table+ to +settings->parameters+). (FIXME: this is
+ a buglet, the params should only be updated if it was the current
+ tool that was modified).
+
+. If the modified tool is currently loaded in the
+ spindle, and if the config is for a nonrandom toolchanger, then the
+ new tool information is written to the tool table's pocket 0 as well,
+ via a second call to SET_TOOL_TABLE_ENTRY(). (This second tool-table
+ update is not needed on random toolchanger machines because there,
+ tools don't have a home pocket and instead we just updated the tool
+ in pocket 0 directly.)
+
+
+==== M61
+
+FIXME!
+
+Set current tool number. This switches which tool is in the spindle,
+without actually moving the toolchanger or swapping any tools.
+
+Handled by +Interp::convert_tool_change()+.
+
+Canon: +CHANGE_TOOL_NUMBER()+
+
+settings->current_pocket is assigned the pocket number currently
+holding the tool specified by the Q-word argument.
+
+I think this m-code is broken.
+
+
+==== G41/G41.1/G42/G42.1
+
+Enable cutter radius compensation (usually called _cutter comp_).
+
+Handled by +Interp::convert_cutter_compensation_on()+.
+
+No Canon call, cutter comp happens in the interpreter. Uses the tool
+table in the expected way: if a D-word tool number is supplied it looks
+up the pocket number of the specified tool number in the table, and if
+no D-word is supplied it uses pocket 0 (the spindle).
+
+
+==== G40
+
+Cancel cutter radius compensation.
+
+Handled by +Interp::convert_cutter_compensation_off()+.
+
+No Canon call, cutter comp happens in the interpreter. Does not use
+the tool table.
+
+
+=== Internal state variables
+
+This is not an exhaustive list! Tool information is spread through
+out LinuxCNC.
+
+
+==== IO
+
++emcioStatus+ is of type +EMC_IO_STAT+
+
+emcioStatus.tool.pocketPrepped::
+
+ When IO gets the signal from HAL that the toolchanger prep is
+ complete (after a +Txxx+ command), this variable is set to the
+ pocket of the requested tool. When IO gets the signal from HAL
+ that the tool change itself is complete (after an +M6+ command),
+ this variable gets reset to -1.
+
+emcioStatus.tool.toolInSpindle::
+
+ Tool number of the tool currently installed in the spindle.
+ Exported on the HAL pin +iocontrol.0.tool-number+ (s32).
+
+emcioStatus.tool.toolTable[]::
+
+ An array of +CANON_TOOL_TABLE+ structures, +CANON_POCKETS_MAX+ long.
+ Loaded from the tool table file at startup and maintained there
+ after. Index 0 is the spindle, indexes 1-(CANON_POCKETS_MAX-1)
+ are the pockets in the toolchanger. This is a complete copy
+ of the tool information, maintained separately from Interp's
+ +settings.tool_table+.
+
+
+==== interp
+
++settings+ is of type +settings+, which is +struct setup_struct+.
+Defined in +src/emc/rs274ngc/interp_internal.hh+.
+
+settings.selected_pocket::
+
+ Pocket of the tool most recently selected by +Txxx+.
+
+settings.current_pocket::
+
+ Original pocket of the tool currently in the spindle. In other words:
+ which toolchanger pocket the tool that's currently in the spindle
+ was loaded from.
+
+settings.tool_table[]::
+
+ An array of tool information. The index into the array is the "pocket
+ number" (aka "slot number"). Pocket 0 is the spindle, pockets 1
+ through (CANON_POCKETS_MAX-1) are the pockets of the toolchanger.
+
+settings.tool_offset_index::
+
+ Unused. FIXME: Should probably be removed.
+
+settings.toolchange_flag::
+
+ Interp sets this to true when calling Canon's CHANGE_TOOL()
+ function. It is checked in +Interp::convert_tool_length_offset()+
+ to decide which pocket to use for G43 (with no H-word):
+ +settings->current_pocket+ if the tool change is still in progress,
+ pocket 0 (the spindle) if the tool change is complete.
+
+settings.random_toolchanger::
+
+ Set from the ini variable +[EMCIO]RANDOM_TOOLCHANGER+ at startup.
+ Controls various tool table handling logic. (IO also reads this
+ ini variable and changes its behavior based on it. For example,
+ when saving the tool table, random toolchanger save the tool in
+ the spindle (pocket 0), but non-random toolchanger save each tool
+ in its "home pocket".)
+
+settings.tool_offset::
+
+ This is an +EmcPose+ variable.
+
+ * Used to compute position in various places.
+
+ * Sent to Motion via the +EMCMOT_SET_OFFSET+ message.
+ All motion does with the offsets is export them to the HAL pins
+ +motion.0.tooloffset.[xyzabcuvw]+. FIXME: export these from
+ someplace closer to the tool table (io or interp, probably)
+ and remove the EMCMOT_SET_OFFSET message.
+
+settings.pockets_max::
+
+ Used interchangably with +CANON_POCKETS_MAX+ (a #defined constant,
+ set to 56 as of 2012 December 30). FIXME: This settings variable
+ is not currently useful and should probably be removed.
+
+settings.tool_table::
+
+ This is an array of +CANON_TOOL_TABLE+ structures (defined in
+ +src/emc/nml_intf/emctool.h+), with +CANON_POCKETS_MAX+ entries.
+ Indexed by "pocket number", aka "slot number". Index 0 is the
+ spindle, indexes 1-(CANON_POCKETS_MAX-1) are the pockets in the tool
+ changer. On a random toolchanger pocket numbers are meaningful.
+ On a nonrandom toolchanger pockets are meaningless; the pocket
+ numbers in the tool table file are ignored and tools are assigned
+ to +tool_table+ slots sequentially.
+
+settings.tool_change_at_g30::
+settings.tool_change_quill_up::
+settings.tool_change_with_spindle_on::
+
+ These are set from ini variables in the +[EMCIO]+ section, and
+ control how tool changes are performed.
+
diff --git a/scripts/.gitignore b/scripts/.gitignore
index 5cb8f6983..9094e6daf 100644
--- a/scripts/.gitignore
+++ b/scripts/.gitignore
@@ -6,3 +6,4 @@ realtime
rtapi.conf
linuxcncmkdesktop
latencyplot
+latencyhistogram
diff --git a/scripts/latencyhistogram.in b/scripts/latencyhistogram.in
index dccc362ca..13d8ac1fd 100755
--- a/scripts/latencyhistogram.in
+++ b/scripts/latencyhistogram.in
@@ -57,7 +57,7 @@ proc set_defaults {} {
program_check $::LH(realtime)
}
- set ::LH(version) 2.6
+ set ::LH(version) 2.7
set ::LH(verbose) 0
set ::LH(opt,show) 0
@@ -220,11 +220,17 @@ proc config {} {
} ;# config
proc other_info {} {
+ if [info exists ::env(DISPLAY)] {
+ set display "DISPLAY=$::env(DISPLAY)"
+ } else {
+ set display "DISPLAY=?"
+ }
return "\
$::LH(date) V$::LH(version) \
[exec hostname] \
$::tcl_platform(machine) \
$::tcl_platform(osVersion) \
+$display \
$::tcl_platform(user) \
$::LH(note,txt) \
"
diff --git a/src/emc/iotask/ioControl.cc b/src/emc/iotask/ioControl.cc
index f7fd732fc..d1f1a3374 100644
--- a/src/emc/iotask/ioControl.cc
+++ b/src/emc/iotask/ioControl.cc
@@ -590,7 +590,8 @@ void load_tool(int pocket) {
if (0 != saveToolTable(tool_table_file, emcioStatus.tool.toolTable))
emcioStatus.status = RCS_ERROR;
} else if(pocket == 0) {
- // magic T0 = pocket 0 = no tool
+ // on non-random tool-changers, asking for pocket 0 is the secret
+ // handshake for "unload the tool from the spindle"
emcioStatus.tool.toolTable[0].toolno = -1;
ZERO_EMC_POSE(emcioStatus.tool.toolTable[0].offset);
emcioStatus.tool.toolTable[0].diameter = 0.0;
diff --git a/src/emc/nml_intf/canon.hh b/src/emc/nml_intf/canon.hh
index eccf7f67f..93bab0e8f 100644
--- a/src/emc/nml_intf/canon.hh
+++ b/src/emc/nml_intf/canon.hh
@@ -542,8 +542,7 @@ a change_tool command, the select_tool command must have been given
before the change_tool command, and the value of slot must be the slot
number of the selected tool. */
-// extern void SELECT_POCKET(int i); /* i is slot number */
-extern void SELECT_POCKET(int i, int tool); /* i is slot number, tool is tool number */
+extern void SELECT_POCKET(int pocket, int tool); /* pocket is pocket number, tool is tool number */
extern void CHANGE_TOOL_NUMBER(int number);
diff --git a/src/emc/rs274ngc/interp_convert.cc b/src/emc/rs274ngc/interp_convert.cc
index 4533b4489..659dd48b9 100644
--- a/src/emc/rs274ngc/interp_convert.cc
+++ b/src/emc/rs274ngc/interp_convert.cc
@@ -1839,7 +1839,7 @@ int Interp::convert_cutter_compensation_on(int side, //!< side of path cutte
setup_pointer settings) //!< pointer to machine settings
{
double radius;
- int index, orientation;
+ int pocket_number, orientation;
CHKS((settings->plane != CANON_PLANE_XY && settings->plane != CANON_PLANE_XZ),
NCE_RADIUS_COMP_ONLY_IN_XY_OR_XZ);
@@ -1857,17 +1857,17 @@ int Interp::convert_cutter_compensation_on(int side, //!< side of path cutte
}
} else {
if(!block->d_flag) {
- index = 0;
+ pocket_number = 0;
} else {
int tool;
CHKS(!is_near_int(&tool, block->d_number_float),
_("G%d requires D word to be a whole number"),
block->g_modes[7]/10);
CHKS((tool < 0), NCE_NEGATIVE_D_WORD_TOOL_RADIUS_INDEX_USED);
- CHP((find_tool_pocket(settings, tool, &index)));
+ CHP((find_tool_pocket(settings, tool, &pocket_number)));
}
- radius = USER_TO_PROGRAM_LEN(settings->tool_table[index].diameter) / 2.0;
- orientation = settings->tool_table[index].orientation;
+ radius = USER_TO_PROGRAM_LEN(settings->tool_table[pocket_number].diameter) / 2.0;
+ orientation = settings->tool_table[pocket_number].orientation;
CHKS((settings->plane != CANON_PLANE_XZ && orientation != 0 && orientation != 9), _("G%d with lathe tool, but plane is not G18"), block->g_modes[7]/10);
}
if (radius < 0.0) { /* switch side & make radius positive if radius negative */
@@ -3493,7 +3493,8 @@ int Interp::convert_retract_mode(int g_code, //!< g_code being executed (mus
return INTERP_OK;
}
-// G10 L1 P[tool number] R[radius] X[x offset] Z[z offset] Q[orientation]
+// G10 L1 P[tool number] R[radius] X[x offset] Z[z offset] Q[orientation]
+// G10 L10 P[tool number] R[radius] X[x offset] Z[z offset] Q[orientation]
int Interp::convert_setup_tool(block_pointer block, setup_pointer settings) {
int pocket = -1, toolno;
@@ -3505,8 +3506,6 @@ int Interp::convert_setup_tool(block_pointer block, setup_pointer settings) {
CHP((find_tool_pocket(settings, toolno, &pocket)));
- settings->tool_table[pocket].toolno = toolno;
-
CHKS(!(block->x_flag || block->y_flag || block->z_flag ||
block->a_flag || block->b_flag || block->c_flag ||
block->u_flag || block->v_flag || block->w_flag ||
@@ -3631,7 +3630,15 @@ int Interp::convert_setup_tool(block_pointer block, setup_pointer settings) {
settings->tool_table[pocket].backangle,
settings->tool_table[pocket].orientation);
- if(settings->current_pocket == pocket) {
+ //
+ // On non-random tool changers we just updated the tool's "home pocket"
+ // in the tool changer carousel, so now, if the tool is currently
+ // loaded, we need to copy the new tool information to the spindle
+ // (pocket 0). This is never needed on random tool changers because
+ // there tools don't have a home pocket, and instead we updated pocket
+ // 0 (the spindle) directly when modifying the loaded tool.
+ //
+ if ((!settings->random_toolchanger) && (settings->current_pocket == pocket)) {
settings->tool_table[0] = settings->tool_table[pocket];
}
@@ -3668,9 +3675,11 @@ int Interp::convert_setup_tool(block_pointer block, setup_pointer settings) {
settings->parameters[5412] = settings->tool_table[0].backangle;
settings->parameters[5413] = settings->tool_table[0].orientation;
- //persuade axis-gui to update parameters widget for current tool:
+ // if the modified tool is currently in the spindle, then copy its
+ // information to pocket 0 of the tool table (which signifies the
+ // spindle)
if ( !_setup.random_toolchanger
- && toolno == settings->current_pocket) {
+ && pocket == settings->current_pocket) {
SET_TOOL_TABLE_ENTRY(0,
settings->tool_table[pocket].toolno,
settings->tool_table[pocket].offset,
@@ -5109,41 +5118,43 @@ int Interp::convert_tool_length_offset(int g_code, //!< g_code being execu
block_pointer block, //!< pointer to a block of RS274/NGC instructions
setup_pointer settings) //!< pointer to machine settings
{
- int index;
+ int pocket_number;
EmcPose tool_offset;
ZERO_EMC_POSE(tool_offset);
CHKS((settings->cutter_comp_side),
(_("Cannot change tool offset with cutter radius compensation on")));
if (g_code == G_49) {
- index = 0;
+ pocket_number = 0;
} else if (g_code == G_43) {
logDebug("convert_tool_length_offset h_flag=%d h_number=%d toolchange_flag=%d current_pocket=%d\n",
block->h_flag,block->h_number,settings->toolchange_flag,settings->current_pocket);
if(block->h_flag) {
- CHP((find_tool_pocket(settings, block->h_number, &index)));
+ CHP((find_tool_pocket(settings, block->h_number, &pocket_number)));
} else if (settings->toolchange_flag) {
- // we haven't loaded the tool and swapped pockets quite yet
- index = settings->current_pocket;
+ // Tool change is in progress, so the "current tool" is in its
+ // original pocket still.
+ pocket_number = settings->current_pocket;
} else {
- // tool change is done so pockets are swapped
- index = 0;
+ // Tool change is done so the current tool is in pocket 0 (aka the
+ // spindle).
+ pocket_number = 0;
}
logDebug("convert_tool_length_offset: using index=%d spindle_toolno=%d pocket_toolno=%d",
- index, settings->tool_table[0].toolno,settings->tool_table[settings->current_pocket].toolno);
-
- tool_offset.tran.x = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.tran.x);
- tool_offset.tran.y = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.tran.y);
- tool_offset.tran.z = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.tran.z);
- tool_offset.a = USER_TO_PROGRAM_ANG(settings->tool_table[index].offset.a);
- tool_offset.b = USER_TO_PROGRAM_ANG(settings->tool_table[index].offset.b);
- tool_offset.c = USER_TO_PROGRAM_ANG(settings->tool_table[index].offset.c);
- tool_offset.u = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.u);
- tool_offset.v = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.v);
- tool_offset.w = USER_TO_PROGRAM_LEN(settings->tool_table[index].offset.w);
+ pocket_number, settings->tool_table[0].toolno,settings->tool_table[settings->current_pocket].toolno);
+
+ tool_offset.tran.x = USER_TO_PROGRAM_LEN(settings->tool_table[pocket_number].offset.tran.x);
+ tool_offset.tran.y = USER_TO_PROGRAM_LEN(settings->tool_table[pocket_number].offset.tran.y);
+ tool_offset.tran.z = USER_TO_PROGRAM_LEN(settings->tool_table[pocket_number].offset.tran.z);
+ tool_offset.a = USER_TO_PROGRAM_ANG(settings->tool_table[pocket_number].offset.a);
+ tool_offset.b = USER_TO_PROGRAM_ANG(settings->tool_table[pocket_number].offset.b);
+ tool_offset.c = USER_TO_PROGRAM_ANG(settings->tool_table[pocket_number].offset.c);
+ tool_offset.u = USER_TO_PROGRAM_LEN(settings->tool_table[pocket_number].offset.u);
+ tool_offset.v = USER_TO_PROGRAM_LEN(settings->tool_table[pocket_number].offset.v);
+ tool_offset.w = USER_TO_PROGRAM_LEN(settings->tool_table[pocket_number].offset.w);
} else if (g_code == G_43_1) {
tool_offset = settings->tool_offset;
- index = -1;
+ pocket_number = -1;
if(block->x_flag) tool_offset.tran.x = block->x_number;
if(block->y_flag) tool_offset.tran.y = block->y_number;
if(block->z_flag) tool_offset.tran.z = block->z_number;
@@ -5184,22 +5195,19 @@ int Interp::convert_tool_length_offset(int g_code, //!< g_code being execu
/*! convert_tool_select
Returned Value: int
- If the tool slot given in the block is larger than allowed,
- this returns NCE_SELECTED_TOOL_SLOT_NUMBER_TOO_LARGE.
- Otherwise, it returns INTERP_OK.
+ If the tool number given in the block is not found in the tool table,
+ it returns INTERP_ERROR. Otherwise (if the tool *is* found) it returns
+ INTERP_OK.
Side effects: See below
Called by: execute_block
A select tool command is given, which causes the changer chain to move
-so that the slot with the t_number given in the block is next to the
-tool changer, ready for a tool change. The
+so that the slot with the tool identified by the t_number given in the
+block is next to the tool changer, ready for a tool change. The
settings->selected_tool_slot is set to the given slot.
-An alternative in this function is to select by tool id. This was used
-in the K&T and VGER interpreters. It is easy to code.
-
A check that the t_number is not negative has already been made in read_t.
A zero t_number is allowed and means no tool should be selected.
diff --git a/src/emc/task/emccanon.cc b/src/emc/task/emccanon.cc
index 69d1d1f3a..e34236333 100644
--- a/src/emc/task/emccanon.cc
+++ b/src/emc/task/emccanon.cc
@@ -2721,11 +2721,27 @@ int GET_EXTERNAL_QUEUE_EMPTY(void)
return emcStatus->motion.traj.queue == 0 ? 1 : 0;
}
+// Returns the "home pocket" of the tool currently in the spindle, ie the
+// pocket that the current tool was loaded from. Returns 0 if there is no
+// tool in the spindle.
int GET_EXTERNAL_TOOL_SLOT()
{
- return emcStatus->io.tool.toolInSpindle;
+ int toolno = emcStatus->io.tool.toolInSpindle;
+ int pocket;
+
+ for (pocket = 1; pocket < CANON_POCKETS_MAX; pocket++) {
+ if (emcStatus->io.tool.toolTable[pocket].toolno == toolno) {
+ return pocket;
+ }
+ }
+
+ return 0; // no tool in spindle
}
+// If the tool changer has prepped a pocket (after a Txxx command) and is
+// ready to perform a tool change, return the currently prepped pocket
+// number. If the tool changer is idle (because no Txxx command has been
+// run, or because an M6 tool change has completed), return -1.
int GET_EXTERNAL_SELECTED_TOOL_SLOT()
{
return emcStatus->io.tool.pocketPrepped;
diff --git a/src/emc/usr_intf/axis/scripts/axis.py b/src/emc/usr_intf/axis/scripts/axis.py
index 6786bde3f..c64941062 100755
--- a/src/emc/usr_intf/axis/scripts/axis.py
+++ b/src/emc/usr_intf/axis/scripts/axis.py
@@ -2818,7 +2818,7 @@ mav = (
or inifile.find("TRAJ","MAX_VELOCITY")
or mlv)
vars.max_aspeed.set(float(mav))
-mv = inifile.find("TRAJ","MAX_LINEAR_VELOCITY") or inifile.find("AXIS_0","MAX_VELOCITY") or 1.0
+mv = inifile.find("DISPLAY","MAX_LINEAR_VELOCITY") or inifile.find("TRAJ","MAX_LINEAR_VELOCITY") or inifile.find("TRAJ","MAX_VELOCITY") or inifile.find("AXIS_0","MAX_VELOCITY") or 1.0
vars.maxvel_speed.set(float(mv)*60)
vars.max_maxvel.set(float(mv))
root_window.tk.eval("${pane_top}.jogspeed.s set [setval $jog_speed $max_speed]")
diff --git a/src/emc/usr_intf/pncconf/pncconf.py b/src/emc/usr_intf/pncconf/pncconf.py
index ed600c16d..214ae6a4d 100755
--- a/src/emc/usr_intf/pncconf/pncconf.py
+++ b/src/emc/usr_intf/pncconf/pncconf.py
@@ -1804,7 +1804,7 @@ If you have a REALLY large config that you wish to convert to this newer version
return test
def pwmgen_invert_pins(self,pinnumber):
- print "list pwm invert pins"
+ print "list pwm invert pins",pinnumber
# sample pinname = mesa0c0pin11
signallist = []
pin = int(pinnumber[10:])
@@ -1838,8 +1838,8 @@ If you have a REALLY large config that you wish to convert to this newer version
closedloop = False
pwmpin = self.pwmgen_sig(let)
pwmpinname = self.make_pinname(pwmpin)
- if pwmpinname:
- pwminvertlist = self.pwmgen_invert_pins(self.pwmgen_sig(let))
+ if pwmpinname and not 'serial' in pwmpin: # TODO allow sserial PWM to be inverted
+ pwminvertlist = self.pwmgen_invert_pins(pwmpin)
if not pwmpin == None:
pwmtype = self.pwmgen_sig(let)+"type"
else:
diff --git a/src/po/de.po b/src/po/de.po
index 42e3e8efd..642a1b575 100644
--- a/src/po/de.po
+++ b/src/po/de.po
@@ -186,16 +186,17 @@ msgid ""
"or\n"
"Click 'Quit' to exit HALSCOPE"
msgstr ""
-"HALSCOPE benutzt eine Echtzeit-Komponente namens scope_rt,\n"
-"um Werte aufzuzeichnen. Sie ist nicht geladen und konnte auch \n"
-"nicht automatisch nachgeladen werden.\n"
-"Weitere Informationen könnten in der Konsole verfügbar sein,\n"
+"HALSCOPE benutzt eine Echtzeit-Komponente namens scope_rt\n"
+"um Werte aufzuzeichnen. Diese wurde nicht geladen und der\n"
+"atomatische Versuch die Komponente zu laden schlug fehl.\n"
+"Weitere Informationen könnten in der Konole verfügbar sein,\n"
"aus der der Befehl »halscope« gestartet wurde.\n"
"\n"
"Wählen Sie eine der folgenden Möglichkeiten:\n"
"\n"
-"Laden der Komponente (eingeben: »halcmd loadrt scope_rt«) und »OK« wählen\n"
-"oder wählen Sie »Beenden«, um HALSCOPE zu beenden"
+"Laden der Komponente (mittels »halcmd loadrt scope_rt«). Wählen Sie »OK«\n"
+"oder\n"
+"wählen Sie »Beenden« um HALSCOPE zu beenden"
#: hal/utils/scope_horiz.c:503 src/hal/utils/scope_horiz.c:495
msgid "Realtime function not linked"
@@ -234,10 +235,10 @@ msgid ""
"or\n"
"Click 'Quit' to exit HALSCOPE"
msgstr ""
-"Wählen Sie einen Thread-Namen und Verviel-\n"
-"facher und bestätigen Sie mit »OK«\n"
+"Wählen Sie einen Tread-Namen und Vervielfacher\n"
+"und bestätigen Sie mit »OK«\n"
"oder\n"
-"wählen Sie »Beenden« um HALSCOPE zu beenden."
+"wählen Sie »Beenden« um HALSCOPE zu beenden\n"
#: src/hal/utils/scope_horiz.c:526 hal/utils/scope_horiz.c:534
msgid "Thread:"
@@ -372,7 +373,7 @@ msgstr ""
"oder\n"
"klicken Sie 'Quit', um HALSCOPE zu verlassen."
-#: hal/utils/scope_horiz.c:791
+#: hal/utils/scope_horiz.c:791 src/hal/utils/scope_horiz.c:779
msgid "Pick log file to write to:"
msgstr "Wählen Sie eine Log-Datei zum Speichern:"
@@ -606,6 +607,7 @@ msgid "Force"
msgstr "Zwang"
#: hal/utils/scope_trig.c:242 hal/utils/scope_trig.c:276
+#: src/hal/utils/scope_trig.c:235 src/hal/utils/scope_trig.c:269
msgid "Level"
msgstr "Schwelle"
@@ -1043,8 +1045,7 @@ msgstr "Speichern"
#: ../tcl/bin/emccalib.tcl:159 ../tcl/bin/halconfig.tcl:623
#, fuzzy, tcl-format
msgid "Tune %d"
-msgstr ""
-"Feineinstellung %d"
+msgstr "Feineinstellung %d"
#: tcl/bin/emccalib.tcl:160 tcl/bin/halconfig.tcl:628
#: ../tcl/bin/emccalib.tcl:161 ../tcl/bin/halconfig.tcl:628
@@ -1119,8 +1120,7 @@ msgstr "Konfigurationsinformationen"
#: tcl/bin/emcdebug.tcl:187 ../tcl/bin/emcdebug.tcl:187
#, fuzzy
msgid "Use of defaults"
-msgstr ""
-"Benutzen der Standardwerte"
+msgstr "Benutzen der Standardwerte"
#: tcl/bin/emcdebug.tcl:188 ../tcl/bin/emcdebug.tcl:188
msgid "Version information"
@@ -1207,8 +1207,7 @@ msgstr "Einfügen"
#: ../tcl/bin/genedit.tcl:99 ../tcl/mini.tcl:2545 ../tcl/show_errors.tcl:68
#, fuzzy
msgid "Select All"
-msgstr ""
-"Alles markieren"
+msgstr "Alles markieren"
#: tcl/bin/genedit.tcl:104 tcl/bin/halconfig.tcl:192 tcl/mini.tcl:919
#: tcl/mini.tcl:2519 tcl/tklinuxcnc.tcl:790 ../tcl/bin/genedit.tcl:104
diff --git a/src/po/hu.po b/src/po/hu.po
index 99f831501..63a1d6097 100644
--- a/src/po/hu.po
+++ b/src/po/hu.po
@@ -72,11 +72,12 @@ msgid "_Close"
msgstr "_Bezárás"
#: src/hal/utils/scope.c:126
+#, fuzzy
msgid ""
"Usage:\n"
" halscope [-h] [-i infile] [-o outfile] [num_samples]\n"
msgstr ""
-"Használat:\\n\n"
+"Használat:\n"
" halscope [-h] [-i ini_fájl] [-o kimeneti_fájl] [mintavétel_száma]\n"
#: src/hal/utils/scope.c:474 src/hal/utils/scope.c:501
@@ -291,7 +292,11 @@ msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:3336
#: src/emc/usr_intf/axis/scripts/image-to-gcode.py:718
#: lib/python/propertywindow.py:34 share/axis/tcl/axis.tcl:1720
-#: share/axis/tcl/axis.tcl:1757
+#: share/axis/tcl/axis.tcl:1757 src/emc/usr_intf/axis/scripts/axis.py:1069
+#: src/emc/usr_intf/axis/scripts/axis.py:1129
+#: src/emc/usr_intf/axis/scripts/axis.py:1445
+#: src/emc/usr_intf/axis/scripts/axis.py:2464
+#: src/emc/usr_intf/axis/scripts/axis.py:3320
msgid "OK"
msgstr "OK"
@@ -437,6 +442,9 @@ msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1459
#: src/emc/usr_intf/axis/scripts/axis.py:1646
#: src/emc/usr_intf/axis/scripts/image-to-gcode.py:720
+#: src/emc/usr_intf/axis/scripts/axis.py:1391
+#: src/emc/usr_intf/axis/scripts/axis.py:1446
+#: src/emc/usr_intf/axis/scripts/axis.py:1633
msgid "Cancel"
msgstr "Mégsem"
@@ -575,31 +583,31 @@ msgstr ""
msgid "fault %d during orient in progress"
msgstr ""
-#: src/emc/motion/control.c:718
+#: src/emc/motion/control.c:718 src/emc/motion/control.c:697
msgid "motion stopped by enable input"
msgstr ""
-#: src/emc/motion/control.c:741
+#: src/emc/motion/control.c:741 src/emc/motion/control.c:720
#, c-format
msgid "joint %d on limit switch error"
msgstr ""
-#: src/emc/motion/control.c:753
+#: src/emc/motion/control.c:753 src/emc/motion/control.c:732
#, c-format
msgid "joint %d amplifier fault"
msgstr ""
-#: src/emc/motion/control.c:762
+#: src/emc/motion/control.c:762 src/emc/motion/control.c:741
#, c-format
msgid "joint %d following error"
msgstr ""
-#: src/emc/motion/control.c:1444
+#: src/emc/motion/control.c:1444 src/emc/motion/control.c:1423
#, c-format
msgid "Exceeded positive soft limit on joint %d"
msgstr ""
-#: src/emc/motion/control.c:1449
+#: src/emc/motion/control.c:1449 src/emc/motion/control.c:1428
#, c-format
msgid "Exceeded negative soft limit on joint %d"
msgstr ""
@@ -779,17 +787,17 @@ msgstr ""
msgid "need to be enabled, in teleop mode for teleop move"
msgstr ""
-#: src/emc/motion/command.c:1605
+#: src/emc/motion/command.c:1605 src/emc/motion/command.c:1556
#, c-format
msgid "joint %d: too many compensation entries"
msgstr ""
-#: src/emc/motion/command.c:1611
+#: src/emc/motion/command.c:1611 src/emc/motion/command.c:1562
#, c-format
msgid "joint %d: compensation values must increase"
msgstr ""
-#: src/emc/motion/command.c:1640
+#: src/emc/motion/command.c:1640 src/emc/motion/command.c:1591
#, c-format
msgid "unrecognized command %d"
msgstr ""
@@ -844,7 +852,7 @@ msgstr ""
msgid "MOTION: emcmot_hal_data malloc failed\n"
msgstr ""
-#: src/emc/motion/motion.c:597
+#: src/emc/motion/motion.c:597 src/emc/motion/motion.c:585
#, c-format
msgid "MOTION: joint %d pin/param export failed\n"
msgstr ""
@@ -905,7 +913,7 @@ msgstr ""
#: tcl/bin/emccalib.tcl:106 tcl/bin/genedit.tcl:77 tcl/bin/halconfig.tcl:151
#: tcl/bin/halshow.tcl:85 tcl/mini.tcl:2516 tcl/tklinuxcnc.tcl:719
-#: tcl/ngcgui.tcl:549
+#: tcl/ngcgui.tcl:549 tcl/bin/halshow.tcl:86
#, fuzzy
msgid "File"
msgstr "_Fájl"
@@ -1033,7 +1041,7 @@ msgstr ""
#: tcl/bin/genedit.tcl:87 tcl/bin/halconfig.tcl:165 tcl/bin/halshow.tcl:92
#: tcl/mini.tcl:954 tcl/tklinuxcnc.tcl:734 tcl/ngcgui.tcl:1243
-#: tcl/ngcgui.tcl:3680
+#: tcl/ngcgui.tcl:3680 tcl/bin/halshow.tcl:93
#, fuzzy
msgid "Exit"
msgstr "Sz_erkesztés"
@@ -1116,6 +1124,7 @@ msgstr ""
#: tcl/bin/genedit.tcl:197 tcl/mini.tcl:1373 tcl/mini.tcl:1775
#: tcl/tklinuxcnc.tcl:451 src/emc/task/emctaskmain.cc:2072
+#: src/emc/task/emctaskmain.cc:2000
#, c-format, tcl-format
msgid "can't open %s"
msgstr ""
@@ -1262,27 +1271,27 @@ msgstr ""
msgid "View"
msgstr "_Nézet"
-#: tcl/bin/halconfig.tcl:170 tcl/bin/halshow.tcl:104
+#: tcl/bin/halconfig.tcl:170 tcl/bin/halshow.tcl:104 tcl/bin/halshow.tcl:105
msgid "Expand Tree"
msgstr ""
-#: tcl/bin/halconfig.tcl:172 tcl/bin/halshow.tcl:106
+#: tcl/bin/halconfig.tcl:172 tcl/bin/halshow.tcl:106 tcl/bin/halshow.tcl:107
msgid "Collapse Tree"
msgstr ""
-#: tcl/bin/halconfig.tcl:175 tcl/bin/halshow.tcl:109
+#: tcl/bin/halconfig.tcl:175 tcl/bin/halshow.tcl:109 tcl/bin/halshow.tcl:110
msgid "Expand Pins"
msgstr ""
-#: tcl/bin/halconfig.tcl:177 tcl/bin/halshow.tcl:111
+#: tcl/bin/halconfig.tcl:177 tcl/bin/halshow.tcl:111 tcl/bin/halshow.tcl:112
msgid "Expand Parameters"
msgstr ""
-#: tcl/bin/halconfig.tcl:179 tcl/bin/halshow.tcl:113
+#: tcl/bin/halconfig.tcl:179 tcl/bin/halshow.tcl:113 tcl/bin/halshow.tcl:114
msgid "Expand Signals"
msgstr ""
-#: tcl/bin/halconfig.tcl:182 tcl/bin/halshow.tcl:116
+#: tcl/bin/halconfig.tcl:182 tcl/bin/halshow.tcl:116 tcl/bin/halshow.tcl:117
msgid "Erase Watch"
msgstr ""
@@ -1301,14 +1310,15 @@ msgid "Enter HAL command :"
msgstr ""
#: tcl/bin/halconfig.tcl:479 tcl/bin/halconfig.tcl:528 tcl/bin/halshow.tcl:354
+#: tcl/bin/halshow.tcl:357
msgid "Execute"
msgstr ""
-#: tcl/bin/halconfig.tcl:943 tcl/bin/halshow.tcl:405
+#: tcl/bin/halconfig.tcl:943 tcl/bin/halshow.tcl:405 tcl/bin/halshow.tcl:413
msgid "Select a node to show."
msgstr ""
-#: tcl/bin/halconfig.tcl:968 tcl/bin/halshow.tcl:429
+#: tcl/bin/halconfig.tcl:968 tcl/bin/halshow.tcl:429 tcl/bin/halshow.tcl:438
msgid "<-- Select a Leaf. Click on its name."
msgstr ""
@@ -1340,35 +1350,35 @@ msgid ""
"allowed by law."
msgstr ""
-#: tcl/bin/halshow.tcl:69
+#: tcl/bin/halshow.tcl:69 tcl/bin/halshow.tcl:70
msgid " SHOW "
msgstr ""
-#: tcl/bin/halshow.tcl:70
+#: tcl/bin/halshow.tcl:70 tcl/bin/halshow.tcl:71
msgid " WATCH "
msgstr ""
-#: tcl/bin/halshow.tcl:90
+#: tcl/bin/halshow.tcl:90 tcl/bin/halshow.tcl:91
msgid "Load Watch List"
msgstr ""
-#: tcl/bin/halshow.tcl:102
+#: tcl/bin/halshow.tcl:102 tcl/bin/halshow.tcl:103
msgid "Tree View"
msgstr ""
-#: tcl/bin/halshow.tcl:349
+#: tcl/bin/halshow.tcl:349 tcl/bin/halshow.tcl:354
msgid "Test HAL command :"
msgstr ""
-#: tcl/bin/halshow.tcl:544
+#: tcl/bin/halshow.tcl:544 tcl/bin/halshow.tcl:556
msgid "Load a watch list"
msgstr ""
-#: tcl/bin/halshow.tcl:567
+#: tcl/bin/halshow.tcl:567 tcl/bin/halshow.tcl:579
msgid "Save current watch list"
msgstr ""
-#: tcl/bin/halshow.tcl:581
+#: tcl/bin/halshow.tcl:581 tcl/bin/halshow.tcl:593
msgid "Commands may be tested here but they will NOT be saved"
msgstr ""
@@ -1887,6 +1897,7 @@ msgstr ""
#: tcl/mini.tcl:1711 tcl/mini.tcl:2823 tcl/mini.tcl:2882
#: tcl/tklinuxcnc.tcl:465 src/emc/usr_intf/axis/scripts/axis.py:1885
#: src/emc/usr_intf/axis/scripts/image-to-gcode.py:754
+#: src/emc/usr_intf/axis/scripts/axis.py:1872
msgid "All files"
msgstr ""
@@ -2393,6 +2404,8 @@ msgstr ""
#: src/emc/usr_intf/pncconf/pncconf.glade:62832
#: src/emc/usr_intf/pncconf/pncconf.glade:63925
#: src/emc/usr_intf/pncconf/pncconf.glade:65091
+#: src/emc/usr_intf/axis/scripts/axis.py:1543
+#: src/emc/usr_intf/axis/scripts/axis.py:1713
msgid "mm"
msgstr ""
@@ -3193,6 +3206,7 @@ msgstr ""
#: tcl/ngcgui.tcl:3642 src/emc/usr_intf/axis/scripts/axis.py:2255
#: src/emc/usr_intf/axis/scripts/axis.py:2268
+#: src/emc/usr_intf/axis/scripts/axis.py:2242
msgid "Warning"
msgstr ""
@@ -3381,369 +3395,458 @@ msgid "Creating new tab page"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:148
+#: src/emc/usr_intf/axis/scripts/axis.py:144
msgid "Emergency stop"
msgstr "Vészleállítás"
#: src/emc/usr_intf/axis/scripts/axis.py:149
+#: src/emc/usr_intf/axis/scripts/axis.py:145
msgid "Turn machine on"
msgstr "Kapcsold be a gépet"
#: src/emc/usr_intf/axis/scripts/axis.py:151
+#: src/emc/usr_intf/axis/scripts/axis.py:147
msgid "Activate first axis"
msgstr "1. tengely beindítva"
#: src/emc/usr_intf/axis/scripts/axis.py:152
+#: src/emc/usr_intf/axis/scripts/axis.py:148
msgid "Activate second axis"
msgstr "2. tengely beindítva"
#: src/emc/usr_intf/axis/scripts/axis.py:153
+#: src/emc/usr_intf/axis/scripts/axis.py:149
msgid "Activate third axis"
msgstr "3. tengely beindítva"
#: src/emc/usr_intf/axis/scripts/axis.py:154
+#: src/emc/usr_intf/axis/scripts/axis.py:150
msgid "Activate fourth axis"
msgstr "4. tengely beindítva"
#: src/emc/usr_intf/axis/scripts/axis.py:155
+#: src/emc/usr_intf/axis/scripts/axis.py:151
#, fuzzy
msgid "Activate fifth through ninth axis"
msgstr "5. tengely beindítva"
#: src/emc/usr_intf/axis/scripts/axis.py:156
+#: src/emc/usr_intf/axis/scripts/axis.py:152
msgid "Set Feed Override from 0% to 100%"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:157
+#: src/emc/usr_intf/axis/scripts/axis.py:153
msgid ", and ."
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:157
+#: src/emc/usr_intf/axis/scripts/axis.py:153
#, fuzzy
msgid "Select jog speed"
msgstr "Lépes növelése"
#: src/emc/usr_intf/axis/scripts/axis.py:158
+#: src/emc/usr_intf/axis/scripts/axis.py:154
msgid "< and >"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:158
+#: src/emc/usr_intf/axis/scripts/axis.py:154
msgid "Select angular jog speed"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:159
+#: src/emc/usr_intf/axis/scripts/axis.py:155
msgid "I, Shift-I"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:159 share/axis/tcl/axis.tcl:2356
+#: src/emc/usr_intf/axis/scripts/axis.py:155
msgid "Select jog increment"
msgstr "Lépes növelése"
#: src/emc/usr_intf/axis/scripts/axis.py:160
+#: src/emc/usr_intf/axis/scripts/axis.py:156
msgid "Continuous jog"
msgstr "Folytonos lépés"
#: src/emc/usr_intf/axis/scripts/axis.py:161
#: src/emc/usr_intf/pncconf/pncconf.py:479
+#: src/emc/usr_intf/axis/scripts/axis.py:157
msgid "Home"
msgstr "Nullpont"
#: src/emc/usr_intf/axis/scripts/axis.py:161
+#: src/emc/usr_intf/axis/scripts/axis.py:157
msgid "Send active axis home"
msgstr "Aktuális tengely kiinduló pozicióba"
#: src/emc/usr_intf/axis/scripts/axis.py:162
+#: src/emc/usr_intf/axis/scripts/axis.py:158
#, fuzzy
msgid "Ctrl-Home"
msgstr "Nullpont"
#: src/emc/usr_intf/axis/scripts/axis.py:162
+#: src/emc/usr_intf/axis/scripts/axis.py:158
msgid "Home all axes"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:163
+#: src/emc/usr_intf/axis/scripts/axis.py:159
msgid "Shift-Home"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:163
+#: src/emc/usr_intf/axis/scripts/axis.py:159
#, fuzzy
msgid "Zero G54 offset for active axis"
msgstr "A G54 offszet beállítása az aktiv tengelyen"
#: src/emc/usr_intf/axis/scripts/axis.py:164
+#: src/emc/usr_intf/axis/scripts/axis.py:160
msgid "End"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:164
+#: src/emc/usr_intf/axis/scripts/axis.py:160
msgid "Set G54 offset for active axis"
msgstr "A G54 offszet beállítása az aktiv tengelyen"
#: src/emc/usr_intf/axis/scripts/axis.py:165
+#: src/emc/usr_intf/axis/scripts/axis.py:161
#, fuzzy
msgid "Jog active axis"
msgstr "3. tengely léptetés"
#: src/emc/usr_intf/axis/scripts/axis.py:168
+#: src/emc/usr_intf/axis/scripts/axis.py:164
msgid "Left, Right"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:168
+#: src/emc/usr_intf/axis/scripts/axis.py:164
msgid "Jog first axis"
msgstr "1. tengely léptetés"
#: src/emc/usr_intf/axis/scripts/axis.py:169
+#: src/emc/usr_intf/axis/scripts/axis.py:165
msgid "Up, Down"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:169
+#: src/emc/usr_intf/axis/scripts/axis.py:165
msgid "Jog second axis"
msgstr "2. tengely léptetés"
#: src/emc/usr_intf/axis/scripts/axis.py:170
+#: src/emc/usr_intf/axis/scripts/axis.py:166
msgid "Pg Up, Pg Dn"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:170
+#: src/emc/usr_intf/axis/scripts/axis.py:166
msgid "Jog third axis"
msgstr "3. tengely léptetés"
#: src/emc/usr_intf/axis/scripts/axis.py:171
+#: src/emc/usr_intf/axis/scripts/axis.py:167
msgid "Shift+above jogs"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:171
+#: src/emc/usr_intf/axis/scripts/axis.py:167
msgid "Jog at traverse speed"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:172
+#: src/emc/usr_intf/axis/scripts/axis.py:168
msgid "Jog fourth axis"
msgstr "4. tengely léptetés"
#: src/emc/usr_intf/axis/scripts/axis.py:175
+#: src/emc/usr_intf/axis/scripts/axis.py:171
msgid "Toggle between Drag and Rotate mode"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:176
+#: src/emc/usr_intf/axis/scripts/axis.py:172
msgid "Left Button"
msgstr "Bal egér gomb"
#: src/emc/usr_intf/axis/scripts/axis.py:176
+#: src/emc/usr_intf/axis/scripts/axis.py:172
#, fuzzy
msgid "Pan, rotate or select line"
msgstr "Nézet mozgatás vagy sor kijelölés"
#: src/emc/usr_intf/axis/scripts/axis.py:177
+#: src/emc/usr_intf/axis/scripts/axis.py:173
msgid "Shift+Left Button"
msgstr "Shift+Bal egér gomb"
#: src/emc/usr_intf/axis/scripts/axis.py:177
+#: src/emc/usr_intf/axis/scripts/axis.py:173
#, fuzzy
msgid "Rotate or pan"
msgstr "Forgatott felül nézet"
#: src/emc/usr_intf/axis/scripts/axis.py:178
+#: src/emc/usr_intf/axis/scripts/axis.py:174
msgid "Right Button"
msgstr "Jobb egérgomb"
#: src/emc/usr_intf/axis/scripts/axis.py:178
#: src/emc/usr_intf/axis/scripts/axis.py:180
#: src/emc/usr_intf/axis/scripts/axis.py:181
+#: src/emc/usr_intf/axis/scripts/axis.py:174
+#: src/emc/usr_intf/axis/scripts/axis.py:176
+#: src/emc/usr_intf/axis/scripts/axis.py:177
msgid "Zoom view"
msgstr "Nagyitás"
#: src/emc/usr_intf/axis/scripts/axis.py:179
+#: src/emc/usr_intf/axis/scripts/axis.py:175
msgid "Wheel Button"
msgstr "Egér görgő gomb"
#: src/emc/usr_intf/axis/scripts/axis.py:179
+#: src/emc/usr_intf/axis/scripts/axis.py:175
msgid "Rotate view"
msgstr "Forgatott nézet"
#: src/emc/usr_intf/axis/scripts/axis.py:180
+#: src/emc/usr_intf/axis/scripts/axis.py:176
msgid "Rotate Wheel"
msgstr "Egér görgető kerék"
#: src/emc/usr_intf/axis/scripts/axis.py:181
+#: src/emc/usr_intf/axis/scripts/axis.py:177
#, fuzzy
msgid "Control+Left Button"
msgstr "Bal egér gomb"
#: src/emc/usr_intf/axis/scripts/axis.py:184
+#: src/emc/usr_intf/axis/scripts/axis.py:180
msgid "Manual control"
msgstr "Kézi vezérlés"
#: src/emc/usr_intf/axis/scripts/axis.py:185
+#: src/emc/usr_intf/axis/scripts/axis.py:181
msgid "Code entry (MDI)"
msgstr "Kód mező (MDI)"
#: src/emc/usr_intf/axis/scripts/axis.py:186
+#: src/emc/usr_intf/axis/scripts/axis.py:182
msgid "Control-M"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:186
+#: src/emc/usr_intf/axis/scripts/axis.py:182
msgid "Clear MDI history"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:187
+#: src/emc/usr_intf/axis/scripts/axis.py:183
msgid "Control-H"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:187
+#: src/emc/usr_intf/axis/scripts/axis.py:183
msgid "Copy selected MDI history elements"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:188
+#: src/emc/usr_intf/axis/scripts/axis.py:184
msgid "to clipboard"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:189
+#: src/emc/usr_intf/axis/scripts/axis.py:185
msgid "Control-Shift-H"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:189
+#: src/emc/usr_intf/axis/scripts/axis.py:185
msgid "Paste clipboard to MDI history"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:190 share/axis/tcl/axis.tcl:1113
#: src/emc/usr_intf/touchy/touchy.glade:508
+#: src/emc/usr_intf/axis/scripts/axis.py:186
msgid "Override Limits"
msgstr "Határok módosítása"
#: src/emc/usr_intf/axis/scripts/axis.py:192
+#: src/emc/usr_intf/axis/scripts/axis.py:188
msgid "Open program"
msgstr "Program betöltés"
#: src/emc/usr_intf/axis/scripts/axis.py:193
+#: src/emc/usr_intf/axis/scripts/axis.py:189
msgid "Control-R"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:193
+#: src/emc/usr_intf/axis/scripts/axis.py:189
#, fuzzy
msgid "Reload program"
msgstr "Program indítás"
#: src/emc/usr_intf/axis/scripts/axis.py:194
+#: src/emc/usr_intf/axis/scripts/axis.py:190
msgid "Control-S"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:194
+#: src/emc/usr_intf/axis/scripts/axis.py:190
msgid "Save g-code as"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:195
+#: src/emc/usr_intf/axis/scripts/axis.py:191
msgid "Run program"
msgstr "Program indítás"
#: src/emc/usr_intf/axis/scripts/axis.py:196
+#: src/emc/usr_intf/axis/scripts/axis.py:192
msgid "Step program"
msgstr "Program léptetés"
#: src/emc/usr_intf/axis/scripts/axis.py:197
+#: src/emc/usr_intf/axis/scripts/axis.py:193
msgid "Pause program"
msgstr "Program szünet"
#: src/emc/usr_intf/axis/scripts/axis.py:198
+#: src/emc/usr_intf/axis/scripts/axis.py:194
msgid "Resume program"
msgstr "Program folytatása"
#: src/emc/usr_intf/axis/scripts/axis.py:199
+#: src/emc/usr_intf/axis/scripts/axis.py:195
#, fuzzy
msgid "Stop running program, or"
msgstr "Program megszakítása"
#: src/emc/usr_intf/axis/scripts/axis.py:200
+#: src/emc/usr_intf/axis/scripts/axis.py:196
msgid "stop loading program preview"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:202
+#: src/emc/usr_intf/axis/scripts/axis.py:198
msgid "Toggle mist"
msgstr "Elszívó Ki/Be"
#: src/emc/usr_intf/axis/scripts/axis.py:203
+#: src/emc/usr_intf/axis/scripts/axis.py:199
msgid "Toggle flood"
msgstr "Hűtés Ki/Be"
#: src/emc/usr_intf/axis/scripts/axis.py:204
+#: src/emc/usr_intf/axis/scripts/axis.py:200
msgid "Spindle brake off"
msgstr "Fő orsó fék kikapcsolva"
#: src/emc/usr_intf/axis/scripts/axis.py:205
+#: src/emc/usr_intf/axis/scripts/axis.py:201
msgid "Shift-B"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:205
+#: src/emc/usr_intf/axis/scripts/axis.py:201
msgid "Spindle brake on"
msgstr "Fő orsó fék bekapcsolva"
#: src/emc/usr_intf/axis/scripts/axis.py:206
+#: src/emc/usr_intf/axis/scripts/axis.py:202
msgid "Turn spindle clockwise"
msgstr "Fő orsó jobbra fordul"
#: src/emc/usr_intf/axis/scripts/axis.py:207
+#: src/emc/usr_intf/axis/scripts/axis.py:203
msgid "Turn spindle counterclockwise"
msgstr "Fő orsó balra fordul"
#: src/emc/usr_intf/axis/scripts/axis.py:208
+#: src/emc/usr_intf/axis/scripts/axis.py:204
msgid "Turn spindle more slowly"
msgstr "Fő orsó lassítás"
#: src/emc/usr_intf/axis/scripts/axis.py:209
+#: src/emc/usr_intf/axis/scripts/axis.py:205
msgid "Turn spindle more quickly"
msgstr "Fő orsó gyorsítás"
#: src/emc/usr_intf/axis/scripts/axis.py:211
+#: src/emc/usr_intf/axis/scripts/axis.py:207
msgid "Control-K"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:211
+#: src/emc/usr_intf/axis/scripts/axis.py:207
msgid "Clear live plot"
msgstr "Grafikus szimuláció törlése"
#: src/emc/usr_intf/axis/scripts/axis.py:212
+#: src/emc/usr_intf/axis/scripts/axis.py:208
msgid "Cycle among preset views"
msgstr "Ciklus előre beállított nézetek között"
#: src/emc/usr_intf/axis/scripts/axis.py:213
+#: src/emc/usr_intf/axis/scripts/axis.py:209
#, fuzzy
msgid "Cycle among preview, DRO, and user tabs"
msgstr "Ciklus előre beállított nézetek között"
#: src/emc/usr_intf/axis/scripts/axis.py:215
+#: src/emc/usr_intf/axis/scripts/axis.py:211
msgid "Ctrl-Space"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:215
+#: src/emc/usr_intf/axis/scripts/axis.py:211
msgid "Clear notifications"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:836
+#: src/emc/usr_intf/axis/scripts/axis.py:828
#, python-format
msgid "Unknown tool %d"
msgstr "Szerszám %d ismeretlen"
#: src/emc/usr_intf/axis/scripts/axis.py:838
+#: src/emc/usr_intf/axis/scripts/axis.py:830
msgid "No tool"
msgstr "Nincs szerszám"
#: src/emc/usr_intf/axis/scripts/axis.py:840
+#: src/emc/usr_intf/axis/scripts/axis.py:832
#, fuzzy, python-format
msgid "Tool %(tool)d, offset %(zo)g, diameter %(dia)g"
msgstr "Szerszám %d, eltolás %g, atmerő %g"
#: src/emc/usr_intf/axis/scripts/axis.py:842
+#: src/emc/usr_intf/axis/scripts/axis.py:834
#, python-format
msgid "Tool %(tool)d, zo %(zo)g, xo %(xo)g, dia %(dia)g"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1013
+#: src/emc/usr_intf/axis/scripts/axis.py:1005
msgid "Filtering..."
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1073
+#: src/emc/usr_intf/axis/scripts/axis.py:1065
#, fuzzy
msgid "Filter failed"
msgstr "Program_szűrő %r sikertelen"
#: src/emc/usr_intf/axis/scripts/axis.py:1074
+#: src/emc/usr_intf/axis/scripts/axis.py:1066
#, python-format
msgid ""
"The program %(program)r exited with code %(code)d. Any error messages it "
@@ -3751,11 +3854,13 @@ msgid ""
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1139
+#: src/emc/usr_intf/axis/scripts/axis.py:1127
#, python-format
msgid "G-Code error in %s"
msgstr "G-kód hiba %s -ben"
#: src/emc/usr_intf/axis/scripts/axis.py:1140
+#: src/emc/usr_intf/axis/scripts/axis.py:1128
#, fuzzy, python-format
msgid ""
"Near line %(seq)d of %(f)s:\n"
@@ -3767,14 +3872,18 @@ msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1292
#: src/emc/usr_intf/axis/scripts/axis.py:2725 share/axis/tcl/axis.tcl:1092
#: share/axis/tcl/axis.tcl:1094 share/axis/tcl/axis.tcl:2144
+#: src/emc/usr_intf/axis/scripts/axis.py:1279
+#: src/emc/usr_intf/axis/scripts/axis.py:2712
msgid "Continuous"
msgstr "Folytonos"
#: src/emc/usr_intf/axis/scripts/axis.py:1403
+#: src/emc/usr_intf/axis/scripts/axis.py:1390
msgid "Ok"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1546
+#: src/emc/usr_intf/axis/scripts/axis.py:1533
msgid "T Tool Table"
msgstr ""
@@ -3782,114 +3891,142 @@ msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1730
#: src/emc/usr_intf/stepconf/stepconf.py:1691
#: src/emc/usr_intf/stepconf/stepconf.py:2235
+#: src/emc/usr_intf/axis/scripts/axis.py:1544
+#: src/emc/usr_intf/axis/scripts/axis.py:1717
msgid "in"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1560
+#: src/emc/usr_intf/axis/scripts/axis.py:1547
msgid " radius"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1562
+#: src/emc/usr_intf/axis/scripts/axis.py:1549
msgid " diameter"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1563
+#: src/emc/usr_intf/axis/scripts/axis.py:1550
msgid "°"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1572
+#: src/emc/usr_intf/axis/scripts/axis.py:1559
msgid "Coordinate System:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1588
+#: src/emc/usr_intf/axis/scripts/axis.py:1575
msgid "fixture"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1589
+#: src/emc/usr_intf/axis/scripts/axis.py:1576
msgid "workpiece"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1605
+#: src/emc/usr_intf/axis/scripts/axis.py:1592
msgid "Name:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1605
+#: src/emc/usr_intf/axis/scripts/axis.py:1592
#, fuzzy
msgid "Size:"
msgstr "Fő orsó:"
#: src/emc/usr_intf/axis/scripts/axis.py:1606
+#: src/emc/usr_intf/axis/scripts/axis.py:1593
msgid "Tool order:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1606
+#: src/emc/usr_intf/axis/scripts/axis.py:1593
msgid "Rapid distance:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1607
+#: src/emc/usr_intf/axis/scripts/axis.py:1594
msgid "Feed distance:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1607
+#: src/emc/usr_intf/axis/scripts/axis.py:1594
msgid "Total distance:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1608
+#: src/emc/usr_intf/axis/scripts/axis.py:1595
msgid "Run time:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1608
+#: src/emc/usr_intf/axis/scripts/axis.py:1595
msgid "X bounds:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1609
+#: src/emc/usr_intf/axis/scripts/axis.py:1596
msgid "Y bounds:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1609
+#: src/emc/usr_intf/axis/scripts/axis.py:1596
msgid "Z bounds:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1610
+#: src/emc/usr_intf/axis/scripts/axis.py:1597
msgid "A bounds:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1610
+#: src/emc/usr_intf/axis/scripts/axis.py:1597
msgid "B bounds:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1611
+#: src/emc/usr_intf/axis/scripts/axis.py:1598
msgid "C bounds:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1635
+#: src/emc/usr_intf/axis/scripts/axis.py:1622
#, python-format
msgid "Program exceeds machine minimum on axis %s"
msgstr "A program meghaladja a gép minimumat: %s tengelyen"
#: src/emc/usr_intf/axis/scripts/axis.py:1638
+#: src/emc/usr_intf/axis/scripts/axis.py:1625
#, python-format
msgid "Program exceeds machine maximum on axis %s"
msgstr "A program meghaladja a gép maximumat: %s tengelyen"
#: src/emc/usr_intf/axis/scripts/axis.py:1643
+#: src/emc/usr_intf/axis/scripts/axis.py:1630
msgid "Program exceeds machine limits"
msgstr "A program túllép a gép korlátain"
#: src/emc/usr_intf/axis/scripts/axis.py:1646
+#: src/emc/usr_intf/axis/scripts/axis.py:1633
msgid "Run Anyway"
msgstr "Program folytatás"
#: src/emc/usr_intf/axis/scripts/axis.py:1708
+#: src/emc/usr_intf/axis/scripts/axis.py:1695
msgid "No file loaded"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1716
+#: src/emc/usr_intf/axis/scripts/axis.py:1703
#, python-format
msgid "generated from %s"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1722
+#: src/emc/usr_intf/axis/scripts/axis.py:1709
#, python-format
msgid ""
"%(size)s bytes\n"
@@ -3897,92 +4034,113 @@ msgid ""
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1748
+#: src/emc/usr_intf/axis/scripts/axis.py:1735
#, python-format
msgid "%.1f minutes"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1750
+#: src/emc/usr_intf/axis/scripts/axis.py:1737
#, fuzzy, python-format
msgid "%d seconds"
msgstr "2. tengely léptetés"
#: src/emc/usr_intf/axis/scripts/axis.py:1758
+#: src/emc/usr_intf/axis/scripts/axis.py:1745
#, python-format
msgid "%(a)f to %(b)f = %(diff)f %(units)s"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1759
+#: src/emc/usr_intf/axis/scripts/axis.py:1746
#, fuzzy
msgid "G-Code Properties"
msgstr "G-kód hiba %s -ben"
#: src/emc/usr_intf/axis/scripts/axis.py:1883
+#: src/emc/usr_intf/axis/scripts/axis.py:1870
msgid "All machinable files"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1884
#: src/emc/usr_intf/axis/scripts/axis.py:2464
+#: src/emc/usr_intf/axis/scripts/axis.py:1871
+#: src/emc/usr_intf/axis/scripts/axis.py:2451
msgid "rs274ngc files"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:1899
+#: src/emc/usr_intf/axis/scripts/axis.py:1886
msgid "axis cannot accept remote command while running"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2255
+#: src/emc/usr_intf/axis/scripts/axis.py:2242
msgid "Axis is already homed, are you sure you want to re-home?"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2268
+#: src/emc/usr_intf/axis/scripts/axis.py:2255
msgid "This axis is already homed, are you sure you want to re-home?"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2308 share/axis/tcl/axis.tcl:1108
+#: src/emc/usr_intf/axis/scripts/axis.py:2295
msgid "Touch Off"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2309
+#: src/emc/usr_intf/axis/scripts/axis.py:2296
#, python-format
msgid "Enter %s coordinate relative to %%s:"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2476
+#: src/emc/usr_intf/axis/scripts/axis.py:2463
msgid "Error saving file"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2859
#: src/emc/usr_intf/touchy/touchy.glade:577
+#: src/emc/usr_intf/axis/scripts/axis.py:2845
#, fuzzy
msgid "Home All"
msgstr "Nullpont"
#: src/emc/usr_intf/axis/scripts/axis.py:2861
+#: src/emc/usr_intf/axis/scripts/axis.py:2847
msgid "Home all axes [Ctrl-Home]"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2864
+#: src/emc/usr_intf/axis/scripts/axis.py:2850
msgid "Home All Axes"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2871
+#: src/emc/usr_intf/axis/scripts/axis.py:2855
msgid "Unhome All Axes"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2895
+#: src/emc/usr_intf/axis/scripts/axis.py:2879
#, python-format
msgid "Home Axis _%s"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:2897
+#: src/emc/usr_intf/axis/scripts/axis.py:2881
#, python-format
msgid "Unhome Axis _%s"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:3040
+#: src/emc/usr_intf/axis/scripts/axis.py:3024
msgid "Run from here"
msgstr ""
#: src/emc/usr_intf/axis/scripts/axis.py:3335
+#: src/emc/usr_intf/axis/scripts/axis.py:3319
msgid "Error in ~/.axisrc"
msgstr ""
@@ -11877,85 +12035,91 @@ msgid "gtk-cancel"
msgstr "Mégsem"
#: src/emc/task/emctaskmain.cc:467 src/emc/task/emctaskmain.cc:500
+#: src/emc/task/emctaskmain.cc:427 src/emc/task/emctaskmain.cc:460
#, fuzzy, c-format
msgid "%s exceeds +X limit"
msgstr "A program túllép a gép korlátain"
#: src/emc/task/emctaskmain.cc:472 src/emc/task/emctaskmain.cc:505
+#: src/emc/task/emctaskmain.cc:432 src/emc/task/emctaskmain.cc:465
#, fuzzy, c-format
msgid "%s exceeds +Y limit"
msgstr "A program túllép a gép korlátain"
#: src/emc/task/emctaskmain.cc:477 src/emc/task/emctaskmain.cc:510
+#: src/emc/task/emctaskmain.cc:437 src/emc/task/emctaskmain.cc:470
#, fuzzy, c-format
msgid "%s exceeds +Z limit"
msgstr "A program túllép a gép korlátain"
#: src/emc/task/emctaskmain.cc:482 src/emc/task/emctaskmain.cc:515
+#: src/emc/task/emctaskmain.cc:442 src/emc/task/emctaskmain.cc:475
#, fuzzy, c-format
msgid "%s exceeds -X limit"
msgstr "A program túllép a gép korlátain"
#: src/emc/task/emctaskmain.cc:487 src/emc/task/emctaskmain.cc:520
+#: src/emc/task/emctaskmain.cc:447 src/emc/task/emctaskmain.cc:480
#, fuzzy, c-format
msgid "%s exceeds -Y limit"
msgstr "A program túllép a gép korlátain"
#: src/emc/task/emctaskmain.cc:492 src/emc/task/emctaskmain.cc:525
+#: src/emc/task/emctaskmain.cc:452 src/emc/task/emctaskmain.cc:485
#, fuzzy, c-format
msgid "%s exceeds -Z limit"
msgstr "A program túllép a gép korlátain"
-#: src/emc/task/emctaskmain.cc:853
+#: src/emc/task/emctaskmain.cc:853 src/emc/task/emctaskmain.cc:810
#, c-format
msgid ""
"command (%s) cannot be executed until the machine is out of E-stop and "
"turned on"
msgstr ""
-#: src/emc/task/emctaskmain.cc:973
+#: src/emc/task/emctaskmain.cc:973 src/emc/task/emctaskmain.cc:930
#, c-format
msgid "can't do that (%s) in manual mode"
msgstr ""
-#: src/emc/task/emctaskmain.cc:1072
+#: src/emc/task/emctaskmain.cc:1072 src/emc/task/emctaskmain.cc:1027
#, c-format
msgid "can't do that (%s) in auto mode with the interpreter idle"
msgstr ""
-#: src/emc/task/emctaskmain.cc:1132
+#: src/emc/task/emctaskmain.cc:1132 src/emc/task/emctaskmain.cc:1087
#, c-format
msgid "can't do that (%s) in auto mode with the interpreter reading"
msgstr ""
-#: src/emc/task/emctaskmain.cc:1216
+#: src/emc/task/emctaskmain.cc:1216 src/emc/task/emctaskmain.cc:1169
#, c-format
msgid "can't do that (%s) in auto mode with the interpreter paused"
msgstr ""
-#: src/emc/task/emctaskmain.cc:1278
+#: src/emc/task/emctaskmain.cc:1278 src/emc/task/emctaskmain.cc:1231
#, c-format
msgid "can't do that (%s) in auto mode with the interpreter waiting"
msgstr ""
-#: src/emc/task/emctaskmain.cc:1370
+#: src/emc/task/emctaskmain.cc:1370 src/emc/task/emctaskmain.cc:1321
#, c-format
msgid "can't do that (%s) in MDI mode"
msgstr ""
-#: src/emc/task/emctaskmain.cc:2015
+#: src/emc/task/emctaskmain.cc:2015 src/emc/task/emctaskmain.cc:1943
msgid "Can't switch mode while mode is AUTO and interpreter is not IDLE"
msgstr ""
-#: src/emc/task/emctaskmain.cc:2084
+#: src/emc/task/emctaskmain.cc:2084 src/emc/task/emctaskmain.cc:2012
msgid "Can't issue MDI command when not homed"
msgstr ""
-#: src/emc/task/emctaskmain.cc:2089
+#: src/emc/task/emctaskmain.cc:2089 src/emc/task/emctaskmain.cc:2017
msgid "Must be in MDI mode to issue MDI command"
msgstr ""
-#: src/emc/task/emctaskmain.cc:2151
+#: src/emc/task/emctaskmain.cc:2151 src/emc/task/emctaskmain.cc:2078
msgid "Can't run a program when not homed"
msgstr ""
@@ -11971,61 +12135,61 @@ msgid ""
"rel_err=%.4f%%"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:90
+#: src/emc/rs274ngc/interp_check.cc:90 src/emc/rs274ngc/interp_check.cc:89
msgid "G4 not allowed with G2 or G3 because they both use P"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:93
+#: src/emc/rs274ngc/interp_check.cc:93 src/emc/rs274ngc/interp_check.cc:92
msgid "Line with G10 does not have L1, L10, L11, L2, or L20"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:94
+#: src/emc/rs274ngc/interp_check.cc:94 src/emc/rs274ngc/interp_check.cc:93
msgid "P value not an integer with G10"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:95
+#: src/emc/rs274ngc/interp_check.cc:95 src/emc/rs274ngc/interp_check.cc:94
msgid "P value out of range (0-9) with G10 L2 or L20"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:96
+#: src/emc/rs274ngc/interp_check.cc:96 src/emc/rs274ngc/interp_check.cc:95
msgid "P value out of range with G10 L1 or G10 L10"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:100
+#: src/emc/rs274ngc/interp_check.cc:100 src/emc/rs274ngc/interp_check.cc:99
msgid "Between G5.2 and G5.3 codes, only additional G5.2 codes are allowed."
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:258
+#: src/emc/rs274ngc/interp_check.cc:258 src/emc/rs274ngc/interp_check.cc:248
msgid "D word with no G41, G41.1, G42, G42.1, or G96 to use it"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:264
+#: src/emc/rs274ngc/interp_check.cc:264 src/emc/rs274ngc/interp_check.cc:254
msgid "E word with no G76, M66, M67 or M68 to use it"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:269
+#: src/emc/rs274ngc/interp_check.cc:269 src/emc/rs274ngc/interp_check.cc:259
msgid "H word with no G43 or G76 to use it"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:275
+#: src/emc/rs274ngc/interp_check.cc:275 src/emc/rs274ngc/interp_check.cc:265
msgid "I word with no G2, G3, G5, G5.1, G10, G76, or G87 to use it"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:281
+#: src/emc/rs274ngc/interp_check.cc:281 src/emc/rs274ngc/interp_check.cc:271
msgid "J word with no G2, G3, G5, G5.1, G10, G76 or G87 to use it"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:287
+#: src/emc/rs274ngc/interp_check.cc:287 src/emc/rs274ngc/interp_check.cc:277
msgid "K word with no G2, G3, G33, G33.1, G76, or G87 to use it"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:297
+#: src/emc/rs274ngc/interp_check.cc:297 src/emc/rs274ngc/interp_check.cc:287
msgid ""
"L word with no G10, cutter compensation, canned cycle, digital/analog input, "
"or NURBS code"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:309
+#: src/emc/rs274ngc/interp_check.cc:309 src/emc/rs274ngc/interp_check.cc:299
msgid ""
"P word with no G2 G3 G4 G10 G64 G5 G5.2 G76 G82 G86 G88 G89 or M50 M51 M52 "
"M53 M62 M63 M64 M65 M66 or user M code to use it"
@@ -12039,7 +12203,7 @@ msgstr ""
msgid "P value must be 0,1,or 2 with M19"
msgstr ""
-#: src/emc/rs274ngc/interp_check.cc:318
+#: src/emc/rs274ngc/interp_check.cc:318 src/emc/rs274ngc/interp_check.cc:304
msgid "P value should be 1 or greater with G2 or G3"
msgstr ""
@@ -12116,6 +12280,7 @@ msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:382
#: src/emc/rs274ngc/interp_convert.cc:4266
+#: src/emc/rs274ngc/interp_convert.cc:3909
msgid "Cannot feed with zero spindle speed in feed per rev mode"
msgstr ""
@@ -12136,6 +12301,7 @@ msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:868
#: src/emc/rs274ngc/interp_convert.cc:878 src/emc/rs274ngc/interp_queue.cc:592
+#: src/emc/rs274ngc/interp_queue.cc:541
msgid ""
"Arc move in concave corner cannot be reached by the tool without gouging"
msgstr ""
@@ -12156,39 +12322,49 @@ msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3733
#: src/emc/rs274ngc/interp_convert.cc:3736
#: src/emc/rs274ngc/interp_convert.cc:3739 src/emc/rs274ngc/interp_find.cc:97
+#: src/emc/rs274ngc/interp_convert.cc:3376
+#: src/emc/rs274ngc/interp_convert.cc:3379
+#: src/emc/rs274ngc/interp_convert.cc:3382
#, c-format
msgid "Invalid absolute position %5.2f for wrapped rotary axis %c"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:1494
+#: src/emc/rs274ngc/interp_convert.cc:1466
msgid "Cannot change control mode with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:1607
+#: src/emc/rs274ngc/interp_convert.cc:1579
msgid "Cannot change coordinate systems with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:1851
+#: src/emc/rs274ngc/interp_convert.cc:1823
#, c-format
msgid "G%d.1 with no D word"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:1854
+#: src/emc/rs274ngc/interp_convert.cc:1826
#, c-format
msgid "G%d.1 with L word, but plane is not G18"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:1865
+#: src/emc/rs274ngc/interp_convert.cc:1837
#, c-format
msgid "G%d requires D word to be a whole number"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:1872
+#: src/emc/rs274ngc/interp_convert.cc:1844
#, c-format
msgid "G%d with lathe tool, but plane is not G18"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2271
+#: src/emc/rs274ngc/interp_convert.cc:2228
msgid "Cannot set reference point with cutter compensation in effect"
msgstr ""
@@ -12219,59 +12395,74 @@ msgid "M7x: restore_settings failed executing: '%s': %s"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2885
+#: src/emc/rs274ngc/interp_convert.cc:2628
msgid "Cannot set motion output with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2886
+#: src/emc/rs274ngc/interp_convert.cc:2629
msgid "No valid P word with M62"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2890
+#: src/emc/rs274ngc/interp_convert.cc:2633
msgid "Cannot set motion digital output with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2891
+#: src/emc/rs274ngc/interp_convert.cc:2634
msgid "No valid P word with M63"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2895
#: src/emc/rs274ngc/interp_convert.cc:2900
+#: src/emc/rs274ngc/interp_convert.cc:2638
+#: src/emc/rs274ngc/interp_convert.cc:2643
msgid "Cannot set auxiliary digital output with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2896
+#: src/emc/rs274ngc/interp_convert.cc:2639
msgid "No valid P word with M64"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2901
+#: src/emc/rs274ngc/interp_convert.cc:2644
msgid "No valid P word with M65"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2931
+#: src/emc/rs274ngc/interp_convert.cc:2673
msgid "invalid P-word with M66"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2946
+#: src/emc/rs274ngc/interp_convert.cc:2688
msgid "Cannot wait for digital input with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2958
+#: src/emc/rs274ngc/interp_convert.cc:2700
msgid "Cannot wait for analog input with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2973
+#: src/emc/rs274ngc/interp_convert.cc:2714
msgid "Cannot set motion analog output with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2974
+#: src/emc/rs274ngc/interp_convert.cc:2715
msgid "Invalid analog index with M67"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2980
+#: src/emc/rs274ngc/interp_convert.cc:2721
msgid "Cannot set auxiliary analog output with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:2981
+#: src/emc/rs274ngc/interp_convert.cc:2722
msgid "Invalid analog index with M68"
msgstr ""
@@ -12292,6 +12483,11 @@ msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3188
#: src/emc/rs274ngc/interp_convert.cc:3202
#: src/emc/rs274ngc/interp_convert.cc:3216
+#: src/emc/rs274ngc/interp_convert.cc:2806
+#: src/emc/rs274ngc/interp_convert.cc:2823
+#: src/emc/rs274ngc/interp_convert.cc:2837
+#: src/emc/rs274ngc/interp_convert.cc:2851
+#: src/emc/rs274ngc/interp_convert.cc:2865
msgid "Cannot enable overrides with cutter radius compensation on"
msgstr ""
@@ -12300,12 +12496,20 @@ msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3193
#: src/emc/rs274ngc/interp_convert.cc:3207
#: src/emc/rs274ngc/interp_convert.cc:3221
+#: src/emc/rs274ngc/interp_convert.cc:2813
+#: src/emc/rs274ngc/interp_convert.cc:2828
+#: src/emc/rs274ngc/interp_convert.cc:2842
+#: src/emc/rs274ngc/interp_convert.cc:2856
+#: src/emc/rs274ngc/interp_convert.cc:2870
msgid "Cannot disable overrides with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3325
#: src/emc/rs274ngc/interp_convert.cc:3326
#: src/emc/rs274ngc/interp_convert.cc:3327
+#: src/emc/rs274ngc/interp_convert.cc:2970
+#: src/emc/rs274ngc/interp_convert.cc:2971
+#: src/emc/rs274ngc/interp_convert.cc:2972
#, c-format
msgid "Indexing axis %c can only be moved with G0"
msgstr ""
@@ -12313,122 +12517,147 @@ msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3334
#: src/emc/rs274ngc/interp_convert.cc:3336
#: src/emc/rs274ngc/interp_convert.cc:3338
+#: src/emc/rs274ngc/interp_convert.cc:2979
+#: src/emc/rs274ngc/interp_convert.cc:2981
+#: src/emc/rs274ngc/interp_convert.cc:2983
#, c-format
msgid "Indexing axis %c can only be moved alone"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3433
+#: src/emc/rs274ngc/interp_convert.cc:3076
msgid "Cannot probe with feed per rev mode"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3481
+#: src/emc/rs274ngc/interp_convert.cc:3124
msgid "Cannot change retract mode with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3515
+#: src/emc/rs274ngc/interp_convert.cc:3158
msgid "G10 L1 without offsets has no effect"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3621
+#: src/emc/rs274ngc/interp_convert.cc:3264
msgid "Q number in G10 is not an integer"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3622
+#: src/emc/rs274ngc/interp_convert.cc:3265
msgid "Invalid tool orientation"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3721
+#: src/emc/rs274ngc/interp_convert.cc:3364
msgid "I J words not allowed with G10 L2"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3742
+#: src/emc/rs274ngc/interp_convert.cc:3385
msgid ""
"Cannot change the active coordinate system with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:3750
+#: src/emc/rs274ngc/interp_convert.cc:3393
msgid "R not allowed in G10 L20"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4323
+#: src/emc/rs274ngc/interp_convert.cc:3966
msgid "Spindle not turning in G33"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4333
+#: src/emc/rs274ngc/interp_convert.cc:3976
msgid "Spindle not turning in G33.1"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4376
+#: src/emc/rs274ngc/interp_convert.cc:4019
msgid "BUG: An axis incorrectly moved along with an indexer"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4389
+#: src/emc/rs274ngc/interp_convert.cc:4032
msgid "BUG: trying to index incorrect axis"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4481
+#: src/emc/rs274ngc/interp_convert.cc:4124
msgid "Cannot use G76 threading cycle with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4484
+#: src/emc/rs274ngc/interp_convert.cc:4127
msgid "In G76, I must not be 0"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4486
+#: src/emc/rs274ngc/interp_convert.cc:4129
msgid "In G76, J must be greater than 0"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4488
+#: src/emc/rs274ngc/interp_convert.cc:4131
msgid "In G76, K must be greater than J"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4631
+#: src/emc/rs274ngc/interp_convert.cc:4274
msgid ""
"Length of cutter compensation entry move is not greater than the tool radius"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4850
+#: src/emc/rs274ngc/interp_convert.cc:4493
msgid "Zero degree inside corner is invalid for cutter compensation"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4888
#: src/emc/rs274ngc/interp_convert.cc:4896
+#: src/emc/rs274ngc/interp_convert.cc:4531
+#: src/emc/rs274ngc/interp_convert.cc:4539
msgid ""
"Arc to straight motion makes a corner the compensated tool can't fit in "
"without gouging"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:4980
+#: src/emc/rs274ngc/interp_convert.cc:4623
msgid "Cannot change tools with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/interp_convert.cc:5101
+#: src/emc/rs274ngc/interp_convert.cc:4743
msgid "Cannot change tool offset with cutter radius compensation on"
msgstr ""
-#: src/emc/rs274ngc/interp_queue.cc:590
+#: src/emc/rs274ngc/interp_queue.cc:590 src/emc/rs274ngc/interp_queue.cc:539
#, c-format
msgid ""
"BUG: cutter compensation has generated an invalid arc with mismatched radii "
"r1 %f r2 %f\n"
msgstr ""
-#: src/emc/rs274ngc/interp_queue.cc:612
+#: src/emc/rs274ngc/interp_queue.cc:612 src/emc/rs274ngc/interp_queue.cc:561
msgid "BUG: Unsupported plane in cutter compensation"
msgstr ""
-#: src/emc/rs274ngc/interp_queue.cc:622
+#: src/emc/rs274ngc/interp_queue.cc:622 src/emc/rs274ngc/interp_queue.cc:571
msgid ""
"Straight traverse in concave corner cannot be reached by the tool without "
"gouging"
msgstr ""
-#: src/emc/rs274ngc/interp_queue.cc:650
+#: src/emc/rs274ngc/interp_queue.cc:650 src/emc/rs274ngc/interp_queue.cc:599
#, c-format
msgid "BUG: Unsupported plane [%d] in cutter compensation"
msgstr ""
-#: src/emc/rs274ngc/interp_queue.cc:661
+#: src/emc/rs274ngc/interp_queue.cc:661 src/emc/rs274ngc/interp_queue.cc:610
msgid ""
"Straight feed in concave corner cannot be reached by the tool without gouging"
msgstr ""
@@ -12450,22 +12679,27 @@ msgid "G17 canned cycle is not possible on a machine without Z axis"
msgstr ""
#: src/emc/rs274ngc/interp_cycles.cc:1004
+#: src/emc/rs274ngc/interp_cycles.cc:1001
msgid "G17.1 canned cycle is not possible on a machine without W axis"
msgstr ""
#: src/emc/rs274ngc/interp_cycles.cc:1220
+#: src/emc/rs274ngc/interp_cycles.cc:1217
msgid "G19 canned cycle is not possible on a machine without X axis"
msgstr ""
#: src/emc/rs274ngc/interp_cycles.cc:1388
+#: src/emc/rs274ngc/interp_cycles.cc:1385
msgid "G19.1 canned cycle is not possible on a machine without U axis"
msgstr ""
#: src/emc/rs274ngc/interp_cycles.cc:1613
+#: src/emc/rs274ngc/interp_cycles.cc:1610
msgid "G18 canned cycle is not possible on a machine without Y axis"
msgstr ""
#: src/emc/rs274ngc/interp_cycles.cc:1780
+#: src/emc/rs274ngc/interp_cycles.cc:1777
msgid "G18.1 canned cycle is not possible on a machine without V axis"
msgstr ""
@@ -12498,106 +12732,115 @@ msgid "Requested tool %d not found in the tool table"
msgstr ""
#: src/emc/rs274ngc/interp_internal.cc:154
+#: src/emc/rs274ngc/interp_internal.cc:151
msgid "Cannot use polar coordinate on a machine lacking X or Y axes"
msgstr ""
#: src/emc/rs274ngc/interp_internal.cc:155
+#: src/emc/rs274ngc/interp_internal.cc:152
msgid "Cannot use polar coordinate except in G17 plane"
msgstr ""
#: src/emc/rs274ngc/interp_internal.cc:156
+#: src/emc/rs274ngc/interp_internal.cc:153
msgid "Cannot specify both polar coordinate and X word"
msgstr ""
#: src/emc/rs274ngc/interp_internal.cc:157
+#: src/emc/rs274ngc/interp_internal.cc:154
msgid "Cannot specify both polar coordinate and Y word"
msgstr ""
#: src/emc/rs274ngc/interp_internal.cc:178
#: src/emc/rs274ngc/interp_internal.cc:190
#: src/emc/rs274ngc/interp_internal.cc:203
+#: src/emc/rs274ngc/interp_internal.cc:175
+#: src/emc/rs274ngc/interp_internal.cc:187
+#: src/emc/rs274ngc/interp_internal.cc:200
msgid "Polar coordinates can only be used for motion"
msgstr ""
#: src/emc/rs274ngc/interp_read.cc:1143 src/emc/rs274ngc/interp_read.cc:1147
+#: src/emc/rs274ngc/interp_read.cc:1112 src/emc/rs274ngc/interp_read.cc:1116
#, c-format
msgid "Bad character '\\%03o' used"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1147
+#: src/emc/rs274ngc/interp_read.cc:1147 src/emc/rs274ngc/interp_read.cc:1116
#, c-format
msgid "Bad character '%c' used"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1671
+#: src/emc/rs274ngc/interp_read.cc:1671 src/emc/rs274ngc/interp_read.cc:1623
msgid "Left bracket missing after 'while'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1686
+#: src/emc/rs274ngc/interp_read.cc:1686 src/emc/rs274ngc/interp_read.cc:1638
msgid "Left bracket missing after 'repeat'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1701
+#: src/emc/rs274ngc/interp_read.cc:1701 src/emc/rs274ngc/interp_read.cc:1653
msgid "Left bracket missing after 'if'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1716
+#: src/emc/rs274ngc/interp_read.cc:1716 src/emc/rs274ngc/interp_read.cc:1668
msgid "Left bracket missing after 'elseif'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1919
+#: src/emc/rs274ngc/interp_read.cc:1919 src/emc/rs274ngc/interp_read.cc:2174
msgid "Cannot read current position with cutter radius compensation on"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1934
+#: src/emc/rs274ngc/interp_read.cc:1934 src/emc/rs274ngc/interp_read.cc:2189
msgid "Expected # reading parameter"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:1936
+#: src/emc/rs274ngc/interp_read.cc:1936 src/emc/rs274ngc/interp_read.cc:2191
msgid "Expected ] reading bracketed parameter"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:2608
+#: src/emc/rs274ngc/interp_read.cc:2608 src/emc/rs274ngc/interp_read.cc:2881
#, c-format
msgid "bad number format (conversion failed) parsing '%s'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:2609
+#: src/emc/rs274ngc/interp_read.cc:2609 src/emc/rs274ngc/interp_read.cc:2882
#, c-format
msgid "bad number format (trailing characters) parsing '%s'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:2699
+#: src/emc/rs274ngc/interp_read.cc:2699 src/emc/rs274ngc/interp_read.cc:2972
msgid "Calculation resulted in 'not a number'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:2701
+#: src/emc/rs274ngc/interp_read.cc:2701 src/emc/rs274ngc/interp_read.cc:2974
msgid "Calculation resulted in 'infinity'"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:2994
+#: src/emc/rs274ngc/interp_read.cc:2994 src/emc/rs274ngc/interp_read.cc:3268
#, c-format
msgid "EOF in file:%s seeking o-word: o<%s> from line: %d"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:3106
+#: src/emc/rs274ngc/interp_read.cc:3106 src/emc/rs274ngc/interp_read.cc:3391
msgid "Multiple U words on one line"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:3122
+#: src/emc/rs274ngc/interp_read.cc:3122 src/emc/rs274ngc/interp_read.cc:3407
msgid "Multiple V words on one line"
msgstr ""
-#: src/emc/rs274ngc/interp_read.cc:3138
+#: src/emc/rs274ngc/interp_read.cc:3138 src/emc/rs274ngc/interp_read.cc:3423
msgid "Multiple W words on one line"
msgstr ""
-#: src/emc/rs274ngc/interp_o_word.cc:95
+#: src/emc/rs274ngc/interp_o_word.cc:95 src/emc/rs274ngc/interp_o_word.cc:104
#, c-format
msgid "File:%s line:%d redefining sub: o|%s| already defined in file:%s"
msgstr ""
#: src/emc/rs274ngc/interp_namedparams.cc:161
+#: src/emc/rs274ngc/interp_read.cc:2093
#, c-format
msgid "Named parameter #<%s> not defined"
msgstr ""
@@ -12623,6 +12866,7 @@ msgid "fetch_hal_param: hal_ready(): %d"
msgstr ""
#: src/emc/rs274ngc/interp_namedparams.cc:370
+#: src/emc/rs274ngc/interp_read.cc:1889 src/emc/rs274ngc/interp_read.cc:1932
#, c-format
msgid "Internal error: Could not assign #<%s>"
msgstr ""
@@ -12638,10 +12882,11 @@ msgid "BUG: lookup_named_param(%s): unhandled index=%fn"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_pre.cc:1269 src/emc/rs274ngc/rs274ngc_pre.cc:1344
+#: src/emc/rs274ngc/rs274ngc_pre.cc:897
msgid "Queue is not empty after tool change"
msgstr ""
-#: src/emc/rs274ngc/rs274ngc_pre.cc:1648
+#: src/emc/rs274ngc/rs274ngc_pre.cc:1648 src/emc/rs274ngc/rs274ngc_pre.cc:1145
#, c-format
msgid "Unable to open parameter file: '%s'"
msgstr ""
@@ -13313,123 +13558,153 @@ msgid "Bug: call stack underrun"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:170
+#: src/emc/rs274ngc/rs274ngc_return.hh:169
msgid "Unknown control command in o word"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:171
+#: src/emc/rs274ngc/rs274ngc_return.hh:170
msgid "Too many oword labels"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:172
+#: src/emc/rs274ngc/rs274ngc_return.hh:171
#, fuzzy
msgid "Unknown oword number"
msgstr "Szerszám %d ismeretlen"
#: src/emc/rs274ngc/rs274ngc_return.hh:173
+#: src/emc/rs274ngc/rs274ngc_return.hh:172
msgid "Nested subroutine definition"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:174
+#: src/emc/rs274ngc/rs274ngc_return.hh:173
msgid "Not in subroutine definition"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:175
+#: src/emc/rs274ngc/rs274ngc_return.hh:174
msgid "File not open"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:176
+#: src/emc/rs274ngc/rs274ngc_return.hh:175
msgid "Need tool prepared -Txx- for toolchange"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:177
+#: src/emc/rs274ngc/rs274ngc_return.hh:176
msgid "Cannot change planes with cutter radius compensation on"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:178
+#: src/emc/rs274ngc/rs274ngc_return.hh:177
msgid "Cutter radius compensation allowed only in XY, XZ planes"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:179
+#: src/emc/rs274ngc/rs274ngc_return.hh:178
msgid "P word missing with G76"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:180
+#: src/emc/rs274ngc/rs274ngc_return.hh:179
msgid "I J or K words missing with G76"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:181
+#: src/emc/rs274ngc/rs274ngc_return.hh:180
msgid "Cannot move rotary axes with G76"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:182
+#: src/emc/rs274ngc/rs274ngc_return.hh:181
msgid "Multiple e words on one line"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:183
+#: src/emc/rs274ngc/rs274ngc_return.hh:182
msgid "Named parameter not terminated"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:184
+#: src/emc/rs274ngc/rs274ngc_return.hh:183
msgid "Out of memory"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:185
+#: src/emc/rs274ngc/rs274ngc_return.hh:184
msgid "S word missing with G96"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:186
+#: src/emc/rs274ngc/rs274ngc_return.hh:185
msgid "Queue is not empty after external input"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:187
+#: src/emc/rs274ngc/rs274ngc_return.hh:186
msgid "Can't select analog input with wait type != immediate return"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:188
+#: src/emc/rs274ngc/rs274ngc_return.hh:187
msgid "Zero timeout with wait type != immediate return"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:189
+#: src/emc/rs274ngc/rs274ngc_return.hh:188
msgid "Invalid to select both a digital and an analog input with M66"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:190
+#: src/emc/rs274ngc/rs274ngc_return.hh:189
msgid "Need to have either a valid P or a valid E word with M66"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:191
+#: src/emc/rs274ngc/rs274ngc_return.hh:190
msgid "Q word missing with g73"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:192
+#: src/emc/rs274ngc/rs274ngc_return.hh:191
msgid "Digital input selected out of bounds"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:193
+#: src/emc/rs274ngc/rs274ngc_return.hh:192
msgid "Analog input selected out of bounds"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:194
+#: src/emc/rs274ngc/rs274ngc_return.hh:193
msgid "W value unspecified in UV plane canned cycle"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:195
+#: src/emc/rs274ngc/rs274ngc_return.hh:194
msgid "U value unspecified in VW plane canned cycle"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:196
+#: src/emc/rs274ngc/rs274ngc_return.hh:195
msgid "V value unspecified in UW plane canned cycle"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:197
+#: src/emc/rs274ngc/rs274ngc_return.hh:196
msgid "R less than W in cycle in UV plane"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:198
+#: src/emc/rs274ngc/rs274ngc_return.hh:197
msgid "R less than U in cycle in VW plane"
msgstr ""
#: src/emc/rs274ngc/rs274ngc_return.hh:199
+#: src/emc/rs274ngc/rs274ngc_return.hh:198
msgid "R less than V in cycle in UW plane"
msgstr ""
@@ -13455,6 +13730,30 @@ msgstr ""
"\n"
"Szívesen látunk az AXIS web oldalán: "
+#: src/emc/rs274ngc/interp_check.cc:302
+msgid "P value not an integer with G2 or G3"
+msgstr ""
+
+#: src/emc/rs274ngc/interp_check.cc:311
+msgid ""
+"Q word with no G5, G10, G64, G73, G76, G83, M66, M67, M68 or user M code "
+"that uses it"
+msgstr ""
+
+#: src/emc/rs274ngc/interp_convert.cc:2733
+msgid "Need positive Q-word to specify tool number with M61"
+msgstr ""
+
+#: src/emc/rs274ngc/interp_read.cc:1858
+#, c-format
+msgid "Cannot change #<%s>"
+msgstr ""
+
+#: src/emc/rs274ngc/interp_read.cc:1906
+#, c-format
+msgid "init_named_parameter must be global #<%s>"
+msgstr ""
+
#, fuzzy
#~ msgid "to"
#~ msgstr "Stop"
diff --git a/src/po/zh_HK.po b/src/po/zh_HK.po
index 105c7d0c8..105839692 100644
--- a/src/po/zh_HK.po
+++ b/src/po/zh_HK.po
@@ -67,7 +67,6 @@ msgid "_Close"
msgstr " 關閉(_C) "
#: src/hal/utils/scope.c:126
-#, fuzzy
msgid ""
"Usage:\n"
" halscope [-h] [-i infile] [-o outfile] [num_samples]\n"
@@ -554,7 +553,7 @@ msgid "Unexpected realtime delay: check dmesg for details."
msgstr "意外的實時延遲:檢查 dmesg 的詳細信息."
#: src/emc/motion/control.c:263
-#, fuzzy, c-format
+#, c-format
msgid ""
"\n"
"In recent history there were\n"
@@ -790,15 +789,15 @@ msgstr "在坐標模式做剛性攻絲移動,需要啟動指令"
#: src/emc/motion/command.c:1410
msgid "can't do rigid tap move with limits exceeded"
-msgstr ""
+msgstr "不能做剛性攻絲移動當超過極限"
#: src/emc/motion/command.c:1421
msgid "can't add rigid tap move"
-msgstr ""
+msgstr "不能添加剛性攻絲移動"
#: src/emc/motion/command.c:1435
msgid "need to be enabled, in teleop mode for teleop move"
-msgstr ""
+msgstr "需要激活遠程操作模式,才可作遠程運移動"
#: src/emc/motion/command.c:1556 src/emc/motion/command.c:1605
#, c-format
@@ -810,10 +809,10 @@ msgstr "joint %d: 太多的補償條目"
msgid "joint %d: compensation values must increase"
msgstr "joint %d: 補償值必須增加"
-#: src/emc/motion/command.c:1591 src/emc/motion/command.c:1640
+#: src/emc/motion/command.c:1591
#, c-format
msgid "unrecognized command %d"
-msgstr ""
+msgstr "無法識別的命令 %d"
#: src/emc/motion/motion.c:185
msgid "MOTION: hal_init() failed\n"
@@ -873,21 +872,21 @@ msgstr ""
#: src/emc/motion/homing.c:80 src/emc/motion/homing.c:748
#, c-format
msgid "hit limit in home state %d"
-msgstr ""
+msgstr "在歸零狀態,碰到極限 %d"
#: src/emc/motion/homing.c:90
#, c-format
msgid "end of move in home state %d"
-msgstr ""
+msgstr "在歸零狀態,移動完結 %d"
#: src/emc/motion/homing.c:185
#, c-format
msgid "unknown state '%d' during homing sequence"
-msgstr ""
+msgstr "在歸零程序時,不明的狀態 '%d'"
#: src/emc/motion/homing.c:246
msgid "Cannot home while shared home switch is closed"
-msgstr ""
+msgstr "當共享零開關閉上時,不能歸零"
#: src/emc/motion/homing.c:290
msgid ""
@@ -4902,8 +4901,8 @@ msgstr ""
msgid ""
"LinuxCNC/AXIS version $version\n"
"\n"
-"Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Jeff Epler and Chris "
-"Radek.\n"
+"Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Jeff "
+"Epler and Chris Radek.\n"
"\n"
"This is free software, and you are welcome to redistribute it under certain "
"conditions. See the file COPYING, included with LinuxCNC.\n"
@@ -12039,8 +12038,8 @@ msgstr "不能使用 G5.3沒有 G5.2先行"
#: src/emc/rs274ngc/interp_convert.cc:183
#, c-format
msgid ""
-"You must specify a number of control points at least equal to the order L = "
-"%d"
+"You must specify a number of control points at least equal to the order L = %"
+"d"
msgstr "您必須指定一個數字控制點至少等於順序L =%d"
#: src/emc/rs274ngc/interp_convert.cc:212
@@ -13544,6 +13543,19 @@ msgstr ""
msgid "Bug: call stack underrun"
msgstr ""
+#: share/axis/tcl/axis.tcl:1711
+msgid ""
+"LinuxCNC/AXIS version $version\n"
+"\n"
+"Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Jeff Epler and Chris "
+"Radek.\n"
+"\n"
+"This is free software, and you are welcome to redistribute it under certain "
+"conditions. See the file COPYING, included with LinuxCNC.\n"
+"\n"
+"Visit the LinuxCNC web site: "
+msgstr ""
+
#~ msgid "About TkEmc"
#~ msgstr "關於 TkEmc"
diff --git a/tests/linuxcncrsh/skip b/tests/linuxcncrsh/skip
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/linuxcncrsh/skip
diff --git a/tests/t0/nonrandom/skip b/tests/t0/nonrandom/skip
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/t0/nonrandom/skip
diff --git a/tests/t0/random-with-t0/skip b/tests/t0/random-with-t0/skip
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/t0/random-with-t0/skip
diff --git a/tests/t0/random-without-t0/skip b/tests/t0/random-without-t0/skip
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/t0/random-without-t0/skip
diff --git a/tests/toolchanger/.gitignore b/tests/toolchanger/.gitignore
new file mode 100644
index 000000000..b39ac728b
--- /dev/null
+++ b/tests/toolchanger/.gitignore
@@ -0,0 +1,5 @@
+sim.var
+sim.var.bak
+simpockets.tbl
+stdout
+gcode-output
diff --git a/tests/toolchanger/README b/tests/toolchanger/README
new file mode 100644
index 000000000..40e6282cc
--- /dev/null
+++ b/tests/toolchanger/README
@@ -0,0 +1,14 @@
+
+The tests in this directory attempt to verify the correct behavior of
+the tool table and the tool changer.
+
+Two tests are run: one on a random toolchanger and one on a nonrandom
+toolchanger. Both tests perform the same operations, and expect (nearly)
+the same results.
+
+A full LinuxCNC instance is started, with linuxcncrsh as the UI. A bunch
+of gcode commands are run via MDI, and the internal state of LinuxCNC
+is accessed via numbered parameters. A custom M-code shell script is
+used to write these parameter values to a file, which is then compared
+to a hand-crafted "expected values" file.
+
diff --git a/tests/toolchanger/core_sim.hal b/tests/toolchanger/core_sim.hal
new file mode 100644
index 000000000..e5db5f3b3
--- /dev/null
+++ b/tests/toolchanger/core_sim.hal
@@ -0,0 +1,53 @@
+# core HAL config file for simulation
+
+# first load all the RT modules that will be needed
+# kinematics
+loadrt trivkins
+# motion controller, get name and thread periods from ini file
+loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
+# load 6 differentiators (for velocity and accel signals
+loadrt ddt count=6
+# load additional blocks
+loadrt hypot count=2
+loadrt comp count=3
+loadrt or2 count=1
+
+# add motion controller functions to servo thread
+addf motion-command-handler servo-thread
+addf motion-controller servo-thread
+# link the differentiator functions into the code
+addf ddt.0 servo-thread
+addf ddt.1 servo-thread
+addf ddt.2 servo-thread
+addf ddt.3 servo-thread
+addf ddt.4 servo-thread
+addf ddt.5 servo-thread
+addf hypot.0 servo-thread
+addf hypot.1 servo-thread
+
+# create HAL signals for position commands from motion module
+# loop position commands back to motion module feedback
+net Xpos axis.0.motor-pos-cmd => axis.0.motor-pos-fb ddt.0.in
+net Ypos axis.1.motor-pos-cmd => axis.1.motor-pos-fb ddt.2.in
+net Zpos axis.2.motor-pos-cmd => axis.2.motor-pos-fb ddt.4.in
+
+# send the position commands thru differentiators to
+# generate velocity and accel signals
+net Xvel ddt.0.out => ddt.1.in hypot.0.in0
+net Xacc <= ddt.1.out
+net Yvel ddt.2.out => ddt.3.in hypot.0.in1
+net Yacc <= ddt.3.out
+net Zvel ddt.4.out => ddt.5.in hypot.1.in0
+net Zacc <= ddt.5.out
+
+# Cartesian 2- and 3-axis velocities
+net XYvel hypot.0.out => hypot.1.in1
+net XYZvel <= hypot.1.out
+
+# estop loopback
+net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in
+
+# create signals for tool loading loopback
+net tool-prep-loop iocontrol.0.tool-prepare iocontrol.0.tool-prepared
+net tool-change-loop iocontrol.0.tool-change iocontrol.0.tool-changed
+
diff --git a/tests/toolchanger/shared-checkresult b/tests/toolchanger/shared-checkresult
new file mode 100755
index 000000000..9dd30b26e
--- /dev/null
+++ b/tests/toolchanger/shared-checkresult
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+TEST_DIR=$(dirname $1)
+cd $TEST_DIR
+
+diff -u expected-gcode-output gcode-output
diff --git a/tests/toolchanger/subs/M100 b/tests/toolchanger/subs/M100
new file mode 100755
index 000000000..b32c24334
--- /dev/null
+++ b/tests/toolchanger/subs/M100
@@ -0,0 +1,29 @@
+#!/bin/bash
+#
+# This script (M100) is called to log the current coordinates and the
+# current tool number and Tool Length Offset information to a log file,
+# for testing purposes
+#
+
+TEST_DIR=$(dirname INI_FILE_NAME)
+OUT_FILE=$TEST_DIR/gcode-output
+
+P=$1
+Q=$2
+
+#echo P is $P >> $OUT_FILE
+#echo Q is $Q >> $OUT_FILE
+
+case $P in
+ 0.000000) echo "X = $Q" >> $OUT_FILE;;
+ 1.000000) echo "Y = $Q" >> $OUT_FILE;;
+ 2.000000) echo "Z = $Q" >> $OUT_FILE;;
+ 3.000000) echo "toolno = $Q" >> $OUT_FILE;;
+ 4.000000) echo "tlo_z = $Q" >> $OUT_FILE;;
+ 5.000000) echo "" >> $OUT_FILE;;
+ 6.000000) echo "sequence number $Q" >> $OUT_FILE;;
+ *)
+ echo "unknown P=$P (Q=$Q)" >> $OUT_FILE
+ exit 1;;
+esac
+
diff --git a/tests/toolchanger/toolno-pocket-differ/nonrandom/checkresult b/tests/toolchanger/toolno-pocket-differ/nonrandom/checkresult
new file mode 120000
index 000000000..2660372fe
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/nonrandom/checkresult
@@ -0,0 +1 @@
+../../shared-checkresult \ No newline at end of file
diff --git a/tests/toolchanger/toolno-pocket-differ/nonrandom/expected-gcode-output b/tests/toolchanger/toolno-pocket-differ/nonrandom/expected-gcode-output
new file mode 100644
index 000000000..97a7d6f2a
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/nonrandom/expected-gcode-output
@@ -0,0 +1,217 @@
+sequence number 0.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.000000
+toolno = 0.000000
+tlo_z = 0.000000
+
+sequence number 1.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.000000
+toolno = 1.000000
+tlo_z = 1.000000
+
+sequence number 2.000000
+X = 0.000000
+Y = 0.000000
+Z = -1.000000
+toolno = 1.000000
+tlo_z = 1.000000
+
+sequence number 3.000000
+X = 0.000000
+Y = 0.000000
+Z = -1.000000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 4.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 5.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 6.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 7.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 8.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 9.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 10.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 11.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 12.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 13.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 14.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 15.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 16.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 17.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 18.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 19.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 20.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 21.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 22.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 23.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.400000
+
+sequence number 24.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.400000
+toolno = 99999.000000
+tlo_z = -0.400000
+
+sequence number 25.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.400000
+toolno = 1.000000
+tlo_z = -0.300000
+
+sequence number 26.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.300000
+toolno = 1.000000
+tlo_z = -0.300000
+
+sequence number 27.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.300000
+toolno = 10.000000
+tlo_z = -0.350000
+
+sequence number 28.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.350000
+toolno = 10.000000
+tlo_z = -0.350000
+
+sequence number 29.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.350000
+toolno = 99999.000000
+tlo_z = -0.400000
+
+sequence number 30.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.400000
+toolno = 99999.000000
+tlo_z = -0.400000
+
diff --git a/tests/toolchanger/toolno-pocket-differ/nonrandom/sim.ini b/tests/toolchanger/toolno-pocket-differ/nonrandom/sim.ini
new file mode 100644
index 000000000..1b8404c10
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/nonrandom/sim.ini
@@ -0,0 +1,83 @@
+[EMC]
+#DEBUG = 0
+DEBUG = 0x7fffffff
+
+[DISPLAY]
+DISPLAY = linuxcncrsh
+PROGRAM_PREFIX = ../../subs
+
+[TASK]
+TASK = milltask
+CYCLE_TIME = 0.001
+
+[RS274NGC]
+PARAMETER_FILE = sim.var
+USER_M_PATH = ../../subs
+SUBROUTINE_PATH = ../../subs
+
+[EMCMOT]
+EMCMOT = motmod
+COMM_TIMEOUT = 2.0
+COMM_WAIT = 0.010
+BASE_PERIOD = 0
+SERVO_PERIOD = 1000000
+
+[HAL]
+HALFILE = ../../core_sim.hal
+
+[TRAJ]
+AXES = 3
+COORDINATES = X Y Z
+HOME = 0 0 0
+LINEAR_UNITS = inch
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 1.2
+MAX_LINEAR_VELOCITY = 4
+
+[EMCIO]
+EMCIO = io
+CYCLE_TIME = 0.100
+TOOL_TABLE = simpockets.tbl
+TOOL_CHANGE_QUILL_UP = 1
+RANDOM_TOOLCHANGER = 0
+
+[AXIS_0]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 4
+MAX_ACCELERATION = 100.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -40.0
+MAX_LIMIT = 40.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+
+[AXIS_1]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 4
+MAX_ACCELERATION = 100.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -40.0
+MAX_LIMIT = 40.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+
+[AXIS_2]
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 4
+MAX_ACCELERATION = 100.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -4.0
+MAX_LIMIT = 4.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+
diff --git a/tests/toolchanger/toolno-pocket-differ/nonrandom/skip b/tests/toolchanger/toolno-pocket-differ/nonrandom/skip
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/nonrandom/skip
diff --git a/tests/toolchanger/toolno-pocket-differ/nonrandom/test.sh b/tests/toolchanger/toolno-pocket-differ/nonrandom/test.sh
new file mode 120000
index 000000000..0b01664e6
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/nonrandom/test.sh
@@ -0,0 +1 @@
+../shared-test.sh \ No newline at end of file
diff --git a/tests/toolchanger/toolno-pocket-differ/random/checkresult b/tests/toolchanger/toolno-pocket-differ/random/checkresult
new file mode 120000
index 000000000..2660372fe
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/random/checkresult
@@ -0,0 +1 @@
+../../shared-checkresult \ No newline at end of file
diff --git a/tests/toolchanger/toolno-pocket-differ/random/expected-gcode-output b/tests/toolchanger/toolno-pocket-differ/random/expected-gcode-output
new file mode 100644
index 000000000..13833408d
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/random/expected-gcode-output
@@ -0,0 +1,217 @@
+sequence number 0.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.000000
+toolno = -1.000000
+tlo_z = 0.000000
+
+sequence number 1.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.000000
+toolno = 1.000000
+tlo_z = 1.000000
+
+sequence number 2.000000
+X = 0.000000
+Y = 0.000000
+Z = -1.000000
+toolno = 1.000000
+tlo_z = 1.000000
+
+sequence number 3.000000
+X = 0.000000
+Y = 0.000000
+Z = -1.000000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 4.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 5.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 6.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 7.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 8.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 1.000000
+tlo_z = -0.100000
+
+sequence number 9.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.100000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 10.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 11.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 12.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.150000
+
+sequence number 13.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.150000
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 14.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 15.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 16.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 10.000000
+tlo_z = -0.103500
+
+sequence number 17.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.103500
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 18.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 19.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 20.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 21.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 22.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.104000
+
+sequence number 23.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.104000
+toolno = 99999.000000
+tlo_z = -0.400000
+
+sequence number 24.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.400000
+toolno = 99999.000000
+tlo_z = -0.400000
+
+sequence number 25.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.400000
+toolno = 1.000000
+tlo_z = -0.300000
+
+sequence number 26.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.300000
+toolno = 1.000000
+tlo_z = -0.300000
+
+sequence number 27.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.300000
+toolno = 10.000000
+tlo_z = -0.350000
+
+sequence number 28.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.350000
+toolno = 10.000000
+tlo_z = -0.350000
+
+sequence number 29.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.350000
+toolno = 99999.000000
+tlo_z = -0.400000
+
+sequence number 30.000000
+X = 0.000000
+Y = 0.000000
+Z = 0.400000
+toolno = 99999.000000
+tlo_z = -0.400000
+
diff --git a/tests/toolchanger/toolno-pocket-differ/random/sim.ini b/tests/toolchanger/toolno-pocket-differ/random/sim.ini
new file mode 100644
index 000000000..b66cc5a4f
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/random/sim.ini
@@ -0,0 +1,83 @@
+[EMC]
+#DEBUG = 0
+DEBUG = 0x7fffffff
+
+[DISPLAY]
+DISPLAY = linuxcncrsh
+PROGRAM_PREFIX = ../../subs
+
+[TASK]
+TASK = milltask
+CYCLE_TIME = 0.001
+
+[RS274NGC]
+PARAMETER_FILE = sim.var
+USER_M_PATH = ../../subs
+SUBROUTINE_PATH = ../../subs
+
+[EMCMOT]
+EMCMOT = motmod
+COMM_TIMEOUT = 2.0
+COMM_WAIT = 0.010
+BASE_PERIOD = 0
+SERVO_PERIOD = 1000000
+
+[HAL]
+HALFILE = ../../core_sim.hal
+
+[TRAJ]
+AXES = 3
+COORDINATES = X Y Z
+HOME = 0 0 0
+LINEAR_UNITS = inch
+ANGULAR_UNITS = degree
+CYCLE_TIME = 0.010
+DEFAULT_VELOCITY = 1.2
+MAX_LINEAR_VELOCITY = 4
+
+[EMCIO]
+EMCIO = io
+CYCLE_TIME = 0.100
+TOOL_TABLE = simpockets.tbl
+TOOL_CHANGE_QUILL_UP = 1
+RANDOM_TOOLCHANGER = 1
+
+[AXIS_0]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 4
+MAX_ACCELERATION = 100.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -40.0
+MAX_LIMIT = 40.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+
+[AXIS_1]
+TYPE = LINEAR
+HOME = 0.000
+MAX_VELOCITY = 4
+MAX_ACCELERATION = 100.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -40.0
+MAX_LIMIT = 40.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+
+[AXIS_2]
+TYPE = LINEAR
+HOME = 0.0
+MAX_VELOCITY = 4
+MAX_ACCELERATION = 100.0
+BACKLASH = 0.000
+INPUT_SCALE = 4000
+OUTPUT_SCALE = 1.000
+MIN_LIMIT = -4.0
+MAX_LIMIT = 4.0
+FERROR = 0.050
+MIN_FERROR = 0.010
+
diff --git a/tests/toolchanger/toolno-pocket-differ/random/skip b/tests/toolchanger/toolno-pocket-differ/random/skip
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/random/skip
diff --git a/tests/toolchanger/toolno-pocket-differ/random/test.sh b/tests/toolchanger/toolno-pocket-differ/random/test.sh
new file mode 120000
index 000000000..0b01664e6
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/random/test.sh
@@ -0,0 +1 @@
+../shared-test.sh \ No newline at end of file
diff --git a/tests/toolchanger/toolno-pocket-differ/shared-test.sh b/tests/toolchanger/toolno-pocket-differ/shared-test.sh
new file mode 100755
index 000000000..20d09a5cd
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/shared-test.sh
@@ -0,0 +1,151 @@
+#!/bin/bash
+set -x
+
+rm -f sim.var
+
+# reset the tool table to a known starting configuration
+rm -f simpockets.tbl
+cp ../simpockets.tbl.orig simpockets.tbl
+
+rm -f gcode-output
+
+linuxcnc -d -v sim.ini &
+
+# let linuxcnc come up
+sleep 5
+
+(
+ function introspect() {
+ SEQUENCE_NUMBER=$1
+ echo "set mdi m100 P6 Q$SEQUENCE_NUMBER" # sequence number
+ echo 'set mdi m100 P0 Q#5420' # X
+ echo 'set mdi m100 P1 Q#5421' # Y
+ echo 'set mdi m100 P2 Q#5422' # Z
+ echo 'set mdi m100 P3 Q#5400' # toolno
+ echo 'set mdi m100 P4 Q#5403' # TLO z
+ echo 'set mdi m100 P5' # blank line
+ }
+
+ echo hello EMC mt 1.0
+ echo set enable EMCTOO
+
+ echo set estop off
+ echo set machine on
+
+ echo set home 0
+ echo set home 1
+ echo set home 2
+ sleep 1
+
+ echo set mode mdi
+
+ introspect 0
+
+ echo set mdi t1 m6
+ introspect 1
+
+ echo set mdi g43
+ introspect 2
+
+ echo set mdi g10 l10 p1 z.1
+ introspect 3
+
+ echo set mdi g43
+ introspect 4
+
+ echo set mdi g10 l10 p10 z.15
+ introspect 5
+
+ echo set mdi g43
+ introspect 6
+
+ echo set mdi g10 l10 p99999 z.2
+ introspect 7
+
+ echo set mdi g43
+ introspect 8
+
+
+ echo set mdi t10 m6
+ introspect 9
+
+ echo set mdi g43
+ introspect 10
+
+ echo set mdi g10 l10 p1 z.103
+ introspect 11
+
+ echo set mdi g43
+ introspect 12
+
+ echo set mdi g10 l10 p10 z.1035
+ introspect 13
+
+ echo set mdi g43
+ introspect 14
+
+ echo set mdi g10 l10 p99999 z.104
+ introspect 15
+
+ echo set mdi g43
+ introspect 16
+
+
+ echo set mdi t99999 m6
+ introspect 17
+
+ echo set mdi g43
+ introspect 18
+
+ echo set mdi g10 l10 p1 z.3
+ introspect 19
+
+ echo set mdi g43
+ introspect 20
+
+ echo set mdi g10 l10 p10 z.35
+ introspect 21
+
+ echo set mdi g43
+ introspect 22
+
+ echo set mdi g10 l10 p99999 z.4
+ introspect 23
+
+ echo set mdi g43
+ introspect 24
+
+
+ echo set mdi t1 m6
+ introspect 25
+
+ echo set mdi g43
+ introspect 26
+
+
+ echo set mdi t10 m6
+ introspect 27
+
+ echo set mdi g43
+ introspect 28
+
+
+ echo set mdi t99999 m6
+ introspect 29
+
+ echo set mdi g43
+ introspect 30
+
+
+ # give linuxcnc a second to finish
+ sleep 1.0
+
+ echo shutdown
+) | telnet localhost 5007
+
+
+# wait for linuxcnc to finish
+wait
+
+exit 0
+
diff --git a/tests/toolchanger/toolno-pocket-differ/simpockets.tbl.orig b/tests/toolchanger/toolno-pocket-differ/simpockets.tbl.orig
new file mode 100644
index 000000000..4b427daaf
--- /dev/null
+++ b/tests/toolchanger/toolno-pocket-differ/simpockets.tbl.orig
@@ -0,0 +1,3 @@
+T1 P1 D0.125000 Z+1.000000 ;
+T10 P3 D0.500000 Z+3.000000 ;
+T99999 P50 Z+2.000000 ;