diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d412317f24f..12bcaf82254 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,7 +108,7 @@ jobs: fi done for f in scripts/linuxcnc scripts/halrun bin/linuxcncrsh bin/linuxcncsvr \ - bin/halcmd bin/halui bin/mdi bin/linuxcnctop; do + bin/halcmd bin/mdi bin/linuxcnctop; do if test ! -x "$f"; then echo "error: missing headless artifact: $f" exit 1 diff --git a/configs/attic/dallur-thc/dallur-advanced.ini b/configs/attic/dallur-thc/dallur-advanced.ini index 29c669589d4..17391f89e8a 100644 --- a/configs/attic/dallur-thc/dallur-advanced.ini +++ b/configs/attic/dallur-thc/dallur-advanced.ini @@ -79,9 +79,6 @@ CYCLE_TIME = 0.010 # The run script first uses halcmd to execute any HALFILE # files, and then to execute any individual HALCMD commands. # -# HALUI to interact with NML -# Run before any other HALFILE -HALUI=halui # list of hal config files to run through halcmd # files are executed in the order in which they appear HALFILE = dallur-core_stepper.hal diff --git a/configs/by_interface/mesa/plasma-5i20/plasma-5i20.ini b/configs/by_interface/mesa/plasma-5i20/plasma-5i20.ini index 665749f493d..05893701472 100644 --- a/configs/by_interface/mesa/plasma-5i20/plasma-5i20.ini +++ b/configs/by_interface/mesa/plasma-5i20/plasma-5i20.ini @@ -52,7 +52,6 @@ CYCLE_TIME = 0.010 # files are executed in the order in which they appear HALFILE = plasma-5i20.hal POSTGUI_HALFILE = postgui.hal -HALUI = halui # list of halcmd commands to execute # commands are executed in the order in which they appear #HALCMD = save neta diff --git a/configs/by_interface/mesa/plasma-5i20/plasma-demo.ini b/configs/by_interface/mesa/plasma-5i20/plasma-demo.ini index 227b53a8c42..50ce08897fc 100644 --- a/configs/by_interface/mesa/plasma-5i20/plasma-demo.ini +++ b/configs/by_interface/mesa/plasma-5i20/plasma-demo.ini @@ -43,7 +43,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = plasma-demo.hal POSTGUI_HALFILE = postgui.hal diff --git a/configs/by_interface/parport/gantry/gantry.ini b/configs/by_interface/parport/gantry/gantry.ini index efef5faf1f6..9940e23fc40 100644 --- a/configs/by_interface/parport/gantry/gantry.ini +++ b/configs/by_interface/parport/gantry/gantry.ini @@ -51,7 +51,6 @@ BASE_PERIOD = 30000 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = gantry.hal #HALFILE = custom.hal #POSTGUI_HALFILE = postgui_call_list.hal diff --git a/configs/by_interface/parport/gantry/gantry_joints.ini b/configs/by_interface/parport/gantry/gantry_joints.ini index 6e8d83daa12..f249d65e20b 100644 --- a/configs/by_interface/parport/gantry/gantry_joints.ini +++ b/configs/by_interface/parport/gantry/gantry_joints.ini @@ -51,7 +51,6 @@ BASE_PERIOD = 30000 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = gantry.hal [HALUI] diff --git a/configs/by_interface/parport/plasma-thc-sim/plasma_mm.ini b/configs/by_interface/parport/plasma-thc-sim/plasma_mm.ini index db1c400a957..56884b5fc77 100644 --- a/configs/by_interface/parport/plasma-thc-sim/plasma_mm.ini +++ b/configs/by_interface/parport/plasma-thc-sim/plasma_mm.ini @@ -104,9 +104,6 @@ CYCLE_TIME = 0.100 # The run script first uses halcmd to execute any HALFILE # files, and then to execute any individual HALCMD commands. # -# HALUI to interact with NML -# Run before any other HALFILE -HALUI = halui # list of hal config files to run through halcmd #+ files are executed in the order in which they appear HALFILE = kinematics.hal diff --git a/configs/by_interface/parport/stepper-gantry/stepper_mm.ini b/configs/by_interface/parport/stepper-gantry/stepper_mm.ini index d8fc9c20233..801ef71b72b 100644 --- a/configs/by_interface/parport/stepper-gantry/stepper_mm.ini +++ b/configs/by_interface/parport/stepper-gantry/stepper_mm.ini @@ -96,9 +96,6 @@ CYCLE_TIME = 0.100 # The run script first uses halcmd to execute any HALFILE # files, and then to execute any individual HALCMD commands. # -# HALUI to interact with NML -# Run before any other HALFILE -HALUI = halui # list of hal config files to run through halcmd #+ files are executed in the order in which they appear HALFILE = kinematics.hal diff --git a/configs/by_machine/scorbot-er-3/scorbot-er-3.ini b/configs/by_machine/scorbot-er-3/scorbot-er-3.ini index 3ba8fea37ae..71911f9215a 100644 --- a/configs/by_machine/scorbot-er-3/scorbot-er-3.ini +++ b/configs/by_machine/scorbot-er-3/scorbot-er-3.ini @@ -73,8 +73,6 @@ HALFILE = scorbot-er-3.hal #HALFILE = shuttlexpress-customization.hal POSTGUI_HALFILE = pyvcp.hal -HALUI = halui - [HALUI] #No Content diff --git a/configs/by_machine/smithy/1034gecko.ini b/configs/by_machine/smithy/1034gecko.ini index 71ac255c449..56468417b47 100644 --- a/configs/by_machine/smithy/1034gecko.ini +++ b/configs/by_machine/smithy/1034gecko.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = 1240gecko.hal EZTROL_HALFILE = eztrol.hal HALFILE = axis_manualtoolchange.hal diff --git a/configs/by_machine/smithy/1240.ini b/configs/by_machine/smithy/1240.ini index a5301550bd5..3763cc7282a 100644 --- a/configs/by_machine/smithy/1240.ini +++ b/configs/by_machine/smithy/1240.ini @@ -88,7 +88,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 1240.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/1240_4axis.ini b/configs/by_machine/smithy/1240_4axis.ini index 07f326a7977..a9a53f169f5 100644 --- a/configs/by_machine/smithy/1240_4axis.ini +++ b/configs/by_machine/smithy/1240_4axis.ini @@ -88,7 +88,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 1240_4axis.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/1240combined.ini b/configs/by_machine/smithy/1240combined.ini index fe808dd5564..10241ccea9b 100644 --- a/configs/by_machine/smithy/1240combined.ini +++ b/configs/by_machine/smithy/1240combined.ini @@ -91,7 +91,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 1240combined.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/1240combined_4axis.ini b/configs/by_machine/smithy/1240combined_4axis.ini index a9600f508ab..b26588e6ed2 100644 --- a/configs/by_machine/smithy/1240combined_4axis.ini +++ b/configs/by_machine/smithy/1240combined_4axis.ini @@ -91,7 +91,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 1240combined_4axis.hal #HALFILE = naiky_4axis.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/1240combined_mm.ini b/configs/by_machine/smithy/1240combined_mm.ini index e04e4edfee5..a497764d694 100644 --- a/configs/by_machine/smithy/1240combined_mm.ini +++ b/configs/by_machine/smithy/1240combined_mm.ini @@ -89,7 +89,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 1240combined.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/1240gecko.ini b/configs/by_machine/smithy/1240gecko.ini index 05d87c39a63..34cca4694b6 100644 --- a/configs/by_machine/smithy/1240gecko.ini +++ b/configs/by_machine/smithy/1240gecko.ini @@ -88,7 +88,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = 1240gecko.hal EZTROL_HALFILE = eztrol.hal POSTGUI_HALFILE = gecko_postgui.hal diff --git a/configs/by_machine/smithy/1240rutex.ini b/configs/by_machine/smithy/1240rutex.ini index ab8906feb24..c5af47baf79 100644 --- a/configs/by_machine/smithy/1240rutex.ini +++ b/configs/by_machine/smithy/1240rutex.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = 1240rutex.hal EZTROL_HALFILE = eztrol.hal HALFILE = axis_manualtoolchange.hal diff --git a/configs/by_machine/smithy/1240rutex_4axis.ini b/configs/by_machine/smithy/1240rutex_4axis.ini index a92967300e0..e4c04bc0001 100644 --- a/configs/by_machine/smithy/1240rutex_4axis.ini +++ b/configs/by_machine/smithy/1240rutex_4axis.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = 1240rutex_4axis.hal EZTROL_HALFILE = eztrol.hal HALFILE = axis_manualtoolchange.hal diff --git a/configs/by_machine/smithy/1315.ini b/configs/by_machine/smithy/1315.ini index 695a2a71d84..992758019ad 100644 --- a/configs/by_machine/smithy/1315.ini +++ b/configs/by_machine/smithy/1315.ini @@ -67,7 +67,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = 1315.hal #HALFILE = naiky.hal POSTGUI_HALFILE = 1315postgui.hal diff --git a/configs/by_machine/smithy/516gecko.ini b/configs/by_machine/smithy/516gecko.ini index 09e46aef400..f3c8d942464 100644 --- a/configs/by_machine/smithy/516gecko.ini +++ b/configs/by_machine/smithy/516gecko.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = 622gecko.hal EZTROL_HALFILE = eztrol.hal HALFILE = axis_manualtoolchange.hal diff --git a/configs/by_machine/smithy/622.ini b/configs/by_machine/smithy/622.ini index eea966b8284..b390d6b0f5d 100644 --- a/configs/by_machine/smithy/622.ini +++ b/configs/by_machine/smithy/622.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 622.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/622_4axis.ini b/configs/by_machine/smithy/622_4axis.ini index 88b085909d8..2bb26ee3bc6 100644 --- a/configs/by_machine/smithy/622_4axis.ini +++ b/configs/by_machine/smithy/622_4axis.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 622_4axis.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/622gecko.ini b/configs/by_machine/smithy/622gecko.ini index edd1a34409a..fdc8a35727e 100644 --- a/configs/by_machine/smithy/622gecko.ini +++ b/configs/by_machine/smithy/622gecko.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = 622gecko.hal EZTROL_HALFILE = eztrol.hal HALFILE = axis_manualtoolchange.hal diff --git a/configs/by_machine/smithy/622keyence.ini b/configs/by_machine/smithy/622keyence.ini index b3a955910bf..7c16c57da94 100644 --- a/configs/by_machine/smithy/622keyence.ini +++ b/configs/by_machine/smithy/622keyence.ini @@ -88,7 +88,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 622keyence.hal #HALFILE = naiky.hal EZTROL_HALFILE = 622eztrol-leadshine.hal diff --git a/configs/by_machine/smithy/622leadshine.ini b/configs/by_machine/smithy/622leadshine.ini index a23e2a29735..e5b0449c486 100644 --- a/configs/by_machine/smithy/622leadshine.ini +++ b/configs/by_machine/smithy/622leadshine.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 622leadshine.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/622leadshine_4axis.ini b/configs/by_machine/smithy/622leadshine_4axis.ini index 21c1c44340b..7b56be52200 100644 --- a/configs/by_machine/smithy/622leadshine_4axis.ini +++ b/configs/by_machine/smithy/622leadshine_4axis.ini @@ -87,7 +87,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 622leadshine_4axis.hal #HALFILE = naiky.hal EZTROL_HALFILE = 5i20eztrol.hal diff --git a/configs/by_machine/smithy/924.ini b/configs/by_machine/smithy/924.ini index c4092c0a83e..684ddc663db 100644 --- a/configs/by_machine/smithy/924.ini +++ b/configs/by_machine/smithy/924.ini @@ -72,7 +72,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = 924.hal #HALFILE = naiky.hal diff --git a/configs/sim/axis/anglejog/anglejog.ini b/configs/sim/axis/anglejog/anglejog.ini index 696f6188bb2..17196bfe235 100644 --- a/configs/sim/axis/anglejog/anglejog.ini +++ b/configs/sim/axis/anglejog/anglejog.ini @@ -30,7 +30,6 @@ SERVO_PERIOD = 1000000 CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl -no_sim_spindle -no_use_hal_manualtoolchange # all provisions for anglejog: POSTGUI_HALFILE = anglejog_postgui.hal diff --git a/configs/sim/axis/axis.ini b/configs/sim/axis/axis.ini index 534604ef150..4945eafc986 100644 --- a/configs/sim/axis/axis.ini +++ b/configs/sim/axis/axis.ini @@ -124,8 +124,6 @@ HALFILE = cooling.hal # AXIS at this time (only AXIS creates a HAL component of its own) #POSTGUI_HALFILE = test_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] COORDINATES = X Y Z diff --git a/configs/sim/axis/axis_9axis.ini b/configs/sim/axis/axis_9axis.ini index ff220c27567..103baf9c510 100644 --- a/configs/sim/axis/axis_9axis.ini +++ b/configs/sim/axis/axis_9axis.ini @@ -45,7 +45,6 @@ SERVO_PERIOD = 1000000 TOOL_CHANGE_POSITION = 0 0 2 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = locking_indexer.hal diff --git a/configs/sim/axis/axis_9axis_scurve.ini b/configs/sim/axis/axis_9axis_scurve.ini index 39c082a442b..24bc30f8012 100644 --- a/configs/sim/axis/axis_9axis_scurve.ini +++ b/configs/sim/axis/axis_9axis_scurve.ini @@ -47,7 +47,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = axis_9axis_scurve.hal [TRAJ] diff --git a/configs/sim/axis/axis_mm.ini b/configs/sim/axis/axis_mm.ini index df209baf313..1efb1d7dee4 100644 --- a/configs/sim/axis/axis_mm.ini +++ b/configs/sim/axis/axis_mm.ini @@ -115,8 +115,6 @@ HALFILE = cooling.hal # AXIS at this time (only AXIS creates a HAL component of its own) #POSTGUI_HALFILE = test_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] COORDINATES = X Y Z diff --git a/configs/sim/axis/axis_mm_scurve.ini b/configs/sim/axis/axis_mm_scurve.ini index 13a3e803bbd..0f69e88d20c 100644 --- a/configs/sim/axis/axis_mm_scurve.ini +++ b/configs/sim/axis/axis_mm_scurve.ini @@ -47,7 +47,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = axis_mm_scurve.hal [TRAJ] diff --git a/configs/sim/axis/canterp.ini b/configs/sim/axis/canterp.ini index 1fc4c1ab779..c34f3c67fa1 100644 --- a/configs/sim/axis/canterp.ini +++ b/configs/sim/axis/canterp.ini @@ -32,7 +32,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/db_demo/base.inc b/configs/sim/axis/db_demo/base.inc index 8330fee7eb5..142df4c93e4 100644 --- a/configs/sim/axis/db_demo/base.inc +++ b/configs/sim/axis/db_demo/base.inc @@ -20,7 +20,6 @@ EMCMOT = motmod SERVO_PERIOD = 1000000 [HAL] -HALUI=halui HALFILE = LIB:basic_sim.tcl -no_use_hal_manualtoolchange POSTGUI_HALFILE = db_postgui.hal diff --git a/configs/sim/axis/external_offsets/dynamic_offsets.ini b/configs/sim/axis/external_offsets/dynamic_offsets.ini index b07b103c737..6b0fd9969fd 100644 --- a/configs/sim/axis/external_offsets/dynamic_offsets.ini +++ b/configs/sim/axis/external_offsets/dynamic_offsets.ini @@ -4,7 +4,6 @@ DELAY = 5 APP = halscope -i dynamic_offsets.halscope [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl -no_sim_spindle POSTGUI_HALFILE = dynamic_offsets_panel.hal diff --git a/configs/sim/axis/external_offsets/eoffsets.ini b/configs/sim/axis/external_offsets/eoffsets.ini index 0542f67c902..6559b3364f8 100644 --- a/configs/sim/axis/external_offsets/eoffsets.ini +++ b/configs/sim/axis/external_offsets/eoffsets.ini @@ -18,7 +18,6 @@ APP = sim_pin --title "MPG Simulator" \ APP = eoffsets_monitor.tcl [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl -no_use_hal_manualtoolchange HALFILE = eoffsets.hal POSTGUI_HALFILE = eoffsets_panel.hal diff --git a/configs/sim/axis/external_offsets/jwp_z.ini b/configs/sim/axis/external_offsets/jwp_z.ini index d99db80c758..0c6853d4965 100644 --- a/configs/sim/axis/external_offsets/jwp_z.ini +++ b/configs/sim/axis/external_offsets/jwp_z.ini @@ -10,7 +10,6 @@ [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = jwp_z_panel.hal diff --git a/configs/sim/axis/external_offsets/opa.ini b/configs/sim/axis/external_offsets/opa.ini index 2301b15c977..87b68605f48 100644 --- a/configs/sim/axis/external_offsets/opa.ini +++ b/configs/sim/axis/external_offsets/opa.ini @@ -5,7 +5,6 @@ DELAY = 3 APP = sim_pin ini.x.max_acceleration ini.x.max_velocity [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = opa.hal POSTGUI_HALFILE = opa_panel.hal diff --git a/configs/sim/axis/extrajoints/12extrajoints.ini b/configs/sim/axis/extrajoints/12extrajoints.ini index ff8f8f02c39..96ec281db6f 100644 --- a/configs/sim/axis/extrajoints/12extrajoints.ini +++ b/configs/sim/axis/extrajoints/12extrajoints.ini @@ -26,7 +26,6 @@ SERVO_PERIOD = 1000000 TWOPASS = on HALFILE = LIB:basic_sim.tcl HALFILE = ./extrajoints.tcl -HALUI = halui [DISPLAY] DISPLAY = axis diff --git a/configs/sim/axis/extrajoints/1extrajoint.ini b/configs/sim/axis/extrajoints/1extrajoint.ini index 38c17ad9da2..bdbb4358c2d 100644 --- a/configs/sim/axis/extrajoints/1extrajoint.ini +++ b/configs/sim/axis/extrajoints/1extrajoint.ini @@ -27,7 +27,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = 1extrajoint.hal -HALUI = halui [DISPLAY] diff --git a/configs/sim/axis/extrajoints/2extrajoints.ini b/configs/sim/axis/extrajoints/2extrajoints.ini index fee8ff15c41..21a7b8b7f10 100644 --- a/configs/sim/axis/extrajoints/2extrajoints.ini +++ b/configs/sim/axis/extrajoints/2extrajoints.ini @@ -31,7 +31,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = LIB:basic_sim.tcl HALFILE = ./2extrajoints.hal -HALUI = halui [DISPLAY] DISPLAY = axis diff --git a/configs/sim/axis/foam/axis_foam.ini b/configs/sim/axis/foam/axis_foam.ini index db93a5f2849..96961c0b731 100644 --- a/configs/sim/axis/foam/axis_foam.ini +++ b/configs/sim/axis/foam/axis_foam.ini @@ -41,7 +41,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/gantry/gantry_mm.ini b/configs/sim/axis/gantry/gantry_mm.ini index 52e01d21bfb..51b029ffb28 100644 --- a/configs/sim/axis/gantry/gantry_mm.ini +++ b/configs/sim/axis/gantry/gantry_mm.ini @@ -39,7 +39,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = gantry_mm.hal -HALUI = halui [KINS] KINEMATICS = trivkins coordinates=xyyz kinstype=BOTH diff --git a/configs/sim/axis/gladevcp/gladevcp_panel.ini b/configs/sim/axis/gladevcp/gladevcp_panel.ini index a8f477b8ade..64b95bad2e4 100644 --- a/configs/sim/axis/gladevcp/gladevcp_panel.ini +++ b/configs/sim/axis/gladevcp/gladevcp_panel.ini @@ -44,7 +44,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE= manual-example.hal diff --git a/configs/sim/axis/gladevcp/gladevcp_panel_tester.ini b/configs/sim/axis/gladevcp/gladevcp_panel_tester.ini index 26b292677c7..caedbd799c8 100644 --- a/configs/sim/axis/gladevcp/gladevcp_panel_tester.ini +++ b/configs/sim/axis/gladevcp/gladevcp_panel_tester.ini @@ -44,7 +44,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl #POSTGUI_HALFILE= manual-example.hal diff --git a/configs/sim/axis/gladevcp/gladevcp_tab.ini b/configs/sim/axis/gladevcp/gladevcp_tab.ini index 4395c542d52..4b16152efd2 100644 --- a/configs/sim/axis/gladevcp/gladevcp_tab.ini +++ b/configs/sim/axis/gladevcp/gladevcp_tab.ini @@ -48,7 +48,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = manual-example.hal diff --git a/configs/sim/axis/gladevcp/probe.ini b/configs/sim/axis/gladevcp/probe.ini index 635f6424b62..e0d878d0e66 100644 --- a/configs/sim/axis/gladevcp/probe.ini +++ b/configs/sim/axis/gladevcp/probe.ini @@ -46,7 +46,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/gladevcp/probe.py b/configs/sim/axis/gladevcp/probe.py index fcca3592815..089dedd378b 100644 --- a/configs/sim/axis/gladevcp/probe.py +++ b/configs/sim/axis/gladevcp/probe.py @@ -65,7 +65,6 @@ def ensure_mode(self,m, *p): if self.s.task_mode == m or self.s.task_mode in p: return True if self.running(do_poll=False): return False self.c.mode(m) - self.c.wait_complete() return True def active_codes(self): diff --git a/configs/sim/axis/gladevcp/set-param-from-ini.ini b/configs/sim/axis/gladevcp/set-param-from-ini.ini index 43da20df92f..998a660657e 100644 --- a/configs/sim/axis/gladevcp/set-param-from-ini.ini +++ b/configs/sim/axis/gladevcp/set-param-from-ini.ini @@ -44,7 +44,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/halui_pyvcp/halui.ini b/configs/sim/axis/halui_pyvcp/halui.ini index 4eaef32e8da..7e62a514a6a 100644 --- a/configs/sim/axis/halui_pyvcp/halui.ini +++ b/configs/sim/axis/halui_pyvcp/halui.ini @@ -33,7 +33,6 @@ CYCLE_TIME = 0.010 HALFILE = core_sim.hal HALFILE = pyvcp.hal HALFILE = simulated_home.hal -HALUI = halui [HALUI] MDI_COMMAND = G0 G53 Z0 diff --git a/configs/sim/axis/halui_pyvcp/pyvcp.hal b/configs/sim/axis/halui_pyvcp/pyvcp.hal index 0554fa8344b..e6e7366d341 100644 --- a/configs/sim/axis/halui_pyvcp/pyvcp.hal +++ b/configs/sim/axis/halui_pyvcp/pyvcp.hal @@ -23,10 +23,6 @@ net flood-off pyvcp.flood.off halui.flood.off net mist-is-on pyvcp.mist.is-on halui.mist.is-on net flood-is-on pyvcp.flood.is-on halui.flood.is-on -net mode-manual pyvcp.mode.manual halui.mode.manual -net mode-auto pyvcp.mode.auto halui.mode.auto -net mode-mdi pyvcp.mode.mdi halui.mode.mdi - net spindle-start pyvcp.spindle.on halui.spindle.0.start net spindle-stop pyvcp.spindle.off halui.spindle.0.stop net spindle-forward pyvcp.spindle.forward halui.spindle.0.forward diff --git a/configs/sim/axis/halui_pyvcp/vcp.xml b/configs/sim/axis/halui_pyvcp/vcp.xml index dac57a1f5d1..b78e24c17d1 100644 --- a/configs/sim/axis/halui_pyvcp/vcp.xml +++ b/configs/sim/axis/halui_pyvcp/vcp.xml @@ -55,11 +55,9 @@ - + "mode.is-manual" 20 @@ -68,11 +66,9 @@ - + "mode.is-auto" 20 @@ -81,11 +77,9 @@ - + "mode.is-mdi" 20 diff --git a/configs/sim/axis/histogram_demo.ini b/configs/sim/axis/histogram_demo.ini index 615f01859fe..c6221ef9b75 100644 --- a/configs/sim/axis/histogram_demo.ini +++ b/configs/sim/axis/histogram_demo.ini @@ -45,7 +45,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/home_is_shared/home_is_shared.ini b/configs/sim/axis/home_is_shared/home_is_shared.ini index e80bf812c76..5503aa51163 100644 --- a/configs/sim/axis/home_is_shared/home_is_shared.ini +++ b/configs/sim/axis/home_is_shared/home_is_shared.ini @@ -99,7 +99,6 @@ TOOL_CHANGE_QUILL_UP = 1 [HAL] HALFILE = core_sim.hal HALFILE = simulated_home_is_shared.hal -HALUI = halui # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/configs/sim/axis/ini_hal_demo.ini b/configs/sim/axis/ini_hal_demo.ini index 75c5992b7f9..486d3f939d5 100644 --- a/configs/sim/axis/ini_hal_demo.ini +++ b/configs/sim/axis/ini_hal_demo.ini @@ -47,7 +47,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = postgui_calib_helper.hal diff --git a/configs/sim/axis/ini_with_includes/hal.inc b/configs/sim/axis/ini_with_includes/hal.inc index f627913c476..25843406070 100644 --- a/configs/sim/axis/ini_with_includes/hal.inc +++ b/configs/sim/axis/ini_with_includes/hal.inc @@ -5,4 +5,3 @@ # list of hal config files to run through halcmd # files are executed in the order in which they appear HALFILE = LIB:basic_sim.tcl -HALUI = halui diff --git a/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyyzb.ini b/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyyzb.ini index bce8ab912bc..c3ef01710a6 100644 --- a/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyyzb.ini +++ b/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyyzb.ini @@ -20,7 +20,6 @@ JOINTS = 5 KINEMATICS = trivkins coordinates=xyyzb kinstype=both [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = LIB:wheeljogpins.tcl 0.1 diff --git a/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyzb.ini b/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyzb.ini index 8cc06b086f2..6e9838b1985 100644 --- a/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyzb.ini +++ b/configs/sim/axis/ja_tests/xyzb_locking_indexer/xyzb.ini @@ -13,7 +13,6 @@ JOINTS = 4 KINEMATICS = trivkins coordinates=xyzb [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = LIB:wheeljogpins.tcl 0.1 diff --git a/configs/sim/axis/ja_tests/xyzx_mpg/xyzx-xhc-hb04.ini b/configs/sim/axis/ja_tests/xyzx_mpg/xyzx-xhc-hb04.ini index 8918f2f36ae..548ba7b8b15 100644 --- a/configs/sim/axis/ja_tests/xyzx_mpg/xyzx-xhc-hb04.ini +++ b/configs/sim/axis/ja_tests/xyzx_mpg/xyzx-xhc-hb04.ini @@ -5,7 +5,6 @@ APP = halshow xyzx.halshow [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = LIB:xhc-hb04.tcl diff --git a/configs/sim/axis/ja_tests/xyzx_mpg/xyzx.ini b/configs/sim/axis/ja_tests/xyzx_mpg/xyzx.ini index 997ab73cc95..ec873a69d30 100644 --- a/configs/sim/axis/ja_tests/xyzx_mpg/xyzx.ini +++ b/configs/sim/axis/ja_tests/xyzx_mpg/xyzx.ini @@ -11,7 +11,6 @@ APP = sim_pin \ APP = halshow xyzx.halshow [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = ./xyzx_jog.hal diff --git a/configs/sim/axis/ja_tests/xz/xzbase.inc b/configs/sim/axis/ja_tests/xz/xzbase.inc index 0ed6ec2841a..bf35154d4a3 100644 --- a/configs/sim/axis/ja_tests/xz/xzbase.inc +++ b/configs/sim/axis/ja_tests/xz/xzbase.inc @@ -1,6 +1,5 @@ [HAL] HALFILE = LIB:basic_sim.tcl - HALUI = halui [TRAJ] COORDINATES = XZ diff --git a/configs/sim/axis/laser/laser.ini b/configs/sim/axis/laser/laser.ini index 9ca8259791b..cb43697088a 100644 --- a/configs/sim/axis/laser/laser.ini +++ b/configs/sim/axis/laser/laser.ini @@ -13,7 +13,6 @@ LINEAR_UNITS = mm ANGULAR_UNITS = degree [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = laser.hal POSTGUI_HALFILE = postgui.hal diff --git a/configs/sim/axis/lathe.ini b/configs/sim/axis/lathe.ini index dcbfba03341..47cb37b0514 100644 --- a/configs/sim/axis/lathe.ini +++ b/configs/sim/axis/lathe.ini @@ -40,7 +40,6 @@ SERVO_PERIOD = 1000000 CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = lathe_postgui.hal diff --git a/configs/sim/axis/moveoff/1_onpause_local.ini b/configs/sim/axis/moveoff/1_onpause_local.ini index b6cf30a605a..4892c9bdeba 100644 --- a/configs/sim/axis/moveoff/1_onpause_local.ini +++ b/configs/sim/axis/moveoff/1_onpause_local.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff,onpause,local [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl # hookup a moveoff component: diff --git a/configs/sim/axis/moveoff/2_onpause_external.ini b/configs/sim/axis/moveoff/2_onpause_external.ini index 46c594a7d8d..6bf8dfe081c 100644 --- a/configs/sim/axis/moveoff/2_onpause_external.ini +++ b/configs/sim/axis/moveoff/2_onpause_external.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff,onpause,external [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl # hookup a moveoff component: diff --git a/configs/sim/axis/moveoff/3_always_local.ini b/configs/sim/axis/moveoff/3_always_local.ini index eedd656d649..bf8b53e8698 100644 --- a/configs/sim/axis/moveoff/3_always_local.ini +++ b/configs/sim/axis/moveoff/3_always_local.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff,always,local [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl # hookup a moveoff component: diff --git a/configs/sim/axis/moveoff/4_always_external.ini b/configs/sim/axis/moveoff/4_always_external.ini index 635bc49ce4f..2cf8283178e 100644 --- a/configs/sim/axis/moveoff/4_always_external.ini +++ b/configs/sim/axis/moveoff/4_always_external.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff,always,external [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl # hookup a moveoff component: diff --git a/configs/sim/axis/moveoff/5_no_gui.ini b/configs/sim/axis/moveoff/5_no_gui.ini index 45c1ba29823..1d6aa1f06e1 100644 --- a/configs/sim/axis/moveoff/5_no_gui.ini +++ b/configs/sim/axis/moveoff/5_no_gui.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff,no_gui [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = LIB:hookup_moveoff.tcl diff --git a/configs/sim/axis/moveoff/6_zretract.ini b/configs/sim/axis/moveoff/6_zretract.ini index a26f98bb48b..dd8996cb2b0 100644 --- a/configs/sim/axis/moveoff/6_zretract.ini +++ b/configs/sim/axis/moveoff/6_zretract.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff zretract demo [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl # hookup a moveoff component: diff --git a/configs/sim/axis/moveoff/7_pyvcp.ini b/configs/sim/axis/moveoff/7_pyvcp.ini index 191a2b7fe17..852895b3621 100644 --- a/configs/sim/axis/moveoff/7_pyvcp.ini +++ b/configs/sim/axis/moveoff/7_pyvcp.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff,onpause,external [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl # hookup a moveoff component: diff --git a/configs/sim/axis/moveoff/8_gladevcp.ini b/configs/sim/axis/moveoff/8_gladevcp.ini index 1c61c46b552..787c807baf4 100644 --- a/configs/sim/axis/moveoff/8_gladevcp.ini +++ b/configs/sim/axis/moveoff/8_gladevcp.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = moveoff,onpause,external [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl # hookup a moveoff component: diff --git a/configs/sim/axis/mtconnect/example.ini b/configs/sim/axis/mtconnect/example.ini index 0ee7838cf6b..b39ad50015a 100644 --- a/configs/sim/axis/mtconnect/example.ini +++ b/configs/sim/axis/mtconnect/example.ini @@ -97,7 +97,6 @@ HALFILE = check_xyz_constraints.hal HALFILE = ../cooling.hal # Load the MTConnect agent as a userspace HAL component (see mtconnect.hal). HALFILE = mtconnect.hal -HALUI = halui [TRAJ] COORDINATES = X Y Z diff --git a/configs/sim/axis/ngcgui/ngcgui.ini b/configs/sim/axis/ngcgui/ngcgui.ini index 538017966e6..ac3e15f5f43 100644 --- a/configs/sim/axis/ngcgui/ngcgui.ini +++ b/configs/sim/axis/ngcgui/ngcgui.ini @@ -81,7 +81,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/ngcgui/ngcgui_gcmc.ini b/configs/sim/axis/ngcgui/ngcgui_gcmc.ini index 9139f793ee4..6625d08060e 100644 --- a/configs/sim/axis/ngcgui/ngcgui_gcmc.ini +++ b/configs/sim/axis/ngcgui/ngcgui_gcmc.ini @@ -85,7 +85,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/ngcgui/ngcgui_lathe.ini b/configs/sim/axis/ngcgui/ngcgui_lathe.ini index dff7147df02..7655af01c3e 100644 --- a/configs/sim/axis/ngcgui/ngcgui_lathe.ini +++ b/configs/sim/axis/ngcgui/ngcgui_lathe.ini @@ -67,7 +67,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/ngcgui/ngcgui_simple.ini b/configs/sim/axis/ngcgui/ngcgui_simple.ini index ccb896d7e1f..95a47a195f3 100644 --- a/configs/sim/axis/ngcgui/ngcgui_simple.ini +++ b/configs/sim/axis/ngcgui/ngcgui_simple.ini @@ -68,7 +68,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/ngcgui/pyngcgui_axis.ini b/configs/sim/axis/ngcgui/pyngcgui_axis.ini index 8cab0e77f10..3388435615d 100644 --- a/configs/sim/axis/ngcgui/pyngcgui_axis.ini +++ b/configs/sim/axis/ngcgui/pyngcgui_axis.ini @@ -82,7 +82,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/pentapod/pentapod.ini b/configs/sim/axis/pentapod/pentapod.ini index 943a62c0c2d..0f91e195476 100644 --- a/configs/sim/axis/pentapod/pentapod.ini +++ b/configs/sim/axis/pentapod/pentapod.ini @@ -42,7 +42,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = kinematics.hal POSTGUI_HALFILE = pentapod_postgui.hal diff --git a/configs/sim/axis/plasma/imperial.ini b/configs/sim/axis/plasma/imperial.ini index a86417ab27d..3b2d1092fdb 100644 --- a/configs/sim/axis/plasma/imperial.ini +++ b/configs/sim/axis/plasma/imperial.ini @@ -20,7 +20,6 @@ TWOPASS = ON HALFILE = plasmac2/lib/sim/sim_stepgen.tcl HALFILE = qtplasmac_comp.hal HALFILE = custom.hal -HALUI = halui [DISPLAY] DISPLAY = axis diff --git a/configs/sim/axis/plasma/metric.ini b/configs/sim/axis/plasma/metric.ini index d9d7d8ad745..a3b1d0e91eb 100644 --- a/configs/sim/axis/plasma/metric.ini +++ b/configs/sim/axis/plasma/metric.ini @@ -20,7 +20,6 @@ TWOPASS = ON HALFILE = plasmac2/lib/sim/sim_stepgen.tcl HALFILE = qtplasmac_comp.hal HALFILE = custom.hal -HALUI = halui [DISPLAY] DISPLAY = axis diff --git a/configs/sim/axis/profile_axis.ini b/configs/sim/axis/profile_axis.ini index e43ef4f7946..03cea494693 100644 --- a/configs/sim/axis/profile_axis.ini +++ b/configs/sim/axis/profile_axis.ini @@ -42,7 +42,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/qtvcp/qtvcp_tab.ini b/configs/sim/axis/qtvcp/qtvcp_tab.ini index 7822089cb27..edf508783a0 100644 --- a/configs/sim/axis/qtvcp/qtvcp_tab.ini +++ b/configs/sim/axis/qtvcp/qtvcp_tab.ini @@ -51,7 +51,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/qtvcp/qtvismach_tab.ini b/configs/sim/axis/qtvcp/qtvismach_tab.ini index 561c9b4c2a2..f00dc83969f 100644 --- a/configs/sim/axis/qtvcp/qtvismach_tab.ini +++ b/configs/sim/axis/qtvcp/qtvismach_tab.ini @@ -45,7 +45,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/random_tc.ini b/configs/sim/axis/random_tc.ini index 442449ee371..2c1bd8f1b55 100644 --- a/configs/sim/axis/random_tc.ini +++ b/configs/sim/axis/random_tc.ini @@ -42,7 +42,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/remap/cycle/cycle.ini b/configs/sim/axis/remap/cycle/cycle.ini index 6f3ebe6e5de..dcfe73aba97 100644 --- a/configs/sim/axis/remap/cycle/cycle.ini +++ b/configs/sim/axis/remap/cycle/cycle.ini @@ -50,7 +50,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = locking_indexer.hal diff --git a/configs/sim/axis/remap/extend-builtins/extend-builtins.ini b/configs/sim/axis/remap/extend-builtins/extend-builtins.ini index 67634a009a1..3e2ff851f2a 100644 --- a/configs/sim/axis/remap/extend-builtins/extend-builtins.ini +++ b/configs/sim/axis/remap/extend-builtins/extend-builtins.ini @@ -83,7 +83,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = gladevcp.hal diff --git a/configs/sim/axis/remap/getting-started/demo.ini b/configs/sim/axis/remap/getting-started/demo.ini index e2e7ac32dc0..baf1cf305e9 100644 --- a/configs/sim/axis/remap/getting-started/demo.ini +++ b/configs/sim/axis/remap/getting-started/demo.ini @@ -132,7 +132,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/remap/manual-toolchange-with-tool-length-switch/manualtoolchange.ini b/configs/sim/axis/remap/manual-toolchange-with-tool-length-switch/manualtoolchange.ini index 20fc4388e68..483ac90d5e1 100644 --- a/configs/sim/axis/remap/manual-toolchange-with-tool-length-switch/manualtoolchange.ini +++ b/configs/sim/axis/remap/manual-toolchange-with-tool-length-switch/manualtoolchange.ini @@ -56,7 +56,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE= gladevcp.hal diff --git a/configs/sim/axis/remap/rack-toolchange/racktoolchange.ini b/configs/sim/axis/remap/rack-toolchange/racktoolchange.ini index 659bda067c3..dd1b7c86721 100644 --- a/configs/sim/axis/remap/rack-toolchange/racktoolchange.ini +++ b/configs/sim/axis/remap/rack-toolchange/racktoolchange.ini @@ -54,7 +54,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = racktoolchange.hal POSTGUI_HALFILE= gladevcp.hal diff --git a/configs/sim/axis/remap/stop-lookahead/demo.ini b/configs/sim/axis/remap/stop-lookahead/demo.ini index 43aade97169..91d1c790b46 100644 --- a/configs/sim/axis/remap/stop-lookahead/demo.ini +++ b/configs/sim/axis/remap/stop-lookahead/demo.ini @@ -50,7 +50,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/rose_engine/rose_engine.ini b/configs/sim/axis/rose_engine/rose_engine.ini index 7ad0172a7bd..1fbddfe4df9 100644 --- a/configs/sim/axis/rose_engine/rose_engine.ini +++ b/configs/sim/axis/rose_engine/rose_engine.ini @@ -1,7 +1,6 @@ [APPLICATIONS] APP = halshow rose_engine.halshow [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/axis/spindle_orient/orient.ini b/configs/sim/axis/spindle_orient/orient.ini index 148bf9935e5..7c281375fbb 100644 --- a/configs/sim/axis/spindle_orient/orient.ini +++ b/configs/sim/axis/spindle_orient/orient.ini @@ -46,7 +46,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal HALFILE = axis_manualtoolchange.hal HALFILE = simulated_home.hal diff --git a/configs/sim/axis/twopass/twopass.ini b/configs/sim/axis/twopass/twopass.ini index b944fe09c1e..fa136a0fa74 100644 --- a/configs/sim/axis/twopass/twopass.ini +++ b/configs/sim/axis/twopass/twopass.ini @@ -43,7 +43,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui # options available are: on,verbose,nodelete TWOPASS = on HALFILE = core_sim.hal diff --git a/configs/sim/axis/vismach/3axis-tutorial/3axis-tutorial.ini b/configs/sim/axis/vismach/3axis-tutorial/3axis-tutorial.ini index 7e2dfcc4d1f..ead951a340c 100644 --- a/configs/sim/axis/vismach/3axis-tutorial/3axis-tutorial.ini +++ b/configs/sim/axis/vismach/3axis-tutorial/3axis-tutorial.ini @@ -112,8 +112,6 @@ HALFILE = 3axis-tutorial.hal # AXIS at this time (only AXIS creates a HAL component of its own) #POSTGUI_HALFILE = test_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/axis/vismach/5axis/bridgemill/5axis.ini b/configs/sim/axis/vismach/5axis/bridgemill/5axis.ini index 38e706fac22..2707f631b70 100644 --- a/configs/sim/axis/vismach/5axis/bridgemill/5axis.ini +++ b/configs/sim/axis/vismach/5axis/bridgemill/5axis.ini @@ -38,7 +38,6 @@ SERVO_PERIOD = 1000000 CYCLE_TIME = 0.010 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = 5axisgui.hal POSTGUI_HALFILE = 5axis_postgui.hal diff --git a/configs/sim/axis/vismach/5axis/max5/max5kins.ini b/configs/sim/axis/vismach/5axis/max5/max5kins.ini index b2d77aaf046..957798018a6 100644 --- a/configs/sim/axis/vismach/5axis/max5/max5kins.ini +++ b/configs/sim/axis/vismach/5axis/max5/max5kins.ini @@ -6,7 +6,6 @@ JOINTS = 6 [HAL] HALFILE = max5kins.hal -HALUI = halui [EMC] VERSION = 1.1 diff --git a/configs/sim/axis/vismach/5axis/max5/max5triv.ini b/configs/sim/axis/vismach/5axis/max5/max5triv.ini index 005c3627ad2..9c466209942 100644 --- a/configs/sim/axis/vismach/5axis/max5/max5triv.ini +++ b/configs/sim/axis/vismach/5axis/max5/max5triv.ini @@ -6,7 +6,6 @@ JOINTS = 6 [HAL] HALFILE = max5triv.hal -HALUI = halui [EMC] VERSION = 1.1 diff --git a/configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini b/configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini index bd6dc79e82a..d526e341f63 100644 --- a/configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini +++ b/configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini @@ -32,7 +32,6 @@ KINEMATICS = xyzab_tdr_kins JOINTS = 5 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = xyzab-tdr-postgui.hal diff --git a/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini b/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini index 9c2bc00e33e..1436f780f3f 100644 --- a/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini +++ b/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini @@ -44,7 +44,6 @@ KINEMATICS = xyzac-trt-kins sparm=identityfirst JOINTS = 5 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = switchkins_postgui.hal diff --git a/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini b/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini index 45d780a251c..278b8aa1262 100644 --- a/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini +++ b/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini @@ -44,7 +44,6 @@ KINEMATICS = xyzbc-trt-kins sparm=identityfirst JOINTS = 5 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = switchkins_postgui.hal diff --git a/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini b/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini index 2be585e6ef8..c9bcb54ce49 100644 --- a/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini +++ b/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini @@ -70,7 +70,6 @@ PRIMARY = C SECONDARY = B [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = xyzacb-trsrn_postgui.hal diff --git a/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini b/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini index d3032855aee..ef3e476225d 100644 --- a/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini +++ b/configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini @@ -70,7 +70,6 @@ PRIMARY = C SECONDARY = A [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = xyzbca-trsrn_postgui.hal diff --git a/configs/sim/axis/vismach/VMC_toolchange/vmc_graycode.ini b/configs/sim/axis/vismach/VMC_toolchange/vmc_graycode.ini index 35ee95f4ab3..da6425d924c 100644 --- a/configs/sim/axis/vismach/VMC_toolchange/vmc_graycode.ini +++ b/configs/sim/axis/vismach/VMC_toolchange/vmc_graycode.ini @@ -30,7 +30,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = vmc.hal HALFILE = sim_vmc.hal HALFILE = spindle.hal diff --git a/configs/sim/axis/vismach/VMC_toolchange/vmc_index.ini b/configs/sim/axis/vismach/VMC_toolchange/vmc_index.ini index 323b7eab813..b4783e494e2 100644 --- a/configs/sim/axis/vismach/VMC_toolchange/vmc_index.ini +++ b/configs/sim/axis/vismach/VMC_toolchange/vmc_index.ini @@ -30,7 +30,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = vmc.hal HALFILE = sim_vmc.hal HALFILE = spindle.hal diff --git a/configs/sim/axis/vismach/delta/ldelta.ini b/configs/sim/axis/vismach/delta/ldelta.ini index a6c95c302fa..fb1393a589f 100644 --- a/configs/sim/axis/vismach/delta/ldelta.ini +++ b/configs/sim/axis/vismach/delta/ldelta.ini @@ -46,7 +46,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = sim_ldelta.hal HALFILE = axis_manualtoolchange.hal -HALUI = halui [TRAJ] COORDINATES = X Y Z A diff --git a/configs/sim/axis/vismach/delta/ldelta_demo.ini b/configs/sim/axis/vismach/delta/ldelta_demo.ini index 8c72659967b..e45ac7d05d6 100644 --- a/configs/sim/axis/vismach/delta/ldelta_demo.ini +++ b/configs/sim/axis/vismach/delta/ldelta_demo.ini @@ -46,7 +46,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = sim_ldelta.hal HALFILE = axis_manualtoolchange.hal -HALUI = halui HALCMD = setp joint.0.jog-enable 1 HALCMD = setp joint.1.jog-enable 1 diff --git a/configs/sim/axis/vismach/delta/rdelta.ini b/configs/sim/axis/vismach/delta/rdelta.ini index e40defb1c41..17d83eaafc1 100644 --- a/configs/sim/axis/vismach/delta/rdelta.ini +++ b/configs/sim/axis/vismach/delta/rdelta.ini @@ -46,7 +46,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = sim_rdelta.hal HALFILE = axis_manualtoolchange.hal -HALUI = halui [TRAJ] COORDINATES = X Y Z A B C U V W diff --git a/configs/sim/axis/vismach/hbm/hbm.ini b/configs/sim/axis/vismach/hbm/hbm.ini index 231778a5009..ae108d96559 100644 --- a/configs/sim/axis/vismach/hbm/hbm.ini +++ b/configs/sim/axis/vismach/hbm/hbm.ini @@ -28,7 +28,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = hbm.hal [TRAJ] diff --git a/configs/sim/axis/vismach/hexapod-sim/hexapod.ini b/configs/sim/axis/vismach/hexapod-sim/hexapod.ini index f42a14799a0..65543c7a8bd 100644 --- a/configs/sim/axis/vismach/hexapod-sim/hexapod.ini +++ b/configs/sim/axis/vismach/hexapod-sim/hexapod.ini @@ -36,7 +36,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = kinematics.hal HALCMD = loadusr -W ./hexagui.py diff --git a/configs/sim/axis/vismach/melfa-sim/melfa-sim-genser/melfa-sim-genser.ini b/configs/sim/axis/vismach/melfa-sim/melfa-sim-genser/melfa-sim-genser.ini index cfea9e01701..59221f236fb 100644 --- a/configs/sim/axis/vismach/melfa-sim/melfa-sim-genser/melfa-sim-genser.ini +++ b/configs/sim/axis/vismach/melfa-sim/melfa-sim-genser/melfa-sim-genser.ini @@ -8,7 +8,6 @@ KINEMATICS= genserkins JOINTS= 6 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = melfa_mdh.hal HALCMD = loadusr -W ../melfagui.py diff --git a/configs/sim/axis/vismach/melfa-sim/melfa-sim-three21/melfa_321.ini b/configs/sim/axis/vismach/melfa-sim/melfa-sim-three21/melfa_321.ini index 5a8ba9d4787..495a214a855 100644 --- a/configs/sim/axis/vismach/melfa-sim/melfa-sim-three21/melfa_321.ini +++ b/configs/sim/axis/vismach/melfa-sim/melfa-sim-three21/melfa_321.ini @@ -8,7 +8,6 @@ KINEMATICS= three21kins JOINTS= 6 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = melfa_dh.hal HALCMD = loadusr -W ../melfagui.py diff --git a/configs/sim/axis/vismach/millturn/millturn.ini b/configs/sim/axis/vismach/millturn/millturn.ini index 575947d9dce..9d5ea62d3eb 100644 --- a/configs/sim/axis/vismach/millturn/millturn.ini +++ b/configs/sim/axis/vismach/millturn/millturn.ini @@ -11,7 +11,6 @@ KINEMATICS = millturn JOINTS= 4 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = millturn.hal POSTGUI_HALFILE = millturn-postgui.hal diff --git a/configs/sim/axis/vismach/puma/puma.ini b/configs/sim/axis/vismach/puma/puma.ini index 99c0fa33112..c9eee69634a 100644 --- a/configs/sim/axis/vismach/puma/puma.ini +++ b/configs/sim/axis/vismach/puma/puma.ini @@ -8,7 +8,6 @@ KINEMATICS = pumakins JOINTS = 6 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = puma_dh.hal HALCMD = loadusr -W ./pumagui.py diff --git a/configs/sim/axis/vismach/puma/puma560.ini b/configs/sim/axis/vismach/puma/puma560.ini index 046f5d118d5..31ca764725d 100644 --- a/configs/sim/axis/vismach/puma/puma560.ini +++ b/configs/sim/axis/vismach/puma/puma560.ini @@ -12,7 +12,6 @@ JOINTS= 6 KINEMATICS= genserkins [HAL] -HALUI = halui HALCMD = loadusr -W ./puma560gui.py HALFILE = LIB:basic_sim.tcl HALFILE = puma560_dh.hal diff --git a/configs/sim/axis/vismach/puma/puma560_uvw.ini b/configs/sim/axis/vismach/puma/puma560_uvw.ini index a6b9f8544e9..df96788061d 100644 --- a/configs/sim/axis/vismach/puma/puma560_uvw.ini +++ b/configs/sim/axis/vismach/puma/puma560_uvw.ini @@ -12,7 +12,6 @@ JOINTS= 9 KINEMATICS= genserkins [HAL] -HALUI = halui HALCMD = loadusr -W ./puma560gui.py HALFILE = LIB:basic_sim.tcl HALFILE = puma560_dh.hal diff --git a/configs/sim/axis/vismach/puma/puma_cube.ini b/configs/sim/axis/vismach/puma/puma_cube.ini index 8397ce3ea7a..d40a54428fc 100644 --- a/configs/sim/axis/vismach/puma/puma_cube.ini +++ b/configs/sim/axis/vismach/puma/puma_cube.ini @@ -99,7 +99,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = puma_dh.hal HALCMD = loadusr -W ./pumagui.py diff --git a/configs/sim/axis/vismach/scara/scara.ini b/configs/sim/axis/vismach/scara/scara.ini index 23323fdc8bf..9daec89d7d5 100644 --- a/configs/sim/axis/vismach/scara/scara.ini +++ b/configs/sim/axis/vismach/scara/scara.ini @@ -55,7 +55,6 @@ JOINTS = 6 KINEMATICS = scarakins coordinates=xyzcab [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALCMD = loadusr -W ./scaragui.py POSTGUI_HALFILE = scara_postgui.hal diff --git a/configs/sim/axis/wrapped_rotary/wrapped_rotary.ini b/configs/sim/axis/wrapped_rotary/wrapped_rotary.ini index 4d2bc2673ec..0c5d7c296c0 100644 --- a/configs/sim/axis/wrapped_rotary/wrapped_rotary.ini +++ b/configs/sim/axis/wrapped_rotary/wrapped_rotary.ini @@ -39,7 +39,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = wrapped_rotary.hal -HALUI = halui [KINS] KINEMATICS = trivkins coordinates=xyza kinstype=BOTH diff --git a/configs/sim/axis/xhc-hb04/README b/configs/sim/axis/xhc-hb04/README index 6b7aba395c3..8468387af72 100644 --- a/configs/sim/axis/xhc-hb04/README +++ b/configs/sim/axis/xhc-hb04/README @@ -162,7 +162,6 @@ For example, the organization for the xhc-hb04-layout2.ini file is: ... | HALFILE = | HALFILE = LIB:xhc-hb04.tcl | xhc-hb04 configuration script - HALUI = halui | Halui specifier [XHC_HB04_CONFIG] | All config items used by LIB:xhc-hb04.tcl layout = | diff --git a/configs/sim/axis/xhc-hb04/xhc-hb04-layout1.ini b/configs/sim/axis/xhc-hb04/xhc-hb04-layout1.ini index f57619ca97a..65147e531cd 100644 --- a/configs/sim/axis/xhc-hb04/xhc-hb04-layout1.ini +++ b/configs/sim/axis/xhc-hb04/xhc-hb04-layout1.ini @@ -9,7 +9,6 @@ MACHINE = xhc-hb04 layout1 demo [HAL] HALFILE = LIB:basic_sim.tcl HALFILE = LIB:xhc-hb04.tcl -HALUI = halui [XHC_HB04_CONFIG] # specify layout = n for LIB:xhc-hb04-layout{n}.cfg files diff --git a/configs/sim/axis/xhc-hb04/xhc-hb04-layout2.ini b/configs/sim/axis/xhc-hb04/xhc-hb04-layout2.ini index eba145fc3fb..f64e9ce1441 100644 --- a/configs/sim/axis/xhc-hb04/xhc-hb04-layout2.ini +++ b/configs/sim/axis/xhc-hb04/xhc-hb04-layout2.ini @@ -9,7 +9,6 @@ MACHINE = xhc-hb04 layout2 demo [HAL] HALFILE = LIB:basic_sim.tcl HALFILE = LIB:xhc-hb04.tcl -HALUI = halui [XHC_HB04_CONFIG] # specify layout = n for LIB:xhc-hb04-layout{n}.cfg files diff --git a/configs/sim/axis/xhc-hb04/xhc-hb04-layout2_mm.ini b/configs/sim/axis/xhc-hb04/xhc-hb04-layout2_mm.ini index 820f965f002..3bf3077f039 100644 --- a/configs/sim/axis/xhc-hb04/xhc-hb04-layout2_mm.ini +++ b/configs/sim/axis/xhc-hb04/xhc-hb04-layout2_mm.ini @@ -7,7 +7,6 @@ VERSION = 1.1 MACHINE = xhc-hb04 layout2 mm demo [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = LIB:xhc-hb04.tcl diff --git a/configs/sim/gmoccapy/6_axis.ini b/configs/sim/gmoccapy/6_axis.ini index 4a1a0179f8c..7431a17fc2e 100644 --- a/configs/sim/gmoccapy/6_axis.ini +++ b/configs/sim/gmoccapy/6_axis.ini @@ -59,7 +59,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = core_sim_6.hal #HALFILE = simulated_home_9.hal diff --git a/configs/sim/gmoccapy/7_axis.ini b/configs/sim/gmoccapy/7_axis.ini index e5d25e7fddb..2f0186f8c1a 100644 --- a/configs/sim/gmoccapy/7_axis.ini +++ b/configs/sim/gmoccapy/7_axis.ini @@ -59,7 +59,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = core_sim_7.hal #HALFILE = simulated_home_9.hal diff --git a/configs/sim/gmoccapy/7_axis_tool.ini b/configs/sim/gmoccapy/7_axis_tool.ini index 62c9b2578a3..71aa1abba3b 100644 --- a/configs/sim/gmoccapy/7_axis_tool.ini +++ b/configs/sim/gmoccapy/7_axis_tool.ini @@ -59,7 +59,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = core_sim_7.hal #HALFILE = simulated_home_9.hal diff --git a/configs/sim/gmoccapy/8_axis.ini b/configs/sim/gmoccapy/8_axis.ini index bbfd5b65dde..19410a0c3b9 100644 --- a/configs/sim/gmoccapy/8_axis.ini +++ b/configs/sim/gmoccapy/8_axis.ini @@ -62,7 +62,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = core_sim_8.hal # Single file that is executed after the GUI has started. diff --git a/configs/sim/gmoccapy/9_axis.ini b/configs/sim/gmoccapy/9_axis.ini index 33fac9bce8d..61791bbb4a1 100644 --- a/configs/sim/gmoccapy/9_axis.ini +++ b/configs/sim/gmoccapy/9_axis.ini @@ -59,7 +59,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = core_sim_9.hal #HALFILE = simulated_home_9.hal diff --git a/configs/sim/gmoccapy/gmoccapy.ini b/configs/sim/gmoccapy/gmoccapy.ini index 217ae378d61..6b64f9bc4a4 100644 --- a/configs/sim/gmoccapy/gmoccapy.ini +++ b/configs/sim/gmoccapy/gmoccapy.ini @@ -96,8 +96,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_4_axis.ini b/configs/sim/gmoccapy/gmoccapy_4_axis.ini index 34e0bd18085..0d34ad8171e 100644 --- a/configs/sim/gmoccapy/gmoccapy_4_axis.ini +++ b/configs/sim/gmoccapy/gmoccapy_4_axis.ini @@ -69,8 +69,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_800x600.ini b/configs/sim/gmoccapy/gmoccapy_800x600.ini index 8c2f29bdca9..95be38c3068 100644 --- a/configs/sim/gmoccapy/gmoccapy_800x600.ini +++ b/configs/sim/gmoccapy/gmoccapy_800x600.ini @@ -87,8 +87,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_XYZAB.ini b/configs/sim/gmoccapy/gmoccapy_XYZAB.ini index 75c0997fcd4..d69347ad008 100644 --- a/configs/sim/gmoccapy/gmoccapy_XYZAB.ini +++ b/configs/sim/gmoccapy/gmoccapy_XYZAB.ini @@ -99,8 +99,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_XYZAC.ini b/configs/sim/gmoccapy/gmoccapy_XYZAC.ini index 1b9348e4742..c67346b2dc6 100644 --- a/configs/sim/gmoccapy/gmoccapy_XYZAC.ini +++ b/configs/sim/gmoccapy/gmoccapy_XYZAC.ini @@ -88,8 +88,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_XYZCW.ini b/configs/sim/gmoccapy/gmoccapy_XYZCW.ini index 9fbb984d4f7..74c66acb95c 100644 --- a/configs/sim/gmoccapy/gmoccapy_XYZCW.ini +++ b/configs/sim/gmoccapy/gmoccapy_XYZCW.ini @@ -84,8 +84,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_blockdelete.ini b/configs/sim/gmoccapy/gmoccapy_blockdelete.ini index 4043aa966d9..bfb3dbd7e86 100644 --- a/configs/sim/gmoccapy/gmoccapy_blockdelete.ini +++ b/configs/sim/gmoccapy/gmoccapy_blockdelete.ini @@ -85,8 +85,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_left_panel.ini b/configs/sim/gmoccapy/gmoccapy_left_panel.ini index 52c9d8b3a30..47e096e3f5e 100644 --- a/configs/sim/gmoccapy/gmoccapy_left_panel.ini +++ b/configs/sim/gmoccapy/gmoccapy_left_panel.ini @@ -78,8 +78,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_messages.ini b/configs/sim/gmoccapy/gmoccapy_messages.ini index 705f051028f..1cf69d4c015 100644 --- a/configs/sim/gmoccapy/gmoccapy_messages.ini +++ b/configs/sim/gmoccapy/gmoccapy_messages.ini @@ -111,8 +111,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_pedant.ini b/configs/sim/gmoccapy/gmoccapy_pedant.ini index 8ca75a3fd8c..2f13186e4f1 100644 --- a/configs/sim/gmoccapy/gmoccapy_pedant.ini +++ b/configs/sim/gmoccapy/gmoccapy_pedant.ini @@ -79,8 +79,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_pyngcgui.ini b/configs/sim/gmoccapy/gmoccapy_pyngcgui.ini index 6bfc5c446a9..dffaee23f46 100644 --- a/configs/sim/gmoccapy/gmoccapy_pyngcgui.ini +++ b/configs/sim/gmoccapy/gmoccapy_pyngcgui.ini @@ -114,8 +114,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_pyngcgui_gcmc.ini b/configs/sim/gmoccapy/gmoccapy_pyngcgui_gcmc.ini index de4a5e50836..303fe9156ea 100644 --- a/configs/sim/gmoccapy/gmoccapy_pyngcgui_gcmc.ini +++ b/configs/sim/gmoccapy/gmoccapy_pyngcgui_gcmc.ini @@ -115,8 +115,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_qt_messages.ini b/configs/sim/gmoccapy/gmoccapy_qt_messages.ini index d15480633da..e77de499b01 100644 --- a/configs/sim/gmoccapy/gmoccapy_qt_messages.ini +++ b/configs/sim/gmoccapy/gmoccapy_qt_messages.ini @@ -109,8 +109,6 @@ POSTGUI_HALFILE = gmoccapy_postgui.hal POSTGUI_HALCMD = loadusr -Wn ini_dialogs qtvcp --ini gmoccapy_qt_messages.ini -q ini_dialogs POSTGUI_HALCMD = setp ini_dialogs.VFD 1 -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_right_panel.ini b/configs/sim/gmoccapy/gmoccapy_right_panel.ini index 62213d687d5..35130499f47 100644 --- a/configs/sim/gmoccapy/gmoccapy_right_panel.ini +++ b/configs/sim/gmoccapy/gmoccapy_right_panel.ini @@ -74,8 +74,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_sim_hardware_button.ini b/configs/sim/gmoccapy/gmoccapy_sim_hardware_button.ini index 704e64d796d..6f5f225cd5b 100644 --- a/configs/sim/gmoccapy/gmoccapy_sim_hardware_button.ini +++ b/configs/sim/gmoccapy/gmoccapy_sim_hardware_button.ini @@ -82,8 +82,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_tool_sensor.ini b/configs/sim/gmoccapy/gmoccapy_tool_sensor.ini index 37daf107549..6f607735a8d 100644 --- a/configs/sim/gmoccapy/gmoccapy_tool_sensor.ini +++ b/configs/sim/gmoccapy/gmoccapy_tool_sensor.ini @@ -104,8 +104,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini b/configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini index 9ac53efa54b..2a186a7145d 100644 --- a/configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini +++ b/configs/sim/gmoccapy/gmoccapy_with_user_tabs.ini @@ -99,8 +99,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/lathe_configs/lathe.ini b/configs/sim/gmoccapy/lathe_configs/lathe.ini index 71da9ff283d..4df6ba4e8d6 100644 --- a/configs/sim/gmoccapy/lathe_configs/lathe.ini +++ b/configs/sim/gmoccapy/lathe_configs/lathe.ini @@ -76,8 +76,6 @@ HALFILE = simulated_home_lathe.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/lathe_configs/lathe_C.ini b/configs/sim/gmoccapy/lathe_configs/lathe_C.ini index b47ec8d569d..96c75824987 100644 --- a/configs/sim/gmoccapy/lathe_configs/lathe_C.ini +++ b/configs/sim/gmoccapy/lathe_configs/lathe_C.ini @@ -77,8 +77,6 @@ HALFILE = simulated_home_lathe.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/lathe_configs/lathe_CW.ini b/configs/sim/gmoccapy/lathe_configs/lathe_CW.ini index e5bd6640c33..05a775972f8 100644 --- a/configs/sim/gmoccapy/lathe_configs/lathe_CW.ini +++ b/configs/sim/gmoccapy/lathe_configs/lathe_CW.ini @@ -77,8 +77,6 @@ HALFILE = simulated_home_lathe.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/lathe_configs/lathe_backtool.ini b/configs/sim/gmoccapy/lathe_configs/lathe_backtool.ini index b49ae755431..6859eb479e8 100644 --- a/configs/sim/gmoccapy/lathe_configs/lathe_backtool.ini +++ b/configs/sim/gmoccapy/lathe_configs/lathe_backtool.ini @@ -77,8 +77,6 @@ HALFILE = simulated_home_lathe.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/lathe_configs/lathe_imperial.ini b/configs/sim/gmoccapy/lathe_configs/lathe_imperial.ini index e95ffdd29ac..1b600a31078 100644 --- a/configs/sim/gmoccapy/lathe_configs/lathe_imperial.ini +++ b/configs/sim/gmoccapy/lathe_configs/lathe_imperial.ini @@ -77,8 +77,6 @@ HALFILE = simulated_home_lathe.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/lathe_configs/lathe_macros.ini b/configs/sim/gmoccapy/lathe_configs/lathe_macros.ini index c3a49f61433..198ccbb5995 100644 --- a/configs/sim/gmoccapy/lathe_configs/lathe_macros.ini +++ b/configs/sim/gmoccapy/lathe_configs/lathe_macros.ini @@ -82,8 +82,6 @@ HALFILE = simulated_home_lathe.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = ./gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gmoccapy/lathe_configs/lathehandler.py b/configs/sim/gmoccapy/lathe_configs/lathehandler.py index b8ae574d4b0..46e2bd403a9 100755 --- a/configs/sim/gmoccapy/lathe_configs/lathehandler.py +++ b/configs/sim/gmoccapy/lathe_configs/lathehandler.py @@ -198,7 +198,6 @@ def cycle_pin(self, pin, data = None): if c is not None: self.cmd.abort() self.cmd.mode(linuxcnc.MODE_MDI) - self.cmd.wait_complete() c.emit('clicked') print(c.get_name(), "clicked") diff --git a/configs/sim/gmoccapy/non_trivial_kinematics/Gantry/gantry_mm.ini b/configs/sim/gmoccapy/non_trivial_kinematics/Gantry/gantry_mm.ini index 979e8775798..f5a577d52e8 100644 --- a/configs/sim/gmoccapy/non_trivial_kinematics/Gantry/gantry_mm.ini +++ b/configs/sim/gmoccapy/non_trivial_kinematics/Gantry/gantry_mm.ini @@ -54,7 +54,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = gantry_mm.hal -HALUI = halui # Single file that is executed after the GUI has started. #POSTGUI_HALFILE = gmoccapy_postgui.hal diff --git a/configs/sim/gmoccapy/non_trivial_kinematics/scara/scara.ini b/configs/sim/gmoccapy/non_trivial_kinematics/scara/scara.ini index 37b2ad9a241..9120639155a 100644 --- a/configs/sim/gmoccapy/non_trivial_kinematics/scara/scara.ini +++ b/configs/sim/gmoccapy/non_trivial_kinematics/scara/scara.ini @@ -44,7 +44,6 @@ SERVO_PERIOD = 1000000 TRAJ_PERIOD = 10000000 [HAL] -HALUI = halui HALFILE = scara_sim_4.hal POSTGUI_HALFILE = postgui.hal diff --git a/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/xyzac-trt.ini b/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/xyzac-trt.ini index ad1ea4a3877..50f5888fc8a 100644 --- a/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/xyzac-trt.ini +++ b/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/xyzac-trt.ini @@ -31,7 +31,6 @@ TOPLEVEL = ../../python/toplevel.py LOG_LEVEL = 0 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl -no_use_hal_manualtoolchange # vismach xyzac-trt-gui items diff --git a/configs/sim/gmoccapy/plasma_config/gmoccapy_plasma.ini b/configs/sim/gmoccapy/plasma_config/gmoccapy_plasma.ini index 5e0dffb5895..6037033e80b 100644 --- a/configs/sim/gmoccapy/plasma_config/gmoccapy_plasma.ini +++ b/configs/sim/gmoccapy/plasma_config/gmoccapy_plasma.ini @@ -79,8 +79,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gmoccapy_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen.ini b/configs/sim/gscreen/gscreen.ini index 42b90a1c5f5..b1232f673dc 100644 --- a/configs/sim/gscreen/gscreen.ini +++ b/configs/sim/gscreen/gscreen.ini @@ -132,8 +132,6 @@ HALFILE = simulated_home.hal # AXIS at this time (only AXIS creates a HAL component of its own) # POSTGUI_HALFILE = test_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen_custom/9axis.ini b/configs/sim/gscreen/gscreen_custom/9axis.ini index 89ff1072083..7f88fa8c9d3 100644 --- a/configs/sim/gscreen/gscreen_custom/9axis.ini +++ b/configs/sim/gscreen/gscreen_custom/9axis.ini @@ -102,8 +102,6 @@ HALFILE = locking_indexer.hal # Single file that is executed after the GUI has started. #POSTGUI_HALFILE = test_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen_custom/gaxis_no_plot.ini b/configs/sim/gscreen/gscreen_custom/gaxis_no_plot.ini index e91dd76845b..b7f485284c9 100644 --- a/configs/sim/gscreen/gscreen_custom/gaxis_no_plot.ini +++ b/configs/sim/gscreen/gscreen_custom/gaxis_no_plot.ini @@ -99,8 +99,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gaxis_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen_custom/gscreen_gaxis.ini b/configs/sim/gscreen/gscreen_custom/gscreen_gaxis.ini index d27ba0bd229..c2abe2d8f28 100644 --- a/configs/sim/gscreen/gscreen_custom/gscreen_gaxis.ini +++ b/configs/sim/gscreen/gscreen_custom/gscreen_gaxis.ini @@ -99,8 +99,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = gaxis_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen_custom/industrial.ini b/configs/sim/gscreen/gscreen_custom/industrial.ini index 0aa100bbfd8..ca2d99900a0 100644 --- a/configs/sim/gscreen/gscreen_custom/industrial.ini +++ b/configs/sim/gscreen/gscreen_custom/industrial.ini @@ -101,8 +101,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = industrial_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen_custom/tester.ini b/configs/sim/gscreen/gscreen_custom/tester.ini index 3b6f6145815..6924beacf6e 100644 --- a/configs/sim/gscreen/gscreen_custom/tester.ini +++ b/configs/sim/gscreen/gscreen_custom/tester.ini @@ -90,8 +90,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = tester_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen_custom/tester_metric.ini b/configs/sim/gscreen/gscreen_custom/tester_metric.ini index e9d51848396..f313e40a46e 100644 --- a/configs/sim/gscreen/gscreen_custom/tester_metric.ini +++ b/configs/sim/gscreen/gscreen_custom/tester_metric.ini @@ -102,8 +102,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = tester_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/gscreen_lathe.ini b/configs/sim/gscreen/gscreen_lathe.ini index b219e1e5931..23b5e756339 100644 --- a/configs/sim/gscreen/gscreen_lathe.ini +++ b/configs/sim/gscreen/gscreen_lathe.ini @@ -42,7 +42,6 @@ SERVO_PERIOD = 1000000 CYCLE_TIME = 0.001 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = lathe_postgui.hal diff --git a/configs/sim/gscreen/gscreen_mm.ini b/configs/sim/gscreen/gscreen_mm.ini index fb27c3da7c8..af7a205c95f 100644 --- a/configs/sim/gscreen/gscreen_mm.ini +++ b/configs/sim/gscreen/gscreen_mm.ini @@ -103,8 +103,6 @@ HALFILE = simulated_home.hal # AXIS at this time (only AXIS creates a HAL component of its own) #POSTGUI_HALFILE = test_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] #No Content diff --git a/configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini b/configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini index a18d281d567..9032cffcfe2 100644 --- a/configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini +++ b/configs/sim/gscreen/industrial_lathe_wear/industrial_lathe_wear.ini @@ -44,7 +44,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl POSTGUI_HALFILE = lathe_postgui.hal diff --git a/configs/sim/gscreen/ngcgui/pyngcgui_gscreen.ini b/configs/sim/gscreen/ngcgui/pyngcgui_gscreen.ini index bbc2903e276..5ad0a976566 100644 --- a/configs/sim/gscreen/ngcgui/pyngcgui_gscreen.ini +++ b/configs/sim/gscreen/ngcgui/pyngcgui_gscreen.ini @@ -91,7 +91,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/gscreen/ngcgui/pyngcgui_gscreen_popupkeyboard.ini b/configs/sim/gscreen/ngcgui/pyngcgui_gscreen_popupkeyboard.ini index cba1b603180..d4c922f9b96 100644 --- a/configs/sim/gscreen/ngcgui/pyngcgui_gscreen_popupkeyboard.ini +++ b/configs/sim/gscreen/ngcgui/pyngcgui_gscreen_popupkeyboard.ini @@ -88,7 +88,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/gscreen/silverdragon/silverdragon.ini b/configs/sim/gscreen/silverdragon/silverdragon.ini index fe2e27123d9..c7932c2b49e 100644 --- a/configs/sim/gscreen/silverdragon/silverdragon.ini +++ b/configs/sim/gscreen/silverdragon/silverdragon.ini @@ -77,7 +77,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. #POSTGUI_HALFILE = silverdragon_postgui.hal -HALUI = halui # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/gscreen/spartan/spartan.ini b/configs/sim/gscreen/spartan/spartan.ini index dbdc9baa8b8..1de14983b2e 100644 --- a/configs/sim/gscreen/spartan/spartan.ini +++ b/configs/sim/gscreen/spartan/spartan.ini @@ -43,7 +43,6 @@ TASK = milltask CYCLE_TIME = 0.010 [HAL] -HALUI = halui HALFILE = spartan.hal HALFILE = simulated_home.hal HALFILE = custom.hal diff --git a/configs/sim/pyvcp_demo/pyvcp_bottom_panel.ini b/configs/sim/pyvcp_demo/pyvcp_bottom_panel.ini index ea8520ed706..07d9fb0e31b 100644 --- a/configs/sim/pyvcp_demo/pyvcp_bottom_panel.ini +++ b/configs/sim/pyvcp_demo/pyvcp_bottom_panel.ini @@ -117,8 +117,6 @@ HALFILE = simulated_home.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = pyvcp_bottom_panel.hal -HALUI = halui - [HALUI] # add halui MDI commands here (max 64) diff --git a/configs/sim/pyvcp_demo/pyvcp_demo1.ini b/configs/sim/pyvcp_demo/pyvcp_demo1.ini index 57be35b0ef0..076710de532 100644 --- a/configs/sim/pyvcp_demo/pyvcp_demo1.ini +++ b/configs/sim/pyvcp_demo/pyvcp_demo1.ini @@ -114,8 +114,6 @@ HALFILE = simulated_home.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = custom.hal -HALUI = halui - [HALUI] # add halui MDI commands here (max 64) diff --git a/configs/sim/pyvcp_demo/pyvcp_embed_tab.ini b/configs/sim/pyvcp_demo/pyvcp_embed_tab.ini index 1895448e577..80574f49fd3 100644 --- a/configs/sim/pyvcp_demo/pyvcp_embed_tab.ini +++ b/configs/sim/pyvcp_demo/pyvcp_embed_tab.ini @@ -118,8 +118,6 @@ HALFILE = simulated_home.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = pyvcp_embed_tab.hal -HALUI = halui - [HALUI] # add halui MDI commands here (max 64) diff --git a/configs/sim/qtaxis/non-trivial/scara/scara.ini b/configs/sim/qtaxis/non-trivial/scara/scara.ini index 00ea3d2a1ca..041ae255c34 100644 --- a/configs/sim/qtaxis/non-trivial/scara/scara.ini +++ b/configs/sim/qtaxis/non-trivial/scara/scara.ini @@ -119,7 +119,6 @@ JOINTS = 6 KINEMATICS = scarakins coordinates=xyzcab [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [HALUI] diff --git a/configs/sim/qtaxis/xyz/qtaxis.ini b/configs/sim/qtaxis/xyz/qtaxis.ini index 12cf1911843..2f9dcb2afa7 100644 --- a/configs/sim/qtaxis/xyz/qtaxis.ini +++ b/configs/sim/qtaxis/xyz/qtaxis.ini @@ -177,8 +177,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini index 8c16d5e1d20..d84babffac8 100644 --- a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini +++ b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyz.ini @@ -120,7 +120,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyzw.ini b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyzw.ini index b3614ef512a..791aefecd93 100644 --- a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyzw.ini +++ b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyyzw.ini @@ -122,7 +122,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzy.ini b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzy.ini index 1430466c4dc..f76d1d3d9a4 100644 --- a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzy.ini +++ b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzy.ini @@ -120,7 +120,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzya.ini b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzya.ini index e37a803deae..10bb8a88291 100644 --- a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzya.ini +++ b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzya.ini @@ -124,7 +124,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_yyxz.ini b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_yyxz.ini index 54631bbbfd8..cc39f30a238 100644 --- a/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_yyxz.ini +++ b/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_yyxz.ini @@ -120,7 +120,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_tool_probe/qtdragon_auto_tool_probe.ini b/configs/sim/qtdragon/qtdragon_tool_probe/qtdragon_auto_tool_probe.ini index cd8c1cd4ae7..109740b4e3d 100644 --- a/configs/sim/qtdragon/qtdragon_tool_probe/qtdragon_auto_tool_probe.ini +++ b/configs/sim/qtdragon/qtdragon_tool_probe/qtdragon_auto_tool_probe.ini @@ -144,7 +144,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge HALFILE = core_sim.hal diff --git a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_inch.ini b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_inch.ini index 4be20c9b004..f4a3cf65d14 100644 --- a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_inch.ini +++ b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_inch.ini @@ -153,7 +153,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric.ini b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric.ini index c246e1d6845..561179e06ac 100644 --- a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric.ini +++ b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric.ini @@ -150,7 +150,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric_debug.ini b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric_debug.ini index b2bb0b8ddd2..347ebd1ff4d 100644 --- a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric_debug.ini +++ b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_metric_debug.ini @@ -158,7 +158,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_xyza.ini b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_xyza.ini index 466f0e98085..8eabb84c516 100644 --- a/configs/sim/qtdragon/qtdragon_xyz/qtdragon_xyza.ini +++ b/configs/sim/qtdragon/qtdragon_xyz/qtdragon_xyza.ini @@ -129,7 +129,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui # loads the HAL machine simulation HALFILE = gantrysim.hal HALFILE = simulated-gantry-home.hal diff --git a/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyza.ini b/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyza.ini index 59e43f1cb63..0477fec4d1c 100644 --- a/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyza.ini +++ b/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyza.ini @@ -125,7 +125,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzab.ini b/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzab.ini index 41dbf6364b5..59ac96fee1e 100644 --- a/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzab.ini +++ b/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzab.ini @@ -125,7 +125,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzac.ini b/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzac.ini index 01fc99beefe..70857afcdf4 100644 --- a/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzac.ini +++ b/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzac.ini @@ -125,7 +125,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical.ini b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical.ini index 605f9700ce1..22d30d42e14 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical.ini @@ -128,7 +128,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge HALFILE = core_sim.hal diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical_xyza.ini b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical_xyza.ini index d8e88f3b704..e412ddcec3b 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical_xyza.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_vertical_xyza.ini @@ -131,7 +131,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyz.ini b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyz.ini index 25283374243..c3d249406bd 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyz.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyz.ini @@ -126,7 +126,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge HALFILE = core_sim.hal diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyza.ini b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyza.ini index b206ed1a7db..20e593a5275 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyza.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyza.ini @@ -128,7 +128,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzab.ini b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzab.ini index a489db176c6..660227adaa2 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzab.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzab.ini @@ -125,7 +125,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzac.ini b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzac.ini index 2d2c97b1e17..70e904de811 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzac.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_hd_xyzac.ini @@ -125,7 +125,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge # loads the HAL machine simulation diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_next_xyz.ini b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_next_xyz.ini index aaf67603a23..b99a925b8d9 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_next_xyz.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_xyz/qtdragon_next_xyz.ini @@ -120,7 +120,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALFILE = core_sim.hal HALFILE = simulated_home.hal # this file is loaded after qtdragon has made it's HAl pins diff --git a/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini b/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini index 274443940af..1e25dd5e056 100644 --- a/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini +++ b/configs/sim/qtdragon_hd/qtdragon_hd_z_compensation/qtdragon_hd_z_compensation.ini @@ -120,7 +120,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALBRIDGE = hal_bridge HALFILE = core_sim.hal diff --git a/configs/sim/qtdragon_lathe/basic_xz_lathe/lathe.ini b/configs/sim/qtdragon_lathe/basic_xz_lathe/lathe.ini index 6d5a04b2c14..1c810b286ee 100644 --- a/configs/sim/qtdragon_lathe/basic_xz_lathe/lathe.ini +++ b/configs/sim/qtdragon_lathe/basic_xz_lathe/lathe.ini @@ -56,7 +56,6 @@ SERVO_PERIOD = 1000000 CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALBRIDGE = hal_bridge HALFILE = LIB:basic_sim.tcl diff --git a/configs/sim/qtplasmac/qtplasmac_imperial_ini.inc b/configs/sim/qtplasmac/qtplasmac_imperial_ini.inc index 23f990a8d0e..881a6872d59 100644 --- a/configs/sim/qtplasmac/qtplasmac_imperial_ini.inc +++ b/configs/sim/qtplasmac/qtplasmac_imperial_ini.inc @@ -19,7 +19,6 @@ HALFILE = qtplasmac_comp.hal HALFILE = custom.hal POSTGUI_HALFILE = custom_postgui.hal POSTGUI_HALFILE = sim_postgui.hal -HALUI = halui [EMC] VERSION = 1.1 diff --git a/configs/sim/qtplasmac/qtplasmac_metric_ini.inc b/configs/sim/qtplasmac/qtplasmac_metric_ini.inc index 12e6c3fb39e..82f0df7c161 100644 --- a/configs/sim/qtplasmac/qtplasmac_metric_ini.inc +++ b/configs/sim/qtplasmac/qtplasmac_metric_ini.inc @@ -19,7 +19,6 @@ HALFILE = qtplasmac_comp.hal HALFILE = custom.hal POSTGUI_HALFILE = custom_postgui.hal POSTGUI_HALFILE = sim_postgui.hal -HALUI = halui [EMC] VERSION = 1.1 diff --git a/configs/sim/qttouchy/qttouchy.ini b/configs/sim/qttouchy/qttouchy.ini index ef616ba42fd..5690b1cae85 100644 --- a/configs/sim/qttouchy/qttouchy.ini +++ b/configs/sim/qttouchy/qttouchy.ini @@ -158,8 +158,6 @@ HALFILE = simulated_home.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/blender.ini b/configs/sim/qtvcp_screens/blender.ini index 6e091cd644b..4ebdd924f49 100644 --- a/configs/sim/qtvcp_screens/blender.ini +++ b/configs/sim/qtvcp_screens/blender.ini @@ -167,8 +167,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/industrial_lathe_wear/industrial_lathe_wear.ini b/configs/sim/qtvcp_screens/industrial_lathe_wear/industrial_lathe_wear.ini index 12effa9efe5..992f211af75 100644 --- a/configs/sim/qtvcp_screens/industrial_lathe_wear/industrial_lathe_wear.ini +++ b/configs/sim/qtvcp_screens/industrial_lathe_wear/industrial_lathe_wear.ini @@ -64,7 +64,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl -no_use_hal_manualtoolchange POSTGUI_HALFILE = qtvcp_postgui.hal diff --git a/configs/sim/qtvcp_screens/non-trivial/scara/scara.ini b/configs/sim/qtvcp_screens/non-trivial/scara/scara.ini index 97f588c2e34..d786c83435c 100644 --- a/configs/sim/qtvcp_screens/non-trivial/scara/scara.ini +++ b/configs/sim/qtvcp_screens/non-trivial/scara/scara.ini @@ -120,7 +120,6 @@ JOINTS = 6 KINEMATICS = scarakins coordinates=xyzcab [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [HALUI] diff --git a/configs/sim/qtvcp_screens/qt_800x600.ini b/configs/sim/qtvcp_screens/qt_800x600.ini index ff78136c0b7..2def79cb40b 100644 --- a/configs/sim/qtvcp_screens/qt_800x600.ini +++ b/configs/sim/qtvcp_screens/qt_800x600.ini @@ -124,8 +124,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtaxis.ini b/configs/sim/qtvcp_screens/qtaxis.ini index c023a0607a8..bc4fe148af4 100644 --- a/configs/sim/qtvcp_screens/qtaxis.ini +++ b/configs/sim/qtvcp_screens/qtaxis.ini @@ -180,8 +180,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtaxis_lathe/qtaxis_lathe.ini b/configs/sim/qtvcp_screens/qtaxis_lathe/qtaxis_lathe.ini index 0876cac83cc..54ce1466385 100644 --- a/configs/sim/qtvcp_screens/qtaxis_lathe/qtaxis_lathe.ini +++ b/configs/sim/qtvcp_screens/qtaxis_lathe/qtaxis_lathe.ini @@ -154,8 +154,6 @@ POSTGUI_HALFILE = qtvcp_postgui.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - [TRAJ] diff --git a/configs/sim/qtvcp_screens/qtaxis_mpg.ini b/configs/sim/qtvcp_screens/qtaxis_mpg.ini index e5bb171e719..bbcc52ad9c1 100644 --- a/configs/sim/qtvcp_screens/qtaxis_mpg.ini +++ b/configs/sim/qtvcp_screens/qtaxis_mpg.ini @@ -207,8 +207,6 @@ POSTGUI_HALCMD = setp qtaxis.mpg-enable 1 #POSTGUI_HALCMD = net mpg-enable qtaxis.mpg-enable sim_panel.selectscroll POSTGUI_HALCMD = net mpg qtaxis.mpg-in sim_panel.MPG-s -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtdefault.ini b/configs/sim/qtvcp_screens/qtdefault.ini index 78061f39987..cb378c86c02 100644 --- a/configs/sim/qtvcp_screens/qtdefault.ini +++ b/configs/sim/qtvcp_screens/qtdefault.ini @@ -170,8 +170,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtdefault_9axis.ini b/configs/sim/qtvcp_screens/qtdefault_9axis.ini index dad0c31c2e6..419615a9615 100644 --- a/configs/sim/qtvcp_screens/qtdefault_9axis.ini +++ b/configs/sim/qtvcp_screens/qtdefault_9axis.ini @@ -56,7 +56,6 @@ SERVO_PERIOD = 1000000 TOOL_CHANGE_POSITION = 0 0 2 [HAL] - HALUI = halui HALFILE = LIB:basic_sim.tcl -no_use_hal_manualtoolchange HALFILE = locking_indexer.hal diff --git a/configs/sim/qtvcp_screens/qtdefault_mm.ini b/configs/sim/qtvcp_screens/qtdefault_mm.ini index a696d4597e4..de74d574c11 100644 --- a/configs/sim/qtvcp_screens/qtdefault_mm.ini +++ b/configs/sim/qtvcp_screens/qtdefault_mm.ini @@ -110,8 +110,6 @@ HALFILE = simulated_home.hal # Single file that is executed after the GUI has started. POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] COORDINATES = X Y Z diff --git a/configs/sim/qtvcp_screens/qtdragon/qtdragon_mpg.ini b/configs/sim/qtvcp_screens/qtdragon/qtdragon_mpg.ini index a28b0a1e885..534757ff6bc 100644 --- a/configs/sim/qtvcp_screens/qtdragon/qtdragon_mpg.ini +++ b/configs/sim/qtvcp_screens/qtdragon/qtdragon_mpg.ini @@ -110,7 +110,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALFILE = core_sim.hal HALFILE = simulated_home.hal #HALFILE = custom.hal diff --git a/configs/sim/qtvcp_screens/qtvcp_custom/qtdefault_ngc.ini b/configs/sim/qtvcp_screens/qtvcp_custom/qtdefault_ngc.ini index 0372ad865c1..0aa0ece3706 100644 --- a/configs/sim/qtvcp_screens/qtvcp_custom/qtdefault_ngc.ini +++ b/configs/sim/qtvcp_screens/qtvcp_custom/qtdefault_ngc.ini @@ -189,8 +189,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtvcp_experimental/gremlin.ini b/configs/sim/qtvcp_screens/qtvcp_experimental/gremlin.ini index 0270b000131..39961324f7d 100644 --- a/configs/sim/qtvcp_screens/qtvcp_experimental/gremlin.ini +++ b/configs/sim/qtvcp_screens/qtvcp_experimental/gremlin.ini @@ -192,8 +192,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtvcp_experimental/lathehandler.py b/configs/sim/qtvcp_screens/qtvcp_experimental/lathehandler.py index 4997894099e..eedbc15047c 100644 --- a/configs/sim/qtvcp_screens/qtvcp_experimental/lathehandler.py +++ b/configs/sim/qtvcp_screens/qtvcp_experimental/lathehandler.py @@ -188,7 +188,6 @@ def cycle_pin(self, pin, data = None): if c.name.partition('.')[2] == 'action': self.cmd.abort() self.cmd.mode(linuxcnc.MODE_MANUAL) - self.cmd.wait_complete() c.emit('clicked') def gash(self, obj, data = None): diff --git a/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_gladevcp.ini b/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_gladevcp.ini index 14820649397..dbcab0b5d15 100644 --- a/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_gladevcp.ini +++ b/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_gladevcp.ini @@ -192,8 +192,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_ngc.ini b/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_ngc.ini index 0372ad865c1..0aa0ece3706 100644 --- a/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_ngc.ini +++ b/configs/sim/qtvcp_screens/qtvcp_experimental/qtdefault_ngc.ini @@ -189,8 +189,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/qtx1mill.ini b/configs/sim/qtvcp_screens/qtx1mill.ini index 0e3a2d3c334..b9aa6c59dec 100644 --- a/configs/sim/qtvcp_screens/qtx1mill.ini +++ b/configs/sim/qtvcp_screens/qtx1mill.ini @@ -174,8 +174,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/qtvcp_screens/tester.ini b/configs/sim/qtvcp_screens/tester.ini index 4cec31b24f5..4b3b493e67b 100644 --- a/configs/sim/qtvcp_screens/tester.ini +++ b/configs/sim/qtvcp_screens/tester.ini @@ -144,8 +144,6 @@ HALFILE = check_constraints.hal # AXIS at this time (only AXIS creates a HAL component of its own) #POSTGUI_HALFILE = qtvcp_postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [HALUI] diff --git a/configs/sim/tklinuxcnc/ldelta.ini b/configs/sim/tklinuxcnc/ldelta.ini index c2222ff791e..b2ca19f0afd 100644 --- a/configs/sim/tklinuxcnc/ldelta.ini +++ b/configs/sim/tklinuxcnc/ldelta.ini @@ -46,7 +46,6 @@ SERVO_PERIOD = 1000000 [HAL] HALFILE = sim_ldelta.hal HALFILE = axis_manualtoolchange.hal -HALUI = halui [TRAJ] COORDINATES = X Y Z A diff --git a/configs/sim/tklinuxcnc/trivkins/xzbase.inc b/configs/sim/tklinuxcnc/trivkins/xzbase.inc index b78b08f35f5..6bb1b111101 100644 --- a/configs/sim/tklinuxcnc/trivkins/xzbase.inc +++ b/configs/sim/tklinuxcnc/trivkins/xzbase.inc @@ -1,6 +1,5 @@ [HAL] HALFILE = LIB:basic_sim.tcl - HALUI = halui [TRAJ] COORDINATES = XZ diff --git a/configs/sim/touchy/ngcgui/pyngcgui_touchy.ini b/configs/sim/touchy/ngcgui/pyngcgui_touchy.ini index 1297e290e42..858c181fa9c 100644 --- a/configs/sim/touchy/ngcgui/pyngcgui_touchy.ini +++ b/configs/sim/touchy/ngcgui/pyngcgui_touchy.ini @@ -54,7 +54,6 @@ CYCLE_TIME = 0.001 [HAL] HALFILE = LIB:basic_sim.tcl -HALUI = halui [TRAJ] COORDINATES = X Y Z diff --git a/configs/sim/touchy/ngcgui/pyngcgui_touchy_lathe.ini b/configs/sim/touchy/ngcgui/pyngcgui_touchy_lathe.ini index 90918ec728c..3eba2ab765e 100644 --- a/configs/sim/touchy/ngcgui/pyngcgui_touchy_lathe.ini +++ b/configs/sim/touchy/ngcgui/pyngcgui_touchy_lathe.ini @@ -64,7 +64,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl [TRAJ] diff --git a/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.ini b/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.ini index 500bf37ed1c..15b52e9c096 100644 --- a/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.ini +++ b/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.ini @@ -54,7 +54,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:basic_sim.tcl HALFILE = LIB:hookup_moveoff.tcl diff --git a/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.txt b/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.txt index df58dc90c87..8154e407807 100644 --- a/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.txt +++ b/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff.txt @@ -5,7 +5,6 @@ modifies pyngcgui_touchy.ini to use: [HAL] ... HALFILE = hookup_move.tcl -HALUI = halui APP = moveoff_gui \ -size 20 -loc center \ diff --git a/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff_es.txt b/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff_es.txt index 4c920b3708e..84b30d69da0 100644 --- a/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff_es.txt +++ b/configs/sim/touchy/ngcgui/pyngcgui_touchy_moveoff_es.txt @@ -5,7 +5,6 @@ modifica pyngcgui_touchy.ini para usar: [HAL] ... HALFILE = hookup_move.tcl -HALUI = halui APP = moveoff_gui \ -size 20 -loc center \ diff --git a/configs/sim/woodpecker/woodpecker.ini b/configs/sim/woodpecker/woodpecker.ini index fc6b389dc99..fd46471f057 100644 --- a/configs/sim/woodpecker/woodpecker.ini +++ b/configs/sim/woodpecker/woodpecker.ini @@ -78,7 +78,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALFILE = core_sim.hal HALFILE = simulated_home.hal #HALFILE = custom.hal diff --git a/configs/sim/woodpecker/woodpecker_auto_tool_probe.ini b/configs/sim/woodpecker/woodpecker_auto_tool_probe.ini index e8fe3935119..07748d5ace9 100644 --- a/configs/sim/woodpecker/woodpecker_auto_tool_probe.ini +++ b/configs/sim/woodpecker/woodpecker_auto_tool_probe.ini @@ -100,7 +100,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui HALFILE = core_sim.hal HALFILE = simulated_home.hal POSTGUI_HALFILE = woodpecker_postgui.hal diff --git a/configs/sim/woodpecker/woodpecker_xyz.ini b/configs/sim/woodpecker/woodpecker_xyz.ini index 911f2c576b0..1631c202240 100644 --- a/configs/sim/woodpecker/woodpecker_xyz.ini +++ b/configs/sim/woodpecker/woodpecker_xyz.ini @@ -87,7 +87,6 @@ SPINDLES = 1 NO_FORCE_HOMING = 1 [HAL] -HALUI = halui HALFILE = core_sim.hal HALFILE = simulated_home.hal #HALFILE = custom.hal diff --git a/configs/sim/woodpecker/woodpecker_xyza.ini b/configs/sim/woodpecker/woodpecker_xyza.ini index 1226c5e7e00..6d2fb66c3b3 100644 --- a/configs/sim/woodpecker/woodpecker_xyza.ini +++ b/configs/sim/woodpecker/woodpecker_xyza.ini @@ -116,7 +116,6 @@ POSITION_FILE = position.txt #NO_FORCE_HOMING = 1 [HAL] -HALUI = halui #HALFILE = core_sim.hal HALFILE = gantrysim.hal HALFILE = simulated-gantry-home.hal diff --git a/configs/sim/woodpecker/woodpecker_xyzab.ini b/configs/sim/woodpecker/woodpecker_xyzab.ini index d6229b133c6..67f1e0f788d 100644 --- a/configs/sim/woodpecker/woodpecker_xyzab.ini +++ b/configs/sim/woodpecker/woodpecker_xyzab.ini @@ -102,7 +102,6 @@ POSITION_FILE = position.txt SPINDLES = 1 [HAL] -HALUI = halui HALFILE = gantrysim-xyzab.hal HALFILE = simulated-gantry-xyzab-home.hal #HALFILE = mpg.hal diff --git a/configs/sim/woodpecker/woodpecker_xyzy.ini b/configs/sim/woodpecker/woodpecker_xyzy.ini index 18f793993f4..bbd8f63a620 100644 --- a/configs/sim/woodpecker/woodpecker_xyzy.ini +++ b/configs/sim/woodpecker/woodpecker_xyzy.ini @@ -84,7 +84,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui #HALFILE = core_sim.hal HALFILE = gantrysim.hal HALFILE = simulated-gantry-home.hal diff --git a/configs/sim/woodpecker/woodpecker_xyzya.ini b/configs/sim/woodpecker/woodpecker_xyzya.ini index 3f0ba0c3b57..87ea1220a07 100644 --- a/configs/sim/woodpecker/woodpecker_xyzya.ini +++ b/configs/sim/woodpecker/woodpecker_xyzya.ini @@ -87,7 +87,6 @@ DEFAULT_LINEAR_VELOCITY = 50.00 SPINDLES = 1 [HAL] -HALUI = halui #HALFILE = core_sim.hal HALFILE = gantrysim.hal HALFILE = simulated-gantry-home.hal diff --git a/docs/src/code/nml-messages.adoc b/docs/src/code/nml-messages.adoc index 307066ea39d..a0489298378 100644 --- a/docs/src/code/nml-messages.adoc +++ b/docs/src/code/nml-messages.adoc @@ -121,7 +121,6 @@ EMC_MOTION_STAT_TYPE EMC_TASK_INIT_TYPE EMC_TASK_HALT_TYPE EMC_TASK_ABORT_TYPE -EMC_TASK_SET_MODE_TYPE EMC_TASK_SET_STATE_TYPE EMC_TASK_PLAN_OPEN_TYPE EMC_TASK_PLAN_RUN_TYPE diff --git a/docs/src/config/ini-config.adoc b/docs/src/config/ini-config.adoc index 4980de30b1d..9fe0aeb6fa5 100644 --- a/docs/src/config/ini-config.adoc +++ b/docs/src/config/ini-config.adoc @@ -778,8 +778,6 @@ For more information see the <> chapter. Some GUIs create HAL pins and support the use of a postgui halfile to use them. GUIs that support postgui HAL files include Touchy, AXIS, Gscreen, and GMOCCAPY. + See section <> for more information. -* `HALUI = halui` - adds the HAL user interface pins. + - For more information see the <> chapter. [[sub:ini:sec:halui]] === [HALUI] section(((INI File,Sections,[HALUI] Section))) @@ -952,6 +950,9 @@ Finally, no amount of tweaking will speed up a tool path with lots of small, tig * `MAX_LINEAR_VELOCITY = 5.0` - (((MAX VELOCITY))) The maximum velocity for any axis or coordinated move, in 'machine units' per second. The value shown equals 300 units per minute. * `MAX_LINEAR_ACCELERATION = 20.0` - (((MAX ACCELERATION))) The maximum acceleration for any axis or coordinated axis move, in 'machine units' per second per second. +* `PAUSE_RETURN_LAST = Z` - (((PAUSE RETURN LAST))) The axes that return last when a paused program or MDI command resumes after jogs while paused. + The other axes return to the paused position first, together in a straight line, then these, so by default the tool comes down onto the point last. + Empty: all axes return in one straight line. The return runs at the axis velocity and acceleration limits. * `PLANNER_TYPE = 0` - (((PLANNER TYPE))) Selects the trajectory planner type: 0 = trapezoidal (default), 1 = S-curve with jerk limiting. S-curve planning is only active when `PLANNER_TYPE = 1` AND `MAX_LINEAR_JERK` is 1.0 or above; a smaller value falls back to trapezoidal, with an operator message. diff --git a/docs/src/config/moveoff.adoc b/docs/src/config/moveoff.adoc index 81e1bb7d605..ed57ccc3079 100644 --- a/docs/src/config/moveoff.adoc +++ b/docs/src/config/moveoff.adoc @@ -114,8 +114,7 @@ to the corresponding joint. Modify an existing configuration as follows: -Make sure there is an INI file entry for `[HAL]HALUI` and create a new -`[HAL]HALFILE` entry for LIB:hookup_moveoff.tcl. +Create a new `[HAL]HALFILE` entry for LIB:hookup_moveoff.tcl. The entry for LIB:hookup_moveoff.tcl should follow all `HALFILE=` entries for HAL files that connect the pins for `joint.N.motor-pos-cmd`, `joint.N.motor-pos-fb`, and any components connected to these pins @@ -124,7 +123,6 @@ for HAL files that connect the pins for `joint.N.motor-pos-cmd`, [source,ini] ---- [HAL] -HALUI = halui HALFILE = existing_configuration_halfile_1 # ... HALFILE = existing_configuration_halfile_n @@ -216,7 +214,6 @@ and mv.bactrack-enable pins to signals: [source,ini] ---- [HAL] -HALUI = halui # ... HALFILE = LIB:hookup_moveoff.tcl HALFILE = LIB:moveoff_external.hal diff --git a/docs/src/config/python-interface.adoc b/docs/src/config/python-interface.adoc index 0fce1c760ac..aa33bd3c575 100644 --- a/docs/src/config/python-interface.adoc +++ b/docs/src/config/python-interface.adoc @@ -287,6 +287,20 @@ see <> for an example. *paused*:: '(returns boolean)' - `motion paused` flag. +*pause_jog_ok*:: '(returns boolean)' - + a pause has stopped the motion of a program or MDI command: axes may + jog, see `pause_offset`. + +*pause_offset*:: '(returns tuple of floats)' - + how far jogs while paused have moved each axis off the paused position. + Resume (or step) brings them back to zero first: the spindles and the + coolant as they were at the pause, the spindles at speed, the axes other + than `[TRAJ]PAUSE_RETURN_LAST` in a straight line, then those, then the + program goes on. An abort keeps the machine where it was jogged to. + +*pause_returning*:: '(returns boolean)' - + resuming after a pause: spindles, back to the paused position, then on. + *single_stepping*:: '(returns boolean)' - `motion single_stepping` flag. @@ -350,6 +364,11 @@ see <> for an example. *task_mode*:: '(returns integer)' - current task mode. One of `MODE_MDI`, `MODE_AUTO`, `MODE_MANUAL`. + `MODE_AUTO` while a program runs (including paused) and `MODE_MDI` + while MDI commands run. While task is idle it is the mode this process + last asked for with `mode()`, `MODE_MANUAL` until then: task's own mode + reports what runs and cannot be set, so each user interface keeps its + own page. *task_paused*:: '(returns integer)' - task paused flag. @@ -579,8 +598,6 @@ def ok_for_mdi(): return not s.estop and s.enabled and (s.homed.count(1) == s.joints) and (s.interp_state == linuxcnc.INTERP_IDLE) if ok_for_mdi(): - c.mode(linuxcnc.MODE_MDI) - c.wait_complete() # wait until mode switch executed (or default timeout of 5s occurs!) c.mdi("G0 X10 Y20 Z30") ---- @@ -627,10 +644,6 @@ c.mdi("G0 X10 Y20 Z30") c.mist(linuxcnc.MIST_ON) c.mist(linuxcnc.MIST_OFF) -c.mode(linuxcnc.MODE_MDI) -c.mode(linuxcnc.MODE_AUTO) -c.mode(linuxcnc.MODE_MANUAL) - c.override_limits() c.program_open("foo.ngc") @@ -719,7 +732,10 @@ c.tool_offset(toolno, z_offset, x_offset, diameter, frontangle, backangle, orie MIST_OFF `mode(int)`:: - set mode (MODE_MDI, MODE_MANUAL, MODE_AUTO). + set the mode this process shows (MODE_MDI, MODE_MANUAL, MODE_AUTO), see + `task_mode`. Nothing is sent to task: it starts an MDI run on `mdi()` + and a program run on `auto(AUTO_RUN)` or `auto(AUTO_STEP)` when it is + idle, and jogs and homes whenever it is idle, whatever mode was set. `override_limits()`:: set the override axis limits flag. diff --git a/docs/src/getting-started/updating-linuxcnc.adoc b/docs/src/getting-started/updating-linuxcnc.adoc index 63decc6e5e2..06ec22bbbbb 100644 --- a/docs/src/getting-started/updating-linuxcnc.adoc +++ b/docs/src/getting-started/updating-linuxcnc.adoc @@ -232,6 +232,77 @@ link:../man/man1/mesambccc.1.html[mesambccc(1)]. The 2.9 release retains the framework, so its documentation remains available in the http://linuxcnc.org/docs/2.9/html/drivers/mesa_modbus.html[2.9 docs]. +=== halui is part of the task controller + +halui is no longer a separate program. Its pins are created by the task +controller in every configuration, before the HAL files are read, so +there is nothing to start. Remove these from existing configurations: + +* `HALUI = halui` in the `[HAL]` section of the INI file. It is no longer + read; LinuxCNC prints a warning at startup while it is still there. +* `loadusr halui` (with or without `-W`/`-Wn halui` and `-ini ...`) in a + HAL file. A compatibility `halui` stub still accepts this and prints a + warning; it will be removed in a later release. + +The pins, `[HALUI]MDI_COMMAND` and the `[DISPLAY]` override limits work +as before, see link:../gui/halui.html[HAL User Interface]. + +=== The task mode cannot be set + +Manual, MDI and Auto are no longer modes a user interface switches +between. Task accepts what fits what it is doing: + +* while idle: jogs, homing, an MDI command (which starts MDI) and a + program run or step (which starts the program); +* while MDI runs: more MDI commands, which queue, pause and abort; +* while a program runs: pause, step and abort, as before. + +Immediate commands such as overrides, spindle and coolant are accepted +as before. Several user interfaces can therefore show different pages at +the same time without taking the machine away from each other. + +* Task's mode, and `halui.mode.is-manual`, `.is-mdi`, `.is-auto`, report + what runs: Auto while a program runs or is paused, MDI while MDI + commands run, Manual otherwise. They change on their own when a run + starts and ends. +* The Python `mode()` command, Tcl `emc_mode` and linuxcncrsh `set mode` + no longer reach task. They set the mode that user interface (Python or + Tcl process, linuxcncrsh connection) shows, which `task_mode`, + `emc_mode` and `get mode` report while task is idle. User interfaces + that switch pages on the mode keep working, each with its own page. +* The `halui.mode.manual`, `.mdi` and `.auto` pins are gone. Remove the + nets that connect them from HAL files: a program start button only + needs `halui.program.run`. The `.is-manual`, `.is-mdi` and `.is-auto` + pins stay. +* Switching to Manual used to abort a running MDI command. It no longer + does: use abort. +* Task puts motion into coordinated mode when a run starts and back into + joint or world mode when it ends, so wheel (MPG) jogs work whenever + nothing runs. A jog in progress, including a wheel jog, holds off MDI + and program starts, which are refused with an error. +* A run started in Manual mode used to be ignored. It now runs the + program. A run or step with no program open is refused. +* While MDI runs, jogs and switching between joint and world mode are + refused; they used to be passed to motion. + +=== Jogging while paused + +Axes can now be jogged, by keyboard, halui, linuxcncrsh or a wheel, while +a program or MDI command is paused, including at M0 and M1, once the pause +has stopped the motion. Joints cannot. On resume (or step) LinuxCNC first: + +. puts the spindles and the coolant back as they were at the pause, and + waits for the spindles to be at speed; +. returns the axes to the paused position: the axes other than + `[TRAJ]PAUSE_RETURN_LAST` (default `Z`) together in a straight line, + then those, at the axis limits; +. goes on with the program. + +Pausing again during the return stops it; the axes can be jogged again +from there. An abort keeps the machine where it was jogged to. Reverse +run is refused while the axes are away from the paused position. AXIS +enables its jog and spindle controls while paused. + == Preview renderer now requires OpenGL 3.3 core diff --git a/docs/src/gui/halui.adoc b/docs/src/gui/halui.adoc index e9c87f8c1ae..fd9c6c1bc80 100644 --- a/docs/src/gui/halui.adoc +++ b/docs/src/gui/halui.adoc @@ -9,25 +9,17 @@ == Introduction Halui is a HAL based user interface for LinuxCNC, it connects HAL pins to -NML commands. Most of the functionality (buttons, indicators etc.) that +machine commands. Most of the functionality (buttons, indicators etc.) that is provided by a traditional GUI (AXIS, GMOCCAPY, QtDragon, etc.), is provided by HAL pins in Halui. -The easiest way to add halui is to add the following to the [HAL] -section of the INI file: +There is nothing to load: the pins exist in every configuration, created +by the task controller before the HAL files are read, so a HAL file can +connect them straight away. A configuration that connects none of them +pays only for a pin scan every 20 ms. -[source,ini] ----- -[HAL] -HALUI = halui ----- - -An alternate way to invoke it (specially if you generate the configuration with StepConf) is to include the following in your `custom.hal` file. + -Make sure you use the correct path to your INI file. - -[source,hal] ----- -loadusr halui -ini /path/to/inifile.ini ----- +Earlier versions ran halui as a separate program, started with +`[HAL]HALUI = halui` in the INI file or `loadusr halui` in a HAL file. +Neither is needed any more; remove them from existing configurations. == MDI @@ -78,8 +70,8 @@ Owner Type Dir Value Name When a halui MDI pin is set (pulsed) true, halui will send the MDI command defined in the INI. -This will not always succeed depending on the current operating -mode (e.g., while in AUTO halui can't successfully send MDI commands). +This will not always succeed depending on what LinuxCNC is doing +(e.g., while a program runs or a jog is active task refuses MDI commands). == Example Configuration @@ -159,11 +151,10 @@ that is set in the [TRAJ] section of the INI file. * 'halui.mdi-command-__' (bool, in) - halui will try to send the MDI command defined in the INI. __ is a two digit number starting at 00. + - If the command succeeds then it will place LinuxCNC in the MDI mode and then back to Manual mode. + If no [HALUI]MDI_COMMAND variables are set in the ini file, no halui.mdi-command- pins will be exported by halui. * 'halui.halui-mdi-is-running' (bool, out) - execution status of MDI commands sent by halui. The status is active - even during mode switching. + from the press until the command finishes. If no [HALUI]MDI_COMMAND variables are set in the ini file, this pins will not be exported by halui. === Joint @@ -242,15 +233,12 @@ _L_ = axis letter (xyzabcuvw) === Mode -* 'halui.mode.auto' (bool, in) - pin for requesting auto mode -* 'halui.mode.is-auto' (bool, out) - indicates auto mode is on +* 'halui.mode.is-auto' (bool, out) - indicates a program runs, or is paused; the task mode follows what task runs and cannot be set * 'halui.mode.is-joint' (bool, out) - indicates joint by joint jog mode is on -* 'halui.mode.is-manual' (bool, out) - indicates manual mode is on -* 'halui.mode.is-mdi' (bool, out) - indicates MDI mode is on +* 'halui.mode.is-manual' (bool, out) - indicates task is idle: neither a program nor MDI runs +* 'halui.mode.is-mdi' (bool, out) - indicates MDI commands run * 'halui.mode.is-teleop' (bool, out) - indicates coordinated jog mode is on * 'halui.mode.joint' (bool, in) - pin for requesting joint by joint jog mode -* 'halui.mode.manual' (bool, in) - pin for requesting manual mode -* 'halui.mode.mdi' (bool, in) - pin for requesting MDI mode * 'halui.mode.teleop' (bool, in) - pin for requesting coordinated jog mode === Program diff --git a/docs/src/hal/basic-hal.adoc b/docs/src/hal/basic-hal.adoc index 0c800c56c9a..73166bd7c55 100644 --- a/docs/src/hal/basic-hal.adoc +++ b/docs/src/hal/basic-hal.adoc @@ -137,7 +137,7 @@ Flags may be one or more of the following: [source,hal] ---- loadusr -loadusr halui +loadusr hal_input loadusr -Wn spindle gs2_vfd -n spindle ---- diff --git a/docs/src/hal/halui-examples.adoc b/docs/src/hal/halui-examples.adoc index 2f237cc14cb..ff0c4d51ee1 100644 --- a/docs/src/hal/halui-examples.adoc +++ b/docs/src/hal/halui-examples.adoc @@ -5,44 +5,19 @@ = Halui Examples (((Halui Examples))) -For any Halui examples to work you need to add the following line to the [HAL] section of the INI file. - -[source,ini] ----- -HALUI = halui ----- +The Halui pins are always available, so these examples work as they stand. [[sec:halui-remote-start]] == Remote Start -To connect a remote program start button to LinuxCNC you use the -`halui.program.run` pin and the `halui.mode.auto` pin. -You have to ensure that it is OK to run first by using the `halui.mode.is-auto` pin. -You do this with an `and2` component. The following figure shows how this is done. -When the Remote Run Button is pressed it is connected to both `halui.mode.auto` and `and2.0.in0`. -If it is OK for auto mode the pin `halui.mode.is-auto` will be on. -If both the inputs to the `and2.0` component are on the `and2.0.out` will be on -and this will start the program. - -.Remote Start Example -image::images/remote-start.png["Remote Start Example"] - -The hal commands needed to accomplish the above are: - -[source,hal] ----- -net program-start-btn halui.mode.auto and2.0.in0 <= -net program-run-ok and2.0.in1 <= halui.mode.is-auto -net remote-program-run halui.program.run <= and2.0.out ----- - -Notice on line one that there are two reader pins, this can also be split -up to two lines like this: +To connect a remote program start button to LinuxCNC connect it to the +`halui.program.run` pin. There is no mode to switch to first: LinuxCNC +starts the program when it is idle and refuses the run otherwise, for +instance while MDI runs or a jog is active. [source,hal] ---- -net program-start-btn halui.mode.auto <= -net program-start-btn and2.0.in0 +net remote-program-run halui.program.run <= ---- == Pause & Resume diff --git a/docs/src/hal/intro.adoc b/docs/src/hal/intro.adoc index b9e3bc8cb1b..a21b3456423 100644 --- a/docs/src/hal/intro.adoc +++ b/docs/src/hal/intro.adoc @@ -242,9 +242,6 @@ The same commands used to build the system can be used to make changes as needed This document is aimed at people who already know how to do this kind of hardware system integration, but who do not know how to connect the hardware to LinuxCNC. See the <> section in the HAL UI Examples documentation. -.Remote Start Example (Schema) -image::images/remote-start.png["Remote Start Example (Schema)"] - The traditional hardware design as described above ends at the edge of the main control. Outside the control are a bunch of relatively simple boxes, connected together to do whatever is needed. Inside, the control is a big mystery -- one huge black box that we hope works. diff --git a/docs/src/hal/twopass.adoc b/docs/src/hal/twopass.adoc index 7fdc48fae2c..fd50a15d5da 100644 --- a/docs/src/hal/twopass.adoc +++ b/docs/src/hal/twopass.adoc @@ -120,7 +120,6 @@ HALFILE = simulated_home.hal HALFILE = load_for_postgui.hal <- loadrt lines for components in postgui.hal POSTGUI_HALFILE = postgui.hal -HALUI = halui ---- == Post GUI diff --git a/docs/src/man/man1/halui.1.adoc b/docs/src/man/man1/halui.1.adoc index 861abcd04c0..82145890b8e 100644 --- a/docs/src/man/man1/halui.1.adoc +++ b/docs/src/man/man1/halui.1.adoc @@ -2,29 +2,38 @@ == NAME -halui - observe HAL pins and command LinuxCNC through NML +halui - HAL pins to observe and command LinuxCNC -== SYNOPSIS +== DESCRIPTION -*halui* [*-ini* __] +*halui* is used to build a User Interface using hardware knobs and switches. +It provides a large number of HAL pins, and acts accordingly when these +change. -== DESCRIPTION +The pins are part of the LinuxCNC task controller and exist in every +configuration. There is nothing to load: connect the pins you want in a +HAL file. Earlier versions ran halui as a separate program, selected with +*[HAL]HALUI* in the INI file or started with *loadusr halui*; neither is +needed any more. -The program *halui* is used to build a User Interface using hardware knobs and switches. -It exports a big number of pins, and acts accordingly when these change. +== INI FILE -== OPTIONS +halui still reads these INI settings: -*-ini* _filename_:: - Use the _filename_ as the configuration file. Note: halui must find - the nml file specified in the INI, usually that file is in the same - folder as the INI, so it makes sense to run halui from that folder. +*[HALUI]MDI_COMMAND*:: + An MDI command to run when the matching *halui.mdi-command-NN* pin goes + true. May be given up to 64 times. +*[DISPLAY]MAX_FEED_OVERRIDE*:: + Upper limit for the feed override set through halui. +*[DISPLAY]MIN_SPINDLE_OVERRIDE*, *[DISPLAY]MAX_SPINDLE_OVERRIDE*:: + Limits for the spindle override set through halui. +*[TRAJ]COORDINATES*:: + Which *halui.axis.L.\** pins are created. == USAGE -When run, *halui* will export a large number of pins. A user can connect -those to his physical knobs & switches & leds, and when a change is -noticed halui triggers an appropriate event. +A user can connect the pins to his physical knobs & switches & leds, and +when a change is noticed halui triggers an appropriate event. Caveat, *halui* expects the signals to be debounced, so if needed (bad knob contact) connect the physical button to a HAL debounce filter first. @@ -142,24 +151,19 @@ contact) connect the physical button to a HAL debounce filter first. === Mode -*halui.mode.auto* bool in:: - pin for requesting auto mode *halui.mode.is-auto* bool out:: - pin for auto mode is on + a program runs, or is paused. The task mode follows what task runs and + cannot be set. *halui.mode.is-joint* bool out:: pin showing joint by joint jog mode is on *halui.mode.is-manual* bool out:: - pin for manual mode is on + task is idle: neither a program nor MDI runs *halui.mode.is-mdi* bool out:: - pin for MDI mode is on + MDI commands run *halui.mode.is-teleop* bool out:: pin showing coordinated jog mode is on *halui.mode.joint* bool in:: pin for requesting joint by joint jog mode -*halui.mode.manual* bool in:: - pin for requesting manual mode -*halui.mode.mdi* bool in:: - pin for requesting MDI mode *halui.mode.teleop* bool in:: pin for requesting coordinated jog mode diff --git a/docs/src/man/man1/linuxcncrsh.1.adoc b/docs/src/man/man1/linuxcncrsh.1.adoc index 1278e8d9923..b39c15e3a78 100644 --- a/docs/src/man/man1/linuxcncrsh.1.adoc +++ b/docs/src/man/man1/linuxcncrsh.1.adoc @@ -432,8 +432,12 @@ Subcommands for 'GET' and 'SET' are: *get mode*:: *set mode* {manual|auto|mdi}:: - With get, returns the current machine mode. - With set, sets the machine mode as specified. + With get, returns AUTO while a program runs, MDI while MDI commands + run and, while the machine is idle, the mode this connection last set + (MANUAL until then). + With set, sets the mode this connection shows. It is not sent to the + machine: task's mode reports what runs and cannot be set, and task + accepts jogs, MDI commands and program runs whatever mode is set. *get open* *set open* __:: @@ -491,7 +495,7 @@ Subcommands for 'GET' and 'SET' are: Additionally, many sanity and boundary condition checks are performed that are hard to duplicate outside of the canon interface. + - The 'SET PROBE' command can only be run in MDI mode (use 'SET MODE MDI'). + 'SET PROBE' is sent as an MDI command, so it is refused while a program runs. Additionally, 'SET PROBE' never returns a 'SET PROBE NAK' if the probe fails to make contact. However, an error is produced (use 'GET ERROR') and the 'GET PROBE_TRIPPED' returns 'NO' in that case. diff --git a/docs/src/man/man1/moveoff_gui.1.adoc b/docs/src/man/man1/moveoff_gui.1.adoc index 042b2aead0f..dd82617a6b9 100644 --- a/docs/src/man/man1/moveoff_gui.1.adoc +++ b/docs/src/man/man1/moveoff_gui.1.adoc @@ -73,12 +73,6 @@ These options are available for special cases: LinuxCNC must be running. -Halui must be loaded, typical INI file setting: ----- -[HAL] -HALUI = halui ----- - The moveoff component must be loaded with the name 'mv' as: + **loadrt moveoff names=**_mv **personality=**_number_of_axes_ @@ -107,7 +101,6 @@ HALFILE *hookup_moveoff.tcl* as illustrated below: ---- [HAL] -HALUI = halui HALFILE = user_halfile_1 etc ... HALFILE = user_halfile_n diff --git a/docs/src/man/man1/xhc-whb04b-6.1.adoc b/docs/src/man/man1/xhc-whb04b-6.1.adoc index 6cd5f625ab2..fe06c5acb58 100644 --- a/docs/src/man/man1/xhc-whb04b-6.1.adoc +++ b/docs/src/man/man1/xhc-whb04b-6.1.adoc @@ -235,7 +235,8 @@ Signals for operating program and MDI mode. `whb.halui.program.is-idle` (bool, in):: Connect to `halui.program.is-idle`. Pin indicating no program is running. `whb.halui.mode.auto` (bool, out):: - Connect to `halui.mode.auto`. Pin for requesting auto mode. + Pin for requesting auto mode. Leave unconnected: the task mode cannot be set + and halui has no pin for it. `whb.halui.mode.is-auto` (bool, in):: Connect to `halui.mode.is-auto`. Pin for indicating auto mode is on. `whb.halui.mode.joint` (bool, out):: @@ -243,11 +244,11 @@ Signals for operating program and MDI mode. `whb.halui.mode.is-joint` (bool, in):: Connect to `halui.mode.is-joint`. Pin indicating joint by joint mode is on. `whb.halui.mode.manual` (bool, out):: - Connect to `halui.mode.manual`. Pin for requesting manual mode. + Pin for requesting manual mode. Leave unconnected, see `whb.halui.mode.auto`. `whb.halui.mode.is-manual` (bool, in):: Connect to `halui.mode.is-manual`. Pin indicating manual mode is on. `whb.halui.mode.mdi` (bool, out):: - Connect to `halui.mode.mdi`. Pin for requesting MDI mode. + Pin for requesting MDI mode. Leave unconnected, see `whb.halui.mode.auto`. `whb.halui.mode.is-mdi` (bool, in):: Connect to `halui.mode.is-mdi`. Pin indicating MDI mode is on. `whb.halui.mode.teleop` (bool, out):: @@ -419,9 +420,6 @@ net pdnt.program.run whb.halui.program.run net pdnt.program.stop whb.halui.program.stop halui.program.stop # machine mode related signals -net pdnt.mode.auto whb.halui.mode.auto halui.mode.auto -net pdnt.mode.manual whb.halui.mode.manual halui.mode.manual -net pdnt.mode.mdi whb.halui.mode.mdi halui.mode.mdi net pdnt.mode.joint whb.halui.mode.joint halui.mode.joint net pdnt.mode.teleop whb.halui.mode.teleop halui.mode.teleop net pdnt.mode.is-auto halui.mode.is-auto whb.halui.mode.is-auto diff --git a/docs/src/plasma/qtplasmac.adoc b/docs/src/plasma/qtplasmac.adoc index bc68a12556c..7a852b00098 100644 --- a/docs/src/plasma/qtplasmac.adoc +++ b/docs/src/plasma/qtplasmac.adoc @@ -570,7 +570,6 @@ These variables are mandatory. [source,ini] ---- -HALUI = halui (required) HALFILE = __.hal (the machine HAL file) HALFILE = plasmac.tcl (the standard QtPlasmaC HAL file) HALFILE = custom.hal (Users custom HAL commands) diff --git a/lib/hallib/xhc-hb04.tcl b/lib/hallib/xhc-hb04.tcl index d9d3c7fdb3e..beb2c112394 100644 --- a/lib/hallib/xhc-hb04.tcl +++ b/lib/hallib/xhc-hb04.tcl @@ -384,8 +384,7 @@ proc std_start_pause_button {} { makenet pendant:program-pause <= pendant_util.pause \ => halui.program.pause makenet pendant:program-run <= pendant_util.run \ - => halui.program.run \ - => halui.mode.auto + => halui.program.run # accommodate existing signames for halui outpins: makenet [existing_outpin_signame halui.program.is-idle pendant:is-idle] \ diff --git a/lib/python/common/hal_glib.py b/lib/python/common/hal_glib.py index 6227a3dae3b..807067bf3e9 100644 --- a/lib/python/common/hal_glib.py +++ b/lib/python/common/hal_glib.py @@ -1381,7 +1381,6 @@ def set_tool_touchoff(self,tool,axis,value): if self.stat.task_mode != linuxcnc.MODE_MDI: premode = self.stat.task_mode self.cmd.mode(linuxcnc.MODE_MDI) - self.cmd.wait_complete() self.cmd.mdi(m) self.cmd.wait_complete() self.cmd.mdi("g43") @@ -1396,7 +1395,6 @@ def set_axis_origin(self,axis,value): if self.stat.task_mode != linuxcnc.MODE_MDI: premode = self.stat.task_mode self.cmd.mode(linuxcnc.MODE_MDI) - self.cmd.wait_complete() self.cmd.mdi(m) self.cmd.wait_complete() if premode: diff --git a/lib/python/gladevcp/builtin-panels/gtk_little_probe/gtk_little_probe.py b/lib/python/gladevcp/builtin-panels/gtk_little_probe/gtk_little_probe.py index 7f790cf2d7b..b23f59427f1 100644 --- a/lib/python/gladevcp/builtin-panels/gtk_little_probe/gtk_little_probe.py +++ b/lib/python/gladevcp/builtin-panels/gtk_little_probe/gtk_little_probe.py @@ -626,21 +626,18 @@ def lenght_y(self, data = None): def on_btn1_set_x_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_x", self.spbtn_offs_x.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() self.command.mdi( "G10 L20 P0 X%f" % self.spbtn_offs_x.get_value() ) time.sleep(1) def on_btn1_set_y_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_y", self.spbtn_offs_y.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() self.command.mdi( "G10 L20 P0 Y%f" % self.spbtn_offs_y.get_value() ) time.sleep(1) def on_btn1_set_z_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_z", self.spbtn_offs_z.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() self.command.mdi( "G10 L20 P0 Z%f" % self.spbtn_offs_z.get_value() ) time.sleep(1) @@ -648,7 +645,6 @@ def on_btn1_set_angle_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_angle", self.spbtn_offs_angle.get_value(), float ) self.lb_probe_a.set_text( "%.3f" % self.spbtn_offs_angle.get_value()) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() s="G10 L2 P0" if self.chk_set_zero.get_active() : s += " X%.4f"%self.spbtn_offs_x.get_value() @@ -672,7 +668,6 @@ def on_btn1_set_angle_released(self, gtkbutton, data = None): # Down def on_down_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # Start gtk_probe_down.ngc if self.ocode ("O call") == -1: return @@ -686,7 +681,6 @@ def on_down_released(self, gtkbutton, data = None): # X+ def on_xp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance s="""G91 G1 X-%f @@ -717,7 +711,6 @@ def on_xp_released(self, gtkbutton, data = None): # Y+ def on_yp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - xy_clearance s="""G91 G1 Y-%f @@ -748,7 +741,6 @@ def on_yp_released(self, gtkbutton, data = None): # X- def on_xm_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance s="""G91 G1 X%f @@ -779,7 +771,6 @@ def on_xm_released(self, gtkbutton, data = None): # Y- def on_ym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + xy_clearance s="""G91 G1 Y%f @@ -812,7 +803,6 @@ def on_ym_released(self, gtkbutton, data = None): # X+Y+ def on_xpyp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance Y + edge_lenght s="""G91 G1 X-%f Y%f @@ -865,7 +855,6 @@ def on_xpyp_released(self, gtkbutton, data = None): # X+Y- def on_xpym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance Y + edge_lenght s="""G91 G1 X-%f Y-%f @@ -917,7 +906,6 @@ def on_xpym_released(self, gtkbutton, data = None): # X-Y+ def on_xmyp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance Y + edge_lenght s="""G91 G1 X%f Y%f @@ -970,7 +958,6 @@ def on_xmyp_released(self, gtkbutton, data = None): # X-Y- def on_xmym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance Y - edge_lenght s="""G91 G1 X%f Y-%f @@ -1023,7 +1010,6 @@ def on_xmym_released(self, gtkbutton, data = None): # Center X+ X- Y+ Y- def on_xy_center_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - edge_lenght- xy_clearance s="""G91 G1 X-%f @@ -1137,7 +1123,6 @@ def on_xy_center_released(self, gtkbutton, data = None): # X+Y+ def on_xpyp1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - edge_lenght X - xy_clearance s="""G91 G1 X-%f Y-%f @@ -1185,7 +1170,6 @@ def on_xpyp1_released(self, gtkbutton, data = None): # X+Y- def on_xpym1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + edge_lenght X - xy_clearance s="""G91 G1 X-%f Y%f @@ -1233,7 +1217,6 @@ def on_xpym1_released(self, gtkbutton, data = None): # X-Y+ def on_xmyp1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - edge_lenght X + xy_clearance s="""G91 G1 X%f Y-%f @@ -1282,7 +1265,6 @@ def on_xmyp1_released(self, gtkbutton, data = None): # X-Y- def on_xmym1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + edge_lenght X + xy_clearance s="""G91 G1 X%f Y%f @@ -1330,7 +1312,6 @@ def on_xmym1_released(self, gtkbutton, data = None): # Hole Xin- Xin+ Yin- Yin+ def on_xy_hole_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() if self.z_clearance_down() == -1: return # move X - edge_lenght Y + xy_clearance @@ -1428,7 +1409,6 @@ def on_angle_yp_released(self, gtkbutton, data = None): self.stat.poll() xstart=self.stat.position[0]-self.stat.g5x_offset[0] - self.stat.g92_offset[0] - self.stat.tool_offset[0] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - xy_clearance s="""G91 G1 Y-%f @@ -1477,7 +1457,6 @@ def on_angle_ym_released(self, gtkbutton, data = None): self.stat.poll() xstart=self.stat.position[0]-self.stat.g5x_offset[0] - self.stat.g92_offset[0] - self.stat.tool_offset[0] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + xy_clearance s="""G91 G1 Y%f @@ -1525,7 +1504,6 @@ def on_angle_xp_released(self, gtkbutton, data = None): self.stat.poll() ystart=self.stat.position[1]-self.stat.g5x_offset[1] - self.stat.g92_offset[1] - self.stat.tool_offset[1] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance s="""G91 G1 X-%f @@ -1573,7 +1551,6 @@ def on_angle_xm_released(self, gtkbutton, data = None): self.stat.poll() ystart=self.stat.position[1]-self.stat.g5x_offset[1] - self.stat.g92_offset[1] - self.stat.tool_offset[1] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance s="""G91 G1 X%f diff --git a/lib/python/gladevcp/builtin-panels/gtk_verser_probe/gtk_verser_probe.py b/lib/python/gladevcp/builtin-panels/gtk_verser_probe/gtk_verser_probe.py index b538e0b26d2..9f6aa1287a7 100644 --- a/lib/python/gladevcp/builtin-panels/gtk_verser_probe/gtk_verser_probe.py +++ b/lib/python/gladevcp/builtin-panels/gtk_verser_probe/gtk_verser_probe.py @@ -627,21 +627,18 @@ def lenght_y(self, data = None): def on_btn1_set_x_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_x", self.spbtn_offs_x.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() self.command.mdi( "G10 L20 P0 X%f" % self.spbtn_offs_x.get_value() ) time.sleep(1) def on_btn1_set_y_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_y", self.spbtn_offs_y.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() self.command.mdi( "G10 L20 P0 Y%f" % self.spbtn_offs_y.get_value() ) time.sleep(1) def on_btn1_set_z_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_z", self.spbtn_offs_z.get_value(), float ) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() self.command.mdi( "G10 L20 P0 Z%f" % self.spbtn_offs_z.get_value() ) time.sleep(1) @@ -649,7 +646,6 @@ def on_btn1_set_angle_released(self, gtkbutton, data = None): self.prefs.putpref( "ps_offs_angle", self.spbtn_offs_angle.get_value(), float ) self.lb_probe_a.set_text( "%.3f" % self.spbtn_offs_angle.get_value()) self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() s="G10 L2 P0" if self.chk_set_zero.get_active() : s += " X%.4f"%self.spbtn_offs_x.get_value() @@ -673,7 +669,6 @@ def on_btn1_set_angle_released(self, gtkbutton, data = None): # Down def on_down_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # Start gtk_probe_down.ngc if self.ocode ("O call") == -1: return @@ -684,7 +679,6 @@ def on_down_released(self, gtkbutton, data = None): # X+ def on_xp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance s="""G91 G1 X-%f @@ -713,7 +707,6 @@ def on_xp_released(self, gtkbutton, data = None): # Y+ def on_yp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - xy_clearance s="""G91 G1 Y-%f @@ -742,7 +735,6 @@ def on_yp_released(self, gtkbutton, data = None): # X- def on_xm_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance s="""G91 G1 X%f @@ -771,7 +763,6 @@ def on_xm_released(self, gtkbutton, data = None): # Y- def on_ym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + xy_clearance s="""G91 G1 Y%f @@ -802,7 +793,6 @@ def on_ym_released(self, gtkbutton, data = None): # X+Y+ def on_xpyp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance Y + edge_lenght s="""G91 G1 X-%f Y%f @@ -853,7 +843,6 @@ def on_xpyp_released(self, gtkbutton, data = None): # X+Y- def on_xpym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance Y + edge_lenght s="""G91 G1 X-%f Y-%f @@ -903,7 +892,6 @@ def on_xpym_released(self, gtkbutton, data = None): # X-Y+ def on_xmyp_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance Y + edge_lenght s="""G91 G1 X%f Y%f @@ -954,7 +942,6 @@ def on_xmyp_released(self, gtkbutton, data = None): # X-Y- def on_xmym_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance Y - edge_lenght s="""G91 G1 X%f Y-%f @@ -1005,7 +992,6 @@ def on_xmym_released(self, gtkbutton, data = None): # Center X+ X- Y+ Y- def on_xy_center_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - edge_lenght- xy_clearance s="""G91 G1 X-%f @@ -1117,7 +1103,6 @@ def on_xy_center_released(self, gtkbutton, data = None): # X+Y+ def on_xpyp1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - edge_lenght X - xy_clearance s="""G91 G1 X-%f Y-%f @@ -1163,7 +1148,6 @@ def on_xpyp1_released(self, gtkbutton, data = None): # X+Y- def on_xpym1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + edge_lenght X - xy_clearance s="""G91 G1 X-%f Y%f @@ -1209,7 +1193,6 @@ def on_xpym1_released(self, gtkbutton, data = None): # X-Y+ def on_xmyp1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - edge_lenght X + xy_clearance s="""G91 G1 X%f Y-%f @@ -1256,7 +1239,6 @@ def on_xmyp1_released(self, gtkbutton, data = None): # X-Y- def on_xmym1_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + edge_lenght X + xy_clearance s="""G91 G1 X%f Y%f @@ -1302,7 +1284,6 @@ def on_xmym1_released(self, gtkbutton, data = None): # Hole Xin- Xin+ Yin- Yin+ def on_xy_hole_released(self, gtkbutton, data = None): self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() if self.z_clearance_down() == -1: return # move X - edge_lenght Y + xy_clearance @@ -1398,7 +1379,6 @@ def on_angle_yp_released(self, gtkbutton, data = None): self.stat.poll() xstart=self.stat.position[0]-self.stat.g5x_offset[0] - self.stat.g92_offset[0] - self.stat.tool_offset[0] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y - xy_clearance s="""G91 G1 Y-%f @@ -1445,7 +1425,6 @@ def on_angle_ym_released(self, gtkbutton, data = None): self.stat.poll() xstart=self.stat.position[0]-self.stat.g5x_offset[0] - self.stat.g92_offset[0] - self.stat.tool_offset[0] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move Y + xy_clearance s="""G91 G1 Y%f @@ -1491,7 +1470,6 @@ def on_angle_xp_released(self, gtkbutton, data = None): self.stat.poll() ystart=self.stat.position[1]-self.stat.g5x_offset[1] - self.stat.g92_offset[1] - self.stat.tool_offset[1] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X - xy_clearance s="""G91 G1 X-%f @@ -1537,7 +1515,6 @@ def on_angle_xm_released(self, gtkbutton, data = None): self.stat.poll() ystart=self.stat.position[1]-self.stat.g5x_offset[1] - self.stat.g92_offset[1] - self.stat.tool_offset[1] self.command.mode( linuxcnc.MODE_MDI ) - self.command.wait_complete() # move X + xy_clearance s="""G91 G1 X%f diff --git a/lib/python/gladevcp/gtk_action.py b/lib/python/gladevcp/gtk_action.py index 1316c29f2dd..a5981f3a0c7 100644 --- a/lib/python/gladevcp/gtk_action.py +++ b/lib/python/gladevcp/gtk_action.py @@ -674,7 +674,6 @@ def ensure_mode(self, *modes): truth, premode = STATUS.check_for_modes(modes) if truth is False: self.cmd.mode(modes[0]) - self.cmd.wait_complete() return (True, premode) else: return (truth, premode) diff --git a/lib/python/gladevcp/hal_actions.py b/lib/python/gladevcp/hal_actions.py index 2adacc30110..b8f5862fd21 100644 --- a/lib/python/gladevcp/hal_actions.py +++ b/lib/python/gladevcp/hal_actions.py @@ -299,7 +299,6 @@ def ensure_mode(s, c, *modes): if s.task_mode in modes: return True if running(s, do_poll=False): return False c.mode(modes[0]) - c.wait_complete() return True class EMC_Action_Python(_EMC_Action): diff --git a/lib/python/gladevcp/offsetpage_widget.py b/lib/python/gladevcp/offsetpage_widget.py index 11dad262b3a..a295d3e77e8 100755 --- a/lib/python/gladevcp/offsetpage_widget.py +++ b/lib/python/gladevcp/offsetpage_widget.py @@ -445,7 +445,6 @@ def system_to_p(system): if lncnc_running: if self.status.task_mode != self.linuxcnc.MODE_MDI: self.cmd.mode(self.linuxcnc.MODE_MDI) - self.cmd.wait_complete() if row == 0: self.cmd.mdi("G43.1 %s %10.4f" % (self.axisletters[axisnum], qualified)) elif row == 1: @@ -462,9 +461,7 @@ def system_to_p(system): else: self.cmd.mdi("G10 L2 P%d %s %10.4f" % (pnum, self.axisletters[axisnum], qualified)) self.cmd.mode(self.linuxcnc.MODE_MANUAL) - self.cmd.wait_complete() self.cmd.mode(self.linuxcnc.MODE_MDI) - self.cmd.wait_complete() self.gstat.emit('reload-display') except Exception as error: print(_("offsetpage widget error: MDI call error")) @@ -479,12 +476,9 @@ def zero_g92(self, widget): try: if self.status.task_mode != self.linuxcnc.MODE_MDI: self.cmd.mode(self.linuxcnc.MODE_MDI) - self.cmd.wait_complete() self.cmd.mdi("G92.1") self.cmd.mode(self.linuxcnc.MODE_MANUAL) - self.cmd.wait_complete() self.cmd.mode(self.linuxcnc.MODE_MDI) - self.cmd.wait_complete() self.gstat.emit('reload-display') except: print(_("MDI error in offsetpage widget -zero G92")) @@ -496,12 +490,9 @@ def zero_rot(self, widget): try: if self.status.task_mode != self.linuxcnc.MODE_MDI: self.cmd.mode(self.linuxcnc.MODE_MDI) - self.cmd.wait_complete() self.cmd.mdi("G10 L2 P0 R 0") self.cmd.mode(self.linuxcnc.MODE_MANUAL) - self.cmd.wait_complete() self.cmd.mode(self.linuxcnc.MODE_MDI) - self.cmd.wait_complete() self.gstat.emit('reload-display') except: print(_("MDI error in offsetpage widget-zero rotational offset")) diff --git a/lib/python/qtvcp/qt_action.py b/lib/python/qtvcp/qt_action.py index 1ef2912d51b..8c81b08a3d6 100644 --- a/lib/python/qtvcp/qt_action.py +++ b/lib/python/qtvcp/qt_action.py @@ -1037,7 +1037,6 @@ def ensure_mode(self, *modes): truth, premode = STATUS.check_for_modes(modes) if truth is False: self.cmd.mode(modes[0]) - self.cmd.wait_complete() return (True, premode) else: return (truth, premode) diff --git a/scripts/halui b/scripts/halui new file mode 100755 index 00000000000..15921048e43 --- /dev/null +++ b/scripts/halui @@ -0,0 +1,9 @@ +#!/bin/sh +# halui used to be a separate program. Its pins are now created by the task +# controller in every configuration, so there is nothing left to start. +# This stub keeps configurations that still run "loadusr halui" working, +# and tells their owners to remove that line. +echo "halui: the halui pins are built into the task controller now;" \ + "remove 'loadusr halui' from your HAL file (and [HAL]HALUI from" \ + "your INI file). This compatibility stub will be removed." >&2 +exit 0 diff --git a/scripts/linuxcnc.in b/scripts/linuxcnc.in index 3ab645da498..5edb0990ba4 100644 --- a/scripts/linuxcnc.in +++ b/scripts/linuxcnc.in @@ -528,9 +528,12 @@ if [ "$EMCTASK" = emctask ]; then EMCTASK=linuxcnctask; fi # so it needs to start by default, as the first process EMCSERVER=linuxcncsvr -# 2.7. get halui information +# 2.7. halui is part of task now; [HAL]HALUI is no longer read GetFromIniQuiet HALUI HAL -HALUI=$retval +if [ -n "$retval" ] ; then + echo "Warning: [HAL]HALUI is no longer needed, the halui pins are built" \ + "into the task controller. Remove it from $INIFILE." >&2 +fi # 2.7.1 get halbridge info from INI GetFromIniQuiet HALBRIDGE HAL @@ -830,17 +833,6 @@ fi halcmd loadusr -Wn inihal "$EMCTASK" -ini "$INIFILE" -# 4.3.5. Run halui in background, if necessary -if [ -n "$HALUI" ] ; then - echo "Starting HAL User Interface program: $HALUI" >> "$PRINT_FILE" - if ! program_available "$HALUI" ; then - echo "Can't execute halui program $HALUI" - Cleanup - exit 1 - fi - $HALCMD loadusr -Wn halui "$HALUI" -ini "$INIFILE" -fi - # run hal bridge program IF requested if [ -n "$HALBRIDGE" ] ; then echo "Starting HAL User Interface program: $HALBRIDGE" >> "$PRINT_FILE" diff --git a/share/axis/tcl/axis.tcl b/share/axis/tcl/axis.tcl index 2b99ad86ae8..98ba9ffbc0b 100644 --- a/share/axis/tcl/axis.tcl +++ b/share/axis/tcl/axis.tcl @@ -1891,6 +1891,11 @@ proc update_state {args} { set_mode_from_tab } enable_group $::manualgroup + } elseif {$::task_state == $::STATE_ON && $::pause_jog_ok} { + # a paused program or MDI: jogs and the spindle, see jog_ok, but + # no homing + enable_group $::manualgroup + $::_tabs_manual.jogf.zerohome.home configure -state disabled } else { disable_group $::manualgroup } @@ -1999,6 +2004,7 @@ set block_delete 0 set interp_pause 0 set last_interp_state 0 set interp_state 0 +set pause_jog_ok 0 set running_line -1 set highlight_line -1 set coord_type 1 @@ -2020,6 +2026,7 @@ trace add variable optional_stop write queue_update_state trace add variable block_delete write queue_update_state trace add variable interp_pause write queue_update_state trace add variable interp_state write queue_update_state +trace add variable pause_jog_ok write queue_update_state trace add variable running_line write queue_update_state trace add variable highlight_line write queue_update_state trace add variable spindledir write queue_update_state diff --git a/share/gscreen/skins/silverdragon/silverdragon_handler.py b/share/gscreen/skins/silverdragon/silverdragon_handler.py index e78c1a1db8c..846e68b16f5 100644 --- a/share/gscreen/skins/silverdragon/silverdragon_handler.py +++ b/share/gscreen/skins/silverdragon/silverdragon_handler.py @@ -187,7 +187,6 @@ def initialize_widgets(self): self.widgets.ntb_main.set_current_page(_NB_PREVIEW) self.gscreen.sensitize_widgets(self.data.sensitive_on_off, False) self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() def initialize_preferences(self): self.gscreen.init_general_pref() @@ -426,7 +425,6 @@ def on_rbt_manual_clicked(self, widget): if self.widgets.ntb_main.get_current_page() == _NB_SETUP: return self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() def on_rbt_mdi_clicked(self, widget): if self.widgets.ntb_main.get_current_page() == _NB_SETUP: @@ -434,7 +432,6 @@ def on_rbt_mdi_clicked(self, widget): self.widgets.rbt_mdi.set_active(False) else: self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() def on_rbt_auto_clicked(self, widget): if self.widgets.ntb_main.get_current_page() == _NB_SETUP: @@ -442,7 +439,6 @@ def on_rbt_auto_clicked(self, widget): self.widgets.rbt_auto.set_active(False) else: self.command.mode(linuxcnc.MODE_AUTO) - self.command.wait_complete() def on_ntb_main_switch_page(self, widget, tab, index): if self.stat.task_mode == linuxcnc.MODE_AUTO: @@ -511,13 +507,11 @@ def on_zero_axis_clicked(self, widget): self.gscreen.notify(_("ERROR"), _("Unknown axis selected"), ALERT_ICON) return self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() command = "G10 L20 P0 {0}0".format(self.axis_to_ref) self.command.mdi(command) self.command.wait_complete() self.gscreen.reload_plot() self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.gscreen.prefs.putpref("offset_axis_{0}".format(self.axis_to_ref), 0, float) def on_ref_axis_clicked(self, widget): @@ -540,7 +534,6 @@ def on_ref_axis_clicked(self, widget): title = "Enter Offset for Axis %s"%self.axis_to_ref self.gscreen.launch_numerical_input(callback, 0, 0, title) self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() def on_tbtn_flood_toggled(self, widget, data=None): if self.stat.flood == widget.get_active(): @@ -782,10 +775,8 @@ def on_default_window_pressed(self, widget): def on_btn_zero_g92_clicked(self, widget, data=None): self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.command.mdi("G92.1") self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.widgets.rbt_offset.emit("toggled") def on_tbtn_edit_offsets_toggled(self, widget, data=None): @@ -795,7 +786,6 @@ def on_tbtn_edit_offsets_toggled(self, widget, data=None): self.gscreen.sensitize_widgets(widgetlist, not state) if not state: # must switch back to manual mode, otherwise jogging is not possible self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() def on_chk_ignore_limits_toggled(self, widget, data=None): if self.widgets.chk_ignore_limits.get_active(): @@ -933,7 +923,6 @@ def on_hal_status_all_homed(self, widget): self.data.all_homed = True self.widgets.ntb_main.set_current_page(_NB_PREVIEW) self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.gscreen.sensitize_widgets(self.data.sensitive_all_homed, True) self.set_motion_mode(1) self.widgets.statusbar1.remove(self.gscreen.statusbar_id, self.gscreen.homed_status_message) @@ -977,7 +966,6 @@ def on_hal_status_interp_idle(self, widget): self.gscreen.sensitize_widgets(self.data.sensitive_run_idle, True) if self.tool_change: self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.tool_change = False self.current_line = 0 @@ -997,7 +985,6 @@ def on_hal_status_state_estop(self, widget=None): self.widgets.tbtn_estop.set_label("ESTOP") self.widgets.chk_ignore_limits.set_sensitive(False) self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() def on_hal_status_state_estop_reset(self, widget=None): self.widgets.tbtn_estop.set_active(False) @@ -1022,7 +1009,6 @@ def on_hal_status_state_on(self, widget): self.widgets.rbt_manual.set_active(True) self.widgets.ntb_mode.set_current_page(_MODE_MANUAL) self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() def on_hal_status_mode_manual(self, widget): print("MANUAL Mode") @@ -1041,7 +1027,6 @@ def on_hal_status_mode_mdi(self, widget): if not self.widgets.rbt_mdi.get_sensitive(): self.command.abort() self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.gscreen.notify(_("INFO"), _("It is not possible to change to MDI Mode at the moment"), INFO_ICON) return else: @@ -1055,7 +1040,6 @@ def on_hal_status_mode_auto(self, widget): if not self.widgets.rbt_auto.get_sensitive(): self.command.abort() self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.gscreen.notify(_("INFO"), _("It is not possible to change to AUTO Mode at the moment"), INFO_ICON) else: print("AUTO Mode") @@ -1245,7 +1229,6 @@ def reload_tool(self): self.load_tool = True self.tool_change = True self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() command = "M61 Q {0} G43".format(tool_to_load) self.command.mdi(command) self.command.wait_complete() @@ -1411,7 +1394,6 @@ def update_toolinfo(self, tool): return if "G43" in self.data.active_gcodes and self.stat.task_mode != linuxcnc.MODE_AUTO: self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.command.mdi("G43") self.command.wait_complete() @@ -1456,12 +1438,10 @@ def on_offset_axis_return(self, widget, result, calc, userdata, userdata2): r = self.axis_to_ref self.gscreen.prefs.putpref("offset_axis_{}".format(r), value, str) self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() command = "G10 L20 P0 {}{}".format(r, value) self.command.mdi(command) self.gscreen.reload_plot() self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() widget.destroy() self.data.entry_dialog = None diff --git a/share/qtvcp/panels/3pcenter/3pcenter_handler.py b/share/qtvcp/panels/3pcenter/3pcenter_handler.py index 5e736833ade..dd3d70b68af 100644 --- a/share/qtvcp/panels/3pcenter/3pcenter_handler.py +++ b/share/qtvcp/panels/3pcenter/3pcenter_handler.py @@ -115,7 +115,6 @@ def set_no_ok(self): def goCenter(self): c.mode(linuxcnc.MODE_MDI) - c.wait_complete() c.mdi('g53 g0 z0') c.mdi('g54 g0 x'+str(round(self.X, 4))+'y'+str(round(self.Y, 4))) @@ -123,7 +122,6 @@ def setCenter(self): offset_X = (hal.get_value("halui.axis.x.pos-relative") - self.X) offset_Y = (hal.get_value("halui.axis.y.pos-relative") - self.Y) c.mode(linuxcnc.MODE_MDI) - c.wait_complete() c.mdi('g10 l20 p1 x'+str(round(offset_X, 4))+'y'+str(round(offset_Y, 4))) self.w.label_4.setText("OK") self.w.label_4.setStyleSheet("background-color: rgba(50, 150, 50, 120);") diff --git a/src/Makefile b/src/Makefile index df19b0c3dc7..3bd45ec6775 100644 --- a/src/Makefile +++ b/src/Makefile @@ -664,6 +664,7 @@ endif $(EXE) ../scripts/latency-plot $(DESTDIR)$(bindir) $(EXE) ../scripts/latency-histogram $(DESTDIR)$(bindir) $(EXE) ../scripts/moveoff_gui $(DESTDIR)$(bindir) + $(EXE) ../scripts/halui $(DESTDIR)$(bindir) $(EXE) ../scripts/hal-histogram $(DESTDIR)$(bindir) $(EXE) ../scripts/xhc-hb04-accels $(DESTDIR)$(bindir) $(EXE) ../scripts/pyvcp_demo $(DESTDIR)$(bindir) diff --git a/src/emc/ini/initraj.cc b/src/emc/ini/initraj.cc index 36537e70bdc..6e6e9eb31e6 100644 --- a/src/emc/ini/initraj.cc +++ b/src/emc/ini/initraj.cc @@ -66,6 +66,7 @@ static int loadKins(const IniFile &ini) // [TRAJ]MAX_LINEAR_ACCELERATION Maximum linear acceleration (dv/dt) // [TRAJ]MAX_LINEAR_JERK Maximum linear jerk (da/dt) // [TRAJ]PLANNER_TYPE Planner type (0=standard, 1=S-curve) +// [TRAJ]PAUSE_RETURN_LAST Axes that return last after jogs while paused (default Z) // [TRAJ]ARC_BLEND_ENABLE S-curve planner settings // [TRAJ]ARC_BLEND_FALLBACK_ENABLE ... // [TRAJ]ARC_BLEND_OPTIMIZATION_DEPTH ... @@ -152,6 +153,24 @@ static int loadTraj(const IniFile &ini) return -1; } + // After jogs while paused, the other axes return to the paused position + // first, then these: by default Z, so the tool comes down onto the point + // last. Empty: all axes in one straight line. + unsigned pause_return_last = 1 << 2; + if (auto last = ini.findString("PAUSE_RETURN_LAST", "TRAJ")) { + static const std::string axes{"XYZABCUVW"}; + pause_return_last = 0; + for (auto c : *last) { + size_t n = axes.find_first_of(std::toupper(c & 0xff)); + if (n != std::string::npos) + pause_return_last |= 1u << n; + } + } + if (0 != emcTrajSetPauseReturnLast(pause_return_last)) { + print_dbg_config("emcTrajSetPauseReturnLast"); + return -1; + } + // Planner: 0 = trapezoidal, 1 = S-curve // Default = 0 int planner_type = ini.findIntV("PLANNER_TYPE", "TRAJ", 0, 0, 1); diff --git a/src/emc/motion-logger/motion-logger.c b/src/emc/motion-logger/motion-logger.c index 36b77e54528..303c62ed5b9 100644 --- a/src/emc/motion-logger/motion-logger.c +++ b/src/emc/motion-logger/motion-logger.c @@ -576,6 +576,10 @@ int main(int argc, char* argv[]) { log_print("SET_SCURVE_PEAK_SCALE scale=%.6g\n", c->scurve_peak_scale); break; + case EMCMOT_SET_PAUSE_RETURN_LAST: + log_print("SET_PAUSE_RETURN_LAST mask=0x%x\n", (unsigned)c->flags); + break; + case EMCMOT_SET_TERM_COND: log_print("SET_TERM_COND termCond=%d, tolerance=%.6g\n", c->termCond, c->tolerance); break; diff --git a/src/emc/motion/axis.c b/src/emc/motion/axis.c index 457d1d6fd9c..59fba57f4b2 100644 --- a/src/emc/motion/axis.c +++ b/src/emc/motion/axis.c @@ -36,6 +36,11 @@ typedef struct { double ext_offset_acc_limit; /* upper limit of axis accel for ext offset */ rtapi_sint old_eoffset_counts; simple_tp_t ext_offset_tp; /* planner for external coordinate offsets*/ + + simple_tp_t pause_tp; /* planner for jogs while paused, see axis_pause_update() */ + double pause_base; /* paused program position plus external offset */ + int kb_pjog_active; /* non-zero during a keyboard jog while paused */ + int wheel_pjog_active; /* non-zero during a wheel jog while paused */ } emcmot_axis_t; typedef struct { @@ -69,6 +74,12 @@ typedef struct { static emcmot_axis_t axis_array[EMCMOT_MAX_AXIS]; static axis_hal_data_t *hal_data = NULL; +// The axes that return last when a paused program resumes after jogs, +// [TRAJ]PAUSE_RETURN_LAST, and how far that return has got: 0 not +// returning, 1 the other axes, 2 these. +static unsigned pause_return_last_mask = 1 << 2; // Z +static int pause_return_phase = 0; + // Mark strings for translation, but defer translation to userspace #define _(s) (s) @@ -417,14 +428,17 @@ bool axis_jog_is_active(void) emcmot_axis_t *axis; for (n = 0; n < EMCMOT_MAX_AXIS; n++) { axis = &axis_array[n]; - if (axis->kb_ajog_active || axis->wheel_ajog_active) { + if (axis->kb_ajog_active || axis->wheel_ajog_active + || axis->kb_pjog_active || axis->wheel_pjog_active) { return 1; } } return 0; } -void axis_handle_jogwheels(bool motion_teleop_flag, bool motion_enable_flag, bool homing_is_active) +static void pause_jog_limits(int axis_num, double *min_lim, double *max_lim); + +void axis_handle_jogwheels(bool motion_teleop_flag, bool pause_jog_flag, bool motion_enable_flag, bool homing_is_active) { int axis_num; emcmot_axis_t *axis; @@ -455,6 +469,34 @@ void axis_handle_jogwheels(bool motion_teleop_flag, bool motion_enable_flag, boo //just update counts continue; } + if (pause_jog_flag) { + // a wheel jog while a coordinated move is paused moves the + // pause offset, see axis_pause_update() + double min_lim, max_lim; + if (!motion_enable_flag) { continue; } + if (!hal_get_bool(axis_data->ajog_enable)) { continue; } + if (axis->kb_pjog_active) { continue; } + if (axis->locking_joint >= 0) { continue; } + pos = axis->pause_tp.pos_cmd + delta * hal_get_real(axis_data->ajog_scale); + if ( hal_get_bool(axis_data->ajog_vel_mode) ) { + double v = axis->vel_limit; + stop_dist = v * v / ( 2 * aaccel_limit); + if ( pos > axis->pause_tp.curr_pos + stop_dist ) { + pos = axis->pause_tp.curr_pos + stop_dist; + } else if ( pos < axis->pause_tp.curr_pos - stop_dist ) { + pos = axis->pause_tp.curr_pos - stop_dist; + } + } + pause_jog_limits(axis_num, &min_lim, &max_lim); + if (pos > max_lim) { continue; } + if (pos < min_lim) { continue; } + axis->pause_tp.pos_cmd = pos; + axis->pause_tp.max_vel = axis->vel_limit; + axis->pause_tp.max_acc = aaccel_limit; + axis->wheel_pjog_active = 1; + axis->pause_tp.enable = 1; + continue; + } if (!motion_teleop_flag) { axis->teleop_tp.enable = 0; return; @@ -769,3 +811,282 @@ int axis_calc_motion(double servo_period) } return violated_teleop_limit; } + +/* +** Jogs while a coordinated move is paused. +** +** The paused program position stays where it is. A jog moves the axis by +** an offset on top of it (pause_tp), added in axis_pause_update() the way +** the external offsets are. On resume the offsets run back to zero first +** (axis_pause_return_start()), so the machine is back where it paused +** before the program continues: the other axes together in a straight +** line, then the [TRAJ]PAUSE_RETURN_LAST ones, at the axis limits. +*/ + +void axis_set_pause_return_last(unsigned mask) +{ + pause_return_last_mask = mask; +} + +/* The range the pause offset may jog in: the soft limits, less the paused +** position, for a homed axis; one limit range either way otherwise, as +** axis_jog_limits() does. */ +static void pause_jog_limits(int axis_num, double *min_lim, double *max_lim) +{ + emcmot_axis_t *axis = &axis_array[axis_num]; + + if (axis_is_homed(axis_num)) { + *min_lim = axis->min_pos_limit - axis->pause_base; + *max_lim = axis->max_pos_limit - axis->pause_base; + } else { + double range = axis->max_pos_limit - axis->min_pos_limit; + *min_lim = axis->pause_tp.curr_pos - range; + *max_lim = axis->pause_tp.curr_pos + range; + } +} + +void axis_pause_jog_cont(int axis_num, double vel) +{ + emcmot_axis_t *axis = &axis_array[axis_num]; + double min_lim, max_lim; + + if (axis->wheel_pjog_active) { return; } + pause_jog_limits(axis_num, &min_lim, &max_lim); + axis->pause_tp.pos_cmd = (vel > 0.0) ? max_lim : min_lim; + axis->pause_tp.max_vel = fabs(vel); + axis->pause_tp.max_acc = axis->acc_limit; + axis->kb_pjog_active = 1; + axis->pause_tp.enable = 1; +} + +void axis_pause_jog_incr(int axis_num, double offset, double vel) +{ + emcmot_axis_t *axis = &axis_array[axis_num]; + double target, min_lim, max_lim; + + if (axis->wheel_pjog_active) { return; } + target = axis->pause_tp.pos_cmd + ((vel > 0.0) ? offset : -offset); + pause_jog_limits(axis_num, &min_lim, &max_lim); + if (target > max_lim) { return; } + if (target < min_lim) { return; } + axis->pause_tp.pos_cmd = target; + axis->pause_tp.max_vel = fabs(vel); + axis->pause_tp.max_acc = axis->acc_limit; + axis->kb_pjog_active = 1; + axis->pause_tp.enable = 1; +} + +void axis_pause_jog_abs(int axis_num, double pos, double vel) +{ + emcmot_axis_t *axis = &axis_array[axis_num]; + double target, min_lim, max_lim; + + if (axis->wheel_pjog_active) { return; } + // pos is where the axis should go; the offset is the way there + target = pos - axis->pause_base; + pause_jog_limits(axis_num, &min_lim, &max_lim); + if (target > max_lim) { target = max_lim; } + if (target < min_lim) { target = min_lim; } + axis->pause_tp.pos_cmd = target; + axis->pause_tp.max_vel = fabs(vel); + axis->pause_tp.max_acc = axis->acc_limit; + axis->kb_pjog_active = 1; + axis->pause_tp.enable = 1; +} + +void axis_pause_jog_abort(int axis_num) +{ + emcmot_axis_t *axis = &axis_array[axis_num]; + + if (pause_return_phase) { return; } + axis->pause_tp.enable = 0; + axis->kb_pjog_active = 0; + axis->wheel_pjog_active = 0; +} + +void axis_pause_update(double *pcmd_p[], double servo_period) +{ + int n; + + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + emcmot_axis_t *axis = &axis_array[n]; + double save_curr_pos = axis->pause_tp.curr_pos; + + axis->pause_base = *pcmd_p[n] + axis->ext_offset_tp.curr_pos; + if (!pause_return_phase) { + axis->pause_tp.max_jerk = axis->jerk_limit; + if (axis->pause_tp.max_vel > axis->vel_limit) { + axis->pause_tp.max_vel = axis->vel_limit; + } + } + simple_tp_update(&axis->pause_tp, servo_period); + + // stay within the soft limits, as update_teleop_with_check() does; + // a return only moves back toward the paused position + if ( !pause_return_phase + && !((0 == axis->max_pos_limit) && (0 == axis->min_pos_limit)) + && axis_is_homed(n)) { + double pos = axis->pause_base + axis->pause_tp.curr_pos; + if ( (pos >= axis->max_pos_limit && axis->pause_tp.curr_pos > save_curr_pos) + || (pos <= axis->min_pos_limit && axis->pause_tp.curr_pos < save_curr_pos)) { + axis->pause_tp.curr_pos = save_curr_pos; + axis->pause_tp.curr_vel = 0; + axis->pause_tp.pos_cmd = save_curr_pos; + } + } + if (!axis->pause_tp.active) { + axis->kb_pjog_active = 0; + axis->wheel_pjog_active = 0; + } + *pcmd_p[n] += axis->pause_tp.curr_pos; + } +} + +/* Send the axes in mask back to zero offset in a straight line: the same +** profile for all, scaled by each one's distance, as fast as the slowest +** axis allows. Returns whether any axis has to move. */ +static bool pause_return_plan(unsigned mask) +{ + double v = 1e99, a = 1e99, j = 1e99; + bool jerk = true, any = false; + int n; + + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + emcmot_axis_t *axis = &axis_array[n]; + double d = fabs(axis->pause_tp.curr_pos); + if (!(mask & (1u << n))) { continue; } + if (d < 1e-12) { continue; } + any = true; + if (axis->vel_limit / d < v) { v = axis->vel_limit / d; } + if (axis->acc_limit / d < a) { a = axis->acc_limit / d; } + if (axis->jerk_limit > 0) { + if (axis->jerk_limit / d < j) { j = axis->jerk_limit / d; } + } else { + jerk = false; + } + } + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + emcmot_axis_t *axis = &axis_array[n]; + double d = fabs(axis->pause_tp.curr_pos); + if (!(mask & (1u << n))) { continue; } + axis->kb_pjog_active = 0; + axis->wheel_pjog_active = 0; + if (d < 1e-12) { + axis->pause_tp.curr_pos = axis->pause_tp.pos_cmd = 0; + continue; + } + axis->pause_tp.pos_cmd = 0; + axis->pause_tp.max_vel = d * v; + axis->pause_tp.max_acc = d * a; + axis->pause_tp.max_jerk = jerk ? d * j : 0; + axis->pause_tp.enable = 1; + // moving from now on: pause_return_settled() may run before the + // planner has, and must not take the old 'not active' for arrived + axis->pause_tp.active = 1; + } + return any; +} + +static bool pause_return_settled(unsigned mask) +{ + int n; + + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + if (!(mask & (1u << n))) { continue; } + if (axis_array[n].pause_tp.active) { return false; } + } + // the planner stops within a tiny distance of zero; make it zero + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + if (!(mask & (1u << n))) { continue; } + axis_array[n].pause_tp.curr_pos = axis_array[n].pause_tp.pos_cmd = 0; + axis_array[n].pause_tp.curr_vel = 0; + axis_array[n].pause_tp.curr_acc = 0; + } + return true; +} + +void axis_pause_return_start(void) +{ + pause_return_phase = 1; + if (!pause_return_plan(~pause_return_last_mask)) { + pause_return_settled(~pause_return_last_mask); + pause_return_phase = 2; + if (!pause_return_plan(pause_return_last_mask)) { + pause_return_settled(pause_return_last_mask); + pause_return_phase = 0; + } + } +} + +bool axis_pause_return_update(void) +{ + if (pause_return_phase == 1 && pause_return_settled(~pause_return_last_mask)) { + pause_return_phase = 2; + if (!pause_return_plan(pause_return_last_mask)) { + pause_return_settled(pause_return_last_mask); + pause_return_phase = 0; + } + } else if (pause_return_phase == 2 && pause_return_settled(pause_return_last_mask)) { + pause_return_phase = 0; + } + return pause_return_phase == 0; +} + +void axis_pause_return_cancel(void) +{ + int n; + + pause_return_phase = 0; + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + axis_array[n].pause_tp.enable = 0; + } +} + +bool axis_pause_returning(void) +{ + return pause_return_phase != 0; +} + +bool axis_pause_offset_active(void) +{ + int n; + + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + if (axis_array[n].pause_tp.curr_pos != 0 || axis_array[n].pause_tp.active) { + return true; + } + } + return false; +} + +bool axis_pause_jog_is_active(void) +{ + int n; + + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + if (axis_array[n].kb_pjog_active || axis_array[n].wheel_pjog_active) { + return true; + } + } + return false; +} + +void axis_pause_clear(void) +{ + int n; + + pause_return_phase = 0; + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + simple_tp_t *tp = &axis_array[n].pause_tp; + tp->pos_cmd = tp->curr_pos = tp->curr_vel = tp->curr_acc = 0; + tp->enable = 0; + tp->active = 0; + axis_array[n].kb_pjog_active = 0; + axis_array[n].wheel_pjog_active = 0; + } +} + +double axis_get_pause_offset(int axis_num) +{ + return axis_array[axis_num].pause_tp.curr_pos; +} diff --git a/src/emc/motion/axis.h b/src/emc/motion/axis.h index 5d61f0b13f0..fd542994dfb 100644 --- a/src/emc/motion/axis.h +++ b/src/emc/motion/axis.h @@ -13,7 +13,7 @@ void axis_init_all(void); void axis_initialize_external_offsets(void); int axis_init_hal_io(int mot_comp_id); -void axis_handle_jogwheels(bool motion_teleop_flag, bool motion_enable_flag, bool homing_is_active); +void axis_handle_jogwheels(bool motion_teleop_flag, bool pause_jog_flag, bool motion_enable_flag, bool homing_is_active); bool axis_plan_external_offsets(double servo_period, bool motion_enable_flag, bool all_homed); void axis_check_constraints(double pos[], int failing_axes[]); @@ -53,6 +53,22 @@ int axis_update_coord_with_bound(double *pcmd_p[], double servo_period); int axis_calc_motion(double servo_period); +// jogs while a coordinated move is paused, see axis.c +void axis_set_pause_return_last(unsigned mask); +void axis_pause_jog_cont(int axis_num, double vel); +void axis_pause_jog_incr(int axis_num, double offset, double vel); +void axis_pause_jog_abs(int axis_num, double pos, double vel); +void axis_pause_jog_abort(int axis_num); +void axis_pause_update(double *pcmd_p[], double servo_period); +void axis_pause_return_start(void); +bool axis_pause_return_update(void); +void axis_pause_return_cancel(void); +bool axis_pause_returning(void); +bool axis_pause_offset_active(void); +bool axis_pause_jog_is_active(void); +void axis_pause_clear(void); +double axis_get_pause_offset(int axis_num); + #ifdef __cplusplus } diff --git a/src/emc/motion/command.c b/src/emc/motion/command.c index 14356e1c9c1..d9d295c64ec 100644 --- a/src/emc/motion/command.c +++ b/src/emc/motion/command.c @@ -220,6 +220,100 @@ void apply_spindle_limits(spindle_status_t *s){ } } +/* Jogs while paused. In coordinated mode a jog moves the pause offset + (axis_pause_*() in axis.c): only an axis, and only once a pause has + stopped the motion (emcmotStatus->pause_jog_ok, set in control.c). */ +static bool pause_jog_check(void) +{ + int axis_num = emcmotCommand->axis; + + if (axis_num < 0 || axis_num >= EMCMOT_MAX_AXIS) { + reportError(_("Can't jog a joint while a coordinated move is paused, jog an axis")); + return false; + } + if (!emcmotStatus->pause_jog_ok) { + reportError(_("Can't jog until the paused motion has stopped")); + return false; + } + if (axis_get_locking_joint(axis_num) >= 0) { + reportError(_("Cannot jog a locking indexer AXIS_%c"), "XYZABCUVW"[axis_num]); + return false; + } + return true; +} + +/* What EMCMOT_RESUME and EMCMOT_STEP do, right away or, after jogs while + paused, once do_pause_resume() (control.c) has the machine back. */ +void pause_resume_now(int cmd) +{ + if (cmd == EMCMOT_STEP) { + if (emcmotStatus->paused) { + emcmotInternal->idForStep = emcmotStatus->id; + emcmotStatus->stepping = 1; + tpResume(&emcmotInternal->coord_tp); + emcmotStatus->paused = 1; + } else { + reportError(_("MOTION: can't STEP while already executing")); + } + return; + } + emcmotStatus->stepping = 0; + tpResume(&emcmotInternal->coord_tp); + emcmotStatus->paused = 0; + emcmotInternal->pause_spindles_saved = 0; +} + +/* The spindles as they were when the motion paused. */ +void pause_save_spindles(void) +{ + int n; + + for (n = 0; n < emcmotConfig->numSpindles; n++) { + spindle_status_t *sp = &emcmotStatus->spindle_status[n]; + emcmotInternal->pause_spindle[n].state = sp->state; + emcmotInternal->pause_spindle[n].direction = sp->direction; + emcmotInternal->pause_spindle[n].brake = sp->brake; + emcmotInternal->pause_spindle[n].speed = sp->speed; + emcmotInternal->pause_spindle[n].css_factor = sp->css_factor; + emcmotInternal->pause_spindle[n].xoffset = sp->xoffset; + } + emcmotInternal->pause_spindles_saved = 1; +} + +/* Put the spindles back the way they were when the motion paused, as + EMCMOT_SPINDLE_ON and EMCMOT_SPINDLE_OFF would. Returns whether any of + them changed. */ +bool pause_restore_spindles(void) +{ + bool changed = false; + int n; + + if (!emcmotInternal->pause_spindles_saved) { return false; } + for (n = 0; n < emcmotConfig->numSpindles; n++) { + spindle_status_t *sp = &emcmotStatus->spindle_status[n]; + const emcmot_pause_spindle_t *saved = &emcmotInternal->pause_spindle[n]; + if ( sp->state == saved->state && sp->direction == saved->direction + && sp->speed == saved->speed && sp->css_factor == saved->css_factor + && sp->xoffset == saved->xoffset) { + continue; + } + changed = true; + hal_set_bool(emcmot_hal_data->spindle[n].spindle_locked, 0); + hal_set_bool(emcmot_hal_data->spindle[n].spindle_orient, 0); + sp->orient_state = EMCMOT_ORIENT_NONE; + sp->state = saved->state; + sp->speed = saved->speed; + sp->css_factor = saved->css_factor; + sp->xoffset = saved->xoffset; + sp->direction = saved->direction; + sp->brake = saved->brake; + if (sp->state) { + apply_spindle_limits(sp); + } + } + return changed; +} + /* inRange() returns non-zero if the position lies within the joint limits, or 0 if not. It also reports an error for each joint limit @@ -449,9 +543,10 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) // joints_axes test for unexpected conditions // example: non-cooperating guis // example: attempt to jog locking indexer axis letter - if ( emcmotCommand->command == EMCMOT_JOG_CONT - || emcmotCommand->command == EMCMOT_JOG_INCR - || emcmotCommand->command == EMCMOT_JOG_ABS + if ( ( emcmotCommand->command == EMCMOT_JOG_CONT + || emcmotCommand->command == EMCMOT_JOG_INCR + || emcmotCommand->command == EMCMOT_JOG_ABS) + && !GET_MOTION_COORD_FLAG() // jogs while paused, see pause_jog_check() ) { if (GET_MOTION_TELEOP_FLAG() && (emcmotCommand->axis < 0)) { emsg = "command.com teleop: unexpected negative axis_num"; @@ -507,6 +602,7 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) || emcmotCommand->command == EMCMOT_JOG_ABS ) && !(GET_MOTION_TELEOP_FLAG()) + && !GET_MOTION_COORD_FLAG() && get_home_is_synchronized(joint_num) && !get_homing_is_active() ) { @@ -579,6 +675,14 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) SET_JOINT_FAULT_FLAG(joint, 0); } emcmotStatus->paused = 0; + /* stop jogs while paused and any return; control.c takes the + offsets into the planner position once it is idle */ + emcmotInternal->pause_resume_cmd = 0; + emcmotInternal->pause_spindles_saved = 0; + axis_pause_return_cancel(); + for (n = 0; n < EMCMOT_MAX_AXIS; n++) { + axis_pause_jog_abort(n); + } /* Drop any pending at-speed barrier so it can't strand a later move. */ emcmotStatus->atspeed_next_feed = 0; // Clear pins on abort so tests see a clean state @@ -597,7 +701,12 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) /* abort one joint number or axis number */ /* can happen at any time */ rtapi_print_msg(RTAPI_MSG_DBG, "JOG_ABORT: %i", joint_num); - if (GET_MOTION_TELEOP_FLAG()) { + if (GET_MOTION_COORD_FLAG()) { + /* a jog while paused */ + if ((emcmotCommand->axis >= 0) && (emcmotCommand->axis < EMCMOT_MAX_AXIS)) { + axis_pause_jog_abort(emcmotCommand->axis); + } + } else if (GET_MOTION_TELEOP_FLAG()) { /* tell teleop planner to stop */ if ((emcmotCommand->axis >= 0) && (emcmotCommand->axis < EMCMOT_MAX_AXIS)) { axis_jog_abort(emcmotCommand->axis, 0); @@ -853,6 +962,13 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) SET_JOINT_ERROR_FLAG(joint, 1); break; } + if (GET_MOTION_COORD_FLAG()) { + // COORD (paused) JOG_CONT + if (pause_jog_check()) { + axis_pause_jog_cont(emcmotCommand->axis, emcmotCommand->vel); + } + break; + } if (!GET_MOTION_TELEOP_FLAG()) { if (joint->wheel_jjog_active) { /* can't do two kinds of jog at once */ @@ -922,6 +1038,13 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) SET_JOINT_ERROR_FLAG(joint, 1); break; } + if (GET_MOTION_COORD_FLAG()) { + // COORD (paused) JOG_INCR + if (pause_jog_check()) { + axis_pause_jog_incr(emcmotCommand->axis, emcmotCommand->offset, emcmotCommand->vel); + } + break; + } if (!GET_MOTION_TELEOP_FLAG()) { if (joint->wheel_jjog_active) { /* can't do two kinds of jog at once */ @@ -984,6 +1107,15 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) /* do an absolute jog */ rtapi_print_msg(RTAPI_MSG_DBG, "JOG_ABS"); rtapi_print_msg(RTAPI_MSG_DBG, " %d", joint_num); + if (GET_MOTION_COORD_FLAG()) { + // COORD (paused) JOG_ABS + if ( GET_MOTION_ENABLE_FLAG() + && !hal_get_bool(emcmot_hal_data->jog_inhibit) + && pause_jog_check()) { + axis_pause_jog_abs(emcmotCommand->axis, emcmotCommand->offset, emcmotCommand->vel); + } + break; + } if (joint == 0) { break; } @@ -1301,6 +1433,11 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) /* ===== END PLANNER_SWITCH_DEFER ==================================== */ break; + case EMCMOT_SET_PAUSE_RETURN_LAST: + rtapi_print_msg(RTAPI_MSG_DBG, "SET_PAUSE_RETURN_LAST"); + axis_set_pause_return_last((unsigned)emcmotCommand->flags); + break; + case EMCMOT_SET_SCURVE_PEAK_SCALE: /* S-curve rest-to-rest peak velocity scale: 0.5 = faithful (original * behaviour), 1.0 = physically-correct (full jerk-feasible cornering). @@ -1319,6 +1456,14 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) /* pause the motion */ /* can happen at any time */ rtapi_print_msg(RTAPI_MSG_DBG, "PAUSE"); + if (!emcmotStatus->paused) { + pause_save_spindles(); + } + /* pausing again while resuming stops the return where it is */ + if (emcmotInternal->pause_resume_cmd) { + emcmotInternal->pause_resume_cmd = 0; + axis_pause_return_cancel(); + } tpPause(&emcmotInternal->coord_tp); emcmotStatus->paused = 1; break; @@ -1327,6 +1472,10 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) /* run motion in reverse*/ /* only allowed during a pause */ rtapi_print_msg(RTAPI_MSG_DBG, "REVERSE"); + if (axis_pause_offset_active() || emcmotInternal->pause_resume_cmd) { + reportError(_("Can't run in reverse while jogged away from the paused position")); + break; + } tpSetRunDir(&emcmotInternal->coord_tp, TC_DIR_REVERSE); break; @@ -1334,6 +1483,10 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) /* run motion in reverse*/ /* only allowed during a pause */ rtapi_print_msg(RTAPI_MSG_DBG, "FORWARD"); + if (axis_pause_offset_active() || emcmotInternal->pause_resume_cmd) { + reportError(_("Can't change direction while jogged away from the paused position")); + break; + } tpSetRunDir(&emcmotInternal->coord_tp, TC_DIR_FORWARD); break; @@ -1341,23 +1494,27 @@ void emcmotCommandHandler_locked(void *arg, long servo_period) /* resume paused motion */ /* can happen at any time */ rtapi_print_msg(RTAPI_MSG_DBG, "RESUME"); - emcmotStatus->stepping = 0; - tpResume(&emcmotInternal->coord_tp); - emcmotStatus->paused = 0; + if (emcmotStatus->paused && GET_MOTION_COORD_FLAG()) { + /* spindles, then back to the paused position, then on: + do_pause_resume() in control.c */ + emcmotInternal->pause_resume_cmd = EMCMOT_RESUME; + emcmotInternal->pause_resume_phase = 0; + break; + } + pause_resume_now(EMCMOT_RESUME); break; case EMCMOT_STEP: /* resume paused motion until id changes */ /* can happen at any time */ rtapi_print_msg(RTAPI_MSG_DBG, "STEP"); - if(emcmotStatus->paused) { - emcmotInternal->idForStep = emcmotStatus->id; - emcmotStatus->stepping = 1; - tpResume(&emcmotInternal->coord_tp); - emcmotStatus->paused = 1; - } else { - reportError(_("MOTION: can't STEP while already executing")); + if (emcmotStatus->paused && GET_MOTION_COORD_FLAG()) { + /* as EMCMOT_RESUME, see do_pause_resume() */ + emcmotInternal->pause_resume_cmd = EMCMOT_STEP; + emcmotInternal->pause_resume_phase = 0; + break; } + pause_resume_now(EMCMOT_STEP); break; case EMCMOT_FEED_SCALE: diff --git a/src/emc/motion/control.c b/src/emc/motion/control.c index 17fb96b7ddd..ff4af89a4ab 100644 --- a/src/emc/motion/control.c +++ b/src/emc/motion/control.c @@ -195,6 +195,9 @@ static void update_status(void); static void handle_kinematicsSwitch(void); +/* resume after jogs while paused: spindles, at speed, back, on */ +static void do_pause_resume(void); + /*********************************************************************** * PUBLIC FUNCTION CODE * ************************************************************************/ @@ -259,7 +262,7 @@ void emcmotController(void *arg, long period) handle_jjogwheels(); } if (!emcmotStatus->on_soft_limit && !hal_get_bool(emcmot_hal_data->jog_inhibit)) { // change from teleop to move off joint soft limit - axis_handle_jogwheels(GET_MOTION_TELEOP_FLAG(), GET_MOTION_ENABLE_FLAG(), get_homing_is_active()); + axis_handle_jogwheels(GET_MOTION_TELEOP_FLAG(), emcmotStatus->pause_jog_ok, GET_MOTION_ENABLE_FLAG(), get_homing_is_active()); } if ( (emcmotStatus->motion_state == EMCMOT_MOTION_FREE) && do_homing()) { @@ -972,6 +975,8 @@ static void set_operating_mode(void) hal_set_bool(emcmot_hal_data->eoffset_limited, 0); } axis_initialize_external_offsets(); + axis_pause_clear(); + emcmotInternal->pause_resume_cmd = 0; tpSetPos(&emcmotInternal->coord_tp, &emcmotStatus->carte_pos_cmd); for (joint_num = 0; joint_num < ALL_JOINTS; joint_num++) { /* point to joint data */ @@ -1017,6 +1022,11 @@ static void set_operating_mode(void) } } coord_cubic_active = 0; + /* jogs while paused end with coordinated mode; their offsets + are in carte_pos_cmd */ + axis_pause_clear(); + emcmotInternal->pause_resume_cmd = 0; + emcmotStatus->pause_jog_ok = 0; /* Initialize things to do when starting teleop mode. */ SET_MOTION_TELEOP_FLAG(1); SET_MOTION_COORD_FLAG(0); @@ -1082,6 +1092,9 @@ static void set_operating_mode(void) /* but it can stay disabled until a move is required */ joint->free_tp.enable = 0; } + axis_pause_clear(); + emcmotInternal->pause_resume_cmd = 0; + emcmotStatus->pause_jog_ok = 0; SET_MOTION_COORD_FLAG(0); SET_MOTION_TELEOP_FLAG(0); SET_MOTION_ERROR_FLAG(0); @@ -1430,6 +1443,25 @@ static void get_pos_cmds(long period) /* get new commanded traj pos */ tpGetPos(&emcmotInternal->coord_tp, &emcmotStatus->carte_pos_cmd); + /* jogs while paused move the axes off the paused position by + the pause offsets; a resume first brings them back */ + emcmotStatus->pause_jog_ok = emcmotStatus->paused + && !emcmotStatus->stepping + && !emcmotInternal->pause_resume_cmd + && emcmotStatus->current_vel < 1e-9; + axis_pause_update(pcmd_p, servo_period); + do_pause_resume(); + if ( !emcmotStatus->paused + && !emcmotInternal->pause_resume_cmd + && axis_pause_offset_active() + && !axis_pause_jog_is_active() + && tpIsDone(&emcmotInternal->coord_tp)) { + /* aborted while jogged away: stay here, the planner + takes the offsets into its position */ + tpSetPos(&emcmotInternal->coord_tp, &emcmotStatus->carte_pos_cmd); + axis_pause_clear(); + } + if (axis_update_coord_with_bound(pcmd_p, servo_period)) { ext_offset_coord_limit = 1; } else { @@ -2258,6 +2290,20 @@ static void update_status(void) emcmotStatus->external_offsets_applied = hal_get_bool(emcmot_hal_data->eoffset_active); + emcmotStatus->pause_offset.tran.x = axis_get_pause_offset(0); + emcmotStatus->pause_offset.tran.y = axis_get_pause_offset(1); + emcmotStatus->pause_offset.tran.z = axis_get_pause_offset(2); + emcmotStatus->pause_offset.a = axis_get_pause_offset(3); + emcmotStatus->pause_offset.b = axis_get_pause_offset(4); + emcmotStatus->pause_offset.c = axis_get_pause_offset(5); + emcmotStatus->pause_offset.u = axis_get_pause_offset(6); + emcmotStatus->pause_offset.v = axis_get_pause_offset(7); + emcmotStatus->pause_offset.w = axis_get_pause_offset(8); + emcmotStatus->pause_returning = emcmotInternal->pause_resume_cmd != 0; + if (!GET_MOTION_COORD_FLAG()) { + emcmotStatus->pause_jog_ok = 0; + } + for (dio = 0; dio < emcmotConfig->numDIO; dio++) { emcmotStatus->synch_di[dio] = hal_get_bool(emcmot_hal_data->synch_di[dio]); emcmotStatus->synch_do[dio] = hal_get_bool(emcmot_hal_data->synch_do[dio]); @@ -2374,3 +2420,47 @@ static void update_status(void) } #endif } + +/* Resuming a pause (EMCMOT_RESUME or EMCMOT_STEP, see command.c): put the + spindles back the way they were when the motion paused and wait until + they are at speed, return the axes from jogs while paused to the paused + position (axis_pause_return_*()), then resume. A pause on the way stops + it (command.c). */ +static void do_pause_resume(void) +{ + // a changed spindle's at-speed input needs a moment to follow the new + // command before it can be trusted + static const double SPINDLE_SETTLE = 0.1; + static double settle; + int n; + + if (!emcmotInternal->pause_resume_cmd) { return; } + + switch (emcmotInternal->pause_resume_phase) { + case 0: + settle = pause_restore_spindles() ? SPINDLE_SETTLE : 0; + emcmotInternal->pause_resume_phase = 1; + /* fall through */ + case 1: + if (settle > 0) { + settle -= servo_period; + return; + } + for (n = 0; n < emcmotConfig->numSpindles; n++) { + if (emcmotStatus->spindle_status[n].state + && !emcmotStatus->spindle_status[n].at_speed) { + return; + } + } + axis_pause_return_start(); + emcmotInternal->pause_resume_phase = 2; + /* fall through */ + case 2: + if (!axis_pause_return_update()) { return; } + n = emcmotInternal->pause_resume_cmd; + emcmotInternal->pause_resume_cmd = 0; + emcmotInternal->pause_resume_phase = 0; + pause_resume_now(n); + break; + } +} diff --git a/src/emc/motion/mot_priv.h b/src/emc/motion/mot_priv.h index 954de98dd84..df94e1cbe90 100644 --- a/src/emc/motion/mot_priv.h +++ b/src/emc/motion/mot_priv.h @@ -265,6 +265,11 @@ extern int emcmotGetRotaryIsUnlocked(int axis); // void switch_to_teleop_mode(void); +/* resuming after jogs while paused, see command.c and do_pause_resume() */ +void pause_resume_now(int cmd); +void pause_save_spindles(void); +bool pause_restore_spindles(void); + /* recalculates jog limits */ extern void refresh_jog_limits(emcmot_joint_t *joint,int joint_num); /* handles 'homed' flags, see command.c for details */ diff --git a/src/emc/motion/motion.h b/src/emc/motion/motion.h index 7f3572eda73..ae4306d2ed0 100644 --- a/src/emc/motion/motion.h +++ b/src/emc/motion/motion.h @@ -128,6 +128,7 @@ extern "C" { EMCMOT_SET_JERK, /* set the max jerk for moves (tooltip) */ EMCMOT_SET_PLANNER_TYPE, /* set planner type (0=trapezoidal, 1=S-curve) */ EMCMOT_SET_SCURVE_PEAK_SCALE, /* set S-curve rest-to-rest peak scale (0.5=faithful..1.0=full) */ + EMCMOT_SET_PAUSE_RETURN_LAST, /* axes (flags mask) that return last after jogs while paused */ EMCMOT_SET_TERM_COND, /* set termination condition (stop, blend) */ EMCMOT_SET_NUM_JOINTS, /* set the number of joints */ EMCMOT_SET_NUM_SPINDLES, /* set the number of spindles */ @@ -676,6 +677,9 @@ Suggestion: Split this in to an Error and a Status flag register.. unsigned char tail; /* flag count for mutex detect */ int external_offsets_applied; EmcPose eoffset_pose; + EmcPose pause_offset; /* how far jogs while paused moved off the paused position */ + int pause_jog_ok; /* paused and stopped in coordinated mode: axes may jog */ + int pause_returning; /* resuming: back to the paused position, then on */ int numExtraJoints; int stepping; bool jogging_active; @@ -775,6 +779,12 @@ Suggestion: Split this in to an Error and a Status flag register.. } emcmot_error_t; +/* a spindle as it was when the motion paused, see pause_save_spindles() */ +typedef struct { + int state, direction, brake; + double speed, css_factor, xoffset; +} emcmot_pause_spindle_t; + typedef struct emcmot_internal_t { unsigned char head; /* flag count for mutex detect */ unsigned char tail; /* flag count for mutex detect */ @@ -786,6 +796,12 @@ typedef struct emcmot_internal_t { move while overriding limits */ TP_STRUCT coord_tp; /* coordinated mode planner */ int idForStep; /* status id while stepping */ + /* resuming after jogs while paused, see do_pause_resume() in control.c: + 0 nothing to do, EMCMOT_RESUME or EMCMOT_STEP once back */ + int pause_resume_cmd; + int pause_resume_phase; /* 0 spindles, 1 at speed, 2 return */ + int pause_spindles_saved; + emcmot_pause_spindle_t pause_spindle[EMCMOT_MAX_SPINDLES]; /* the spindles when paused */ } emcmot_internal_t; /* error ring buffer access functions */ diff --git a/src/emc/nml_intf/emc.cc b/src/emc/nml_intf/emc.cc index da9b88e1e78..b4c06e59d43 100644 --- a/src/emc/nml_intf/emc.cc +++ b/src/emc/nml_intf/emc.cc @@ -217,8 +217,6 @@ int emcFormat(NMLTYPE type, void *buffer, CMS * cms) case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: ((EMC_TASK_PLAN_OPTIONAL_STOP *) buffer)->update(cms); break; - case EMC_TASK_SET_MODE_TYPE: - ((EMC_TASK_SET_MODE *) buffer)->update(cms); break; case EMC_TASK_SET_STATE_TYPE: ((EMC_TASK_SET_STATE *) buffer)->update(cms); @@ -458,8 +456,6 @@ const char *emc_symbol_lookup(uint32_t type) return "EMC_TASK_PLAN_SET_BLOCK_DELETE"; case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: return "EMC_TASK_PLAN_OPTIONAL_STOP"; - case EMC_TASK_SET_MODE_TYPE: - return "EMC_TASK_SET_MODE"; case EMC_TASK_SET_STATE_TYPE: return "EMC_TASK_SET_STATE"; case EMC_TASK_STAT_TYPE: @@ -1460,18 +1456,6 @@ void EMC_STAT_MSG::update(CMS * /*cms*/) } -/* -* NML/CMS Update function for EMC_TASK_SET_MODE -* Automatically generated by NML CodeGen Java Applet. -* on Sat Oct 11 13:45:16 UTC 2003 -*/ -// cppcheck-suppress duplInheritedMember -void EMC_TASK_SET_MODE::update(CMS * cms) -{ - EMC_TASK_CMD_MSG::update(cms); - cms->update((int *) &mode, 1); -} - /* * NML/CMS Update function for EMC_JOG_INCR */ @@ -1840,6 +1824,9 @@ void EMC_MOTION_STAT::update(CMS * cms) cms->update(on_soft_limit); cms->update(external_offsets_applied); EmcPose_update(cms, &eoffset_pose); + EmcPose_update(cms, &pause_offset); + cms->update(pause_jog_ok); + cms->update(pause_returning); cms->update(numExtraJoints); cms->update(jogging_active); cms->update(homing_active); diff --git a/src/emc/nml_intf/emc.hh b/src/emc/nml_intf/emc.hh index d251e08abc6..5d46de23d48 100644 --- a/src/emc/nml_intf/emc.hh +++ b/src/emc/nml_intf/emc.hh @@ -124,7 +124,6 @@ struct PM_CARTESIAN; // NML for EMC_TASK #define EMC_TASK_ABORT_TYPE ((NMLTYPE) 503) -#define EMC_TASK_SET_MODE_TYPE ((NMLTYPE) 504) #define EMC_TASK_SET_STATE_TYPE ((NMLTYPE) 505) #define EMC_TASK_PLAN_OPEN_TYPE ((NMLTYPE) 506) #define EMC_TASK_PLAN_RUN_TYPE ((NMLTYPE) 507) @@ -393,6 +392,7 @@ extern int emcTrajUpdate(EMC_TRAJ_STAT * stat); extern int emcTrajSetJerk(double jerk); extern int emcTrajSetMaxJerk(double jerk); extern int emcTrajPlannerType(int type); +extern int emcTrajSetPauseReturnLast(unsigned axis_mask); extern int emcTrajSetScurvePeakScale(double scale); /* G64_R_PLANNER: [TRAJ]SMOOTH_PLANNER - planner a G64 R>0 request resolves to */ extern int emcTrajSetSmoothPlanner(int type); diff --git a/src/emc/nml_intf/emc_nml.hh b/src/emc/nml_intf/emc_nml.hh index 6e5d2277849..f246849dbbb 100644 --- a/src/emc/nml_intf/emc_nml.hh +++ b/src/emc/nml_intf/emc_nml.hh @@ -1182,6 +1182,9 @@ class EMC_MOTION_STAT:public EMC_MOTION_STAT_MSG { int on_soft_limit; int external_offsets_applied; EmcPose eoffset_pose; + EmcPose pause_offset; // how far jogs while paused moved off the paused position + bool pause_jog_ok; // paused and stopped: axes may jog + bool pause_returning; // resuming: spindles, back to the paused position, then on int numExtraJoints; bool jogging_active; // Aggregate "the homing state machine is running", from @@ -1221,21 +1224,6 @@ class EMC_TASK_ABORT:public EMC_TASK_CMD_MSG { void update(CMS * cms); }; -class EMC_TASK_SET_MODE:public EMC_TASK_CMD_MSG { - public: - EMC_TASK_SET_MODE() - : EMC_TASK_CMD_MSG(EMC_TASK_SET_MODE_TYPE, sizeof(EMC_TASK_SET_MODE)), - mode(EMC_TASK_MODE::AUTO) - {}; - - // For internal NML/CMS use only. - // Sub-class update() calls base-class update() - // cppcheck-suppress duplInheritedMember - void update(CMS * cms); - - EMC_TASK_MODE mode; -}; - class EMC_TASK_SET_STATE:public EMC_TASK_CMD_MSG { public: EMC_TASK_SET_STATE() diff --git a/src/emc/nml_intf/emcops.cc b/src/emc/nml_intf/emcops.cc index 708ec2a9f52..a53af59382c 100644 --- a/src/emc/nml_intf/emcops.cc +++ b/src/emc/nml_intf/emcops.cc @@ -124,6 +124,9 @@ EMC_MOTION_STAT::EMC_MOTION_STAT() on_soft_limit(0), external_offsets_applied(0), eoffset_pose{}, + pause_offset{}, + pause_jog_ok(false), + pause_returning(false), numExtraJoints(0), jogging_active(0), homing_active(false), diff --git a/src/emc/task/Submakefile b/src/emc/task/Submakefile index 9fdab7004d6..3892cdeb7eb 100644 --- a/src/emc/task/Submakefile +++ b/src/emc/task/Submakefile @@ -23,6 +23,8 @@ MILLTASKSRCS := \ emc/motion/stashf.c \ emc/task/taskclass.cc \ emc/task/backtrace.cc \ + emc/task/cmd_queue.cc \ + emc/task/halui.cc \ emc/usr_intf/mapini.cc USERSRCS += $(MILLTASKSRCS) diff --git a/src/emc/task/cmd_queue.cc b/src/emc/task/cmd_queue.cc new file mode 100644 index 00000000000..2ba477d4c1a --- /dev/null +++ b/src/emc/task/cmd_queue.cc @@ -0,0 +1,109 @@ +/******************************************************************** +* Description: cmd_queue.cc +* Command injection point for task-internal command producers. +* See cmd_queue.hh for what it is for. +* +* License: GPL Version 2 +********************************************************************/ + +#include "cmd_queue.hh" + +#include "nml_intf/emc.hh" +#include "nml_intf/emc_nml.hh" + +#include +#include +#include +#include + +namespace { + +struct Entry { + std::vector data; /* the message, byte for byte */ + taskcmd::Ticket ticket = 0; + unsigned long key = 0; /* 0: never superseded */ +}; + +std::mutex g_mu; /* guards everything below */ +std::deque g_queue; +Entry g_current; /* keeps the popped message alive */ +taskcmd::Ticket g_next_ticket = 1; + +/* A backlog this long means the producer is far ahead of task and the + commands are stale anyway; dropping is better than growing without + bound. Jogs coalesce, so reaching this takes a genuine flood. */ +const size_t MAX_QUEUED = 64; + +} // namespace + +taskcmd::Ticket taskcmd::pushRaw(const void *cmd, size_t size, + unsigned long coalesce_key) +{ + if (cmd == NULL || size == 0 || size > MAX_CMD_SIZE) { + return 0; + } + + std::lock_guard lk(g_mu); + + const Ticket ticket = g_next_ticket++; + + if (coalesce_key != 0) { + for (Entry &e : g_queue) { + if (e.key != coalesce_key) { + continue; + } + /* Supersede in place: the newer command takes the older one's + turn, so ordering against other commands is unchanged. */ + e.data.assign(static_cast(cmd), + static_cast(cmd) + size); + e.ticket = ticket; + return ticket; + } + } + + if (g_queue.size() >= MAX_QUEUED) { + return 0; + } + + Entry e; + e.data.assign(static_cast(cmd), + static_cast(cmd) + size); + e.ticket = ticket; + e.key = coalesce_key; + g_queue.push_back(std::move(e)); + + return ticket; +} + +bool taskcmd::pending(Ticket ticket) +{ + if (ticket == 0) { + return false; + } + + std::lock_guard lk(g_mu); + for (const Entry &e : g_queue) { + if (e.ticket == ticket) { + return true; + } + } + return false; +} + +RCS_CMD_MSG *taskcmd::next(int echo_serial_number) +{ + std::lock_guard lk(g_mu); + + if (g_queue.empty()) { + return NULL; + } + + g_current = std::move(g_queue.front()); + g_queue.pop_front(); + + /* Task treats a command as new when its serial differs from the one it + last echoed, so hand it the next serial along. */ + RCS_CMD_MSG *msg = reinterpret_cast(g_current.data.data()); + msg->serial_number = echo_serial_number + 1; + return msg; +} diff --git a/src/emc/task/cmd_queue.hh b/src/emc/task/cmd_queue.hh new file mode 100644 index 00000000000..d05f6f6f493 --- /dev/null +++ b/src/emc/task/cmd_queue.hh @@ -0,0 +1,74 @@ +/******************************************************************** +* Description: cmd_queue.hh +* Command injection point for everything inside task that issues NML +* commands without going through the NML command channel. +* +* Task executes one command per cycle, taken either from the NML command +* buffer or from this queue. A command placed here is therefore judged by +* emcTaskPlan() exactly like one that arrived over NML: same mode and +* state gating, same serial-number echo, same error reporting. +* +* halui.cc, running in the task thread, is the only producer today. +* push() is thread safe, so a transport running in its own thread can +* use it too. +* +* License: GPL Version 2 +********************************************************************/ +#ifndef TASK_CMD_QUEUE_HH +#define TASK_CMD_QUEUE_HH + +#include + +class RCS_CMD_MSG; + +namespace taskcmd { + +/* Biggest NML command that can be queued. EMC_TASK_PLAN_OPEN is the large + one (a LINELEN path plus a 4k remote transfer buffer). */ +const size_t MAX_CMD_SIZE = 8192; + +/* Identifies one queued command, so a producer can tell whether task has + taken it yet. Zero is never a valid ticket: push() returns 0 when the + queue is full, and pending(0) is false. */ +typedef unsigned long Ticket; + +/* Queue a copy of a command message. Thread safe. + + coalesce_key, when non-zero, means "this command supersedes any command + still queued under the same key": the pending one is overwritten in + place, keeping its position in the queue. It is for commands that carry + a state rather than an action -- a continuous jog is the case that + matters, where a producer running faster than task drains the queue + would otherwise build a backlog of stale velocities. Never use it for a + command that must happen exactly once, such as an incremental jog. + + The superseded command's ticket stops being pending without ever having + been executed, so a producer that watches a ticket must pass key 0. */ +Ticket pushRaw(const void *cmd, size_t size, unsigned long coalesce_key); + +template +Ticket push(const T &cmd, unsigned long coalesce_key = 0) +{ + static_assert(sizeof(T) <= MAX_CMD_SIZE, "NML command too large to queue"); + return pushRaw(&cmd, sizeof(T), coalesce_key); +} + +/* True while the command is still waiting. False once task has taken it -- + which, for a caller running in the task loop after the status update, + means the command has been issued and the status reflects it. */ +bool pending(Ticket ticket); + +/* Pop the next command, or NULL if none is waiting. Task loop only. + + The returned message stays valid until the next call and is meant to be + consumed exactly like one freshly read from NML. echo_serial_number is + the serial task last echoed; the message gets echo_serial_number + 1 so + that task's "is this a new command?" test fires. Task puts the serial + back afterwards without echoing it: an NML serial is the command + buffer's write id, and echoing one of those here would make task drop + the next command an NML client writes. */ +RCS_CMD_MSG *next(int echo_serial_number); + +} // namespace taskcmd + +#endif /* TASK_CMD_QUEUE_HH */ diff --git a/src/emc/task/emctask.cc b/src/emc/task/emctask.cc index 6e88b359372..b831ff8e154 100644 --- a/src/emc/task/emctask.cc +++ b/src/emc/task/emctask.cc @@ -52,8 +52,7 @@ static_assert(EMC_MAX_CALL_STACK >= INTERP_SUB_ROUTINE_LEVELS, #define MAX_M_DIRS (USER_DEFINED_FUNCTION_MAX_DIRS+1) //note:the +1 is for the PROGRAM_PREFIX or default directory==nc_files -/* flag for how we want to interpret traj coord mode, as mdi or auto */ -static EMC_TASK_MODE mdiOrAuto = EMC_TASK_MODE::AUTO; +TaskRun taskRun = TaskRun::NONE; InterpBase *pinterp=NULL; #define interp (*pinterp) @@ -225,7 +224,7 @@ int emcTaskStateRestore() { int res = 0; // Do NOT restore on MDI command - if (emcStatus->task.mode == EMC_TASK_MODE::AUTO) { + if (taskRun == TaskRun::PROGRAM) { // Validity of state tag checked within restore function res = pinterp->restore_from_tag(emcStatus->motion.traj.tag); } @@ -276,50 +275,6 @@ int emcTaskAbort() return 0; } -int emcTaskSetMode(EMC_TASK_MODE mode) -{ - int retval = 0; - - if (jogging_is_active()) { - log_info("Ignoring task mode change while jogging"); - return 0; - } - - switch (mode) { - case EMC_TASK_MODE::MANUAL: - // go to manual mode - if (all_homed()) { - emcTrajSetMode(EMC_TRAJ_MODE::TELEOP); - } else { - emcTrajSetMode(EMC_TRAJ_MODE::FREE); - } - mdiOrAuto = EMC_TASK_MODE::AUTO; // we'll default back to here - break; - - case EMC_TASK_MODE::MDI: - // go to mdi mode - emcTrajSetMode(EMC_TRAJ_MODE::COORD); - emcTaskAbort(); - emcTaskPlanSynch(); - mdiOrAuto = EMC_TASK_MODE::MDI; - break; - - case EMC_TASK_MODE::AUTO: - // go to auto mode - emcTrajSetMode(EMC_TRAJ_MODE::COORD); - emcTaskAbort(); - emcTaskPlanSynch(); - mdiOrAuto = EMC_TASK_MODE::AUTO; - break; - - default: - retval = -1; - break; - } - - return retval; -} - int emcTaskSetState(EMC_TASK_STATE state) { int t; @@ -384,27 +339,25 @@ int emcTaskSetState(EMC_TASK_STATE state) /* determineMode() - Looks at mode of subsystems, and returns associated mode + The task mode is not set by anyone, it reports what task is running: - Depends on traj mode, and mdiOrAuto flag - - traj mode mdiOrAuto task mode - --------- --------- --------- - FREE XXX MANUAL - TELEOP XXX MANUAL - COORD MDI MDI - COORD AUTO AUTO + taskRun task mode + ------- --------- + NONE MANUAL + PROGRAM AUTO + MDI MDI */ EMC_TASK_MODE determineMode() { - if (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::FREE) { - return EMC_TASK_MODE::MANUAL; - } - if (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::TELEOP) { - return EMC_TASK_MODE::MANUAL; - } - // for EMC_TRAJ_MODE::COORD - return mdiOrAuto; + switch (taskRun) { + case TaskRun::PROGRAM: + return EMC_TASK_MODE::AUTO; + case TaskRun::MDI: + return EMC_TASK_MODE::MDI; + case TaskRun::NONE: + break; + } + return EMC_TASK_MODE::MANUAL; } /* @@ -756,7 +709,7 @@ int emcTaskUpdate(EMC_TASK_STAT * stat) } // If we get an error from trying to unpack from the motion state, always // use interp's internal state, so the active state is never out of date - if (emcStatus->task.mode != EMC_TASK_MODE::AUTO || + if (taskRun != TaskRun::PROGRAM || res_state == INTERP_ERROR) { interp.active_g_codes(&stat->activeGCodes[0]); interp.active_m_codes(&stat->activeMCodes[0]); diff --git a/src/emc/task/emctaskmain.cc b/src/emc/task/emctaskmain.cc index 96fa4951eab..d91c9d81367 100644 --- a/src/emc/task/emctaskmain.cc +++ b/src/emc/task/emctaskmain.cc @@ -86,6 +86,8 @@ fpu_control_t __fpu_control = _FPU_IEEE & ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_M #include "taskclass.hh" #include "motion/motion.h" // EMCMOT_ORIENT_* #include "ini/inihal.hh" +#include "halui.hh" // the HAL user interface, in task +#include "cmd_queue.hh" // commands from inside task (halui) using namespace linuxcnc; using namespace std::chrono_literals; @@ -108,6 +110,9 @@ static RCS_CMD_MSG *emcCommand = NULL; // global EMC status EMC_STAT *emcStatus = NULL; +// set while emcCommand points at a command from inside task (halui) +// rather than at the NML command buffer +static bool emcCommandInternal = false; // timer stuff static linuxcnc::CyclicTimer *timer = NULL; @@ -411,7 +416,7 @@ static EMC_TRAJ_SET_SPINDLESYNC *emcTrajSetSpindlesyncMsg; // MDI while running in TELEOP/COORD would otherwise silently stall. We dip // motion into FREE for the duration and restore whatever mode it was in // before, invisibly to the task-level MDI/AUTO/MANUAL state -// (mdiOrAuto is untouched) -- same principle as multichannel-DESIGN.txt's +// (taskRun is untouched) -- same principle as multichannel-DESIGN.txt's // "channel sessions do NOT flip the global teleop mode" for the analogous // per-channel-homing problem. static int homingWaitJoint = -1; // joint (-1 = all) we're waiting on @@ -452,7 +457,6 @@ static EMC_TOOL_PREPARE *tool_prepare_msg; static EMC_TOOL_LOAD_TOOL_TABLE *load_tool_table_msg; static EMC_TOOL_SET_OFFSET *emc_tool_set_offset_msg; static EMC_TOOL_SET_NUMBER *emc_tool_set_number_msg; -static EMC_TASK_SET_MODE *mode_msg; static EMC_TASK_SET_STATE *state_msg; static EMC_TASK_PLAN_RUN *run_msg; static EMC_TASK_PLAN_EXECUTE *execute_msg; @@ -782,27 +786,302 @@ void readahead_waiting(void) } } -static bool allow_while_idle_type() { - // allow for EMC_TASK_MODE::AUTO, EMC_TASK_MODE::MDI - // expect immediate command - RCS_CMD_MSG *emcCommand; - emcCommand = emcCommandBuffer->get_address(); - switch(emcCommand->_type) { - case EMC_JOG_CONT_TYPE: - case EMC_JOG_INCR_TYPE: - case EMC_JOG_STOP_TYPE: - case EMC_JOG_ABS_TYPE: - case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE: - return 1; - break; +// Runs. Task is idle (taskRun NONE) until an MDI command or a program +// starts a run, and idle again once the run is over. Nobody sets a task +// mode; the one reported is derived from taskRun (determineMode()). +// +// Motion follows: while idle it is in free or teleop mode, so jogs, wheel +// jogs and homing work; a run puts it in coordinated mode. Motion only +// makes that switch once in position, so a run waits for it before the +// first command leaves interp_list (see coordWaiting in emcTaskExecute()). + +// The coolant as it was when a program or MDI paused: resume puts it back, +// as motion does with the spindles (pause_restore_spindles()). +static bool pauseCoolantSaved = false; +static int pauseMist = 0; +static int pauseFlood = 0; + +// Set by taskRunStart(), cleared once motion is in coordinated mode. +static bool coordWaiting = false; +static double coordWaitStart = 0.0; +static const double COORD_WAIT_TIMEOUT = 5.0; + +// The motion mode and homing at the start of a run, to go back to, and +// the mode the last run went back to. +static EMC_TRAJ_MODE runPriorMode = EMC_TRAJ_MODE::FREE; +static bool runPriorHomed = false; +static EMC_TRAJ_MODE idleMode = EMC_TRAJ_MODE::FREE; +// Set by taskRunEnd() until motion is in idleMode. Task is not DONE while +// a run is on or before that, so a client that waits for DONE and then +// jogs finds motion ready. +static bool idleModePending = false; +static double idleModeSince = 0.0; +static const double IDLE_MODE_TIMEOUT = 1.0; + +// Leave idle for a run. Returns -1, with an operator error, if the run may +// not start. +static int taskRunStart(TaskRun run) +{ + const bool mdi = run == TaskRun::MDI; + + if (!all_homed() && !no_force_homing) { //!no_force_homing = force homing before MDI and Auto + emcOperatorError(mdi ? _("Can't issue MDI command when not homed") + : _("Can't run a program when not homed")); + return -1; + } + if (!mdi && emcStatus->task.file[0] == 0) { + // a step would pause on nothing and never finish + emcOperatorError(_("Can't run a program: no program is open")); + return -1; + } + if (jogging_is_active()) { + emcOperatorError(mdi ? _("Can't issue MDI command while jogging") + : _("Can't run a program while jogging")); + return -1; + } + + // Right after a run the status can still show coordinated mode while + // motion is on its way back to idleMode, so send the switch anyway. + runPriorMode = emcStatus->motion.traj.mode; + if (runPriorMode == EMC_TRAJ_MODE::COORD) { + runPriorMode = idleMode; + } + runPriorHomed = all_homed(); + if (emcTrajSetMode(EMC_TRAJ_MODE::COORD) != 0) { + emcOperatorError(_("Can't switch motion to coordinated mode")); + return -1; } + coordWaiting = true; + coordWaitStart = etime(); + idleModePending = false; + + if (mdi && taskplanopen) { + // what a switch to MDI mode did: MDI does not run with the + // program open; PLAN_RUN opens it again + emcTaskPlanClose(); + } + // the machine may have moved since the interpreter last looked + emcTaskPlanSynch(); + + taskRun = run; return 0; } +// Back to idle: the motion mode the run started from, or, if homing +// changed in between, world mode when homed and joint mode otherwise. +static void taskRunEnd() +{ + taskRun = TaskRun::NONE; + coordWaiting = false; + pauseCoolantSaved = false; + + EMC_TRAJ_MODE mode = all_homed() ? EMC_TRAJ_MODE::TELEOP : EMC_TRAJ_MODE::FREE; + if (runPriorHomed == (bool)all_homed()) { + mode = runPriorMode; + } + idleMode = mode; + emcTrajSetMode(mode); + idleModePending = true; + idleModeSince = etime(); +} + +// End the run once the interpreter is idle: a program that ran to its end, +// an MDI command that finished with nothing queued behind it, or anything +// aborted. What an abort leaves on interp_list (the interpreter synch) runs +// while idle. +static void taskRunCheckDone() +{ + if (taskRun == TaskRun::NONE + || emcStatus->task.interpState != EMC_TASK_INTERP::IDLE) { + return; + } + if (taskRun == TaskRun::MDI + && (mdi_execute_queue.len() != 0 || mdi_execute_wait || mdi_execute_next)) { + return; + } + taskRunEnd(); +} + +/* + isImmediate() + + The commands emcTaskPlan() passes straight to emcTaskIssueCommand(), by + what task is doing. Everything else is handled, or refused, by the table + for the state task is in. + */ +static bool isImmediate(NMLTYPE type) +{ + const bool on = emcStatus->task.state == EMC_TASK_STATE::ON; + const bool program = on && taskRun == TaskRun::PROGRAM; + + switch (type) { + // in any state + case EMC_JOINT_SET_BACKLASH_TYPE: + case EMC_JOINT_SET_HOMING_PARAMS_TYPE: + case EMC_JOINT_SET_FERROR_TYPE: + case EMC_JOINT_SET_MIN_FERROR_TYPE: + case EMC_JOINT_UNHOME_TYPE: + case EMC_TRAJ_SET_SCALE_TYPE: + case EMC_TRAJ_SET_RAPID_SCALE_TYPE: + case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: + case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: + case EMC_TRAJ_SET_FO_ENABLE_TYPE: + case EMC_TRAJ_SET_FH_ENABLE_TYPE: + case EMC_TRAJ_SET_SO_ENABLE_TYPE: + case EMC_TASK_SET_STATE_TYPE: + case EMC_TASK_ABORT_TYPE: + case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: + case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: + case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: + case EMC_TRAJ_PROBE_TYPE: + case EMC_AUX_INPUT_WAIT_TYPE: + case EMC_TRAJ_RIGID_TAP_TYPE: + case EMC_SET_DEBUG_TYPE: + return true; + + // only while the machine is off or in E-stop + case EMC_JOINT_LOAD_COMP_TYPE: + case EMC_TRAJ_SET_VELOCITY_TYPE: + case EMC_TRAJ_SET_ACCELERATION_TYPE: + return !on; + + // once the machine is on, whatever runs + case EMC_COOLANT_MIST_ON_TYPE: + case EMC_COOLANT_MIST_OFF_TYPE: + case EMC_COOLANT_FLOOD_ON_TYPE: + case EMC_COOLANT_FLOOD_OFF_TYPE: + case EMC_SPINDLE_INCREASE_TYPE: + case EMC_SPINDLE_DECREASE_TYPE: + case EMC_SPINDLE_CONSTANT_TYPE: + case EMC_TASK_PLAN_PAUSE_TYPE: + case EMC_TASK_PLAN_REVERSE_TYPE: + case EMC_TASK_PLAN_FORWARD_TYPE: + case EMC_TASK_PLAN_RESUME_TYPE: + case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: + return on; + + // once the machine is on, unless a program runs and is not paused + case EMC_SPINDLE_SPEED_TYPE: + case EMC_SPINDLE_ORIENT_TYPE: + case EMC_SPINDLE_WAIT_ORIENT_COMPLETE_TYPE: + case EMC_SPINDLE_ON_TYPE: + case EMC_SPINDLE_OFF_TYPE: + case EMC_SPINDLE_BRAKE_RELEASE_TYPE: + case EMC_SPINDLE_BRAKE_ENGAGE_TYPE: + return on && (!program || emcStatus->task.interpState == EMC_TASK_INTERP::PAUSED); + + // unless a program runs + case EMC_TASK_PLAN_INIT_TYPE: + case EMC_TASK_PLAN_OPEN_TYPE: + case EMC_TASK_PLAN_CLOSE_TYPE: + case EMC_TASK_PLAN_SYNCH_TYPE: + case EMC_MOTION_SET_DOUT_TYPE: + case EMC_MOTION_SET_AOUT_TYPE: + case EMC_MOTION_ADAPTIVE_TYPE: + return !program; + + // unless a program or MDI runs + case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE: + return !on || taskRun == TaskRun::NONE; + } + return false; +} + +// The tool commands go through interp_list: no more reading until they +// are done, then the interpreter synchs. +static void queueToolCommand(NMLmsg *cmd) +{ + switch (cmd->_type) { + case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: + emcTaskQueueCommand(std::make_unique(*static_cast(cmd))); + break; + case EMC_TOOL_SET_OFFSET_TYPE: + emcTaskQueueCommand(std::make_unique(*static_cast(cmd))); + break; + case EMC_TOOL_SET_NUMBER_TYPE: + emcTaskQueueCommand(std::make_unique(*static_cast(cmd))); + break; + } + // signify no more reading + emcTaskPlanSetWait(); + // then resynch interpreter + emcTaskQueueTaskPlanSynchCmd(); +} + +// Coolant across a pause, see pauseCoolantSaved. +static void pauseSaveCoolant() +{ + if (pauseCoolantSaved) { + return; + } + pauseMist = emcStatus->io.coolant.mist; + pauseFlood = emcStatus->io.coolant.flood; + pauseCoolantSaved = true; +} + +static void pauseRestoreCoolant(bool resuming) +{ + if (!pauseCoolantSaved) { + return; + } + if (emcStatus->io.coolant.mist != pauseMist) { + pauseMist ? emcCoolantMistOn() : emcCoolantMistOff(); + } + if (emcStatus->io.coolant.flood != pauseFlood) { + pauseFlood ? emcCoolantFloodOn() : emcCoolantFloodOff(); + } + // a step pauses again, with the same coolant to come back to + pauseCoolantSaved = !resuming; +} + +// A jog while a program or MDI is paused moves the axes off the paused +// position, and resuming brings them back first (motion, axis_pause_*()). +// Only axes jog, and only once the pause has stopped the motion. +static int pausedJog(NMLmsg *cmd) +{ + int jjogmode = 0; + + switch (cmd->_type) { + case EMC_JOG_STOP_TYPE: + return emcTaskIssueCommand(cmd); + case EMC_JOG_CONT_TYPE: + jjogmode = static_cast(cmd)->jjogmode; + break; + case EMC_JOG_INCR_TYPE: + jjogmode = static_cast(cmd)->jjogmode; + break; + case EMC_JOG_ABS_TYPE: + jjogmode = static_cast(cmd)->jjogmode; + break; + } + if (jjogmode) { + emcOperatorError(_("Can't jog a joint while paused, jog an axis")); + return -1; + } + if (!emcStatus->motion.pause_jog_ok) { + emcOperatorError(_("Can't jog until the paused motion has stopped")); + return -1; + } + return emcTaskIssueCommand(cmd); +} + +// Start a run from idle with cmd, see taskRunStart(). +static int taskRunIssue(TaskRun run, NMLmsg *cmd) +{ + int retval = taskRunStart(run); + if (retval == 0) { + retval = emcTaskIssueCommand(cmd); + if (retval != 0) { + taskRunEnd(); + } + } + return retval; +} + /* emcTaskPlan() - Planner for NC code or manual mode operations + Planner for NC code or manual operations */ static int emcTaskPlan(void) { @@ -827,397 +1106,115 @@ static int emcTaskPlan(void) return retval; } - // handle any new command + taskRunCheckDone(); + + // handle any new command: no command, the immediate ones (isImmediate()), + // then what is special to the state task is in switch (emcStatus->task.state) { case EMC_TASK_STATE::OFF: case EMC_TASK_STATE::ESTOP: case EMC_TASK_STATE::ESTOP_RESET: + switch (type) { + case 0: + case EMC_NULL_TYPE: + break; - // now switch on the mode - switch (emcStatus->task.mode) { - case EMC_TASK_MODE::MANUAL: - case EMC_TASK_MODE::AUTO: - case EMC_TASK_MODE::MDI: - - // now switch on the command - switch (type) { - case 0: - case EMC_NULL_TYPE: - // no command - break; - - // immediate commands - case EMC_JOINT_SET_BACKLASH_TYPE: - case EMC_JOINT_SET_HOMING_PARAMS_TYPE: - case EMC_JOINT_SET_FERROR_TYPE: - case EMC_JOINT_SET_MIN_FERROR_TYPE: - case EMC_JOINT_LOAD_COMP_TYPE: - case EMC_JOINT_UNHOME_TYPE: - case EMC_TRAJ_SET_SCALE_TYPE: - case EMC_TRAJ_SET_RAPID_SCALE_TYPE: - case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: - case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: - case EMC_TRAJ_SET_FO_ENABLE_TYPE: - case EMC_TRAJ_SET_FH_ENABLE_TYPE: - case EMC_TRAJ_SET_SO_ENABLE_TYPE: - case EMC_TRAJ_SET_VELOCITY_TYPE: - case EMC_TRAJ_SET_ACCELERATION_TYPE: - case EMC_TASK_SET_MODE_TYPE: - case EMC_TASK_SET_STATE_TYPE: - case EMC_TASK_PLAN_INIT_TYPE: - case EMC_TASK_PLAN_OPEN_TYPE: - case EMC_TASK_PLAN_CLOSE_TYPE: - case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: - case EMC_TASK_ABORT_TYPE: - case EMC_TASK_PLAN_SYNCH_TYPE: - case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: - case EMC_TRAJ_PROBE_TYPE: - case EMC_AUX_INPUT_WAIT_TYPE: - case EMC_MOTION_SET_DOUT_TYPE: - case EMC_MOTION_ADAPTIVE_TYPE: - case EMC_MOTION_SET_AOUT_TYPE: - case EMC_TRAJ_RIGID_TAP_TYPE: - case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE: - case EMC_SET_DEBUG_TYPE: + // one case where nothing may be running + case EMC_JOINT_OVERRIDE_LIMITS_TYPE: + retval = 0; + if (taskRun == TaskRun::NONE) { retval = emcTaskIssueCommand(emcCommand); - break; - - // one case where we need to be in manual mode - case EMC_JOINT_OVERRIDE_LIMITS_TYPE: - retval = 0; - if (emcStatus->task.mode == EMC_TASK_MODE::MANUAL) { - retval = emcTaskIssueCommand(emcCommand); - } - break; - - case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); - break; - } - case EMC_TOOL_SET_OFFSET_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); - break; } + break; - case EMC_TOOL_SET_NUMBER_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); - break; - } - - default: - emcOperatorError(_("command (%s) cannot be executed until the machine is out of E-stop and turned on"), emc_symbol_lookup(type)); - retval = -1; - break; - - } // switch (type) + case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: + case EMC_TOOL_SET_OFFSET_TYPE: + case EMC_TOOL_SET_NUMBER_TYPE: + queueToolCommand(emcCommand); + break; default: - // invalid mode + if (isImmediate(type)) { + retval = emcTaskIssueCommand(emcCommand); + break; + } + emcOperatorError(_("command (%s) cannot be executed until the machine is out of E-stop and turned on"), emc_symbol_lookup(type)); + retval = -1; break; - - } // switch (mode) - + } break; // case EMC_TASK_STATE::OFF,ESTOP,ESTOP_RESET case EMC_TASK_STATE::ON: - /* we can do everything (almost) when the machine is on, so let's - switch on the execution mode */ - switch (emcStatus->task.mode) { - case EMC_TASK_MODE::MANUAL: // ON, MANUAL + switch (taskRun) { + case TaskRun::NONE: // ON, idle switch (type) { case 0: case EMC_NULL_TYPE: - // no command break; - // immediate commands - - case EMC_JOINT_SET_BACKLASH_TYPE: - case EMC_JOINT_SET_HOMING_PARAMS_TYPE: - case EMC_JOINT_SET_FERROR_TYPE: - case EMC_JOINT_SET_MIN_FERROR_TYPE: + // jogging and homing case EMC_JOINT_SET_MAX_POSITION_LIMIT_TYPE: case EMC_JOINT_SET_MIN_POSITION_LIMIT_TYPE: case EMC_JOINT_HALT_TYPE: case EMC_JOINT_HOME_TYPE: - case EMC_JOINT_UNHOME_TYPE: case EMC_JOG_CONT_TYPE: case EMC_JOG_INCR_TYPE: case EMC_JOG_ABS_TYPE: case EMC_JOG_STOP_TYPE: case EMC_JOINT_OVERRIDE_LIMITS_TYPE: - case EMC_TRAJ_SET_SCALE_TYPE: - case EMC_TRAJ_SET_RAPID_SCALE_TYPE: - case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: - case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: - case EMC_TRAJ_SET_FO_ENABLE_TYPE: - case EMC_TRAJ_SET_FH_ENABLE_TYPE: - case EMC_TRAJ_SET_SO_ENABLE_TYPE: - case EMC_SPINDLE_SPEED_TYPE: - case EMC_SPINDLE_ON_TYPE: - case EMC_SPINDLE_OFF_TYPE: - case EMC_SPINDLE_BRAKE_RELEASE_TYPE: - case EMC_SPINDLE_BRAKE_ENGAGE_TYPE: - case EMC_SPINDLE_INCREASE_TYPE: - case EMC_SPINDLE_DECREASE_TYPE: - case EMC_SPINDLE_CONSTANT_TYPE: - case EMC_COOLANT_MIST_ON_TYPE: - case EMC_COOLANT_MIST_OFF_TYPE: - case EMC_COOLANT_FLOOD_ON_TYPE: - case EMC_COOLANT_FLOOD_OFF_TYPE: - case EMC_TASK_SET_MODE_TYPE: - case EMC_TASK_SET_STATE_TYPE: - case EMC_TASK_ABORT_TYPE: - case EMC_TASK_PLAN_OPEN_TYPE: - case EMC_TASK_PLAN_CLOSE_TYPE: - case EMC_TASK_PLAN_PAUSE_TYPE: - case EMC_TASK_PLAN_REVERSE_TYPE: - case EMC_TASK_PLAN_FORWARD_TYPE: - case EMC_TASK_PLAN_RESUME_TYPE: - case EMC_TASK_PLAN_INIT_TYPE: - case EMC_TASK_PLAN_SYNCH_TYPE: - case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: - case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: - case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: - case EMC_TRAJ_PROBE_TYPE: - case EMC_AUX_INPUT_WAIT_TYPE: - case EMC_MOTION_SET_DOUT_TYPE: - case EMC_MOTION_SET_AOUT_TYPE: - case EMC_MOTION_ADAPTIVE_TYPE: - case EMC_TRAJ_RIGID_TAP_TYPE: - case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE: - case EMC_SET_DEBUG_TYPE: retval = emcTaskIssueCommand(emcCommand); break; - // queued commands - + // commands that start a run case EMC_TASK_PLAN_EXECUTE_TYPE: - // resynch the interpreter, since we may have moved - // externally - emcTaskQueueTaskPlanSynchCmd(); - // and now call for interpreter execute - retval = emcTaskIssueCommand(emcCommand); + retval = taskRunIssue(TaskRun::MDI, emcCommand); break; - case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); - break; - } - case EMC_TOOL_SET_OFFSET_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); + case EMC_TASK_PLAN_RUN_TYPE: + retval = taskRunIssue(TaskRun::PROGRAM, emcCommand); break; - } - case EMC_TOOL_SET_NUMBER_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); + case EMC_TASK_PLAN_STEP_TYPE: + // handles case where first action is to step the program + taskPlanRunCmd.line = 0; // run from start + /*! \todo FIXME-- can have GUI set this; send a run instead of a + step */ + retval = taskRunIssue(TaskRun::PROGRAM, &taskPlanRunCmd); + if (retval != 0) break; + emcTrajPause(); + if (emcStatus->task.interpState != EMC_TASK_INTERP::PAUSED) { + interpResumeState = emcStatus->task.interpState; + } + emcStatus->task.interpState = EMC_TASK_INTERP::PAUSED; + emcStatus->task.task_paused = 1; break; - } - case EMC_TASK_PLAN_RUN_TYPE: - if (GET_EXTERNAL_OFFSET_APPLIED()) { - // err here, fewer err reports - retval = -1; - } + case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: + case EMC_TOOL_SET_OFFSET_TYPE: + case EMC_TOOL_SET_NUMBER_TYPE: + queueToolCommand(emcCommand); break; - // otherwise we can't handle it default: - emcOperatorError(_("can't do that (%s:%d) in manual mode"), emc_symbol_lookup(type),(int) type); + if (isImmediate(type)) { + retval = emcTaskIssueCommand(emcCommand); + break; + } + emcOperatorError(_("can't do that (%s:%d) while idle"), emc_symbol_lookup(type),(int) type); retval = -1; break; + } + break; // case TaskRun::NONE - } // switch (type) in ON, MANUAL - - break; // case EMC_TASK_MODE::MANUAL - - case EMC_TASK_MODE::AUTO: // ON, AUTO + case TaskRun::PROGRAM: // ON, program running switch (emcStatus->task.interpState) { - case EMC_TASK_INTERP::IDLE: // ON, AUTO, IDLE - switch (type) { - case 0: - case EMC_NULL_TYPE: - // no command - break; - - // immediate commands - - case EMC_JOINT_SET_BACKLASH_TYPE: - case EMC_JOINT_SET_HOMING_PARAMS_TYPE: - case EMC_JOINT_SET_FERROR_TYPE: - case EMC_JOINT_SET_MIN_FERROR_TYPE: - case EMC_JOINT_UNHOME_TYPE: - case EMC_TRAJ_SET_SCALE_TYPE: - case EMC_TRAJ_SET_RAPID_SCALE_TYPE: - case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: - case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: - case EMC_TRAJ_SET_FO_ENABLE_TYPE: - case EMC_TRAJ_SET_FH_ENABLE_TYPE: - case EMC_TRAJ_SET_SO_ENABLE_TYPE: - case EMC_SPINDLE_SPEED_TYPE: - case EMC_SPINDLE_ORIENT_TYPE: - case EMC_SPINDLE_WAIT_ORIENT_COMPLETE_TYPE: - case EMC_SPINDLE_ON_TYPE: - case EMC_SPINDLE_OFF_TYPE: - case EMC_SPINDLE_BRAKE_RELEASE_TYPE: - case EMC_SPINDLE_BRAKE_ENGAGE_TYPE: - case EMC_SPINDLE_INCREASE_TYPE: - case EMC_SPINDLE_DECREASE_TYPE: - case EMC_SPINDLE_CONSTANT_TYPE: - case EMC_COOLANT_MIST_ON_TYPE: - case EMC_COOLANT_MIST_OFF_TYPE: - case EMC_COOLANT_FLOOD_ON_TYPE: - case EMC_COOLANT_FLOOD_OFF_TYPE: - case EMC_TASK_SET_MODE_TYPE: - case EMC_TASK_SET_STATE_TYPE: - case EMC_TASK_ABORT_TYPE: - case EMC_TASK_PLAN_INIT_TYPE: - case EMC_TASK_PLAN_OPEN_TYPE: - case EMC_TASK_PLAN_CLOSE_TYPE: - case EMC_TASK_PLAN_RUN_TYPE: - case EMC_TASK_PLAN_EXECUTE_TYPE: - case EMC_TASK_PLAN_PAUSE_TYPE: - case EMC_TASK_PLAN_REVERSE_TYPE: - case EMC_TASK_PLAN_FORWARD_TYPE: - case EMC_TASK_PLAN_RESUME_TYPE: - case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: - case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: - case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: - case EMC_TRAJ_PROBE_TYPE: - case EMC_AUX_INPUT_WAIT_TYPE: - case EMC_TRAJ_RIGID_TAP_TYPE: - case EMC_SET_DEBUG_TYPE: - retval = emcTaskIssueCommand(emcCommand); - break; - - case EMC_TASK_PLAN_STEP_TYPE: - // handles case where first action is to step the program - taskPlanRunCmd.line = 0; // run from start - /*! \todo FIXME-- can have GUI set this; send a run instead of a - step */ - retval = emcTaskIssueCommand(&taskPlanRunCmd); - if(retval != 0) break; - emcTrajPause(); - if (emcStatus->task.interpState != EMC_TASK_INTERP::PAUSED) { - interpResumeState = emcStatus->task.interpState; - } - emcStatus->task.interpState = EMC_TASK_INTERP::PAUSED; - emcStatus->task.task_paused = 1; - retval = 0; - break; - - case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); - break; - } - case EMC_TOOL_SET_OFFSET_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); - break; - } - - // otherwise we can't handle it - default: - //EMC_TASK_MODE::AUTO(2) && EMC_TASK_INTERP::IDLE(1) - if ( allow_while_idle_type() ) { - retval = emcTaskIssueCommand(emcCommand); - break; - } - emcOperatorError(_("can't do that (%s) in auto mode with the interpreter idle"), emc_symbol_lookup(type)); - retval = -1; - break; - - } // switch (type) in ON, AUTO, IDLE - - break; // EMC_TASK_INTERP::IDLE - - case EMC_TASK_INTERP::READING: // ON, AUTO, READING + case EMC_TASK_INTERP::READING: // ON, program, READING + case EMC_TASK_INTERP::WAITING: // ON, program, WAITING: interpreter ran to end + { + const bool reading = emcStatus->task.interpState == EMC_TASK_INTERP::READING; switch (type) { case 0: case EMC_NULL_TYPE: - // no command - break; - - // immediate commands - - case EMC_JOINT_SET_BACKLASH_TYPE: - case EMC_JOINT_SET_HOMING_PARAMS_TYPE: - case EMC_JOINT_SET_FERROR_TYPE: - case EMC_JOINT_SET_MIN_FERROR_TYPE: - case EMC_JOINT_UNHOME_TYPE: - case EMC_TRAJ_SET_SCALE_TYPE: - case EMC_TRAJ_SET_RAPID_SCALE_TYPE: - case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: - case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: - case EMC_TRAJ_SET_FO_ENABLE_TYPE: - case EMC_TRAJ_SET_FH_ENABLE_TYPE: - case EMC_TRAJ_SET_SO_ENABLE_TYPE: - case EMC_SPINDLE_INCREASE_TYPE: - case EMC_SPINDLE_DECREASE_TYPE: - case EMC_SPINDLE_CONSTANT_TYPE: - case EMC_TASK_PLAN_PAUSE_TYPE: - case EMC_TASK_PLAN_REVERSE_TYPE: - case EMC_TASK_PLAN_FORWARD_TYPE: - case EMC_TASK_PLAN_RESUME_TYPE: - case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: - case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: - case EMC_TASK_SET_MODE_TYPE: - case EMC_TASK_SET_STATE_TYPE: - case EMC_TASK_ABORT_TYPE: - case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: - case EMC_TRAJ_PROBE_TYPE: - case EMC_AUX_INPUT_WAIT_TYPE: - case EMC_TRAJ_RIGID_TAP_TYPE: - case EMC_SET_DEBUG_TYPE: - case EMC_COOLANT_MIST_ON_TYPE: - case EMC_COOLANT_MIST_OFF_TYPE: - case EMC_COOLANT_FLOOD_ON_TYPE: - case EMC_COOLANT_FLOOD_OFF_TYPE: - retval = emcTaskIssueCommand(emcCommand); - return retval; break; case EMC_TASK_PLAN_STEP_TYPE: @@ -1226,77 +1223,41 @@ static int emcTaskPlan(void) steppingWait = 0; // clear the wait break; - // otherwise we can't handle it default: - emcOperatorError(_("can't do that (%s) in auto mode with the interpreter reading"), emc_symbol_lookup(type)); + if (isImmediate(type)) { + retval = emcTaskIssueCommand(emcCommand); + if (reading) { + // no readahead in this cycle + return retval; + } + break; + } + emcOperatorError(_("can't do that (%s) while a program runs, with the interpreter %s"), emc_symbol_lookup(type), + reading ? "reading" : "waiting"); retval = -1; break; + } - } // switch (type) in ON, AUTO, READING - - // handle interp readahead logic - readahead_reading(); - - break; // EMC_TASK_INTERP::READING + // handle interp readahead logic + if (reading) { + readahead_reading(); + } else { + readahead_waiting(); + } + break; // EMC_TASK_INTERP::READING, WAITING + } - case EMC_TASK_INTERP::PAUSED: // ON, AUTO, PAUSED + case EMC_TASK_INTERP::PAUSED: // ON, program, PAUSED switch (type) { case 0: case EMC_NULL_TYPE: - // no command - break; - - // immediate commands - - case EMC_JOINT_SET_BACKLASH_TYPE: - case EMC_JOINT_SET_HOMING_PARAMS_TYPE: - case EMC_JOINT_SET_FERROR_TYPE: - case EMC_JOINT_SET_MIN_FERROR_TYPE: - case EMC_JOINT_UNHOME_TYPE: - case EMC_TRAJ_SET_SCALE_TYPE: - case EMC_TRAJ_SET_RAPID_SCALE_TYPE: - case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: - case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: - case EMC_TRAJ_SET_FO_ENABLE_TYPE: - case EMC_TRAJ_SET_FH_ENABLE_TYPE: - case EMC_TRAJ_SET_SO_ENABLE_TYPE: - case EMC_SPINDLE_SPEED_TYPE: - case EMC_SPINDLE_ORIENT_TYPE: - case EMC_SPINDLE_WAIT_ORIENT_COMPLETE_TYPE: - case EMC_SPINDLE_ON_TYPE: - case EMC_SPINDLE_OFF_TYPE: - case EMC_SPINDLE_BRAKE_RELEASE_TYPE: - case EMC_SPINDLE_BRAKE_ENGAGE_TYPE: - case EMC_SPINDLE_INCREASE_TYPE: - case EMC_SPINDLE_DECREASE_TYPE: - case EMC_SPINDLE_CONSTANT_TYPE: - case EMC_COOLANT_MIST_ON_TYPE: - case EMC_COOLANT_MIST_OFF_TYPE: - case EMC_COOLANT_FLOOD_ON_TYPE: - case EMC_COOLANT_FLOOD_OFF_TYPE: - case EMC_TASK_SET_MODE_TYPE: - case EMC_TASK_SET_STATE_TYPE: - case EMC_TASK_ABORT_TYPE: - case EMC_TASK_PLAN_EXECUTE_TYPE: - case EMC_TASK_PLAN_PAUSE_TYPE: - case EMC_TASK_PLAN_REVERSE_TYPE: - case EMC_TASK_PLAN_FORWARD_TYPE: - case EMC_TASK_PLAN_RESUME_TYPE: - case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: - case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: - case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: - case EMC_TRAJ_PROBE_TYPE: - case EMC_AUX_INPUT_WAIT_TYPE: - case EMC_TRAJ_RIGID_TAP_TYPE: - case EMC_SET_DEBUG_TYPE: - retval = emcTaskIssueCommand(emcCommand); break; case EMC_TASK_PLAN_STEP_TYPE: emcStatus->motion.traj.single_stepping = 1; stepping = 1; steppingWait = 0; + pauseRestoreCoolant(false); if (emcStatus->motion.traj.paused && emcStatus->motion.traj.queue > 0) { // there are pending motions paused; step them @@ -1307,152 +1268,35 @@ static int emcTaskPlan(void) emcStatus->task.task_paused = 1; break; - // otherwise we can't handle it - default: - emcOperatorError(_("can't do that (%s) in auto mode with the interpreter paused"), emc_symbol_lookup(type)); - retval = -1; - break; - - } // switch (type) in ON, AUTO, PAUSED - - break; // EMC_TASK_INTERP::PAUSED - - case EMC_TASK_INTERP::WAITING: - // interpreter ran to end - // handle input commands - switch (type) { - case 0: - case EMC_NULL_TYPE: - // no command - break; - - // immediate commands - - case EMC_JOINT_SET_BACKLASH_TYPE: - case EMC_JOINT_SET_HOMING_PARAMS_TYPE: - case EMC_JOINT_SET_FERROR_TYPE: - case EMC_JOINT_SET_MIN_FERROR_TYPE: - case EMC_JOINT_UNHOME_TYPE: - case EMC_TRAJ_SET_SCALE_TYPE: - case EMC_TRAJ_SET_RAPID_SCALE_TYPE: - case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: - case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: - case EMC_TRAJ_SET_FO_ENABLE_TYPE: - case EMC_TRAJ_SET_FH_ENABLE_TYPE: - case EMC_TRAJ_SET_SO_ENABLE_TYPE: - case EMC_SPINDLE_INCREASE_TYPE: - case EMC_SPINDLE_DECREASE_TYPE: - case EMC_SPINDLE_CONSTANT_TYPE: - case EMC_TASK_PLAN_EXECUTE_TYPE: - case EMC_TASK_PLAN_PAUSE_TYPE: - case EMC_TASK_PLAN_REVERSE_TYPE: - case EMC_TASK_PLAN_FORWARD_TYPE: - case EMC_TASK_PLAN_RESUME_TYPE: - case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: - case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: - case EMC_TASK_SET_MODE_TYPE: - case EMC_TASK_SET_STATE_TYPE: - case EMC_TASK_ABORT_TYPE: - case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: - case EMC_TRAJ_PROBE_TYPE: - case EMC_AUX_INPUT_WAIT_TYPE: - case EMC_TRAJ_RIGID_TAP_TYPE: - case EMC_SET_DEBUG_TYPE: - case EMC_COOLANT_MIST_ON_TYPE: - case EMC_COOLANT_MIST_OFF_TYPE: - case EMC_COOLANT_FLOOD_ON_TYPE: - case EMC_COOLANT_FLOOD_OFF_TYPE: - retval = emcTaskIssueCommand(emcCommand); + case EMC_JOG_CONT_TYPE: + case EMC_JOG_INCR_TYPE: + case EMC_JOG_ABS_TYPE: + case EMC_JOG_STOP_TYPE: + retval = pausedJog(emcCommand); break; - case EMC_TASK_PLAN_STEP_TYPE: - emcStatus->motion.traj.single_stepping = 1; - stepping = 1; // set stepping mode in case it's not - steppingWait = 0; // clear the wait - break; - - // otherwise we can't handle it default: - emcOperatorError(_("can't do that (%s) in auto mode with the interpreter waiting"), emc_symbol_lookup(type)); + if (isImmediate(type)) { + retval = emcTaskIssueCommand(emcCommand); + break; + } + emcOperatorError(_("can't do that (%s) while a program runs, with the interpreter paused"), emc_symbol_lookup(type)); retval = -1; break; + } + break; // EMC_TASK_INTERP::PAUSED - } // switch (type) in ON, AUTO, WAITING - - // handle interp readahead logic - readahead_waiting(); - - break; // end of case EMC_TASK_INTERP::WAITING - - default: - // coding error - log_error("invalid mode({})", (int)emcStatus->task.mode); - retval = -1; + case EMC_TASK_INTERP::IDLE: + // aborted in this cycle, taskRunCheckDone() ends the run in + // the next one break; + } + break; // case TaskRun::PROGRAM - } // switch (mode) in ON, AUTO - - break; // case EMC_TASK_MODE::AUTO - - case EMC_TASK_MODE::MDI: // ON, MDI + case TaskRun::MDI: // ON, MDI running switch (type) { case 0: case EMC_NULL_TYPE: - // no command - break; - - // immediate commands - - case EMC_JOINT_SET_BACKLASH_TYPE: - case EMC_JOINT_SET_HOMING_PARAMS_TYPE: - case EMC_JOINT_SET_FERROR_TYPE: - case EMC_JOINT_SET_MIN_FERROR_TYPE: - case EMC_JOINT_UNHOME_TYPE: - case EMC_TRAJ_SET_SCALE_TYPE: - case EMC_TRAJ_SET_RAPID_SCALE_TYPE: - case EMC_TRAJ_SET_MAX_VELOCITY_TYPE: - case EMC_TRAJ_SET_SPINDLE_SCALE_TYPE: - case EMC_TRAJ_SET_FO_ENABLE_TYPE: - case EMC_TRAJ_SET_FH_ENABLE_TYPE: - case EMC_TRAJ_SET_SO_ENABLE_TYPE: - case EMC_SPINDLE_SPEED_TYPE: - case EMC_SPINDLE_ORIENT_TYPE: - case EMC_SPINDLE_WAIT_ORIENT_COMPLETE_TYPE: - case EMC_SPINDLE_ON_TYPE: - case EMC_SPINDLE_OFF_TYPE: - case EMC_SPINDLE_BRAKE_RELEASE_TYPE: - case EMC_SPINDLE_BRAKE_ENGAGE_TYPE: - case EMC_SPINDLE_INCREASE_TYPE: - case EMC_SPINDLE_DECREASE_TYPE: - case EMC_SPINDLE_CONSTANT_TYPE: - case EMC_COOLANT_MIST_ON_TYPE: - case EMC_COOLANT_MIST_OFF_TYPE: - case EMC_COOLANT_FLOOD_ON_TYPE: - case EMC_COOLANT_FLOOD_OFF_TYPE: - case EMC_TASK_SET_MODE_TYPE: - case EMC_TASK_SET_STATE_TYPE: - case EMC_TASK_PLAN_INIT_TYPE: - case EMC_TASK_PLAN_OPEN_TYPE: - case EMC_TASK_PLAN_CLOSE_TYPE: - case EMC_TASK_PLAN_PAUSE_TYPE: - case EMC_TASK_PLAN_REVERSE_TYPE: - case EMC_TASK_PLAN_FORWARD_TYPE: - case EMC_TASK_PLAN_SET_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SET_BLOCK_DELETE_TYPE: - case EMC_TASK_PLAN_RESUME_TYPE: - case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: - case EMC_TASK_PLAN_SYNCH_TYPE: - case EMC_TASK_ABORT_TYPE: - case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: - case EMC_TRAJ_PROBE_TYPE: - case EMC_AUX_INPUT_WAIT_TYPE: - case EMC_MOTION_SET_DOUT_TYPE: - case EMC_MOTION_SET_AOUT_TYPE: - case EMC_MOTION_ADAPTIVE_TYPE: - case EMC_TRAJ_RIGID_TAP_TYPE: - case EMC_SET_DEBUG_TYPE: - retval = emcTaskIssueCommand(emcCommand); break; case EMC_TASK_PLAN_EXECUTE_TYPE: @@ -1477,53 +1321,41 @@ static int emcTaskPlan(void) } break; - case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); + case EMC_TOOL_LOAD_TOOL_TABLE_TYPE: + case EMC_TOOL_SET_OFFSET_TYPE: + queueToolCommand(emcCommand); break; - } - case EMC_TOOL_SET_OFFSET_TYPE: { - // send to IO - emcTaskQueueCommand(std::make_unique(*static_cast(emcCommand))); - // signify no more reading - emcTaskPlanSetWait(); - // then resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); + + case EMC_JOG_CONT_TYPE: + case EMC_JOG_INCR_TYPE: + case EMC_JOG_ABS_TYPE: + case EMC_JOG_STOP_TYPE: + if (emcStatus->task.interpState == EMC_TASK_INTERP::PAUSED + || type == EMC_JOG_STOP_TYPE) { + retval = pausedJog(emcCommand); + break; + } + emcOperatorError(_("can't do that (%s) while MDI is running"), emc_symbol_lookup(type)); + retval = -1; break; - } - // otherwise we can't handle it default: - //EMC_TASK_MODE::MDI(3) && EMC_TASK_INTERP::IDLE(1) - if ( allow_while_idle_type() ) { - retval = emcTaskIssueCommand(emcCommand); + if (isImmediate(type)) { + retval = emcTaskIssueCommand(emcCommand); break; - } - emcOperatorError(_("can't do that (%s:%d) in MDI mode"), emc_symbol_lookup(type),(int) type); - + } + emcOperatorError(_("can't do that (%s) while MDI is running"), emc_symbol_lookup(type)); retval = -1; break; - - } // switch (type) in ON, MDI + } mdi_execute_hook(); - - break; // case EMC_TASK_MODE::MDI - - default: - break; - - } // switch (mode) - + break; // case TaskRun::MDI + } break; // case EMC_TASK_STATE::ON default: break; - - } // switch (task.state) + } return retval; } @@ -1751,9 +1583,8 @@ static int emcTaskIssueCommand(NMLmsg * cmd) // invalid joint number) -- homing will never start, so the // WAITING_FOR_HOMING poll below would never run to undo the // FREE-mode dip either. Undo it here instead, or traj.mode - // (and therefore task.mode, which determineMode() derives - // from it) stays stuck at FREE/MANUAL until the operator - // manually cycles mode again. + // stays stuck at FREE and the rest of the program or MDI + // command cannot move. homingWaiting = false; if (homingPriorMode != EMC_TRAJ_MODE::FREE) { emcTrajSetMode(homingPriorMode); @@ -2201,56 +2032,7 @@ static int emcTaskIssueCommand(NMLmsg * cmd) retval = 0; break; - // mode and state commands - - case EMC_TASK_SET_MODE_TYPE: - mode_msg = reinterpret_cast(cmd); - if (emcStatus->task.mode == EMC_TASK_MODE::AUTO && - emcStatus->task.interpState != EMC_TASK_INTERP::IDLE && - mode_msg->mode != EMC_TASK_MODE::AUTO) { - emcOperatorError(_("Can't switch mode while mode is AUTO and interpreter is not IDLE")); - } else { // we can honour the modeswitch - if (mode_msg->mode == EMC_TASK_MODE::MANUAL && - emcStatus->task.mode != EMC_TASK_MODE::MANUAL) { - // leaving auto or mdi mode for manual - - /*! \todo FIXME-- duplicate code for abort, - also near end of main, when aborting on subordinate errors, - and in emcTaskExecute() */ - - // abort motion - emcTaskAbort(); - mdi_execute_abort(); - - // without emcTaskPlanClose(), a new run command resumes at - // aborted line-- feature that may be considered later - { - int was_open = taskplanopen; - emcTaskPlanClose(); - if (emc_debug & EMC_DEBUG_INTERP && was_open) { - log_info("emcTaskPlanClose() called at {}:{}\n", - __FILE__, __LINE__); - } - } - - // clear out the pending command - emcTaskCommand = NULL; - interp_list.clear(); - emcStatus->task.currentLine = 0; - - // clear out the interpreter state - emcStatus->task.interpState = EMC_TASK_INTERP::IDLE; - emcStatus->task.execState = EMC_TASK_EXEC::DONE; - emcStatus->motion.traj.single_stepping = 0; - stepping = 0; - steppingWait = 0; - - // now queue up command to resynch interpreter - emcTaskQueueTaskPlanSynchCmd(); - } - retval = emcTaskSetMode(mode_msg->mode); - } - break; + // state commands case EMC_TASK_SET_STATE_TYPE: state_msg = reinterpret_cast(cmd); @@ -2340,16 +2122,7 @@ static int emcTaskIssueCommand(NMLmsg * cmd) stepping = 0; steppingWait = 0; execute_msg = reinterpret_cast(cmd); - if (!all_homed() && !no_force_homing) { //!no_force_homing = force homing before MDI - emcOperatorError(_("Can't issue MDI command when not homed")); - retval = -1; - break; - } - if (emcStatus->task.mode != EMC_TASK_MODE::MDI) { - emcOperatorError(_("Must be in MDI mode to issue MDI command")); - retval = -1; - break; - } + // taskRunStart() has checked homing // track interpState also during MDI - it might be an oword sub call emcStatus->task.interpState = EMC_TASK_INTERP::READING; @@ -2364,26 +2137,22 @@ static int emcTaskIssueCommand(NMLmsg * cmd) } int level = emcTaskPlanLevel(); - if (emcStatus->task.mode == EMC_TASK_MODE::MDI) { - if (mdi_execute_level < 0) - mdi_execute_level = level; - } + if (mdi_execute_level < 0) + mdi_execute_level = level; execRetval = emcTaskPlanExecute(command, 0); level = emcTaskPlanLevel(); - if (emcStatus->task.mode == EMC_TASK_MODE::MDI) { - if (mdi_execute_level == level) { - mdi_execute_level = -1; - } else if (level > 0) { - // Still insude call. Need another execute(0) call - // but only if we didn't encounter an error - if (execRetval == INTERP_ERROR) { - mdi_execute_next = 0; - } else { - mdi_execute_next = 1; - } + if (mdi_execute_level == level) { + mdi_execute_level = -1; + } else if (level > 0) { + // Still insude call. Need another execute(0) call + // but only if we didn't encounter an error + if (execRetval == INTERP_ERROR) { + mdi_execute_next = 0; + } else { + mdi_execute_next = 1; } } switch (execRetval) { @@ -2427,11 +2196,7 @@ static int emcTaskIssueCommand(NMLmsg * cmd) break; case EMC_TASK_PLAN_RUN_TYPE: - if (!all_homed() && !no_force_homing) { //!no_force_homing = force homing before Auto - emcOperatorError(_("Can't run a program when not homed")); - retval = -1; - break; - } + // taskRunStart() has checked homing emcStatus->motion.traj.single_stepping = 0; stepping = 0; steppingWait = 0; @@ -2446,6 +2211,7 @@ static int emcTaskIssueCommand(NMLmsg * cmd) break; case EMC_TASK_PLAN_PAUSE_TYPE: + pauseSaveCoolant(); emcTrajPause(); if (emcStatus->task.interpState != EMC_TASK_INTERP::PAUSED) { interpResumeState = emcStatus->task.interpState; @@ -2457,6 +2223,7 @@ static int emcTaskIssueCommand(NMLmsg * cmd) case EMC_TASK_PLAN_OPTIONAL_STOP_TYPE: if (GET_OPTIONAL_PROGRAM_STOP() == ON) { + pauseSaveCoolant(); emcTrajPause(); if (emcStatus->task.interpState != EMC_TASK_INTERP::PAUSED) { interpResumeState = emcStatus->task.interpState; @@ -2478,6 +2245,9 @@ static int emcTaskIssueCommand(NMLmsg * cmd) break; case EMC_TASK_PLAN_RESUME_TYPE: + // motion puts the spindles back and returns from jogs while paused + // before it goes on + pauseRestoreCoolant(true); emcTrajResume(); emcStatus->task.interpState = interpResumeState; emcStatus->task.task_paused = 0; @@ -2738,6 +2508,20 @@ static int emcTaskExecute(void) case EMC_TASK_EXEC::DONE: STEPPING_CHECK(); + if (coordWaiting) { + // a run has just started; see taskRunStart() + if (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::COORD) { + coordWaiting = false; + } else { + if (etime() - coordWaitStart > COORD_WAIT_TIMEOUT) { + coordWaiting = false; + emcOperatorError(_("Motion did not switch to coordinated mode")); + emcStatus->task.execState = EMC_TASK_EXEC::ERROR; + retval = -1; + } + break; + } + } if (!emcStatus->motion.traj.queueFull && emcStatus->task.interpState != EMC_TASK_INTERP::PAUSED) { if (NULL == emcTaskCommand) { @@ -3352,6 +3136,9 @@ static int emctask_shutdown(void) delete timer; timer = NULL; } + // release the halui HAL component + haluiExit(); + // delete the NML channels if (NULL != emcErrorBuffer) { @@ -3523,6 +3310,15 @@ int main(int argc, char *argv[]) exit(1); } + // Create the halui pins before emctask_startup() readies the inihal + // component: halcmd is waiting on that and runs the HAL files next, + // and those may connect halui pins. + if (0 != haluiInit(emc_inifile)) { + log_error("can't initialize halui\n"); + emctask_shutdown(); + exit(1); + } + // initialize everything if (0 != emctask_startup()) { emctask_shutdown(); @@ -3558,13 +3354,27 @@ int main(int argc, char *argv[]) check_ini_hal_items(emcStatus->motion.traj.joints); // read command + bool internalDispatch = false; if (0 != emcCommandBuffer->read()) { // got a new command, so clear out errors + emcCommand = emcCommandBuffer->get_address(); + emcCommandInternal = false; taskPlanError = 0; taskExecuteError = 0; - } - // run control cycle - if (0 != emcTaskPlan()) { + } else if (RCS_CMD_MSG *queued = + taskcmd::next(emcStatus->echo_serial_number)) { + // A command came from inside task (halui). Point emcCommand at + // it and the rest of the loop treats it exactly like one read + // from NML, except for the error flags: they belong to the last + // NML command, the one whose serial a client waits on. + emcCommand = queued; + emcCommandInternal = true; + internalDispatch = true; + } + // run control cycle. A command from inside task that fails is + // reported on the error channel by the planner; it must not turn + // the status of an NML client's command into ERROR. + if (0 != emcTaskPlan() && !internalDispatch) { taskPlanError = 1; } if (0 != emcTaskExecute()) { @@ -3703,6 +3513,16 @@ int main(int argc, char *argv[]) // handle RCS_STAT_MSG base class members explicitly, since this // is not an NML_MODULE and they won't be set automatically + // A command from inside task must not consume a serial number. An + // NML serial is the command buffer's write id, so echoing "one past + // the last NML command" is echoing the id the next NML client write + // will get, and task would then drop that command as one it has + // already seen. Leave the echo where the last NML command put it, + // and mark the internal message as seen so that emcTaskPlan() does + // not dispatch it again next cycle. + if (emcCommandInternal) { + emcCommand->serial_number = emcStatus->echo_serial_number; + } else { // do task emcStatus->task.command_type = emcCommand->_type; emcStatus->task.echo_serial_number = emcCommand->serial_number; @@ -3710,6 +3530,13 @@ int main(int argc, char *argv[]) // do top level emcStatus->command_type = emcCommand->_type; emcStatus->echo_serial_number = emcCommand->serial_number; + } + + if (idleModePending + && (emcStatus->motion.traj.mode == idleMode + || etime() - idleModeSince > IDLE_MODE_TIMEOUT)) { + idleModePending = false; + } if (taskPlanError || taskExecuteError || emcStatus->task.execState == EMC_TASK_EXEC::ERROR || @@ -3724,7 +3551,8 @@ int main(int argc, char *argv[]) mdi_execute_queue.len() == 0 && interp_list.len() == 0 && emcTaskCommand == NULL && - emcStatus->task.interpState == EMC_TASK_INTERP::IDLE) { + emcStatus->task.interpState == EMC_TASK_INTERP::IDLE && + taskRun == TaskRun::NONE && !idleModePending) { emcStatus->status = RCS_STATUS::DONE; emcStatus->task.status = RCS_STATUS::DONE; } else { @@ -3737,6 +3565,7 @@ int main(int argc, char *argv[]) // will be updated in the _update() functions above. There's // no need to call the individual functions on all WM items. emcStatusBuffer->write(emcStatus); + haluiUpdate(); // wait on timer cycle, if specified, or calculate actual // interval if INI file says to run full out via diff --git a/src/emc/usr_intf/halui.cc b/src/emc/task/halui.cc similarity index 87% rename from src/emc/usr_intf/halui.cc rename to src/emc/task/halui.cc index c40e2831e73..06c61771dbb 100644 --- a/src/emc/usr_intf/halui.cc +++ b/src/emc/task/halui.cc @@ -1,19 +1,38 @@ /******************************************************************** -* Description: halui.cc -* HAL User-Interface component. -* This file exports various UI related hal pins, and communicates -* with EMC through NML messages +* Description: halui.cc (task) +* The HAL user interface, running inside task. * -* Derived from a work by Fred Proctor & Will Shackleford (emcsh.cc) -* some of the functions (sendFooBar() are adapted from there) +* This was the standalone halui program (src/emc/usr_intf/halui.cc, now +* deleted) with its NML transport taken out. The pin table, the edge +* detection in check_hal_changes() and the status mirroring in +* modify_hal_pins() are the same code, so that behaviour -- including the +* quirks the tests in tests/halui pin down -- is unchanged. * -* Author: Alex Joni -* License: GPL Version 2 -* System: Linux +* What is different, and why: +* +* - No NML. Commands go into the task-internal queue (cmd_queue.hh), so +* they pass through emcTaskPlan() exactly like a command from a UI. +* Nothing waits for an echo: inside task, waiting for task to answer +* is a deadlock, since it is this thread that would have to answer. +* +* - MDI commands go straight to task, see sendMdiCommand() below. * -* Copyright (c) 2006 All rights reserved. +* - Status is read straight out of the live EMC_STAT. halui sees it after +* task has finished the cycle's status update, which is the same +* picture an NML client gets, one cycle earlier. * -* Last change: +* - The pin scan still runs at 20 ms, the standalone halui's loop period. +* The task cycle is typically 1 ms, and jog pins send a command per +* change, so running the whole scan every cycle would put up to a +* thousand commands a second through task's single command slot. +* estop-activate, machine-off, abort and program-stop are checked every +* cycle regardless. +* +* halui is always there: there is nothing to switch on, and a machine +* that connects none of the pins pays for a pin scan every 20 ms. +* +* Derived from the standalone halui.cc by Alex Joni, which this replaces. +* License: GPL Version 2 ********************************************************************/ #include "logutil.hh" @@ -22,9 +41,9 @@ #include #include #include -#include #include + #include /* access to HAL functions/definitions */ #include /* rtapi_print_msg */ #include "rcs_status.hh" @@ -34,15 +53,16 @@ #include "nml_intf/emcglb.h" // EMC_NMLFILE, TRAJ_MAX_VELOCITY, etc. #include "nml_intf/emccfg.h" // DEFAULT_TRAJ_MAX_VELOCITY #include -#include "libnml/nml/nml_oi.hh" #include "timeutil.hh" #include #include "tooldata/tooldata.hh" -#include "mapini.hh" -#include "unitenum.hh" +#include "usr_intf/mapini.hh" +#include "usr_intf/unitenum.hh" + +#include "halui.hh" +#include "cmd_queue.hh" using namespace linuxcnc; -using namespace std::chrono_literals; /* Using halui: see the man page */ @@ -60,12 +80,9 @@ static int axis_mask = 0; FIELD(bool,estop_reset) /* pin for resetting ESTOP */ \ FIELD(bool,estop_is_activated) /* pin for status ESTOP is activated */ \ \ - FIELD(bool,mode_manual) /* pin for requesting manual mode */ \ - FIELD(bool,mode_is_manual) /* pin for manual mode is on */ \ - FIELD(bool,mode_auto) /* pin for requesting auto mode */ \ - FIELD(bool,mode_is_auto) /* pin for auto mode is on */ \ - FIELD(bool,mode_mdi) /* pin for requesting mdi mode */ \ - FIELD(bool,mode_is_mdi) /* pin for mdi mode is on */ \ + FIELD(bool,mode_is_manual) /* pin for manual mode is on: task is idle */ \ + FIELD(bool,mode_is_auto) /* pin for auto mode is on: a program runs */ \ + FIELD(bool,mode_is_mdi) /* pin for mdi mode is on: MDI runs */ \ FIELD(bool,mode_teleop) /* pin for requesting teleop mode */ \ FIELD(bool,mode_is_teleop) /* pin for teleop mode is on */ \ FIELD(bool,mode_joint) /* pin for requesting joint mode */ \ @@ -236,7 +253,7 @@ static char *mdi_commands[MDI_MAX]; static int num_mdi_commands=0; static int have_home_all = 0; -static int comp_id, done; /* component ID, main while loop */ +static int comp_id = -1; /* HAL component ID */ static int num_axes = 0; //number of axes, taken from the INI [TRAJ] section static int num_joints = 3; //number of joints, taken from the INI [KINS] section @@ -246,223 +263,38 @@ static double maxFeedOverride=1; static double maxMaxVelocity=1; static double minSpindleOverride=0.0; static double maxSpindleOverride=1.0; -static EMC_TASK_MODE halui_old_mode = EMC_TASK_MODE::MANUAL; static int halui_sent_mdi = 0; -// the NML channels to the EMC task -static RCS_CMD_CHANNEL *emcCommandBuffer = NULL; -static RCS_STAT_CHANNEL *emcStatusBuffer = NULL; -EMC_STAT *emcStatus = NULL; - -// the NML channel for errors -static NML *emcErrorBuffer = NULL; - -// the serial number to use. -static int emcCommandSerialNumber = 0; - -// how long to wait for Task to report that it has received our command -static double receiveTimeout = 10.0; - -// how long to wait for Task to finish running our command -static double doneTimeout = 60.; - -static void quit(int /*sig*/) -{ - done = 1; -} - -static int emcTaskNmlGet() -{ - int retval = 0; - - // try to connect to EMC cmd - if (emcCommandBuffer == NULL) { - emcCommandBuffer = - new RCS_CMD_CHANNEL(emcFormat, "emcCommand", "xemc", - emc_nmlfile); - if (!emcCommandBuffer->valid()) { - delete emcCommandBuffer; - emcCommandBuffer = NULL; - retval = -1; - } - } - // try to connect to EMC status - if (emcStatusBuffer == NULL) { - emcStatusBuffer = - new RCS_STAT_CHANNEL(emcFormat, "emcStatus", "xemc", - emc_nmlfile); - if (!emcStatusBuffer->valid()) { - delete emcStatusBuffer; - emcStatusBuffer = NULL; - emcStatus = NULL; - retval = -1; - } else { - emcStatus = reinterpret_cast(emcStatusBuffer->get_address()); - } - } - - return retval; -} - -static int emcErrorNmlGet() -{ - int retval = 0; - - if (emcErrorBuffer == NULL) { - emcErrorBuffer = - new NML(nmlErrorFormat, "emcError", "xemc", emc_nmlfile); - if (!emcErrorBuffer->valid()) { - delete emcErrorBuffer; - emcErrorBuffer = NULL; - retval = -1; - } - } - - return retval; -} - -static int tryNml() -{ - std::chrono::seconds end; - int good; -constexpr auto RETRY_TIME = 10s; // wait for subsystems to come up -constexpr auto RETRY_INTERVAL = 1s; // between wait tries for a subsystem - - end = RETRY_TIME; - good = 0; - do { - if (0 == emcTaskNmlGet()) { - good = 1; - break; - } - esleep(RETRY_INTERVAL); - end -= RETRY_INTERVAL; - } while (end > 0s); - - if (!good) { - return -1; - } - end = RETRY_TIME; - good = 0; - do { - if (0 == emcErrorNmlGet()) { - good = 1; - break; - } - esleep(RETRY_INTERVAL); - end -= RETRY_INTERVAL; - } while (end > 0s); +// How often the pin scan runs, the standalone halui's loop period. +static const double HALUI_PERIOD = 0.020; - if (!good) { - return -1; - } +static double last_pass = 0.0; - return 0; +// the last MDI command halui queued, see sendMdiCommand() +static taskcmd::Ticket mdi_exec_ticket = 0; -} - -static int updateStatus() +// Queue a command for task to execute on one of the next cycles. This is +// where the standalone halui wrote to the NML command channel and then +// waited for task to echo the serial number back. +// +// coalesce_key is passed for jogs only: see cmd_queue.hh. Returns 0 like +// the NML send it replaces, -1 if the queue is full. +template +static int emcCommandSend(const T &cmd, unsigned long coalesce_key = 0) { - NMLTYPE type; - - if (NULL == emcStatus || NULL == emcStatusBuffer) { - rtapi_print("halui: %s: no status buffer\n", __func__); + if (taskcmd::push(cmd, coalesce_key) == 0) { + rtapi_print("halui: %s: command queue full, dropping a command\n", __func__); return -1; } - - if (!emcStatusBuffer->valid()) { - rtapi_print("halui: %s: status buffer is not valid\n", __func__); - return -1; - } - - switch (type = emcStatusBuffer->peek()) { - case -1: - // error on CMS channel - rtapi_print("halui: %s: error peeking status buffer\n", __func__); - return -1; - break; - - case 0: // no new data - case EMC_STAT_TYPE: // new data - break; - - default: - rtapi_print("halui: %s: unknown error peeking status buffer\n", __func__); - return -1; - break; - } - return 0; } - -constexpr auto EMC_COMMAND_DELAY = 100ms; // how long to sleep between checks - -static int emcCommandWaitDone() -{ - for (auto end = 0ms; end < std::chrono::duration(doneTimeout); - end += EMC_COMMAND_DELAY) { - updateStatus(); - int serial_diff = emcStatus->echo_serial_number - emcCommandSerialNumber; - - if (serial_diff < 0) { - continue; - } - - if (serial_diff > 0) { - return 0; - } - - if (emcStatus->status == RCS_STATUS::DONE) { - return 0; - } - - if (emcStatus->status == RCS_STATUS::ERROR) { - return -1; - } - - esleep(EMC_COMMAND_DELAY); - } - - return -1; -} - -static int emcCommandSend(RCS_CMD_MSG & cmd) -{ - // write command - if (emcCommandBuffer->write(&cmd)) { - rtapi_print("halui: %s: error writing to Task\n", __func__); - return -1; - } - emcCommandSerialNumber = cmd.serial_number; - - // wait for receive - for (auto end = 0ms; end < std::chrono::duration(receiveTimeout); - end += EMC_COMMAND_DELAY) { - updateStatus(); - int serial_diff = emcStatus->echo_serial_number - emcCommandSerialNumber; - - if (serial_diff >= 0) { - return 0; - } - - esleep(EMC_COMMAND_DELAY); - } - - rtapi_print("halui: %s: no echo from Task after %.3f seconds\n", __func__, receiveTimeout); - return -1; -} - -static void thisQuit() +// One key per jog target, so that a new jog for a joint or axis replaces +// the one still waiting for it rather than queueing behind it. +static unsigned long jog_key(int ja, int jjogmode) { - //don't forget the big HAL sin ;) - hal_exit(comp_id); - - if(emcCommandBuffer) { delete emcCommandBuffer; emcCommandBuffer = NULL; } - if(emcStatusBuffer) { delete emcStatusBuffer; emcStatusBuffer = NULL; } - if(emcErrorBuffer) { delete emcErrorBuffer; emcErrorBuffer = NULL; } - exit(0); + return 1 + (unsigned long)(jjogmode ? 1 : 0) * 1024 + (unsigned long)ja; } static LINEAR_UNIT_CONVERSION linearUnitConversion = LINEAR_UNITS_AUTO; @@ -662,9 +494,6 @@ int halui_hal_init(void) CHK(halui_export_pin_IN_bool(&(halui_data->machine_off), "halui.machine.off")); CHK(halui_export_pin_IN_bool(&(halui_data->estop_activate), "halui.estop.activate")); CHK(halui_export_pin_IN_bool(&(halui_data->estop_reset), "halui.estop.reset")); - CHK(halui_export_pin_IN_bool(&(halui_data->mode_manual), "halui.mode.manual")); - CHK(halui_export_pin_IN_bool(&(halui_data->mode_auto), "halui.mode.auto")); - CHK(halui_export_pin_IN_bool(&(halui_data->mode_mdi), "halui.mode.mdi")); CHK(halui_export_pin_IN_bool(&(halui_data->mode_teleop), "halui.mode.teleop")); CHK(halui_export_pin_IN_bool(&(halui_data->mode_joint), "halui.mode.joint")); CHK(halui_export_pin_IN_bool(&(halui_data->mist_on), "halui.mist.on")); @@ -795,97 +624,45 @@ static int sendEstopReset() return emcCommandSend(state_msg); } -static int sendManual() -{ - EMC_TASK_SET_MODE mode_msg; - - if (emcStatus->task.mode == EMC_TASK_MODE::MANUAL) { - return 0; - } - - mode_msg.mode = EMC_TASK_MODE::MANUAL; - return emcCommandSend(mode_msg); -} - -static int sendAuto() +// Start an [HALUI]MDI_COMMAND. Task needs no mode for it: an MDI command +// starts an MDI run when task is idle, and queues behind the running one +// during MDI. Task refuses it while a program runs or a jog is active. +// +// What the pins do is unchanged, including the two known quirks the tests +// pin down: halui-mdi-is-running goes true at the press, before task has +// accepted anything, and a command task refuses leaves it stuck until the +// next command finishes DONE. +static void sendMdiCommand(int n) { - EMC_TASK_SET_MODE mode_msg; - - if (emcStatus->task.mode == EMC_TASK_MODE::AUTO) { - return 0; - } - - mode_msg.mode = EMC_TASK_MODE::AUTO; - return emcCommandSend(mode_msg); -} - -static int sendMdi() -{ - EMC_TASK_SET_MODE mode_msg; + halui_sent_mdi = 1; - if (emcStatus->task.mode == EMC_TASK_MODE::MDI) { - return 0; + if (num_mdi_commands > 0) { + hal_set_bool(halui_data->halui_mdi_is_running, halui_sent_mdi); } - mode_msg.mode = EMC_TASK_MODE::MDI; - return emcCommandSend(mode_msg); -} - -static int sendMdiCommand(int n) -{ EMC_TASK_PLAN_EXECUTE emc_task_plan_execute_msg; - - if (updateStatus()) { - return -1; - } - - if (!halui_sent_mdi) { - // There is currently no MDI command from halui executing, we're - // currently starting the first one. Record what the Task mode is, - // so we can restore it when all the MDI commands finish. - halui_old_mode = emcStatus->task.mode; - } - - halui_sent_mdi = 1; - - if (num_mdi_commands>0){ - hal_set_bool(halui_data->halui_mdi_is_running, halui_sent_mdi); - updateStatus(); - } - - // switch to MDI mode if needed - if (emcStatus->task.mode != EMC_TASK_MODE::MDI) { - if (sendMdi() != 0) { - rtapi_print("halui: %s: failed to Set Mode MDI\n", __func__); - return -1; - } - if (updateStatus() != 0) { - rtapi_print("halui: %s: failed to update status\n", __func__); - return -1; - } - if (emcStatus->task.mode != EMC_TASK_MODE::MDI) { - rtapi_print("halui: %s: switched mode, but got %d instead of mdi\n", __func__, (int)emcStatus->task.mode); - return -1; - } - } rtapi_strxcpy(emc_task_plan_execute_msg.command, mdi_commands[n]); - if (emcCommandSend(emc_task_plan_execute_msg)) { - rtapi_print("halui: %s: failed to send mdi command %d\n", __func__, n); - return -1; - } + mdi_exec_ticket = taskcmd::push(emc_task_plan_execute_msg); +} - return 0; +// True once the MDI command halui started has actually been issued by task +// (not merely queued), which is what the standalone halui knew by waiting +// for the echo before it returned from sendMdiCommand(). +static bool mdi_settled() +{ + return halui_sent_mdi + && !taskcmd::pending(mdi_exec_ticket); } +// The standalone halui waited here for task to finish the mode change, +// up to 60 seconds. Inside task that wait is the deadlock it sounds like: +// task cannot finish anything while halui holds the loop. static int sendTeleop() { EMC_TRAJ_SET_TELEOP_ENABLE emc_set_teleop_enable_msg; emc_set_teleop_enable_msg.enable = 1; - if (emcCommandSend(emc_set_teleop_enable_msg)) { - return -1; - } - return emcCommandWaitDone(); + return emcCommandSend(emc_set_teleop_enable_msg); } static int sendJoint() @@ -893,10 +670,7 @@ static int sendJoint() EMC_TRAJ_SET_TELEOP_ENABLE emc_set_teleop_enable_msg; emc_set_teleop_enable_msg.enable = 0; - if (emcCommandSend(emc_set_teleop_enable_msg)) { - return -1; - } - return emcCommandWaitDone(); + return emcCommandSend(emc_set_teleop_enable_msg); } static int sendMistOn() @@ -935,8 +709,6 @@ static int sendProgramRun(int line) { EMC_TASK_PLAN_RUN emc_task_plan_run_msg; - updateStatus(); - if (0 == emcStatus->task.file[0]) { return -1; // no program open } @@ -944,7 +716,6 @@ static int sendProgramRun(int line) programStartLine = line; emc_task_plan_run_msg.line = line; - sendAuto(); return emcCommandSend(emc_task_plan_run_msg); } @@ -1082,7 +853,7 @@ static void sendJogStop(int ja, int jjogmode) EMC_JOG_STOP emc_jog_stop_msg; if ( ( (jjogmode == JOGJOINT) && (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::TELEOP) ) - || ( (jjogmode == JOGTELEOP ) && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) ) + || ( (jjogmode == JOGTELEOP ) && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) && !emcStatus->motion.pause_jog_ok && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::COORD) ) ) { return; } @@ -1093,7 +864,7 @@ static void sendJogStop(int ja, int jjogmode) emc_jog_stop_msg.jjogmode = jjogmode; emc_jog_stop_msg.joint_or_axis = ja; - emcCommandSend(emc_jog_stop_msg); + emcCommandSend(emc_jog_stop_msg, jog_key(ja, jjogmode)); } @@ -1103,7 +874,7 @@ static void sendJogCont(int ja, double speed, int jjogmode) if (emcStatus->task.state != EMC_TASK_STATE::ON) { return; } if ( ( (jjogmode == JOGJOINT) && (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::TELEOP) ) - || ( (jjogmode == JOGTELEOP ) && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) ) + || ( (jjogmode == JOGTELEOP ) && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) && !emcStatus->motion.pause_jog_ok ) ) { return; } @@ -1116,7 +887,7 @@ static void sendJogCont(int ja, double speed, int jjogmode) emc_jog_cont_msg.joint_or_axis = ja; emc_jog_cont_msg.vel = speed / 60.0; - emcCommandSend(emc_jog_cont_msg); + emcCommandSend(emc_jog_cont_msg, jog_key(ja, jjogmode)); } static void sendJogIncr(int ja, double speed, double incr, int jjogmode) @@ -1125,7 +896,7 @@ static void sendJogIncr(int ja, double speed, double incr, int jjogmode) if (emcStatus->task.state != EMC_TASK_STATE::ON) { return; } if ( ( (jjogmode == JOGJOINT) && (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::TELEOP) ) - || ( (jjogmode == JOGTELEOP ) && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) ) + || ( (jjogmode == JOGTELEOP ) && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) && !emcStatus->motion.pause_jog_ok ) ) { return; } @@ -1207,7 +978,7 @@ static int sendSpindleOverride(int spindle, double override) return emcCommandSend(emc_traj_set_spindle_scale_msg); } -static int iniLoad(const char *filename) +static int haluiIniLoad(const char *filename) { IniFile inifile(filename); @@ -1215,32 +986,14 @@ static int iniLoad(const char *filename) return -1; } - // EMC debugging flags - emc_debug = (unsigned)inifile.findUIntV("DEBUG", "EMC", 0); - - if (emc_debug & EMC_DEBUG_CONFIG) { - std::string version = inifile.findStringV("VERSION", "EMC", ""); - std::string machine = inifile.findStringV("MACHINE", "EMC", ""); - extern char *program_invocation_short_name; - log_info( - "{} ({}) halui: machine '{}' version '{}'\n", - program_invocation_short_name, getpid(), machine, version - ); - } - - if (auto inistring = inifile.findString("NML_FILE", "EMC")) { - // copy to global - rtapi_strxcpy(emc_nmlfile, inistring->c_str()); - } // else not found, use default - if (auto inival = inifile.findReal("MAX_FEED_OVERRIDE", "DISPLAY")) { if (*inival > 0.0) { maxFeedOverride = *inival; } } - if(!inifile.isSet("MAX_LINEAR_VELOCITY", "TRAJ") && !inifile.isSet("MAX_VELOCITY", "AXIS_X")) - maxMaxVelocity = 1.0; + maxMaxVelocity = inifile.findRealV("MAX_LINEAR_VELOCITY", "TRAJ", + inifile.findRealV("MAX_VELOCITY", "AXIS_X", 1.0)); if (auto inival = inifile.findReal("MIN_SPINDLE_OVERRIDE", "DISPLAY")) { if (*inival > 0.0) { @@ -1423,6 +1176,28 @@ static bool jogging_selected_axis(local_halui_str &hal) { } +// The pins where a 20 ms sampling period is the wrong answer. They are +// checked every task cycle; check_bit_changed() updates old_halui_data, so +// the full pass below does not see the same edge a second time. +static void check_safety_pins() +{ + if (check_bit_changed(hal_get_bool(halui_data->estop_activate), + old_halui_data.estop_activate) != 0) + sendEstop(); + + if (check_bit_changed(hal_get_bool(halui_data->machine_off), + old_halui_data.machine_off) != 0) + sendMachineOff(); + + if (check_bit_changed(hal_get_bool(halui_data->abort), + old_halui_data.abort) != 0) + sendAbort(); + + if (check_bit_changed(hal_get_bool(halui_data->program_stop), + old_halui_data.program_stop) != 0) + sendAbort(); +} + // this function looks if any of the hal pins has changed // and sends appropriate messages if so static void check_hal_changes() @@ -1453,15 +1228,6 @@ static void check_hal_changes() if (check_bit_changed(new_halui_data.estop_reset, old_halui_data.estop_reset) != 0) sendEstopReset(); - if (check_bit_changed(new_halui_data.mode_manual, old_halui_data.mode_manual) != 0) - sendManual(); - - if (check_bit_changed(new_halui_data.mode_auto, old_halui_data.mode_auto) != 0) - sendAuto(); - - if (check_bit_changed(new_halui_data.mode_mdi, old_halui_data.mode_mdi) != 0) - sendMdi(); - if (check_bit_changed(new_halui_data.mode_teleop, old_halui_data.mode_teleop) != 0) sendTeleop(); @@ -1906,21 +1672,9 @@ static void modify_hal_pins() hal_set_bool(halui_data->machine_is_on, emcStatus->task.state == EMC_TASK_STATE::ON); hal_set_bool(halui_data->estop_is_activated, emcStatus->task.state == EMC_TASK_STATE::ESTOP); - // Decide once whether an ongoing halui MDI command has finished: the mode - // restore below refreshes emcStatus, and Task may echo it while still EXEC. - bool mdi_finished = halui_sent_mdi && emcStatus->status == RCS_STATUS::DONE; - - if (halui_sent_mdi) { // we have an ongoing MDI command - if (mdi_finished) { //which seems to have finished - switch (halui_old_mode) { - case EMC_TASK_MODE::MANUAL: sendManual();break; - case EMC_TASK_MODE::MDI: break; - case EMC_TASK_MODE::AUTO: sendAuto();break; - default: sendManual();break; - } - } - } - + // whether an ongoing halui MDI command has finished + bool mdi_finished = mdi_settled() && emcStatus->status == RCS_STATUS::DONE; + hal_set_bool(halui_data->mode_is_manual, emcStatus->task.mode == EMC_TASK_MODE::MANUAL); hal_set_bool(halui_data->mode_is_auto, emcStatus->task.mode == EMC_TASK_MODE::AUTO); @@ -1935,12 +1689,12 @@ static void modify_hal_pins() if (num_mdi_commands>0){ // we wants initialize program_is_idle and mode_is_mdi before halui_sent_mdi - if (halui_sent_mdi) { // we have an ongoing MDI command + if (mdi_settled()) { // we have an ongoing MDI command if (mdi_finished) { //which seems to have finished halui_sent_mdi = 0; - esleep(20ms); //sleep for a while - updateStatus(); - esleep(20ms); //sleep for a while + mdi_exec_ticket = 0; + // the standalone halui slept 2x20ms around a status + // re-read here; in task the status is already current } } hal_set_bool(halui_data->halui_mdi_is_running, halui_sent_mdi); @@ -2097,68 +1851,70 @@ static void modify_hal_pins() -int main(int argc, char *argv[]) -{ - // process command line args - if (0 != emcGetArgs(argc, argv)) { - log_error("error in argument list\n"); - exit(1); - } - // get configuration information - if (0 != iniLoad(emc_inifile)) { - log_error("iniLoad error\n"); - exit(2); +/******************************************************************** +* +* The three entry points task uses. See halui.hh. +* +********************************************************************/ + +int haluiInit(const char *filename) +{ + if (0 != haluiIniLoad(filename)) { + log_error("halui: iniLoad error\n"); + return -1; } - //init HAL and export pins if (0 != halui_hal_init()) { - log_error("hal_init error\n"); - exit(1); + log_error("halui: hal_init error\n"); + // the export helpers hal_exit() the component themselves + comp_id = -1; + return -1; } - //initialize safe values hal_init_pins(); + return 0; +} - // init NML - if (0 != tryNml()) { - log_error("can't connect to emc\n"); - thisQuit(); - exit(1); - } - -#ifdef TOOL_NML //{ - //fprintf(stderr,"%8d HALUI REGISTER %p\n",getpid(), - tool_nml_register((CANON_TOOL_TABLE*)&emcStatus->io.tool.toolTable); -#else //}{ - tool_mmap_user(); -#endif //} - - // get current serial number, and save it for restoring when we quit - // so as not to interfere with real operator interface - updateStatus(); - - done = 0; - /* Register the routine that catches the SIGINT signal */ - signal(SIGINT, quit); - /* catch SIGTERM too - the run script uses it to shut things down */ - signal(SIGTERM, quit); - - while (!done) { - static bool task_start_synced = 0; - if (!task_start_synced) { - // wait for task to establish nonzero linearUnits - if (emcStatus->motion.traj.linearUnits != 0) { - // set once at startup, no changes are expected: - hal_set_real(halui_data->units_per_mm, emcStatus->motion.traj.linearUnits); - task_start_synced = 1; - } +void haluiUpdate(void) +{ + if (comp_id < 0) { + return; + } + + static bool task_start_synced = false; + if (!task_start_synced) { + // wait for task to establish nonzero linearUnits + if (emcStatus->motion.traj.linearUnits != 0) { + // set once at startup, no changes are expected: + hal_set_real(halui_data->units_per_mm, emcStatus->motion.traj.linearUnits); + task_start_synced = true; } - check_hal_changes(); //if anything changed send NML messages + } + + // every cycle: the pins that should not wait for the next pass + check_safety_pins(); + + const double now = etime(); + const bool due = (now - last_pass) >= HALUI_PERIOD; + + if (due) { + last_pass = now; + check_hal_changes(); //if anything changed send commands + } + + if (due) { modify_hal_pins(); //if status changed modify HAL too - esleep(20ms); //sleep for a while - updateStatus(); } - thisQuit(); - return 0; +} + +void haluiExit(void) +{ + if (comp_id < 0) { + return; + } + + //don't forget the big HAL sin ;) + hal_exit(comp_id); + comp_id = -1; } diff --git a/src/emc/task/halui.hh b/src/emc/task/halui.hh new file mode 100644 index 00000000000..7a64e5d1f55 --- /dev/null +++ b/src/emc/task/halui.hh @@ -0,0 +1,31 @@ +/******************************************************************** +* Description: halui.hh +* The HAL user interface, running inside task. +* +* This is the whole interface task sees; everything else lives in +* halui.cc. +* +* License: GPL Version 2 +********************************************************************/ +#ifndef TASK_HALUI_HH +#define TASK_HALUI_HH + +/* Create the halui HAL component and its pins. Returns 0, or -1 on + failure. There is nothing to load: the pins are always there, and a + machine that connects none of them pays only for a pin scan every + 20 ms. + + Call this before ini_hal_init(): halcmd's "loadusr -Wn inihal" returns as + soon as the inihal component is ready, and the HAL files -- which may + well "net" halui pins -- run immediately afterwards. */ +int haluiInit(const char *inifile); + +/* Read the input pins, write the status pins. Called once per task cycle. + Most of the work is internally rate limited to 20 ms, which was the + standalone halui's loop period. */ +void haluiUpdate(void); + +/* Release the HAL component. Safe to call if haluiInit() never ran. */ +void haluiExit(void); + +#endif /* TASK_HALUI_HH */ diff --git a/src/emc/task/task.hh b/src/emc/task/task.hh index d8c619cdb50..3e258beae5e 100644 --- a/src/emc/task/task.hh +++ b/src/emc/task/task.hh @@ -29,11 +29,19 @@ extern int emcTaskOnce(const char *inifile, EMC_IO_STAT &emcioStatus); int all_homed(void); bool jogging_is_active(void); +// What task is running. The task mode reported in the status is derived +// from it (determineMode()); nothing sets the mode directly. +enum class TaskRun { + NONE, // idle: jogs, homing, MDI and program starts are accepted + PROGRAM, // a program run, from PLAN_RUN or PLAN_STEP + MDI, // MDI commands, from PLAN_EXECUTE +}; +extern TaskRun taskRun; + int emcTaskInit(); int emcTaskHalt(); int emcTaskStateRestore(); int emcTaskAbort(); -int emcTaskSetMode(EMC_TASK_MODE mode); int emcTaskSetState(EMC_TASK_STATE state); int emcTaskPlanInit(); int emcTaskPlanSetWait(); diff --git a/src/emc/task/taskintf.cc b/src/emc/task/taskintf.cc index 049ae4d26d4..a4a52d29a81 100644 --- a/src/emc/task/taskintf.cc +++ b/src/emc/task/taskintf.cc @@ -1167,6 +1167,18 @@ int emcTrajSetJerk(double jerk) return retval; } +// The axes that return last after jogs while paused, [TRAJ]PAUSE_RETURN_LAST +int emcTrajSetPauseReturnLast(unsigned axis_mask) +{ + emcmotCommand.command = EMCMOT_SET_PAUSE_RETURN_LAST; + emcmotCommand.flags = (int)axis_mask; + + int retval = usrmotWriteEmcmotCommand(&emcmotCommand); + + log_debug(EMC_DEBUG_CONFIG, "{}({:#x}) returned {}\n", __FUNCTION__, axis_mask, retval); + return retval; +} + int emcTrajPlannerType(int type) { emcmotCommand.command = EMCMOT_SET_PLANNER_TYPE; @@ -2148,6 +2160,9 @@ int emcMotionUpdate(EMC_MOTION_STAT * stat) } stat->jogging_active = emcmotStatus.jogging_active; + stat->pause_offset = emcmotStatus.pause_offset; + stat->pause_jog_ok = emcmotStatus.pause_jog_ok; + stat->pause_returning = emcmotStatus.pause_returning; stat->homing_active = emcmotStatus.homing_active; stat->numExtraJoints = emcmotStatus.numExtraJoints; diff --git a/src/emc/usr_intf/Submakefile b/src/emc/usr_intf/Submakefile index 33c030bea38..121bcfe3b0a 100644 --- a/src/emc/usr_intf/Submakefile +++ b/src/emc/usr_intf/Submakefile @@ -13,10 +13,7 @@ EMCLCDSRCS := emc/usr_intf/emclcd.cc \ emc/usr_intf/shcom.cc \ emc/usr_intf/sockets.cc -HALUISRCS := emc/usr_intf/halui.cc \ - emc/usr_intf/mapini.cc - -USERSRCS += $(EMCSHSRCS) $(EMCRSHSRCS) $(EMCSCHEDSRCS) $(EMCLCDSRCS) $(USRMOTSRCS) $(HALUISRCS) +USERSRCS += $(EMCSHSRCS) $(EMCRSHSRCS) $(EMCSCHEDSRCS) $(EMCLCDSRCS) $(USRMOTSRCS) $(call TOOBJSDEPS, $(EMCSHSRCS)) : EXTRAFLAGS = $(ULFLAGS) $(TCL_CFLAGS) -fPIC @@ -41,8 +38,3 @@ TARGETS += ../bin/schedrmt $(ECHO) Linking $(notdir $@) $(Q)$(CXX) -o $@ $(ULFLAGS) $^ -lfmt $(LDFLAGS) TARGETS += ../bin/linuxcnclcd - -../bin/halui: $(call TOOBJS, $(HALUISRCS)) ../lib/liblinuxcnc.a ../lib/liblinuxcncini.so.1 ../lib/libnml.so.0 ../lib/liblinuxcnchal.so.0 ../lib/libtooldata.so.0 - $(ECHO) Linking $(notdir $@) - $(Q)$(CXX) $(CXXFLAGS) -o $@ $(ULFLAGS) $^ -lfmt $(LDFLAGS) -TARGETS += ../bin/halui diff --git a/src/emc/usr_intf/axis/extensions/emcmodule.cc b/src/emc/usr_intf/axis/extensions/emcmodule.cc index 635726e7cd7..0e9463801f9 100644 --- a/src/emc/usr_intf/axis/extensions/emcmodule.cc +++ b/src/emc/usr_intf/axis/extensions/emcmodule.cc @@ -1134,7 +1134,6 @@ static PyMemberDef Stat_members[] = { { "state", T_INT, O(status), READONLY, NULL}, // task - { "task_mode", T_INT, O(task.mode), READONLY, NULL}, { "task_state", T_INT, O(task.state), READONLY, "Current Task state. Possible values:\n" " STATE_ESTOP: E-Stop is active.\n" @@ -1154,6 +1153,8 @@ static PyMemberDef Stat_members[] = { { "interpreter_errcode", T_INT, O(task.interpreter_errcode), READONLY, NULL}, { "optional_stop", T_BOOL, O(task.optional_stop_state), READONLY, NULL}, { "block_delete", T_BOOL, O(task.block_delete_state), READONLY, NULL}, + { "pause_jog_ok", T_BOOL, O(motion.pause_jog_ok), READONLY, NULL}, + { "pause_returning", T_BOOL, O(motion.pause_returning), READONLY, NULL}, { "task_paused", T_INT, O(task.task_paused), READONLY, NULL}, { "input_timeout", T_BOOL, O(task.input_timeout), READONLY, NULL}, { "rotation_xy", T_DOUBLE, O(task.rotation_xy), READONLY, NULL}, @@ -1306,6 +1307,10 @@ static PyObject *Stat_actual(pyStatChannel *s, void *) { return pose(s->status.motion.traj.actualPosition); } +static PyObject *Stat_pause_offset(pyStatChannel *s, void *) { + return pose(s->status.motion.pause_offset); +} + static PyObject *Stat_joint_position(pyStatChannel *s, void *) { PyObject *res = PyTuple_New(EMCMOT_MAX_JOINTS); for(int i=0; istatus.task.mode; + if (mode == EMC_TASK_MODE::MANUAL) { + mode = view_mode; + } + return PyLong_FromLong((long)mode); +} + static PyObject *Stat_ain(pyStatChannel *s, void *) { return double_array(s->status.motion.analog_input, EMCMOT_MAX_AIO); } @@ -1579,7 +1599,9 @@ static PyObject *Stat_taskbeat(pyStatChannel *s, void *) { static PyGetSetDef Stat_getsetlist[] = { {(char*)"actual_position", (getter)Stat_actual, NULL, NULL, NULL}, + {(char*)"pause_offset", (getter)Stat_pause_offset, NULL, NULL, NULL}, {(char*)"ain", (getter)Stat_ain, NULL, NULL, NULL}, + {(char*)"task_mode", (getter)Stat_task_mode, NULL, NULL, NULL}, {(char*)"aout", (getter)Stat_aout, NULL, NULL, NULL}, {(char*)"joint", (getter)Stat_joint, NULL, NULL, NULL}, {(char*)"axis", (getter)Stat_axis, NULL, NULL, NULL}, @@ -1749,10 +1771,11 @@ static PyObject *optional_stop(pyCommandChannel *s, PyObject *o) { return Py_None; } -static PyObject *mode(pyCommandChannel *s, PyObject *o) { - EMC_TASK_SET_MODE m; - if(!PyArg_ParseTuple(o, "i", &m.mode)) return NULL; - switch(m.mode) { +// Nothing goes to task, see view_mode. +static PyObject *mode(pyCommandChannel * /*s*/, PyObject *o) { + EMC_TASK_MODE m; + if(!PyArg_ParseTuple(o, "i", &m)) return NULL; + switch(m) { case EMC_TASK_MODE::MDI: case EMC_TASK_MODE::MANUAL: case EMC_TASK_MODE::AUTO: @@ -1761,7 +1784,7 @@ static PyObject *mode(pyCommandChannel *s, PyObject *o) { PyErr_Format(PyExc_ValueError,"Mode should be MODE_MDI, MODE_MANUAL, or MODE_AUTO"); return NULL; } - emcSendCommand(s, m); + view_mode = m; Py_INCREF(Py_None); return Py_None; } diff --git a/src/emc/usr_intf/axis/scripts/axis.py b/src/emc/usr_intf/axis/scripts/axis.py index 9477cca0332..c0e951b00d2 100755 --- a/src/emc/usr_intf/axis/scripts/axis.py +++ b/src/emc/usr_intf/axis/scripts/axis.py @@ -746,7 +746,6 @@ def start(self): self.stat = linuxcnc.stat() except linuxcnc.error: return False - self.last_task_mode = self.stat.task_mode self.last_motion_mode = self.stat.motion_mode def C(s): a = o.colors[s + "_alpha"] @@ -844,30 +843,10 @@ def update(self): continuous_jog_in_progress = 0 cjogindices = [] - if ( (self.stat.motion_mode == linuxcnc.TRAJ_MODE_COORD) - and (self.stat.task_mode == linuxcnc.MODE_MANUAL) - ): - set_motion_teleop(1) if ( (self.stat.motion_mode == linuxcnc.TRAJ_MODE_TELEOP) and not vars.teleop_mode.get() ): vars.teleop_mode.set(1) - # With joints_axes support and jogging while mdi - # (ref: emctaskmain.cc:allow_while_idle_type()) - # behavior is better without changing tabs upon detecting - # a task_mode change. - # Restore behavior with this local var: enable_tab_change - enable_tab_change = False - if ( enable_tab_change - and (self.stat.task_mode != self.last_task_mode)): - if (self.stat.task_mode == linuxcnc.MODE_MANUAL): - root_window.tk.eval(pane_top + ".tabs raise manual") - if (self.stat.task_mode == linuxcnc.MODE_MDI): - root_window.tk.eval(pane_top + ".tabs raise mdi") - if (self.stat.task_mode == linuxcnc.MODE_AUTO): - # not sure if anything needs to be done for this - pass - self.last_task_mode = self.stat.task_mode self.after = self.win.after(update_ms, self.update) @@ -913,6 +892,7 @@ def update(self): root_window.update_idletasks() vupdate(vars.exec_state, self.stat.exec_state) vupdate(vars.interp_state, self.stat.interp_state) + vupdate(vars.pause_jog_ok, self.stat.pause_jog_ok) vupdate(vars.queued_mdi_commands, self.stat.queued_mdi_commands) if hal_present == 1: notifications_clear = comp["notifications-clear"] @@ -1040,13 +1020,13 @@ def manual_ok(do_poll=True): if s.task_state != linuxcnc.STATE_ON: return False return s.interp_state == linuxcnc.INTERP_IDLE or (s.task_mode == linuxcnc.MODE_MDI and s.queued_mdi_commands < vars.max_queued_mdi_commands.get()) -# If LinuxCNC is not already in one of the modes given, switch it to the -# first (task) mode MANUAL,MDI,AUTO +# If AXIS does not already show one of the modes given, show the first +# MANUAL,MDI,AUTO. The mode is AXIS's own (see stat.task_mode): nothing goes +# to task, so there is nothing to wait for. def ensure_mode(m, *p): s.poll() if s.task_mode == m or s.task_mode in p: return True c.mode(m) # task_mode - c.wait_complete() s.poll() return True @@ -1499,7 +1479,7 @@ def open_file_guts(f, filtered=False, addrecent=True): widgets.axis_w.configure(value="w") def activate_ja_widget(i, force=0): - if not force and not manual_ok(): return + if not force and not (manual_ok() or s.pause_jog_ok): return if get_jog_mode() and (not kins_is_trivkins or (kins_is_trivkins and s.kinematics_type == linuxcnc.KINEMATICS_BOTH)): # free jogging (joints) if: # non-trivkins config or @@ -2955,7 +2935,7 @@ def set_axis_offset(event=None): commands.touch_off_system(new_axis_value=0.) def brake(event=None): - if not manual_ok(): return + if not spindle_ok(): return ensure_mode(linuxcnc.MODE_MANUAL) c.brake(vars.brake.get()) def flood(event=None): @@ -2963,7 +2943,7 @@ def flood(event=None): def mist(event=None): c.mist(vars.mist.get()) def spindle(event=None): - if not manual_ok(): return + if not spindle_ok(): return ensure_mode(linuxcnc.MODE_MANUAL) d = vars.spindledir.get() if d == 0: @@ -2975,7 +2955,7 @@ def spindle_increase(event=None): def spindle_decrease(event=None): c.spindle(linuxcnc.SPINDLE_DECREASE) def spindle_constant(event=None): - if not manual_ok(): return + if not spindle_ok(): return ensure_mode(linuxcnc.MODE_MANUAL) c.spindle(linuxcnc.SPINDLE_CONSTANT) def set_first_line(lineno): @@ -2990,7 +2970,7 @@ def flood_toggle(*args): c.flood(not s.flood) def spindle_forward_toggle(*args): - if not manual_ok(): return + if not spindle_ok(): return s.poll() if s.spindle[0]['direction'] == 0: c.spindle(linuxcnc.SPINDLE_FORWARD,default_spindle_speed) @@ -2998,7 +2978,7 @@ def spindle_forward_toggle(*args): c.spindle(linuxcnc.SPINDLE_OFF) def spindle_backward_toggle(*args): - if not manual_ok(): return "break" + if not spindle_ok(): return "break" s.poll() if s.spindle[0]['direction'] == 0: c.spindle(linuxcnc.SPINDLE_REVERSE,default_spindle_speed) @@ -3007,10 +2987,10 @@ def spindle_backward_toggle(*args): return "break" # bound to F10, don't activate menu def brake_on(*args): - if not manual_ok(): return + if not spindle_ok(): return c.brake(1) def brake_off(*args): - if not manual_ok(): return + if not spindle_ok(): return c.brake(0) def toggle_display_type(*args): @@ -3119,6 +3099,7 @@ def clear_recent_files(): ("task_state", IntVar), ("task_paused", IntVar), ("interp_state", IntVar), + ("pause_jog_ok", IntVar), ("task_mode", IntVar), ("has_ladder", IntVar), ("has_editor", IntVar), @@ -3335,13 +3316,28 @@ def kp_wrap(f,g): except IOError: pass +# Jogs are fine while idle and, for axes, while a paused program or MDI has +# stopped: the machine goes back to the paused position on resume. +def jog_ok(): + s.poll() + return (manual_ok(False) and not running(False)) or s.pause_jog_ok + +# Spindle commands are fine while idle and while paused. +def spindle_ok(): + s.poll() + return manual_ok(False) or (s.task_state == linuxcnc.STATE_ON + and s.interp_state == linuxcnc.INTERP_PAUSED) + def jog(*args): - if not manual_ok(): return + if not jog_ok(): return if not manual_tab_visible(): return c.jog(*args) def get_jog_mode(): s.poll() + if s.pause_jog_ok: + # while paused only axes jog, in coordinated mode + return False if ( (s.kinematics_type == linuxcnc.KINEMATICS_IDENTITY) and all_homed() ): teleop_mode = 1 @@ -3364,7 +3360,7 @@ def get_jog_mode(): jog_cont = [False] * linuxcnc.MAX_JOINTS jogging = [0] * linuxcnc.MAX_JOINTS def jog_on(a, b): - if not manual_ok() or not manual_tab_visible() or running(): return + if not jog_ok() or not manual_tab_visible(): return if (joint_type[a] == "LINEAR") if get_jog_mode() else not axis_angular[a]: if vars.metric.get(): b = b / 25.4 b = from_internal_linear_unit(b) @@ -3396,7 +3392,7 @@ def jog_off(a): def jog_off_actual(a): global continuous_jog_in_progress continuous_jog_in_progress = False - if not manual_ok(): return + if not jog_ok(): return jog_after[a] = None jogging[a] = 0 jjogmode = get_jog_mode() diff --git a/src/emc/usr_intf/emclcd.cc b/src/emc/usr_intf/emclcd.cc index 67305fa289e..ce3d9225b8f 100644 --- a/src/emc/usr_intf/emclcd.cc +++ b/src/emc/usr_intf/emclcd.cc @@ -926,7 +926,6 @@ static int openProgram(char *s) widgetSetStr(PROG_WIDGET1, s, ""); widgetSetStr(PROG_WIDGET2, s, ""); if (sendTaskPlanInit() != 0) return -1; - sendAuto(); return sendProgramOpen(fname); } @@ -1143,7 +1142,6 @@ static int jog(int jnum, float speed) else stepSize = 1.0; if ((jnum < 0) || (jnum > 5)) return -1; // if (runStatus == rsIdle) { -// sendManual(); switch (jogMode) { case jtCont: if (jogging == 1) { // toggle if driver does not support key down / key up @@ -1240,17 +1238,6 @@ static int stepKey() return sendProgramStep(); } -static int toggleMode() - -{ - switch (emcStatus->task.mode) { - case EMC_TASK_MODE::MANUAL: sendAuto(); break; - case EMC_TASK_MODE::AUTO: sendManual(); break; - case EMC_TASK_MODE::MDI: sendAuto(); break; - } - return 0; -} - static int nextKey() { int temp; @@ -1347,9 +1334,7 @@ static int doKey(keyType k) stepKey(); break; case ktStepRelease: break; - case ktTestPress: - toggleMode(); - break; + case ktTestPress: break; // used to toggle the task mode, which cannot be set case ktTestRelease: break; case ktHelpPress: break; case ktHelpRelease: break; diff --git a/src/emc/usr_intf/emcrsh.cc b/src/emc/usr_intf/emcrsh.cc index 88550e56177..500a05f986c 100644 --- a/src/emc/usr_intf/emcrsh.cc +++ b/src/emc/usr_intf/emcrsh.cc @@ -172,6 +172,7 @@ typedef struct { std::string version; // Client's version std::string progname; // Filename of (g-code) program EMC_WAIT_TYPE waitmode; // Local to the connection to allow others to intervene + EMC_TASK_MODE viewmode; // The mode this connection asked for, see getMode() double cmdtimeout; // Command timeout (infinite when <= 0.0) double usrtimeout; // Timeout as set by SET TIMEOUT int serial; // The serial number of the last command sent @@ -1161,20 +1162,13 @@ static cmdResponseType setUpdateStatus(connectionRecType &) static cmdResponseType setMode(connectionRecType &ctx) { // SET MODE + // Nothing goes to task: its mode cannot be set. The connection keeps + // the mode it asked for, see getMode(). switch (checkManualAutoMDI(ctx.toks[2])) { default: errornl(ctx, fmt::format("Invalid argument '{}', must be {{manual,auto,mdi}}", ctx.toks[2])); return rtError; - case kwManual: - if (sendManual()) - return rtError; - break; - case kwAuto: - if (sendAuto()) - return rtError; - break; - case kwMDI: - if (sendMdi()) - return rtError; - break; + case kwManual: ctx.viewmode = EMC_TASK_MODE::MANUAL; break; + case kwAuto: ctx.viewmode = EMC_TASK_MODE::AUTO; break; + case kwMDI: ctx.viewmode = EMC_TASK_MODE::MDI; break; } return rtOk; } @@ -2015,12 +2009,17 @@ static cmdResponseType getMachine(connectionRecType &ctx) static cmdResponseType getMode(connectionRecType &ctx) { // GET MODE - switch (emcStatus->task.mode) { + // Task's mode reports what runs and cannot be set. While task is + // idle, report the mode this connection asked for with SET MODE. + EMC_TASK_MODE mode = emcStatus->task.mode; + if (mode == EMC_TASK_MODE::MANUAL) + mode = ctx.viewmode; + switch (mode) { case EMC_TASK_MODE::MANUAL: replynl(ctx, "MODE MANUAL"); break; case EMC_TASK_MODE::AUTO: replynl(ctx, "MODE AUTO"); break; case EMC_TASK_MODE::MDI: replynl(ctx, "MODE MDI"); break; default: - errornl(ctx, fmt::format("internal: GET MODE: unrecognised EMC_TASK_MODE value '{}'", (int)emcStatus->task.mode)); + errornl(ctx, fmt::format("internal: GET MODE: unrecognised EMC_TASK_MODE value '{}'", (int)mode)); replynl(ctx, "MODE ?"); } return rtOk; @@ -3590,6 +3589,7 @@ static int sockMain(int svrfd) cr.version = "1.1"; cr.echo = true; cr.waitmode = EMC_WAIT_DONE; + cr.viewmode = EMC_TASK_MODE::MANUAL; //cr.timestamp= true; clients.push_back(cr); if(isipv4) { diff --git a/src/emc/usr_intf/emcsched.cc b/src/emc/usr_intf/emcsched.cc index 00465cd1b7c..76d16eb9456 100644 --- a/src/emc/usr_intf/emcsched.cc +++ b/src/emc/usr_intf/emcsched.cc @@ -256,7 +256,6 @@ void updateQueue() { if (interlocksOk()) { sendFeedOverride(((double) q.front().getFeedOverride()) / 100.0); sendSpindleOverride(0, ((double) q.front().getSpindleOverride()) / 100.0); - sendMdi(); sendMdiCmd("G92.1\n"); if (emcCommandWaitDone() != 0) { queueStatus = qsError; @@ -296,7 +295,6 @@ void updateQueue() { if (sendTaskPlanInit() != 0) { queueStatus = qsError; } - sendAuto(); strxcpy(fileStr, defaultPath.c_str()); strxcat(fileStr, q.front().getFileName().c_str()); if (sendProgramOpen(fileStr) != 0) { diff --git a/src/emc/usr_intf/emcsh.cc b/src/emc/usr_intf/emcsh.cc index e7e20296f37..87de1946b26 100644 --- a/src/emc/usr_intf/emcsh.cc +++ b/src/emc/usr_intf/emcsh.cc @@ -1008,6 +1008,10 @@ static int emc_machine(ClientData /*clientdata*/, return TCL_ERROR; } +// The mode this process asked for with emc_mode. Task's mode reports what +// runs and cannot be set; while task is idle emc_mode reports this one. +static EMC_TASK_MODE viewMode = EMC_TASK_MODE::MANUAL; + static int emc_mode(ClientData /*clientdata*/, Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[]) { @@ -1019,7 +1023,11 @@ static int emc_mode(ClientData /*clientdata*/, if (emcUpdateType == EMC_UPDATE_AUTO) { updateStatus(); } - switch (emcStatus->task.mode) { + EMC_TASK_MODE mode = emcStatus->task.mode; + if (mode == EMC_TASK_MODE::MANUAL) { + mode = viewMode; + } + switch (mode) { case EMC_TASK_MODE::MANUAL: setresult(interp,"manual"); break; @@ -1039,15 +1047,15 @@ static int emc_mode(ClientData /*clientdata*/, if (objc == 2) { objstr = Tcl_GetStringFromObj(objv[1], NULL); if (!strcmp(objstr, "manual")) { - sendManual(); + viewMode = EMC_TASK_MODE::MANUAL; return TCL_OK; } if (!strcmp(objstr, "auto")) { - sendAuto(); + viewMode = EMC_TASK_MODE::AUTO; return TCL_OK; } if (!strcmp(objstr, "mdi")) { - sendMdi(); + viewMode = EMC_TASK_MODE::MDI; return TCL_OK; } } diff --git a/src/emc/usr_intf/gmoccapy/gmoccapy.py b/src/emc/usr_intf/gmoccapy/gmoccapy.py index c8c9bd39506..f654c5edaa7 100644 --- a/src/emc/usr_intf/gmoccapy/gmoccapy.py +++ b/src/emc/usr_intf/gmoccapy/gmoccapy.py @@ -2896,17 +2896,14 @@ def on_tbtn_on_toggled(self, widget, data=None): def on_rbt_manual_pressed(self, widget, data=None): LOG.debug("mode Manual") self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() def on_rbt_mdi_pressed(self, widget, data=None): LOG.debug("mode MDI") self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() def on_rbt_auto_pressed(self, widget, data=None): LOG.debug("mode Auto") self.command.mode(linuxcnc.MODE_AUTO) - self.command.wait_complete() # If button exit is clicked, press emergency button before closing the application def on_btn_exit_clicked(self, widget, data=None): @@ -3067,7 +3064,6 @@ def on_hal_status_interp_idle(self, widget): if self.tool_change: self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.tool_change = False self.halcomp["program.current-line"] = 0 @@ -3154,7 +3150,6 @@ def on_hal_status_state_on(self, widget): self.widgets.btn_exit.set_sensitive(False) if self.widgets.ntb_main.get_current_page() != 0: self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() # activate limit override only if limit switch active if any(self.stat.limit): @@ -3226,7 +3221,6 @@ def on_hal_status_mode_mdi(self, widget): if not self.widgets.rbt_mdi.get_sensitive(): self.command.abort() self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self._show_error((linuxcnc.OPERATOR_DISPLAY, _("It is not possible to change to MDI Mode at the moment"))) return else: @@ -3277,7 +3271,6 @@ def on_hal_status_mode_auto(self, widget): if not self.widgets.rbt_auto.get_sensitive(): self.command.abort() self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self._show_error((linuxcnc.OPERATOR_DISPLAY, _("It is not possible to change to Auto Mode at the moment"))) return else: @@ -3429,7 +3422,6 @@ def on_window1_show(self, widget, data=None): self.on_chk_use_tool_measurement_toggled(self.widgets.chk_use_tool_measurement) self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.initialized = True @@ -3609,7 +3601,6 @@ def on_key_event(self, widget, event, signal): # F3 change to manual mode if keyname == "F3" and signal: self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() # we need to leave here, otherwise the check for jogging # only allowed in manual mode will finish the sub self.last_key_event = keyname, signal @@ -3618,7 +3609,6 @@ def on_key_event(self, widget, event, signal): # F5 should change to mdi mode if keyname == "F5" and signal: self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() # we need to leave here, otherwise the check for jogging # only allowed in manual mode will finish the sub self.last_key_event = keyname, signal @@ -4296,7 +4286,6 @@ def on_tbtn_setup_toggled(self, widget, data=None): self.stat.poll() if widget.get_active(): self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.widgets.rbt_manual.set_active(True) # save the mode to restore when leaving the settings page self.last_mode = self.stat.task_mode @@ -4364,7 +4353,6 @@ def on_tbtn_setup_toggled(self, widget, data=None): else: # restore mode self.command.mode(self.last_mode) - self.command.wait_complete() widget.set_image(self.widgets.img_settings) @@ -4923,11 +4911,9 @@ def on_btn_back_clicked(self, widget, data=None): result = self.dialogs.yesno_dialog(self, message, _("Attention!")) if result: # user says YES self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.command.mdi("G43") self.command.wait_complete() self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.widgets.ntb_button.set_current_page(_BB_MANUAL) self.widgets.ntb_main.set_current_page(0) self.widgets.ntb_preview.set_current_page(0) @@ -4969,7 +4955,6 @@ def on_tbtn_edit_offsets_toggled(self, widget, data=None): if not state: # we must switch back to manual mode, otherwise jogging is not possible self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() # show virtual keyboard? if state and self.widgets.chk_use_kb_on_offset.get_active(): @@ -4978,10 +4963,8 @@ def on_tbtn_edit_offsets_toggled(self, widget, data=None): def on_btn_zero_g92_clicked(self, widget, data=None): self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.command.mdi("G92.1") self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.widgets.btn_touch.emit("clicked") def _on_btn_set_value_clicked(self, widget, data=None): @@ -5016,12 +4999,10 @@ def _on_btn_set_value_clicked(self, widget, data=None): _("Please enter only numerical values. Values have not been applied")) else: self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() command = "G10 L20 P0 {0}{1:f}".format(axis, offset) self.command.mdi(command) self.widgets.hal_action_reload.emit("activate") self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() self.prefs.putpref("offset_axis_{0}".format(axis), offset, float) def _on_btn_edit_offsets_clicked(self, widget, data=None): @@ -5040,10 +5021,8 @@ def _on_btn_set_selected_clicked(self, widget, data=None): return else: self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.command.mdi(system) self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() def on_spbtn_probe_height_value_changed(self, widget, data=None): self.halcomp["probeheight"] = widget.get_value() @@ -5103,11 +5082,9 @@ def on_btn_block_height_clicked(self, widget, data=None): # set coordinate system to new origin origin = self.get_ini_info.get_axis_2_min_limit() + blockheight self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.command.mdi("G10 L2 P0 Z{0}".format(origin)) self.widgets.hal_action_reload.emit("activate") self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() # choose a theme to apply def on_theme_choice_changed(self, widget): @@ -5640,7 +5617,6 @@ def reload_tool(self): self.tool_change = True self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() command = "M61 Q {0} G43".format(tool_to_load) self.command.mdi(command) @@ -5759,14 +5735,12 @@ def on_btn_tool_touchoff_clicked(self, widget, data=None): else: command = "G10 L10 P{0} {1}{2}".format(self.stat.tool_in_spindle, axis, value) self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() self.command.mdi(command) self.command.wait_complete() if "G43" in self.active_gcodes: self.command.mdi("G43") self.command.wait_complete() self.command.mode(linuxcnc.MODE_MANUAL) - self.command.wait_complete() # select a tool entering a number def on_btn_select_tool_by_no_clicked(self, widget, data=None): @@ -5791,7 +5765,6 @@ def on_btn_select_tool_by_no_clicked(self, widget, data=None): else: self.tool_change = True self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() command = "T{0} M6".format(int(value)) self.command.mdi(command) # Next two lines fix issue #3129 caused by GStat missing changes in interpreter mode @@ -5817,7 +5790,6 @@ def on_btn_selected_tool_clicked(self, widget, data=None): self.tool_change = True tool = int(tool) self.command.mode(linuxcnc.MODE_MDI) - self.command.wait_complete() if widget == self.widgets.btn_change_tool: command = "T{0} M6".format(tool) diff --git a/src/emc/usr_intf/gscreen/emc_interface.py b/src/emc/usr_intf/gscreen/emc_interface.py index ff4f3dc767f..e2bb6f784cf 100644 --- a/src/emc/usr_intf/gscreen/emc_interface.py +++ b/src/emc/usr_intf/gscreen/emc_interface.py @@ -189,7 +189,6 @@ def quill_up(self): if self.masked: return self.set_motion_mode() self.emccommand.mode(self.emc.MODE_MANUAL) - self.emccommand.wait_complete() self.emccommand.jog(self.emc.JOG_CONTINUOUS, 0, 2, 100) def feed_hold(self, data): @@ -245,7 +244,6 @@ def single_block(self, s): def cycle_start(self): if self.emcstat.task_mode != self.emc.MODE_AUTO: self.emccommand.mode(self.emc.MODE_AUTO) - self.emccommand.wait_complete() self.emcstat.poll() if self.emcstat.paused: self.emccommand.auto(self.emc.AUTO_STEP) @@ -258,7 +256,6 @@ def cycle_start(self): # This restarts the program at the line specified directly (without cyscle start push) def re_start(self,line): self.emccommand.mode(self.emc.MODE_AUTO) - self.emccommand.wait_complete() self.emccommand.auto(self.emc.AUTO_RUN, line) self.restart_line_number = self.restart_reset_line @@ -285,13 +282,11 @@ def set_mdi_mode(self): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() def set_auto_mode(self): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_AUTO: self.emccommand.mode(self.emc.MODE_AUTO) - self.emccommand.wait_complete() def get_mode(self): self.emcstat.poll() diff --git a/src/emc/usr_intf/gscreen/mdi.py b/src/emc/usr_intf/gscreen/mdi.py index c4f5083bcc2..16ec72e2e57 100644 --- a/src/emc/usr_intf/gscreen/mdi.py +++ b/src/emc/usr_intf/gscreen/mdi.py @@ -145,7 +145,6 @@ def issue(self): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(m) def set_tool_touchoff(self,tool,axis,value): @@ -153,7 +152,6 @@ def set_tool_touchoff(self,tool,axis,value): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(m) self.emccommand.wait_complete() self.emccommand.mdi("g43") @@ -163,7 +161,6 @@ def set_axis_origin(self,axis,value): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(m) def go_to_position(self,axis,position,feedrate): @@ -171,7 +168,6 @@ def go_to_position(self,axis,position,feedrate): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(m) def set_spindle_speed(self,value): @@ -179,7 +175,6 @@ def set_spindle_speed(self,value): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(m) def set_user_system(self,value): @@ -187,7 +182,6 @@ def set_user_system(self,value): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(m) def index_tool(self,toolnumber): @@ -195,14 +189,12 @@ def index_tool(self,toolnumber): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi("m6 T %f"%(toolnumber)) self.emccommand.mdi("g43 h%f"%(toolnumber)) def arbitrary_mdi(self,command): if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(command) class mdi_control: @@ -231,19 +223,16 @@ def set_mdi_mode(self): self.mdi.emcstat.poll() if self.mdi.emcstat.task_mode != self.mdi.emc.MODE_MDI: self.mdi.emccommand.mode(self.mdi.emc.MODE_MDI) - self.mdi.emccommand.wait_complete() def set_axis(self,axis,value): premode = self.mdi.emcstat.task_mode self.mdi.set_axis_origin(axis,value) self.mdi.emccommand.mode(premode) - self.mdi.emccommand.wait_complete() def touchoff(self,tool,axis,value): premode = self.mdi.emcstat.task_mode self.mdi.set_tool_touchoff(tool,axis,value) self.mdi.emccommand.mode(premode) - self.mdi.emccommand.wait_complete() def set_spindle_speed(self,value): self.mdi.set_spindle_speed(value) @@ -256,7 +245,6 @@ def set_user_system(self,system): premode = self.mdi.emcstat.task_mode self.mdi.set_user_system(system) self.mdi.emccommand.mode(premode) - self.mdi.emccommand.wait_complete() def index_tool(self,toolnumber): print("set tool number to :T",toolnumber) diff --git a/src/emc/usr_intf/pncconf/build_INI.py b/src/emc/usr_intf/pncconf/build_INI.py index 379978a4cff..b2529e683c6 100644 --- a/src/emc/usr_intf/pncconf/build_INI.py +++ b/src/emc/usr_intf/pncconf/build_INI.py @@ -267,7 +267,6 @@ def write_inifile(self, base): print("%s=%s"%(a,b), file=file) print(file=file) print("[HAL]", file=file) - print("HALUI = halui", file=file) print("HALFILE = %s.hal" % self.d.machinename, file=file) # qtplasmac requires the qtplasmac_comp file to connect the plasmac component if self.d.frontend == _PD._QTPLASMAC: diff --git a/src/emc/usr_intf/pyui/commands.py b/src/emc/usr_intf/pyui/commands.py index 96fabe7c811..521ccd260a1 100644 --- a/src/emc/usr_intf/pyui/commands.py +++ b/src/emc/usr_intf/pyui/commands.py @@ -268,7 +268,6 @@ def incremental_jog(self, wname, cmd): def quill_up(self, wname, cmd): self.emccommand.mode(self.emc.MODE_MANUAL) - self.emccommand.wait_complete() self.mdi('G53 G0 Z %f'% float(cmd)) def feed_hold(self, wname, cmd): @@ -323,7 +322,6 @@ def smart_cycle_start(self, wname, cmd=None): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_AUTO: self.emccommand.mode(self.emc.MODE_AUTO) - self.emccommand.wait_complete() self.emcstat.poll() if self.emcstat.paused: self.emccommand.auto(self.emc.AUTO_STEP) @@ -336,7 +334,6 @@ def smart_cycle_start(self, wname, cmd=None): # This restarts the program at the line specified directly (without cyscle start push) def re_start(self, wname, line): self.emccommand.mode(self.emc.MODE_AUTO) - self.emccommand.wait_complete() self.emccommand.auto(self.emc.AUTO_RUN, line) self.restart_line_number = self.restart_reset_line @@ -377,19 +374,16 @@ def set_manual_mode(self): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MANUAL: self.emccommand.mode(self.emc.MODE_MANUAL) - self.emccommand.wait_complete() def set_mdi_mode(self): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() def set_auto_mode(self): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_AUTO: self.emccommand.mode(self.emc.MODE_AUTO) - self.emccommand.wait_complete() def get_mode(self): self.emcstat.poll() diff --git a/src/emc/usr_intf/shcom.cc b/src/emc/usr_intf/shcom.cc index 0c96ebc5493..18db82fdee2 100644 --- a/src/emc/usr_intf/shcom.cc +++ b/src/emc/usr_intf/shcom.cc @@ -478,30 +478,6 @@ int sendMachineOff() return emcSendCommandAndWait(state_msg); } -int sendManual() -{ - EMC_TASK_SET_MODE mode_msg; - - mode_msg.mode = EMC_TASK_MODE::MANUAL; - return emcSendCommandAndWait(mode_msg); -} - -int sendAuto() -{ - EMC_TASK_SET_MODE mode_msg; - - mode_msg.mode = EMC_TASK_MODE::AUTO; - return emcSendCommandAndWait(mode_msg); -} - -int sendMdi() -{ - EMC_TASK_SET_MODE mode_msg; - - mode_msg.mode = EMC_TASK_MODE::MDI; - return emcSendCommandAndWait(mode_msg); -} - int sendOverrideLimits(int joint) { EMC_JOINT_OVERRIDE_LIMITS lim_msg; @@ -517,7 +493,8 @@ int sendJogStop(int ja, int jjogmode) if ( ( (jjogmode == JOGJOINT) && (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::TELEOP) ) || ( (jjogmode == JOGTELEOP ) - && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) ) + && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) + && !emcStatus->motion.pause_jog_ok ) ) { return -1; } @@ -543,7 +520,8 @@ int sendJogCont(int ja, int jjogmode, double speed) if ( ( (jjogmode == JOGJOINT) && (emcStatus->motion.traj.mode == EMC_TRAJ_MODE::TELEOP) ) || ( (jjogmode == JOGTELEOP ) - && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) ) + && (emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) + && !emcStatus->motion.pause_jog_ok ) ) { return -1; } @@ -571,7 +549,8 @@ int sendJogIncr(int ja, int jjogmode, double speed, double incr) if ( ( (jjogmode == JOGJOINT) && ( emcStatus->motion.traj.mode == EMC_TRAJ_MODE::TELEOP) ) || ( (jjogmode == JOGTELEOP ) - && ( emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) ) + && ( emcStatus->motion.traj.mode != EMC_TRAJ_MODE::TELEOP) + && !emcStatus->motion.pause_jog_ok ) ) { return -1; } diff --git a/src/emc/usr_intf/shcom.hh b/src/emc/usr_intf/shcom.hh index 9a7abd4fda4..a12a3d5f1b1 100644 --- a/src/emc/usr_intf/shcom.hh +++ b/src/emc/usr_intf/shcom.hh @@ -96,9 +96,6 @@ extern int sendEstop(); extern int sendEstopReset(); extern int sendMachineOn(); extern int sendMachineOff(); -extern int sendManual(); -extern int sendAuto(); -extern int sendMdi(); extern int sendOverrideLimits(int jnum); extern int sendJogStop(int jnum, int jjogmode); extern int sendJogCont(int jnum, int jjogmode, double speed); diff --git a/src/emc/usr_intf/stepconf/build_INI.py b/src/emc/usr_intf/stepconf/build_INI.py index 6bf173b3ce8..0bfb550a1cc 100644 --- a/src/emc/usr_intf/stepconf/build_INI.py +++ b/src/emc/usr_intf/stepconf/build_INI.py @@ -212,8 +212,6 @@ def write_inifile(self, base): print(file=file) print("[HAL]", file=file) - if self.d.halui or self.d.select_qtplasmac: - print("HALUI = halui", file=file) print("HALFILE = %s.hal" % self.d.machinename, file=file) # qtplasmac requires custom, custom_postgui and shutdown hal files if self.d.select_qtplasmac: diff --git a/src/emc/usr_intf/touchy/emc_interface.py b/src/emc/usr_intf/touchy/emc_interface.py index 25ba4e8f4e0..7eb79f9ea30 100644 --- a/src/emc/usr_intf/touchy/emc_interface.py +++ b/src/emc/usr_intf/touchy/emc_interface.py @@ -227,7 +227,6 @@ def cycle_start(self): if self.emcstat.interp_state == self.emc.INTERP_IDLE: self.emccommand.mode(self.emc.MODE_AUTO) - self.emccommand.wait_complete() if self.sb: self.emccommand.auto(self.emc.AUTO_STEP) else: diff --git a/src/emc/usr_intf/touchy/mdi.py b/src/emc/usr_intf/touchy/mdi.py index 089c84c2f73..b4083ee0cb4 100644 --- a/src/emc/usr_intf/touchy/mdi.py +++ b/src/emc/usr_intf/touchy/mdi.py @@ -153,7 +153,6 @@ def issue(self): self.emcstat.poll() if self.emcstat.task_mode != self.emc.MODE_MDI: self.emccommand.mode(self.emc.MODE_MDI) - self.emccommand.wait_complete() self.emccommand.mdi(m) diff --git a/src/hal/user_comps/xhc-whb04b-6/example-configuration.hal b/src/hal/user_comps/xhc-whb04b-6/example-configuration.hal index 636908c9a2b..efc1f7982f0 100644 --- a/src/hal/user_comps/xhc-whb04b-6/example-configuration.hal +++ b/src/hal/user_comps/xhc-whb04b-6/example-configuration.hal @@ -55,9 +55,6 @@ net pdnt.program.run whb.halui.program.run net pdnt.program.stop whb.halui.program.stop halui.program.stop # machine mode related signals -net pdnt.mode.auto whb.halui.mode.auto halui.mode.auto -net pdnt.mode.manual whb.halui.mode.manual halui.mode.manual -net pdnt.mode.mdi whb.halui.mode.mdi halui.mode.mdi net pdnt.mode.joint whb.halui.mode.joint halui.mode.joint net pdnt.mode.teleop whb.halui.mode.teleop halui.mode.teleop net pdnt.mode.is-auto halui.mode.is-auto whb.halui.mode.is-auto diff --git a/tests/abort/feed-rate/test.ini b/tests/abort/feed-rate/test.ini index d8acfe5dff9..36b3c1ca150 100644 --- a/tests/abort/feed-rate/test.ini +++ b/tests/abort/feed-rate/test.ini @@ -30,7 +30,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/abort/g64/test.ini b/tests/abort/g64/test.ini index f8dee4fe1ad..051ba44990f 100644 --- a/tests/abort/g64/test.ini +++ b/tests/abort/g64/test.ini @@ -28,7 +28,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal HALFILE = motion-test.hal diff --git a/tests/ccomp/early-exit/test.ini b/tests/ccomp/early-exit/test.ini index 44e664dc5a0..db7340ab5a7 100644 --- a/tests/ccomp/early-exit/test.ini +++ b/tests/ccomp/early-exit/test.ini @@ -28,7 +28,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/halui/client-status/checkresult b/tests/halui/client-status/checkresult new file mode 100755 index 00000000000..73e90a43dfc --- /dev/null +++ b/tests/halui/client-status/checkresult @@ -0,0 +1,2 @@ +#!/bin/sh +exit 0 # test failure is indicated by test.sh exit value diff --git a/tests/halui/client-status/halui.ini b/tests/halui/client-status/halui.ini new file mode 100644 index 00000000000..26f32e13f82 --- /dev/null +++ b/tests/halui/client-status/halui.ini @@ -0,0 +1,96 @@ +[EMC] +VERSION = 1.1 +DEBUG = 0x7fffffff +RCS_DEBUG = 0x05400f01 + +[DISPLAY] +DISPLAY = ./test-ui.py + +[RS274NGC] +PARAMETER_FILE = sim.var +USER_M_PATH = ./subs + +[EMCMOT] +EMCMOT = motmod +COMM_TIMEOUT = 4.0 +BASE_PERIOD = 0 +SERVO_PERIOD = 1000000 + +[TASK] +TASK = milltask +CYCLE_TIME = 0.001 +MDI_QUEUED_COMMANDS=10000 + +[HAL] +HALFILE = LIB:core_sim.hal + +[TRAJ] +NO_FORCE_HOMING=1 +AXES = 3 +COORDINATES = X Y Z +HOME = 0 0 0 +LINEAR_UNITS = inch +ANGULAR_UNITS = degree +DEFAULT_LINEAR_VELOCITY = 1.2 +MAX_LINEAR_VELOCITY = 4 + +[KINS] +KINEMATICS = trivkins +JOINTS = 3 + +[AXIS_X] +MIN_LIMIT = -40.0 +MAX_LIMIT = 40.0 +MAX_VELOCITY = 4 +MAX_ACCELERATION = 1000.0 + +[JOINT_0] +TYPE = LINEAR +HOME = 0.000 +MAX_VELOCITY = 4 +MAX_ACCELERATION = 1000.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_Y] +MIN_LIMIT = -40.0 +MAX_LIMIT = 40.0 +MAX_VELOCITY = 4 +MAX_ACCELERATION = 1000.0 + +[JOINT_1] +TYPE = LINEAR +HOME = 0.000 +MAX_VELOCITY = 4 +MAX_ACCELERATION = 1000.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_Z] +MIN_LIMIT = -4.0 +MAX_LIMIT = 4.0 +MAX_VELOCITY = 4 +MAX_ACCELERATION = 1000.0 + +[JOINT_2] +TYPE = LINEAR +HOME = 0.0 +MAX_VELOCITY = 4 +MAX_ACCELERATION = 1000.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/halui/client-status/test-ui.py b/tests/halui/client-status/test-ui.py new file mode 100755 index 00000000000..fdecbf8cae2 --- /dev/null +++ b/tests/halui/client-status/test-ui.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +# halui inside task and an NML client side by side: +# - halui.max-velocity is limited by [TRAJ]MAX_LINEAR_VELOCITY, not 1; +# - a halui command that task refuses does not turn the status of the +# client's own command into ERROR, and a halui command does not clear +# the ERROR of a client command that failed. + +import os +import sys +import time + +import hal +import linuxcnc + +c = linuxcnc.command() +s = linuxcnc.stat() +e = linuxcnc.error_channel() +h = hal.component("test-ui") +h.newpin("home", hal.Type.BOOL, hal.Dir.OUT) +h.newpin("mv-counts", hal.Type.SINT, hal.Dir.OUT) +h.ready() +os.system("halcmd net home test-ui.home halui.joint.0.home") +os.system("halcmd net mv-counts test-ui.mv-counts halui.max-velocity.counts") +os.system("halcmd setp halui.max-velocity.count-enable 1") +os.system("halcmd setp halui.max-velocity.scale 0.01") +os.system("halcmd setp halui.max-velocity.direct-value 1") + +fails = 0 + + +def check(name, ok, detail=''): + global fails + print('%s: %s %s' % ('ok' if ok else 'FAIL', name, detail), flush=True) + if not ok: + fails += 1 + + +def wait(fn, timeout=5.0): + end = time.time() + timeout + while time.time() < end: + s.poll() + if fn(): + return True + time.sleep(0.01) + s.poll() + return fn() + + +def errors(): + msgs = [] + while True: + m = e.poll() + if not m: + return msgs + msgs.append(m[1]) + + +def settle(): + # give task a few cycles to dispatch a halui command + time.sleep(0.2) + + +wait(lambda: s.task_state != 0, 10) +c.state(linuxcnc.STATE_ESTOP_RESET) +c.state(linuxcnc.STATE_ON) +check('machine on', c.wait_complete() == linuxcnc.RCS_DONE) + +# --- max velocity above 1 unit/s through the counts pins +h['mv-counts'] = 250 +check('max-velocity counts 250 gives 2.5', wait(lambda: abs(s.max_velocity - 2.5) < 1e-9), s.max_velocity) +h['mv-counts'] = 1000 +check('max-velocity capped at MAX_LINEAR_VELOCITY', wait(lambda: abs(s.max_velocity - 4) < 1e-9), s.max_velocity) +errors() + +# --- a refused halui command leaves the client's DONE alone +c.state(linuxcnc.STATE_OFF) +check('machine off', c.wait_complete() == linuxcnc.RCS_DONE) +h['home'] = 1 +settle() +h['home'] = 0 +msgs = errors() +check('halui home refused while off', msgs != [], msgs) +check('client command still DONE after the refused halui command', + c.wait_complete() == linuxcnc.RCS_DONE) +s.poll() +check('status not ERROR', s.state != linuxcnc.RCS_ERROR, s.state) + +# --- a halui command leaves the client's ERROR alone +c.home(0) +check('client home refused while off', c.wait_complete() == linuxcnc.RCS_ERROR) +errors() +h['mv-counts'] = 150 +check('halui max-velocity applied', wait(lambda: abs(s.max_velocity - 1.5) < 1e-9), s.max_velocity) +check('client command still ERROR after a halui command', + c.wait_complete() == linuxcnc.RCS_ERROR) + +errors() +print('%d failures' % fails, flush=True) +os._exit(1 if fails else 0) diff --git a/tests/halui/client-status/test.sh b/tests/halui/client-status/test.sh new file mode 100755 index 00000000000..2d0bb0375f1 --- /dev/null +++ b/tests/halui/client-status/test.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +exec linuxcnc -r halui.ini + diff --git a/tests/halui/jogging/halui.ini b/tests/halui/jogging/halui.ini index 4fcd2b2b88f..acc1e1a6f94 100644 --- a/tests/halui/jogging/halui.ini +++ b/tests/halui/jogging/halui.ini @@ -22,7 +22,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/halui/mdi/halui.ini b/tests/halui/mdi/halui.ini index 052cd84a331..b55b8215f1b 100644 --- a/tests/halui/mdi/halui.ini +++ b/tests/halui/mdi/halui.ini @@ -22,7 +22,6 @@ CYCLE_TIME = 0.001 MDI_QUEUED_COMMANDS=10000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/halui/mdi/test-ui.py b/tests/halui/mdi/test-ui.py index 296db4b1d62..a096dd71c2f 100755 --- a/tests/halui/mdi/test-ui.py +++ b/tests/halui/mdi/test-ui.py @@ -115,61 +115,40 @@ def wait_for_halui_mode(pin_name): # wrong. # -log("setting mode to Manual") +# The task mode cannot be set: halui's MDI commands run from whatever mode +# a UI asked for, and task is back in Manual (idle) when they finish. +# c.mode() only sets this process's view (what s.task_mode reports while +# task is idle), so task's own mode is read from the halui pins. + +def mdi_then_manual(n, x, y, z): + log("running MDI command %d" % n) + h['mdi-%d' % n] = 1 + wait_for_joint_to_stop_at(0, x); + wait_for_joint_to_stop_at(1, y); + wait_for_joint_to_stop_at(2, z); + h['mdi-%d' % n] = 0 + wait_for_halui_mode('is-manual') + +log("asking for Manual mode") c.mode(linuxcnc.MODE_MANUAL) wait_for_halui_mode('is-manual') -log("running MDI command 0") -h['mdi-0'] = 1 -wait_for_joint_to_stop_at(0, -1); -wait_for_joint_to_stop_at(1, 0); -wait_for_joint_to_stop_at(2, 0); -h['mdi-0'] = 0 -wait_for_task_mode(linuxcnc.MODE_MANUAL) -wait_for_halui_mode('is-manual') +mdi_then_manual(0, -1, 0, 0) -log("setting mode to Auto") +log("asking for Auto mode, which only sets this process's view") c.mode(linuxcnc.MODE_AUTO) -wait_for_halui_mode('is-auto') -log("running MDI command 1") -h['mdi-1'] = 1 -wait_for_joint_to_stop_at(0, 1); -wait_for_joint_to_stop_at(1, 0); -wait_for_joint_to_stop_at(2, 0); -h['mdi-1'] = 0 +c.wait_complete() wait_for_task_mode(linuxcnc.MODE_AUTO) -wait_for_halui_mode('is-auto') +wait_for_halui_mode('is-manual') +mdi_then_manual(1, 1, 0, 0) -log("setting mode to MDI") +log("asking for MDI mode, which only sets this process's view") c.mode(linuxcnc.MODE_MDI) -wait_for_halui_mode('is-mdi') -log("running MDI command 2") -h['mdi-2'] = 1 -wait_for_joint_to_stop_at(0, 1); -wait_for_joint_to_stop_at(1, 2); -wait_for_joint_to_stop_at(2, 0); -h['mdi-2'] = 0 -s.poll() -wait_for_task_mode(linuxcnc.MODE_MDI) -wait_for_halui_mode('is-mdi') - -log("running MDI command 3") -h['mdi-3'] = 1 -wait_for_joint_to_stop_at(0, 1); -wait_for_joint_to_stop_at(1, 2); -wait_for_joint_to_stop_at(2, 3); -h['mdi-3'] = 0 -wait_for_task_mode(linuxcnc.MODE_MDI) -wait_for_halui_mode('is-mdi') - -log("running MDI command 0") -h['mdi-0'] = 1 -wait_for_joint_to_stop_at(0, -1); -wait_for_joint_to_stop_at(1, 0); -wait_for_joint_to_stop_at(2, 0); -h['mdi-0'] = 0 +c.wait_complete() wait_for_task_mode(linuxcnc.MODE_MDI) -wait_for_halui_mode('is-mdi') +wait_for_halui_mode('is-manual') +mdi_then_manual(2, 1, 2, 0) +mdi_then_manual(3, 1, 2, 3) +mdi_then_manual(0, -1, 0, 0) sys.exit(0) - diff --git a/tests/interp/g28.2/flush-order/test.ini b/tests/interp/g28.2/flush-order/test.ini index 38b6a739acb..8edb313dd14 100644 --- a/tests/interp/g28.2/flush-order/test.ini +++ b/tests/interp/g28.2/flush-order/test.ini @@ -19,7 +19,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal [TRAJ] diff --git a/tests/interp/g28.2/home-all-sequence/test.ini b/tests/interp/g28.2/home-all-sequence/test.ini index b55ba992d9b..2cb34a6e528 100644 --- a/tests/interp/g28.2/home-all-sequence/test.ini +++ b/tests/interp/g28.2/home-all-sequence/test.ini @@ -19,7 +19,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal [TRAJ] diff --git a/tests/interp/g28.2/immediate-mode-guard/test.ini b/tests/interp/g28.2/immediate-mode-guard/test.ini index eb1ecd04ca9..95e2516ac87 100644 --- a/tests/interp/g28.2/immediate-mode-guard/test.ini +++ b/tests/interp/g28.2/immediate-mode-guard/test.ini @@ -19,7 +19,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal [TRAJ] diff --git a/tests/interp/g28.2/invalid-pword/test-ui.py b/tests/interp/g28.2/invalid-pword/test-ui.py index 4237a215b8c..de646780e44 100755 --- a/tests/interp/g28.2/invalid-pword/test-ui.py +++ b/tests/interp/g28.2/invalid-pword/test-ui.py @@ -59,10 +59,13 @@ def near(a, b, tol=0.001): def wait_idle(timeout=10.0): + # Task is idle once the interpreter is and motion has left the + # coordinated mode of the run for the joint or world mode it had before. t0 = time.time() while time.time() - t0 < timeout: poll() - if s.interp_state == linuxcnc.INTERP_IDLE: + if (s.interp_state == linuxcnc.INTERP_IDLE + and s.motion_mode != linuxcnc.TRAJ_MODE_COORD): return True time.sleep(0.01) return False @@ -101,7 +104,7 @@ def mode_name(m): if not wait_homed([1, 1, 1]): fail("initial home-all did not home all joints: {}".format(list(s.homed[:3]))) -# Establish a coordinated mode worth preserving. +# Establish a mode worth preserving: the one motion goes back to after a run. c.mode(linuxcnc.MODE_MDI) c.mdi("G0 X1") if not wait_idle(): diff --git a/tests/interp/g28.2/invalid-pword/test.ini b/tests/interp/g28.2/invalid-pword/test.ini index c0b3db5b31a..d3b47c68490 100644 --- a/tests/interp/g28.2/invalid-pword/test.ini +++ b/tests/interp/g28.2/invalid-pword/test.ini @@ -19,7 +19,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal [TRAJ] diff --git a/tests/interp/g28.2/position-model/test.ini b/tests/interp/g28.2/position-model/test.ini index c725f5bf718..1f63941b0ab 100644 --- a/tests/interp/g28.2/position-model/test.ini +++ b/tests/interp/g28.2/position-model/test.ini @@ -19,7 +19,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal HALFILE = sim_extra.hal diff --git a/tests/interp/g28.2/sequencing/test.ini b/tests/interp/g28.2/sequencing/test.ini index eb1ecd04ca9..95e2516ac87 100644 --- a/tests/interp/g28.2/sequencing/test.ini +++ b/tests/interp/g28.2/sequencing/test.ini @@ -19,7 +19,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal [TRAJ] diff --git a/tests/interp/m98m99/12-M99-endless-main-program/expected.motion-logger b/tests/interp/m98m99/12-M99-endless-main-program/expected.motion-logger index aebc5e1e183..252da1de385 100644 --- a/tests/interp/m98m99/12-M99-endless-main-program/expected.motion-logger +++ b/tests/interp/m98m99/12-M99-endless-main-program/expected.motion-logger @@ -4,6 +4,7 @@ SET_VEL vel=0, ini_maxvel=1.2 SET_VEL_LIMIT vel=4 SET_ACC acc=1e+99 SET_JERK jerk=1e+09 +SET_PAUSE_RETURN_LAST mask=0x4 SET_PLANNER_TYPE planner_type=0 SET_SCURVE_PEAK_SCALE scale=1 SETUP_ARC_BLENDS @@ -197,23 +198,6 @@ SPINDLE_OFF SS_ENABLE ENABLE COORD -JOG_ABORT joint=0 -JOG_ABORT joint=1 -JOG_ABORT joint=2 -JOG_ABORT joint=3 -JOG_ABORT joint=4 -JOG_ABORT joint=5 -JOG_ABORT joint=6 -JOG_ABORT joint=7 -JOG_ABORT joint=8 -JOG_ABORT joint=9 -JOG_ABORT joint=10 -JOG_ABORT joint=11 -JOG_ABORT joint=12 -JOG_ABORT joint=13 -JOG_ABORT joint=14 -JOG_ABORT joint=15 -ABORT SET_LINE x=1, y=0, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=19, motion_type=2, vel=0.666667, ini_maxvel=4, acc=1000, turn=-1 SET_LINE x=1, y=-4, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=26, motion_type=2, vel=0.666667, ini_maxvel=4, acc=1000, turn=-1 SET_LINE x=5, y=-4, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=21, motion_type=2, vel=0.666667, ini_maxvel=4, acc=1000, turn=-1 @@ -225,4 +209,5 @@ SET_LINE x=1, y=-4, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=26, motion_type=2, vel SET_LINE x=5, y=-4, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=21, motion_type=2, vel=0.666667, ini_maxvel=4, acc=1000, turn=-1 SET_SPINDLESYNC sync=0.000000, flags=0x00000000 SPINDLE_OFF +FREE DISABLE diff --git a/tests/interp/mdi-oword-m66/interp.ini b/tests/interp/mdi-oword-m66/interp.ini index f6eaa099929..ff1128df8d5 100644 --- a/tests/interp/mdi-oword-m66/interp.ini +++ b/tests/interp/mdi-oword-m66/interp.ini @@ -23,7 +23,6 @@ CYCLE_TIME = 0.001 MDI_QUEUED_COMMANDS=10000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/interp/oword-mdi-sub-update/interp.ini b/tests/interp/oword-mdi-sub-update/interp.ini index 0774aa13db5..50f99de9258 100644 --- a/tests/interp/oword-mdi-sub-update/interp.ini +++ b/tests/interp/oword-mdi-sub-update/interp.ini @@ -22,7 +22,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/interp/subroutine-return/interp.ini b/tests/interp/subroutine-return/interp.ini index 18c4e6cb673..3ad89829196 100644 --- a/tests/interp/subroutine-return/interp.ini +++ b/tests/interp/subroutine-return/interp.ini @@ -23,7 +23,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/interp_initcode/expected b/tests/interp_initcode/expected index c93f6946634..86cd5cf0511 100644 --- a/tests/interp_initcode/expected +++ b/tests/interp_initcode/expected @@ -1,5 +1,5 @@ startup gcodes (0, 800, -1, 170, 400, 200, 900, 940, 540, 430, 990, 640, -1, 970, 911, 80, -1) -set_g5x_offset (1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) +set_g5x_offset (2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) set_g92_offset (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) set_xy_rotation (0.0,) # interpreter: feed mode set to units per minute @@ -7,9 +7,7 @@ set feed rate 0.0 set plane 1 # interpreter: cutter radius compensation off tool_offset (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) -set_g5x_offset (2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) -set_g92_offset (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) -set_xy_rotation (0.0,) +# interpreter: continuing to use same coordinate system # interpreter: retract mode set to r_plane straight_traverse (1.23, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) set feed rate 100.0 diff --git a/tests/interp_initcode/test.ini b/tests/interp_initcode/test.ini index d183d9276b9..7e37f25610b 100644 --- a/tests/interp_initcode/test.ini +++ b/tests/interp_initcode/test.ini @@ -29,7 +29,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal HALFILE = LIB:simulated_home.hal HALFILE = LIB:lathe.hal diff --git a/tests/jog-while-paused/.gitignore b/tests/jog-while-paused/.gitignore new file mode 100644 index 00000000000..57585c75340 --- /dev/null +++ b/tests/jog-while-paused/.gitignore @@ -0,0 +1,2 @@ +sim.var +sim.var.bak diff --git a/tests/jog-while-paused/checkresult b/tests/jog-while-paused/checkresult new file mode 100755 index 00000000000..24dc9aa53e3 --- /dev/null +++ b/tests/jog-while-paused/checkresult @@ -0,0 +1,2 @@ +#!/bin/sh +exit 0 # test failure is indicated by test.sh exit value diff --git a/tests/jog-while-paused/m0.ngc b/tests/jog-while-paused/m0.ngc new file mode 100644 index 00000000000..f0a1bac706e --- /dev/null +++ b/tests/jog-while-paused/m0.ngc @@ -0,0 +1,5 @@ +G21 G90 G17 +G1 F1200 X10 +M0 +G1 X0 +M2 diff --git a/tests/jog-while-paused/program.ngc b/tests/jog-while-paused/program.ngc new file mode 100644 index 00000000000..ba981850341 --- /dev/null +++ b/tests/jog-while-paused/program.ngc @@ -0,0 +1,9 @@ +G21 G90 G17 +S1000 M3 +M8 +G1 F600 X20 +G1 Y20 +G1 X0 +G1 Y0 +M5 M9 +M2 diff --git a/tests/jog-while-paused/sim.hal b/tests/jog-while-paused/sim.hal new file mode 100644 index 00000000000..5779ccc98f6 --- /dev/null +++ b/tests/jog-while-paused/sim.hal @@ -0,0 +1,16 @@ +loadrt [KINS]KINEMATICS +loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS +addf motion-command-handler servo-thread +addf motion-controller servo-thread + +net Xpos joint.0.motor-pos-cmd => joint.0.motor-pos-fb +net Ypos joint.1.motor-pos-cmd => joint.1.motor-pos-fb +net Zpos joint.2.motor-pos-cmd => joint.2.motor-pos-fb + +net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in +net tool-prepare-loop iocontrol.0.tool-prepare iocontrol.0.tool-prepared +net tool-change-loop iocontrol.0.tool-change iocontrol.0.tool-changed + +# a wheel on Y: one count is 0.01 +setp axis.y.jog-scale 0.01 +setp axis.y.jog-vel-mode 0 diff --git a/tests/jog-while-paused/test-ui.py b/tests/jog-while-paused/test-ui.py new file mode 100755 index 00000000000..545527f7d5e --- /dev/null +++ b/tests/jog-while-paused/test-ui.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 +# Jogs while a program is paused: axes move off the paused position, and +# resume brings them back (the other axes first, then Z) with the spindle +# and coolant as they were, before the program goes on. + +import math +import os +import sys +import time + +import hal +import linuxcnc + +c = linuxcnc.command() +s = linuxcnc.stat() +e = linuxcnc.error_channel() +h = hal.component("test-ui") +h.ready() + +fails = 0 + + +def check(name, ok, detail=''): + global fails + print('%s: %s %s' % ('ok' if ok else 'FAIL', name, detail), flush=True) + if not ok: + fails += 1 + + +def wait(fn, timeout=5.0): + end = time.time() + timeout + while time.time() < end: + s.poll() + if fn(): + return True + time.sleep(0.005) + s.poll() + return fn() + + +def errors(): + msgs = [] + while True: + m = e.poll() + if not m: + return msgs + msgs.append(m[1]) + + +def pos(): + return s.actual_position[:3] + + +def near(a, b, tol=1e-6): + return all(abs(x - y) <= tol for x, y in zip(a, b)) + + +def idle(): + return s.interp_state == linuxcnc.INTERP_IDLE and s.queue == 0 and hal.get_value('halui.mode.is-manual') + + +def run_and_pause(prog, at_x): + c.program_open(os.path.abspath(prog)) + c.wait_complete() + c.auto(linuxcnc.AUTO_RUN, 0) + if not wait(lambda: s.actual_position[0] >= at_x, 10): + check('program reached X%g' % at_x, False, pos()) + c.auto(linuxcnc.AUTO_PAUSE) + c.wait_complete() + return wait(lambda: s.pause_jog_ok, 2) + + +wait(lambda: s.task_state != 0, 10) +c.state(linuxcnc.STATE_ESTOP_RESET) +c.state(linuxcnc.STATE_ON) +c.home(-1) +c.wait_complete() +wait(lambda: all(s.homed[:3]), 10) +c.teleop_enable(1) +c.wait_complete() +c.mdi('G0 X0 Y0 Z0') +wait(idle) +errors() + +# --- pause in the middle of a G1, jog three axes three ways +check('paused and ready to jog', run_and_pause('program.ngc', 5.0)) +p = pos() +print('paused at', p, flush=True) +check('spindle and flood on at the pause', s.spindle[0]['direction'] == 1 and s.flood, (s.spindle[0]['direction'], s.flood)) + +c.jog(linuxcnc.JOG_INCREMENT, False, 2, 20, 5.0) # Z +5 +check('incremental Z jog', wait(lambda: near(pos(), (p[0], p[1], p[2] + 5))), pos()) +c.jog(linuxcnc.JOG_CONTINUOUS, False, 0, 10) # X +, 10 mm/s +time.sleep(0.3) +c.jog(linuxcnc.JOG_STOP, False, 0) +check('continuous X jog stopped', wait(lambda: s.current_vel == 0 and not s.motion.jogging_active + if hasattr(s, 'motion') else not hal.get_value('motion.jog-is-active')), pos()) +dx = pos()[0] - p[0] +check('continuous X jog moved', 1.0 < dx < 5.0, dx) +hal.set_p('axis.y.jog-enable', '1') +hal.set_p('axis.y.jog-counts', '200') # Y +2 +check('wheel Y jog', wait(lambda: near(pos(), (p[0] + dx, p[1] + 2, p[2] + 5))), pos()) +s.poll() +check('pause offset reported', near(s.pause_offset[:3], (dx, 2, 5)), s.pause_offset[:3]) +check('still paused', s.paused and s.interp_state == linuxcnc.INTERP_PAUSED) +check('no errors from the jogs', not errors()) + +# --- joint jogs and reverse run are refused while jogged away +c.jog(linuxcnc.JOG_INCREMENT, True, 0, 10, 1) +c.wait_complete() +time.sleep(0.1) +msgs = errors() +check('joint jog refused while paused', any('jog a joint' in m for m in msgs), msgs) +c.auto(linuxcnc.AUTO_REVERSE) +c.wait_complete() +time.sleep(0.1) +msgs = errors() +check('reverse refused while jogged away', any('reverse' in m for m in msgs), msgs) + +# --- the operator stops spindle and coolant; resume puts them back and +# waits for the spindle to be at speed before moving +c.spindle(linuxcnc.SPINDLE_OFF) +c.flood(linuxcnc.FLOOD_OFF) +c.wait_complete() +check('spindle and flood off', wait(lambda: s.spindle[0]['direction'] == 0 and not s.flood)) +hal.set_p('spindle.0.at-speed', '0') +off = pos() +c.auto(linuxcnc.AUTO_RESUME) +c.wait_complete() +check('resume restores the spindle', wait(lambda: s.spindle[0]['direction'] == 1 and s.spindle[0]['speed'] == 1000, 1), s.spindle[0]['speed']) +check('resume restores the flood', wait(lambda: s.flood, 1)) +check('returning', wait(lambda: s.pause_returning, 1)) +time.sleep(0.5) +s.poll() +check('no move until the spindle is at speed', near(pos(), off), (pos(), off)) + +# --- at speed: XY back in a straight line with Z up, then Z down, then on. +# The commanded offsets (pause_offset) show the path; actual_position lags +# them by the joint interpolation. +offsets = [] +hal.set_p('spindle.0.at-speed', '1') +end = time.time() + 5 +while time.time() < end: + s.poll() + offsets.append(s.pause_offset[:3]) + if not s.pause_returning: + break + time.sleep(0.002) +s.poll() +check('back at the paused position: offsets exactly zero', offsets and offsets[-1] == (0.0, 0.0, 0.0), offsets[-1:]) +z_early = [o for o in offsets if abs(o[2] - 5) > 1e-6 and (abs(o[0]) > 0 or abs(o[1]) > 0)] +check('Z stays up until XY are back', not z_early, z_early[:3]) +off_line = [o for o in offsets if abs(o[0] * 2 - o[1] * dx) > 1e-6] +check('XY return is a straight line', not off_line, off_line[:3]) +xy_on_way = [o for o in offsets if 0.1 < o[0] < dx - 0.1] +check('XY move back, no jump', len(xy_on_way) > 10, len(xy_on_way)) +z_on_way = [o for o in offsets if 0.1 < o[2] < 4.9] +check('Z moves back, no jump', len(z_on_way) > 10, len(z_on_way)) +check('program finished at the end point', wait(lambda: idle(), 20), pos()) +check('program end position', near(pos()[:2], (0, 0), 1e-6), pos()) +check('no errors from the resume', not errors()) + +# --- abort while jogged away: no jump, stay there +check('paused again', run_and_pause('program.ngc', 5.0)) +p = pos() +c.jog(linuxcnc.JOG_INCREMENT, False, 2, 20, 3.0) +check('Z jog before abort', wait(lambda: near(pos(), (p[0], p[1], p[2] + 3))), pos()) +c.abort() +c.wait_complete() +check('idle after abort', wait(idle)) +time.sleep(0.2) +s.poll() +check('abort keeps the jogged position', near(pos(), (p[0], p[1], p[2] + 3)), pos()) +check('pause offset gone after abort', near(s.pause_offset[:3], (0, 0, 0), 0), s.pause_offset[:3]) +c.mdi('G0 X1') +check('MDI after the abort', wait(lambda: idle() and near(pos(), (1, p[1], p[2] + 3))), pos()) +errors() + +# --- soft limits hold during a jog while paused (X max is 30) +check('paused for the limit test', run_and_pause('program.ngc', 5.0)) +c.jog(linuxcnc.JOG_CONTINUOUS, False, 0, 40) +time.sleep(1.5) +s.poll() +check('X stops at its soft limit', s.actual_position[0] <= 30 + 1e-9 and s.actual_position[0] > 29, s.actual_position[0]) +c.jog(linuxcnc.JOG_STOP, False, 0) +c.abort() +c.wait_complete() +wait(idle) +c.mdi('G0 X0 Y0 Z0') +wait(idle) +errors() + +# --- step with an offset returns first, then steps +check('paused for the step test', run_and_pause('program.ngc', 5.0)) +p = pos() +c.jog(linuxcnc.JOG_INCREMENT, False, 1, 20, 4.0) +wait(lambda: near(pos(), (p[0], p[1] + 4, p[2]))) +c.auto(linuxcnc.AUTO_STEP) +c.wait_complete() +check('step brings the offset back', wait(lambda: near(s.pause_offset[:3], (0, 0, 0), 0), 5), s.pause_offset[:3]) +check('step moved on along the program', wait(lambda: s.actual_position[0] > p[0] + 1e-3 or s.actual_position[1] > p[1] + 1e-3, 5), pos()) +c.abort() +c.wait_complete() +wait(idle) +c.mdi('G0 X0 Y0 Z0') +wait(idle) +errors() + +# --- an M0 stop is a pause too +c.program_open(os.path.abspath('m0.ngc')) +c.wait_complete() +c.auto(linuxcnc.AUTO_RUN, 0) +check('stopped at M0', wait(lambda: s.paused and s.pause_jog_ok, 10), pos()) +p = pos() +c.jog(linuxcnc.JOG_INCREMENT, False, 2, 20, 2.0) +wait(lambda: near(pos(), (p[0], p[1], p[2] + 2))) +c.auto(linuxcnc.AUTO_RESUME) +c.wait_complete() +check('M0: back and finished', wait(lambda: idle() and near(pos(), (0, p[1], p[2])), 10), pos()) + +msgs = errors() +check('no unexpected errors', not msgs, msgs) + +c.state(linuxcnc.STATE_OFF) +c.wait_complete() +print('%d failures' % fails, flush=True) +os._exit(1 if fails else 0) diff --git a/tests/jog-while-paused/test.ini b/tests/jog-while-paused/test.ini new file mode 100644 index 00000000000..26aa8e03958 --- /dev/null +++ b/tests/jog-while-paused/test.ini @@ -0,0 +1,82 @@ +[EMC] +VERSION = 1.1 +DEBUG = 0 + +[DISPLAY] +DISPLAY = ./test-ui.py + +[RS274NGC] +PARAMETER_FILE = sim.var + +[EMCMOT] +EMCMOT = motmod +COMM_TIMEOUT = 4.0 +SERVO_PERIOD = 1000000 + +[TASK] +TASK = milltask +CYCLE_TIME = 0.001 + +[HAL] +HALFILE = sim.hal + +[TRAJ] +COORDINATES = X Y Z +LINEAR_UNITS = mm +ANGULAR_UNITS = degree +MAX_LINEAR_VELOCITY = 40 + +[EMCIO] +TOOL_TABLE = tool.tbl + +[KINS] +KINEMATICS = trivkins +JOINTS = 3 + +[AXIS_X] +MIN_LIMIT = -100.0 +MAX_LIMIT = 30.0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 + +[JOINT_0] +TYPE = LINEAR +HOME_SEQUENCE = 0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 +MIN_LIMIT = -100.0 +MAX_LIMIT = 30.0 +FERROR = 1 +MIN_FERROR = 1 + +[AXIS_Y] +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 + +[JOINT_1] +TYPE = LINEAR +HOME_SEQUENCE = 0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +FERROR = 1 +MIN_FERROR = 1 + +[AXIS_Z] +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 + +[JOINT_2] +TYPE = LINEAR +HOME_SEQUENCE = 0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +FERROR = 1 +MIN_FERROR = 1 diff --git a/tests/jog-while-paused/test.sh b/tests/jog-while-paused/test.sh new file mode 100755 index 00000000000..972cf4ffcb8 --- /dev/null +++ b/tests/jog-while-paused/test.sh @@ -0,0 +1,3 @@ +#!/bin/bash +rm -f sim.var +linuxcnc -r test.ini diff --git a/tests/jog-while-paused/tool.tbl b/tests/jog-while-paused/tool.tbl new file mode 100644 index 00000000000..aee1343f663 --- /dev/null +++ b/tests/jog-while-paused/tool.tbl @@ -0,0 +1 @@ +T1 P1 Z0.5 ;tool 1 diff --git a/tests/linuxcncrsh/expected-telnet-output b/tests/linuxcncrsh/expected-telnet-output index 935b42dc147..f2ab9f7f09b 100644 --- a/tests/linuxcncrsh/expected-telnet-output +++ b/tests/linuxcncrsh/expected-telnet-output @@ -55,7 +55,7 @@ PROBE_VALUE 0 SET PROBE_CLEAR ACK ERROR OK SET PROBE NAK -ERROR Must be in MDI mode to issue MDI command +ERROR Cannot probe with zero feed rate SET PROBE_CLEAR ACK ERROR OK MODE MANUAL @@ -445,7 +445,7 @@ PROGRAM_UNITS INCH REL_ACT_POS 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 REL_CMD_POS 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 WAIT_MODE DONE -TELEOP_ENABLE OFF +TELEOP_ENABLE ON TIMEOUT 0.000000 TOOL 0 TOOL_OFFSET 0.000000 @@ -485,14 +485,14 @@ SET OPTIONAL_STOP ACK OPTIONAL_STOP ON ERROR OK OVERRIDE_LIMITS OFF -SET OVERRIDE_LIMITS NAK +SET OVERRIDE_LIMITS ACK OVERRIDE_LIMITS OFF -ERROR can't do that (EMC_JOINT_OVERRIDE_LIMITS:129) in MDI mode +ERROR OK SET STEP NAK -ERROR can't do that (EMC_TASK_PLAN_STEP:511) in MDI mode +ERROR Can't run a program: no program is open SET TASK_PLAN_INIT ACK ERROR OK -TELEOP_ENABLE OFF +TELEOP_ENABLE ON SET TELEOP_ENABLE ACK TELEOP_ENABLE OFF ERROR OK diff --git a/tests/linuxcncrsh/test.sh b/tests/linuxcncrsh/test.sh index bd4cc09c083..9a18fa57dea 100755 --- a/tests/linuxcncrsh/test.sh +++ b/tests/linuxcncrsh/test.sh @@ -91,7 +91,7 @@ function testSetOnly() { testSet estop off testSet machine on - # test if probing in manual mode fails + # probing with the manual view still runs it (as MDI); zero feed fails testSet mode manual echo get pos_offset echo get probe_tripped @@ -244,9 +244,9 @@ function testSetOnly() { testSet angular_unit_conversion deg # testSet feed_override 100 # testSet flood on # - testSetOnly jog 0 1 # - testSetOnly jog_incr 0 1 1 # - testSetOnly jog_stop 0 # + testSetOnly jog x 1 # ; world mode after MDI + testSetOnly jog_incr x 1 1 # + testSetOnly jog_stop x # testSet linear_unit_conversion mm # testSet mist on # testSet optional_stop 1 # @@ -256,12 +256,10 @@ function testSetOnly() { #testSet Open #testSet run - # Testing set override_limits results in command line message: - # can't do that (EMC_JOINT_OVERRIDE_LIMITS:129) in MDI mode testSet override_limits off # # Testing step results in a command line message: - # can't do that (EMC_TASK_PLAN_STEP:511) in MDI mode + # Can't run a program: no program is open testSetOnly step testSetOnly task_plan_init diff --git a/tests/matrixkins/test.ini b/tests/matrixkins/test.ini index 662138a46a7..98be460a21b 100644 --- a/tests/matrixkins/test.ini +++ b/tests/matrixkins/test.ini @@ -27,7 +27,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/maxkins/test.ini b/tests/maxkins/test.ini index 7cf23c05738..8b28d176c3c 100644 --- a/tests/maxkins/test.ini +++ b/tests/maxkins/test.ini @@ -30,7 +30,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/mdi-queue-length/test.ini b/tests/mdi-queue-length/test.ini index c3c867680f3..fbda0260e13 100644 --- a/tests/mdi-queue-length/test.ini +++ b/tests/mdi-queue-length/test.ini @@ -21,7 +21,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [TRAJ] diff --git a/tests/mdi-while-queuebuster-waitflag/test.ini b/tests/mdi-while-queuebuster-waitflag/test.ini index 574763d8bee..32816c58090 100644 --- a/tests/mdi-while-queuebuster-waitflag/test.ini +++ b/tests/mdi-while-queuebuster-waitflag/test.ini @@ -22,7 +22,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [TRAJ] diff --git a/tests/motion-logger/basic/expected.builtin-startup.in b/tests/motion-logger/basic/expected.builtin-startup.in index 2296018b31c..0818431c052 100644 --- a/tests/motion-logger/basic/expected.builtin-startup.in +++ b/tests/motion-logger/basic/expected.builtin-startup.in @@ -4,6 +4,7 @@ SET_VEL vel=0, ini_maxvel=1.2 SET_VEL_LIMIT vel=4 SET_ACC acc=1e+99 SET_JERK jerk=1e+09 +SET_PAUSE_RETURN_LAST mask=0x4 SET_PLANNER_TYPE planner_type=0 SET_SCURVE_PEAK_SCALE scale=1 SETUP_ARC_BLENDS @@ -204,25 +205,6 @@ SS_ENABLE ENABLE # -# The test UI finally switches mode to Auto, which switches Motion to Coord -# and aborts. +# The test UI then asks for Auto mode. That sets only the test UI's own +# view; nothing goes to Task or Motion. # - -COORD -JOG_ABORT joint=0 -JOG_ABORT joint=1 -JOG_ABORT joint=2 -JOG_ABORT joint=3 -JOG_ABORT joint=4 -JOG_ABORT joint=5 -JOG_ABORT joint=6 -JOG_ABORT joint=7 -JOG_ABORT joint=8 -JOG_ABORT joint=9 -JOG_ABORT joint=10 -JOG_ABORT joint=11 -JOG_ABORT joint=12 -JOG_ABORT joint=13 -JOG_ABORT joint=14 -JOG_ABORT joint=15 -ABORT diff --git a/tests/motion-logger/basic/expected.g0 b/tests/motion-logger/basic/expected.g0 index aad80163311..cc271eebade 100644 --- a/tests/motion-logger/basic/expected.g0 +++ b/tests/motion-logger/basic/expected.g0 @@ -1,4 +1,6 @@ +COORD SET_LINE x=1, y=2, z=3, a=4, b=5, c=6, u=7, v=8, w=9, id=2, motion_type=1, vel=1.66296, ini_maxvel=1.66296, acc=415.74, turn=-1 SET_LINE x=0.1, y=0.2, z=0.3, a=0.4, b=0.5, c=0.6, u=0.7, v=0.8, w=0.9, id=4, motion_type=1, vel=1.66296, ini_maxvel=1.66296, acc=415.74, turn=-1 SET_SPINDLESYNC sync=0.000000, flags=0x00000000 SPINDLE_OFF +FREE diff --git a/tests/motion-logger/basic/expected.g1 b/tests/motion-logger/basic/expected.g1 index d2c3bffbad6..bd250d5d9b5 100644 --- a/tests/motion-logger/basic/expected.g1 +++ b/tests/motion-logger/basic/expected.g1 @@ -1,5 +1,7 @@ +COORD SET_LINE x=1, y=2, z=3, a=4, b=5, c=6, u=7, v=8, w=9, id=2, motion_type=2, vel=0.0166667, ini_maxvel=1.66296, acc=415.74, turn=-1 SET_LINE x=0.1, y=2, z=0.3, a=0.4, b=5, c=0.6, u=0.7, v=8, w=0.9, id=3, motion_type=2, vel=0.0333333, ini_maxvel=1.40546, acc=351.364, turn=-1 SET_LINE x=10, y=2, z=0.3, a=10, b=5, c=0.6, u=10, v=8, w=0.9, id=5, motion_type=2, vel=0.00166667, ini_maxvel=4, acc=1000, turn=-1 SET_SPINDLESYNC sync=0.000000, flags=0x00000000 SPINDLE_OFF +FREE diff --git a/tests/motion-logger/basic/expected.reset b/tests/motion-logger/basic/expected.reset index 2a358b4b4f8..70687f3e8d3 100644 --- a/tests/motion-logger/basic/expected.reset +++ b/tests/motion-logger/basic/expected.reset @@ -1,3 +1,5 @@ +COORD SET_OFFSET x=0, y=0, z=0, a=0, b=0, c=0 u=0, v=0, w=0 SET_SPINDLESYNC sync=0.000000, flags=0x00000000 SPINDLE_OFF +FREE diff --git a/tests/motion-logger/basic/expected.s b/tests/motion-logger/basic/expected.s index c4216ad2293..fd0fd722768 100644 --- a/tests/motion-logger/basic/expected.s +++ b/tests/motion-logger/basic/expected.s @@ -1,3 +1,4 @@ +COORD SET_LINE x=1, y=0, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=2, motion_type=1, vel=4, ini_maxvel=4, acc=1000, turn=-1 SPINDLE_ON speed=0.000000, css_factor=0.000000, xoffset=0.000000 SET_LINE x=1.5, y=0, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=6, motion_type=1, vel=4, ini_maxvel=4, acc=1000, turn=-1 @@ -13,3 +14,4 @@ SPINDLE_ON speed=0.000000, css_factor=0.000000, xoffset=0.000000 SET_LINE x=5, y=0, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=26, motion_type=1, vel=4, ini_maxvel=4, acc=1000, turn=-1 SET_SPINDLESYNC sync=0.000000, flags=0x00000000 SPINDLE_OFF +FREE diff --git a/tests/motion-logger/mountaindew/expected.motion-logger b/tests/motion-logger/mountaindew/expected.motion-logger index c52ea9598ed..95321cb72b9 100644 --- a/tests/motion-logger/mountaindew/expected.motion-logger +++ b/tests/motion-logger/mountaindew/expected.motion-logger @@ -4,6 +4,7 @@ SET_VEL vel=0, ini_maxvel=120 SET_VEL_LIMIT vel=400 SET_ACC acc=1e+99 SET_JERK jerk=1e+09 +SET_PAUSE_RETURN_LAST mask=0x4 SET_PLANNER_TYPE planner_type=0 SET_SCURVE_PEAK_SCALE scale=1 SETUP_ARC_BLENDS @@ -101,23 +102,6 @@ SPINDLE_OFF SS_ENABLE ENABLE COORD -JOG_ABORT joint=0 -JOG_ABORT joint=1 -JOG_ABORT joint=2 -JOG_ABORT joint=3 -JOG_ABORT joint=4 -JOG_ABORT joint=5 -JOG_ABORT joint=6 -JOG_ABORT joint=7 -JOG_ABORT joint=8 -JOG_ABORT joint=9 -JOG_ABORT joint=10 -JOG_ABORT joint=11 -JOG_ABORT joint=12 -JOG_ABORT joint=13 -JOG_ABORT joint=14 -JOG_ABORT joint=15 -ABORT SET_LINE x=2, y=0, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=4, motion_type=2, vel=0.666667, ini_maxvel=400, acc=1000, turn=-1 SET_LINE x=3, y=0, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=5, motion_type=2, vel=0.666667, ini_maxvel=400, acc=1000, turn=-1 SET_LINE x=3, y=4, z=0, a=0, b=0, c=0, u=0, v=0, w=0, id=6, motion_type=2, vel=0.666667, ini_maxvel=400, acc=1000, turn=-1 @@ -130,4 +114,5 @@ SET_LINE x=0, y=1, z=0.5, a=0, b=0, c=0, u=0, v=0, w=0, id=5, motion_type=1, vel SET_LINE x=0, y=0, z=0.5, a=0, b=0, c=0, u=0, v=0, w=0, id=6, motion_type=1, vel=400, ini_maxvel=400, acc=1000, turn=-1 SET_SPINDLESYNC sync=0.000000, flags=0x00000000 SPINDLE_OFF +FREE DISABLE diff --git a/tests/motion-logger/startup-gcode-abort/expected.motion-logger.in b/tests/motion-logger/startup-gcode-abort/expected.motion-logger.in index 8bef6b8b1a0..7d14e152e0c 100644 --- a/tests/motion-logger/startup-gcode-abort/expected.motion-logger.in +++ b/tests/motion-logger/startup-gcode-abort/expected.motion-logger.in @@ -9,6 +9,7 @@ SET_VEL vel=0, ini_maxvel=1.2 SET_VEL_LIMIT vel=4 SET_ACC acc=1e+99 SET_JERK jerk=1e+09 +SET_PAUSE_RETURN_LAST mask=0x4 SET_PLANNER_TYPE planner_type=0 SET_SCURVE_PEAK_SCALE scale=1 SETUP_ARC_BLENDS diff --git a/tests/mqtt/simulator.ini b/tests/mqtt/simulator.ini index ba7f9fc0232..aa8d6494263 100644 --- a/tests/mqtt/simulator.ini +++ b/tests/mqtt/simulator.ini @@ -25,7 +25,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = simulator.hal [HALUI] diff --git a/tests/remap/remap-io/test-ngc.ini b/tests/remap/remap-io/test-ngc.ini index 4ece72c8ff0..5d5250015dd 100644 --- a/tests/remap/remap-io/test-ngc.ini +++ b/tests/remap/remap-io/test-ngc.ini @@ -35,7 +35,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/remap/remap-io/test-py.ini b/tests/remap/remap-io/test-py.ini index d4d110f9948..fe94ace845d 100644 --- a/tests/remap/remap-io/test-py.ini +++ b/tests/remap/remap-io/test-py.ini @@ -35,7 +35,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/remap/remap-reentry/test.ini b/tests/remap/remap-reentry/test.ini index 1dc3cbe953a..46f82e8d21a 100644 --- a/tests/remap/remap-reentry/test.ini +++ b/tests/remap/remap-reentry/test.ini @@ -21,7 +21,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [TRAJ] diff --git a/tests/rs274ngc-startup/test.ini b/tests/rs274ngc-startup/test.ini index 93bb8db533a..fbb0442d7dc 100644 --- a/tests/rs274ngc-startup/test.ini +++ b/tests/rs274ngc-startup/test.ini @@ -29,7 +29,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/startup-state/test.ini b/tests/startup-state/test.ini index eb6773fbb25..303de104ca4 100644 --- a/tests/startup-state/test.ini +++ b/tests/startup-state/test.ini @@ -28,7 +28,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/statbuffer-g5x-abort/test.ini b/tests/statbuffer-g5x-abort/test.ini index ef2be910f43..80768c3a642 100644 --- a/tests/statbuffer-g5x-abort/test.ini +++ b/tests/statbuffer-g5x-abort/test.ini @@ -28,7 +28,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/task-modeless/.gitignore b/tests/task-modeless/.gitignore new file mode 100644 index 00000000000..57585c75340 --- /dev/null +++ b/tests/task-modeless/.gitignore @@ -0,0 +1,2 @@ +sim.var +sim.var.bak diff --git a/tests/task-modeless/checkresult b/tests/task-modeless/checkresult new file mode 100755 index 00000000000..24dc9aa53e3 --- /dev/null +++ b/tests/task-modeless/checkresult @@ -0,0 +1,2 @@ +#!/bin/sh +exit 0 # test failure is indicated by test.sh exit value diff --git a/tests/task-modeless/program.ngc b/tests/task-modeless/program.ngc new file mode 100644 index 00000000000..cd7c1b0f097 --- /dev/null +++ b/tests/task-modeless/program.ngc @@ -0,0 +1,4 @@ +G0 X2 +G4 P1.5 +G0 X4 +M2 diff --git a/tests/task-modeless/sim.hal b/tests/task-modeless/sim.hal new file mode 100644 index 00000000000..d5d3ef1538b --- /dev/null +++ b/tests/task-modeless/sim.hal @@ -0,0 +1,16 @@ +loadrt [KINS]KINEMATICS +loadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS +addf motion-command-handler servo-thread +addf motion-controller servo-thread + +net Xpos joint.0.motor-pos-cmd => joint.0.motor-pos-fb +net Ypos joint.1.motor-pos-cmd => joint.1.motor-pos-fb +net Zpos joint.2.motor-pos-cmd => joint.2.motor-pos-fb + +net estop-loop iocontrol.0.user-enable-out iocontrol.0.emc-enable-in +net tool-prepare-loop iocontrol.0.tool-prepare iocontrol.0.tool-prepared +net tool-change-loop iocontrol.0.tool-change iocontrol.0.tool-changed + +# a wheel on X: one count is 0.01 +setp axis.x.jog-scale 0.01 +setp axis.x.jog-vel-mode 0 diff --git a/tests/task-modeless/test-ui.py b/tests/task-modeless/test-ui.py new file mode 100755 index 00000000000..d59c101ba92 --- /dev/null +++ b/tests/task-modeless/test-ui.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +# The task mode cannot be set: it reports what task runs, and task accepts +# jogs, MDI and program runs by what it is doing. Nothing here calls +# c.mode() except to check what it does: it sets this process's view, which +# stat.task_mode reports while task is idle. halui's mode pins show task's +# own mode. + +import os +import sys +import time + +import hal +import linuxcnc + +c = linuxcnc.command() +s = linuxcnc.stat() +e = linuxcnc.error_channel() +h = hal.component("test-ui") +h.ready() + +fails = 0 + + +def check(name, ok, detail=''): + global fails + print('%s: %s %s' % ('ok' if ok else 'FAIL', name, detail), flush=True) + if not ok: + fails += 1 + + +def wait(fn, timeout=5.0): + end = time.time() + timeout + while time.time() < end: + s.poll() + if fn(): + return True + time.sleep(0.01) + s.poll() + return fn() + + +def errors(): + msgs = [] + while True: + m = e.poll() + if not m: + return msgs + msgs.append(m[1]) + + +def idle(): + return (s.interp_state == linuxcnc.INTERP_IDLE and s.queue == 0 + and hal.get_value('halui.mode.is-manual')) + + +def x(): + return s.actual_position[0] + + +MODE = {linuxcnc.MODE_MANUAL: 'MANUAL', linuxcnc.MODE_MDI: 'MDI', linuxcnc.MODE_AUTO: 'AUTO'} +TRAJ = {linuxcnc.TRAJ_MODE_FREE: 'FREE', linuxcnc.TRAJ_MODE_TELEOP: 'TELEOP', + linuxcnc.TRAJ_MODE_COORD: 'COORD'} + + +def modes(): + return '%s/%s' % (MODE.get(s.task_mode), TRAJ.get(s.motion_mode)) + + +wait(lambda: s.task_mode in MODE and s.motion_mode in TRAJ, 10.0) +check('starts idle', s.task_mode == linuxcnc.MODE_MANUAL and s.motion_mode == linuxcnc.TRAJ_MODE_FREE, modes()) + +c.state(linuxcnc.STATE_ESTOP_RESET) +c.state(linuxcnc.STATE_ON) +c.wait_complete() + +# --- before homing: MDI is refused, joint jogs work +errors() +c.mdi('G0 X1') +c.wait_complete() +time.sleep(0.1) +msgs = errors() +check('MDI refused before homing', any('not homed' in m for m in msgs), msgs) +check('still idle in joint mode', wait(lambda: idle() and s.motion_mode == linuxcnc.TRAJ_MODE_FREE), modes()) + +c.jog(linuxcnc.JOG_INCREMENT, True, 1, 10, 0.5) +check('joint jog without a mode change', wait(lambda: abs(s.joint_actual_position[1] - 0.5) < 1e-6), s.joint_actual_position[1]) + +c.home(-1) +c.wait_complete() +check('homed', wait(lambda: all(s.homed[:3])), s.homed[:3]) +c.teleop_enable(1) +c.wait_complete() +check('world mode', wait(lambda: s.motion_mode == linuxcnc.TRAJ_MODE_TELEOP), modes()) + +# --- no program open: run and step are refused +errors() +c.auto(linuxcnc.AUTO_STEP) +c.wait_complete() +time.sleep(0.1) +msgs = errors() +check('step refused with no program', any('no program is open' in m for m in msgs), msgs) +check('still idle after the refused step', wait(idle), modes()) + +# --- MDI from idle, no mode change +c.mdi('G0 X1') +check('MDI shows as MDI mode', wait(lambda: s.task_mode == linuxcnc.MODE_MDI, 1.0), modes()) +check('MDI runs in coordinated mode', wait(lambda: s.motion_mode == linuxcnc.TRAJ_MODE_COORD, 1.0), modes()) +check('MDI moved X', wait(lambda: abs(x() - 1) < 1e-6), x()) +check('idle again after MDI', wait(idle), modes()) +check('back in world mode', wait(lambda: s.motion_mode == linuxcnc.TRAJ_MODE_TELEOP), modes()) +check('halui sees manual', wait(lambda: hal.get_value('halui.mode.is-manual'))) +check('no errors from MDI', not errors()) + +# --- DONE means ready: right after wait_complete() motion is back in world +# mode and a world jog is accepted +for i in range(5): + c.mdi('G0 X%d' % (i % 2)) + r = c.wait_complete() + s.poll() + if r != linuxcnc.RCS_DONE or s.motion_mode != linuxcnc.TRAJ_MODE_TELEOP: + break +check('world mode as soon as MDI is DONE', r == linuxcnc.RCS_DONE and s.motion_mode == linuxcnc.TRAJ_MODE_TELEOP, (r, modes())) +c.jog(linuxcnc.JOG_INCREMENT, False, 1, 10, 0.1) +c.wait_complete() +check('a jog right after MDI is accepted', wait(lambda: abs(s.actual_position[1] - 0.1) < 1e-6, 2) and not errors(), s.actual_position[1]) +c.jog(linuxcnc.JOG_INCREMENT, False, 1, 10, -0.1) +wait(lambda: abs(s.actual_position[1]) < 1e-6) +c.mdi('G0 X1') +wait(idle) + +# --- wheel jog while idle after MDI +hal.set_p('axis.x.jog-enable', '1') +hal.set_p('axis.x.jog-counts', '100') +check('wheel jog after MDI', wait(lambda: abs(x() - 2) < 1e-6), x()) + +# --- a world jog right after MDI, with no mode change +c.jog(linuxcnc.JOG_INCREMENT, False, 0, 10, 0.5) +check('world jog after MDI', wait(lambda: abs(x() - 2.5) < 1e-6), x()) + +# --- mode() sets this process's view only +c.mode(linuxcnc.MODE_AUTO) +c.wait_complete() +time.sleep(0.1) +s.poll() +check('mode(AUTO) shows as the view', s.task_mode == linuxcnc.MODE_AUTO, modes()) +check('mode(AUTO) leaves task idle', hal.get_value('halui.mode.is-manual') and s.motion_mode == linuxcnc.TRAJ_MODE_TELEOP, modes()) +c.mode(linuxcnc.MODE_MDI) +c.wait_complete() +time.sleep(0.1) +s.poll() +check('mode(MDI) shows as the view', s.task_mode == linuxcnc.MODE_MDI, modes()) +check('mode(MDI) leaves task idle', hal.get_value('halui.mode.is-manual') and s.motion_mode == linuxcnc.TRAJ_MODE_TELEOP, modes()) +c.jog(linuxcnc.JOG_INCREMENT, False, 0, 10, 0.5) +check('world jog with the MDI view', wait(lambda: abs(x() - 3) < 1e-6), x()) +c.mode(linuxcnc.MODE_MANUAL) +s.poll() +check('mode(MANUAL) view', s.task_mode == linuxcnc.MODE_MANUAL, modes()) +check('no errors from mode()', not errors()) + +# --- queued MDI; jogs are refused while it runs +c.mdi('G4 P1') +c.mdi('G0 X3.5') +check('MDI queue runs', wait(lambda: s.task_mode == linuxcnc.MODE_MDI, 1.0), modes()) +check('halui sees MDI', wait(lambda: hal.get_value('halui.mode.is-mdi'), 1.0)) +y = s.actual_position[1] +c.jog(linuxcnc.JOG_INCREMENT, False, 1, 10, 0.5) +c.wait_complete() +time.sleep(0.1) +msgs = errors() +check('jog refused while MDI runs', any('while MDI is running' in m for m in msgs), msgs) +c.mode(linuxcnc.MODE_MANUAL) +c.wait_complete() +check('mode(MANUAL) does not stop MDI: queued MDI finished', wait(lambda: abs(x() - 3.5) < 1e-6, 4.0), x()) +check('idle after the MDI queue', wait(idle), modes()) +check('Y did not move', abs(s.actual_position[1] - y) < 1e-6, (s.actual_position[1], y)) + +# --- a jog in progress holds off MDI +c.jog(linuxcnc.JOG_CONTINUOUS, False, 1, 1) +wait(lambda: s.current_vel > 0.5, 1.0) +c.mdi('G0 X0') +c.wait_complete() +time.sleep(0.1) +msgs = errors() +check('MDI refused while jogging', any('while jogging' in m for m in msgs), msgs) +c.jog(linuxcnc.JOG_STOP, False, 1) +check('jog stopped, idle', wait(lambda: idle() and s.current_vel == 0), modes()) + +# --- a program run from idle, no mode change +c.program_open(os.path.abspath('program.ngc')) +c.wait_complete() +c.auto(linuxcnc.AUTO_RUN, 0) +check('program shows as AUTO mode', wait(lambda: s.task_mode == linuxcnc.MODE_AUTO, 1.0), modes()) +check('halui sees auto', wait(lambda: hal.get_value('halui.mode.is-auto'), 1.0)) +check('program reached the dwell', wait(lambda: abs(x() - 2) < 1e-6), x()) +c.mode(linuxcnc.MODE_MANUAL) +c.mdi('G0 X0') +c.jog(linuxcnc.JOG_INCREMENT, False, 1, 10, 0.5) +c.wait_complete() +time.sleep(0.1) +msgs = errors() +s.poll() +check('mode(MANUAL) leaves the program running', s.task_mode == linuxcnc.MODE_AUTO and hal.get_value('halui.mode.is-auto'), modes()) +check('MDI refused while the program runs', any('EMC_TASK_PLAN_EXECUTE' in m for m in msgs), msgs) +check('jog refused while the program runs', any('EMC_JOG_INCR' in m for m in msgs), msgs) +check('program finished', wait(lambda: abs(x() - 4) < 1e-6, 5.0), x()) +check('idle after the program', wait(idle), modes()) +check('world mode after the program', wait(lambda: s.motion_mode == linuxcnc.TRAJ_MODE_TELEOP), modes()) + +# --- abort a paused program +c.auto(linuxcnc.AUTO_RUN, 0) +wait(lambda: abs(x() - 2) < 1e-6) +c.auto(linuxcnc.AUTO_PAUSE) +check('paused program is AUTO', wait(lambda: s.paused and s.task_mode == linuxcnc.MODE_AUTO), modes()) +c.abort() +c.wait_complete() +check('abort ends the run', wait(idle), modes()) +errors() + +# --- joint mode is kept across a run +c.teleop_enable(0) +c.wait_complete() +wait(lambda: s.motion_mode == linuxcnc.TRAJ_MODE_FREE) +c.mdi('G0 X1') +check('MDI from joint mode', wait(lambda: abs(x() - 1) < 1e-6), x()) +check('back in joint mode', wait(lambda: idle() and s.motion_mode == linuxcnc.TRAJ_MODE_FREE), modes()) +c.teleop_enable(1) +c.wait_complete() + +# --- halui MDI command +hal.set_p('halui.mdi-command-00', '1') +check('halui MDI runs', wait(lambda: abs(x()) < 1e-6), x()) +check('idle after halui MDI', wait(idle), modes()) +check('halui-mdi-is-running cleared', wait(lambda: not hal.get_value('halui.halui-mdi-is-running'))) +hal.set_p('halui.mdi-command-00', '0') + +# --- the view comes back once a run ends +c.mode(linuxcnc.MODE_MDI) +c.mdi('G0 X0.5') +check('MDI from the MDI view', wait(lambda: abs(x() - 0.5) < 1e-6), x()) +check('idle again, MDI view kept', wait(lambda: hal.get_value('halui.mode.is-manual') and s.interp_state == linuxcnc.INTERP_IDLE) + and s.task_mode == linuxcnc.MODE_MDI, modes()) +c.mode(linuxcnc.MODE_MANUAL) + +# --- step from idle starts the program paused +c.auto(linuxcnc.AUTO_STEP) +check('step starts the program', wait(lambda: s.task_mode == linuxcnc.MODE_AUTO and s.paused), modes()) +c.abort() +c.wait_complete() +check('abort after step', wait(idle), modes()) + +msgs = errors() +check('no unexpected errors', not msgs, msgs) + +c.state(linuxcnc.STATE_OFF) +c.wait_complete() +print('%d failures' % fails, flush=True) +sys.exit(1 if fails else 0) diff --git a/tests/task-modeless/test.ini b/tests/task-modeless/test.ini new file mode 100644 index 00000000000..dcf9e92b986 --- /dev/null +++ b/tests/task-modeless/test.ini @@ -0,0 +1,85 @@ +[EMC] +VERSION = 1.1 +DEBUG = 0 + +[DISPLAY] +DISPLAY = ./test-ui.py + +[RS274NGC] +PARAMETER_FILE = sim.var + +[EMCMOT] +EMCMOT = motmod +COMM_TIMEOUT = 4.0 +SERVO_PERIOD = 1000000 + +[TASK] +TASK = milltask +CYCLE_TIME = 0.001 + +[HAL] +HALFILE = sim.hal + +[HALUI] +MDI_COMMAND = G0 X0 + +[TRAJ] +COORDINATES = X Y Z +LINEAR_UNITS = mm +ANGULAR_UNITS = degree +MAX_LINEAR_VELOCITY = 40 + +[EMCIO] +TOOL_TABLE = tool.tbl + +[KINS] +KINEMATICS = trivkins +JOINTS = 3 + +[AXIS_X] +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 + +[JOINT_0] +TYPE = LINEAR +HOME_SEQUENCE = 0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +FERROR = 1 +MIN_FERROR = 1 + +[AXIS_Y] +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 + +[JOINT_1] +TYPE = LINEAR +HOME_SEQUENCE = 0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +FERROR = 1 +MIN_FERROR = 1 + +[AXIS_Z] +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 + +[JOINT_2] +TYPE = LINEAR +HOME_SEQUENCE = 0 +MAX_VELOCITY = 40 +MAX_ACCELERATION = 1000.0 +MIN_LIMIT = -100.0 +MAX_LIMIT = 100.0 +FERROR = 1 +MIN_FERROR = 1 diff --git a/tests/task-modeless/test.sh b/tests/task-modeless/test.sh new file mode 100755 index 00000000000..972cf4ffcb8 --- /dev/null +++ b/tests/task-modeless/test.sh @@ -0,0 +1,3 @@ +#!/bin/bash +rm -f sim.var +linuxcnc -r test.ini diff --git a/tests/task-modeless/tool.tbl b/tests/task-modeless/tool.tbl new file mode 100644 index 00000000000..aee1343f663 --- /dev/null +++ b/tests/task-modeless/tool.tbl @@ -0,0 +1 @@ +T1 P1 Z0.5 ;tool 1 diff --git a/tests/tlo/g43-test.ini b/tests/tlo/g43-test.ini index 0b6d9beaa80..b56bb9923d2 100644 --- a/tests/tlo/g43-test.ini +++ b/tests/tlo/g43-test.ini @@ -21,7 +21,6 @@ CYCLE_TIME = 0.001 MDI_QUEUED_COMMANDS=10000 [HAL] -HALUI = halui HALFILE = mod_core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/tool-info/non-random/test.ini b/tests/tool-info/non-random/test.ini index 654191fb3f1..a0d34221906 100644 --- a/tests/tool-info/non-random/test.ini +++ b/tests/tool-info/non-random/test.ini @@ -24,7 +24,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/tool-info/random-no-startup-tool/test.ini b/tests/tool-info/random-no-startup-tool/test.ini index c002e1f8b36..a55d6fc7c02 100644 --- a/tests/tool-info/random-no-startup-tool/test.ini +++ b/tests/tool-info/random-no-startup-tool/test.ini @@ -24,7 +24,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/tool-info/random-with-startup-tool/test.ini b/tests/tool-info/random-with-startup-tool/test.ini index c002e1f8b36..a55d6fc7c02 100644 --- a/tests/tool-info/random-with-startup-tool/test.ini +++ b/tests/tool-info/random-with-startup-tool/test.ini @@ -24,7 +24,6 @@ TASK = milltask CYCLE_TIME = 0.001 [HAL] -HALUI = halui HALFILE = core_sim.hal [HALUI] diff --git a/tests/toolchanger/abort-during-change/abort-test.ini b/tests/toolchanger/abort-during-change/abort-test.ini index 3d7fc19cd75..0ee237cc8e6 100644 --- a/tests/toolchanger/abort-during-change/abort-test.ini +++ b/tests/toolchanger/abort-during-change/abort-test.ini @@ -20,7 +20,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = mod_core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/toolchanger/m61/m61-test.ini b/tests/toolchanger/m61/m61-test.ini index e3ad9deae49..68e1303ff48 100644 --- a/tests/toolchanger/m61/m61-test.ini +++ b/tests/toolchanger/m61/m61-test.ini @@ -21,7 +21,6 @@ BASE_PERIOD = 0 SERVO_PERIOD = 1000000 [HAL] -HALUI = halui HALFILE = mod_core_sim.hal POSTGUI_HALFILE = postgui.hal diff --git a/tests/trajectory-planner/circular-arcs/configs/9axis.ini b/tests/trajectory-planner/circular-arcs/configs/9axis.ini index 13aa2b2fcd6..c3d93cb363f 100644 --- a/tests/trajectory-planner/circular-arcs/configs/9axis.ini +++ b/tests/trajectory-planner/circular-arcs/configs/9axis.ini @@ -104,8 +104,6 @@ HALFILE = constraint_check_9axis.tcl # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui_9axis.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XY.ini b/tests/trajectory-planner/circular-arcs/configs/XY.ini index bd8095ee093..b0b89ef41df 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XY.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XY.ini @@ -112,8 +112,6 @@ HALFILE = sim_spindle_encoder.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XYZ.ini b/tests/trajectory-planner/circular-arcs/configs/XYZ.ini index 9af90c0fc52..06ae2217483 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XYZ.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XYZ.ini @@ -111,8 +111,6 @@ HALFILE = sim_spindle_encoder.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XYZ_fast.ini b/tests/trajectory-planner/circular-arcs/configs/XYZ_fast.ini index 6927d4f0381..c65bae120fd 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XYZ_fast.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XYZ_fast.ini @@ -111,8 +111,6 @@ HALFILE = sim_spindle_encoder.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XYZ_medium.ini b/tests/trajectory-planner/circular-arcs/configs/XYZ_medium.ini index 6996743b6c7..072755a022b 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XYZ_medium.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XYZ_medium.ini @@ -112,8 +112,6 @@ HALFILE = sim_spindle_encoder.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XYZ_nospindle.ini b/tests/trajectory-planner/circular-arcs/configs/XYZ_nospindle.ini index fb102d8b355..59728db01bd 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XYZ_nospindle.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XYZ_nospindle.ini @@ -97,8 +97,6 @@ HALFILE = test_status.tcl # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XYZ_uneven.ini b/tests/trajectory-planner/circular-arcs/configs/XYZ_uneven.ini index 9969e362ffd..0b2e550e3cd 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XYZ_uneven.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XYZ_uneven.ini @@ -111,8 +111,6 @@ HALFILE = sim_spindle_encoder.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XY_slowZ.ini b/tests/trajectory-planner/circular-arcs/configs/XY_slowZ.ini index 7970522cceb..6e3beb171a8 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XY_slowZ.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XY_slowZ.ini @@ -111,8 +111,6 @@ HALFILE = sim_spindle_encoder.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/XZ.ini b/tests/trajectory-planner/circular-arcs/configs/XZ.ini index 376a5f786f1..866a1245b20 100644 --- a/tests/trajectory-planner/circular-arcs/configs/XZ.ini +++ b/tests/trajectory-planner/circular-arcs/configs/XZ.ini @@ -112,8 +112,6 @@ HALFILE = sim_spindle_encoder.hal # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/trajectory-planner/circular-arcs/configs/axis_mm.ini b/tests/trajectory-planner/circular-arcs/configs/axis_mm.ini index a87b6f8f398..7c8d8f6a644 100644 --- a/tests/trajectory-planner/circular-arcs/configs/axis_mm.ini +++ b/tests/trajectory-planner/circular-arcs/configs/axis_mm.ini @@ -107,8 +107,6 @@ HALFILE = test_status.tcl # AXIS at this time (only AXIS creates a HAL component of its own) POSTGUI_HALFILE = postgui.hal -HALUI = halui - # Trajectory planner section -------------------------------------------------- [TRAJ] diff --git a/tests/workplane-preview/test.ini b/tests/workplane-preview/test.ini index 51a235f0cff..1f8daf8cb04 100644 --- a/tests/workplane-preview/test.ini +++ b/tests/workplane-preview/test.ini @@ -29,7 +29,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal HALFILE = LIB:simulated_home.hal HALFILE = LIB:lathe.hal diff --git a/tests/workplane-retain/clear.ini b/tests/workplane-retain/clear.ini index 891b931cef0..cd41d92f2c4 100644 --- a/tests/workplane-retain/clear.ini +++ b/tests/workplane-retain/clear.ini @@ -29,7 +29,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal HALFILE = LIB:simulated_home.hal HALFILE = LIB:lathe.hal diff --git a/tests/workplane-retain/test.ini b/tests/workplane-retain/test.ini index 2fd2850e903..e58fa29def4 100644 --- a/tests/workplane-retain/test.ini +++ b/tests/workplane-retain/test.ini @@ -30,7 +30,6 @@ TOOL_TABLE = tool.tbl TOOL_CHANGE_POSITION = 0 0 2 [HAL] -HALUI = halui HALFILE = LIB:core_sim.hal HALFILE = LIB:simulated_home.hal HALFILE = LIB:lathe.hal