vcswatch reports that
this package seems to have a new changelog entry (version
1:2.10.0~pre2, distribution
UNRELEASED) and new commits
in its VCS. You should consider whether it's time to make
an upload.
Here are the relevant commit messages:
commit 3ce10cf797db8b602756b4375f5bd746d456e5fb
Merge: f4e6146b 1aa9607c
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Oct 30 13:11:33 2026 +0800
Merge pull request #4745 from BsAtHome/hal64_boss_plc
hal: Update to 64-bit clean operation and accesses
commit f4e6146be2f08628a8ac94bf92c6545713c76ff0
Merge: 6660aee2 42afee32
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Oct 30 13:10:44 2026 +0800
Merge pull request #4743 from BsAtHome/hal64_counter-encoder
hal: Update all accesses to 64-bit and make counting 64-bit clean
commit 6660aee24ff2beac551e77cc5af36fd3f686b3fd
Merge: 5f9e072d 3e7a81d5
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Oct 30 13:09:21 2026 +0800
Merge pull request #4742 from BsAtHome/hal64_streamer-sampler
hal: Update streamer/sampler to use 64-bit accesses
commit 5f9e072d30c2cef920715145c54d03df9f1eef2d
Merge: e0f5150f 3d9620f4
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Oct 30 13:08:17 2026 +0800
Merge pull request #4740 from BsAtHome/hal64_hm2_modbus
hal: Update hm2_modbus driver status params and pins to use 64-bit
commit e0f5150f007cf6b5d5129c90d3af89bb1b2f6ec9
Merge: e1c6a557 71e1c7c6
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Oct 30 13:07:51 2026 +0800
Merge pull request #4729 from tzuohann/halcompile-doc-range-4714
halcompile: man page array ranges end at size-1 (#4714)
commit 1aa9607c65a2e3403f84101f4910484c45221e49
Author: Bertho Stultiens <bertho@vagrearg.org>
Date: Thu Oct 29 15:47:37 2026 +0100
hal: Update to 64-bit clean operation and accesses
commit e1c6a557c0e1c61961f17ee35a1ba188e7db275f
Merge: 39b516ab 64778096
Author: andypugh <andy@bodgesoc.org>
Date: Thu Oct 29 13:32:12 2026 +0000
Merge pull request #4741 from LinuxCNC/revert-4720-feat-multi-input-and-or
Revert "Multi input AND/OR; "
commit 64778096e0c4b4b6c87eca51935ce3bf5e7668e0
Author: andypugh <andy@bodgesoc.org>
Date: Thu Oct 29 13:31:24 2026 +0000
Revert "Multi input AND/OR; "
commit 42afee327318e2dc63642c2bb0ef0f37289bd27c
Author: Bertho Stultiens <bertho@vagrearg.org>
Date: Thu Oct 29 14:17:16 2026 +0100
hal: Update all accesses to 64-bit and make counting 64-bit clean.
commit 3e7a81d59fa3a3752953f895e31a4f883d51b6d4
Author: Bertho Stultiens <bertho@vagrearg.org>
Date: Thu Oct 29 14:02:55 2026 +0100
hal: Update streamer/sampler to use 64-bit accesses
commit 3d9620f4101a1b28ab9cfbe27ee03192fb87f18f
Author: Bertho Stultiens <bertho@vagrearg.org>
Date: Thu Oct 29 13:31:33 2026 +0100
hal: Update hm2_modbus driver status params and pins to use 64-bit
commit 39b516abf17c6c1226e9446597bf125c95c4654e
Merge: 87d8f4ec 54a868c6
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Thu Oct 29 11:02:54 2026 +0800
Merge pull request #4724 from grandixximo/genhex-newton
genhexkins: take the forward's Newton step in roll, pitch and yaw rates
commit 87d8f4ecd69386a4f87707ab1d1f4b76e8a6e7f0
Merge: 536d1bae bee44a7a
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Thu Oct 29 11:01:48 2026 +0800
Merge pull request #4676 from grandixximo/posemath-consolidate
genserkins: use posemath, remove gomath
commit 536d1baec1f2e5daf60cc856fda95a24160f6e89
Merge: 6f90560e d0199006
Author: andypugh <andy@bodgesoc.org>
Date: Wed Oct 28 14:42:23 2026 +0000
Merge pull request #4720 from dirkx/feat-multi-input-and-or
Multi input AND/OR;
commit 6f90560ec9c9592fbf0a84b8560055d5b537515f
Merge: 5a3d2f7a d53b4d90
Author: andypugh <andy@bodgesoc.org>
Date: Wed Oct 28 13:40:18 2026 +0000
Merge pull request #4733 from grandixximo/gui-spawn-no-fork
Fix GUI startup ENOMEM on small-RAM machines with an OpenMP OpenBLAS
commit d53b4d9044627d042d7740f42b56867991ddc242
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 28 19:15:12 2026 +1100
gui: run the postgui HAL files without forking the GUI
axis, gmoccapy, gscreen and qtvcp ran POSTGUI_HALFILE and
POSTGUI_HALCMD through os.spawnvp(), which forks the whole GUI
process. A fork must account the GUI's private writable memory again,
and with the preview's numpy that can be gigabytes of reservation
(see the OMP_NUM_THREADS commit). subprocess.call() starts the child
with vfork/posix_spawn, which shares the parent's memory until exec
and accounts nothing.
The return value is the same: the exit status, or minus the signal.
gmoccapy's comment on SIGTERM lost in a fork hook no longer points at
the postgui spawns; the check stays for any other fork.
commit 4499eaa53ad3abea7ac9841c5b9e173bf5216e51
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 28 19:15:12 2026 +1100
linuxcnc: default OMP_NUM_THREADS to 1
An OpenMP build of OpenBLAS reserves 128 MiB buffers at load, about
1 GiB of private writable memory per CPU. The preview imports numpy,
which loads it, so every GUI with a preview holds that reservation.
With the default overcommit mode a fork() must account it again, and
on a machine with less RAM than that the kernel refuses:
__vm_enough_memory: pid: 2586, comm: axis, bytes: 10737418240 not
enough memory for the allocation
OSError: [Errno 12] Cannot allocate memory
The GUIs that fork after the import fail to start: axis, gmoccapy and
qtvcp for the POSTGUI_HALFILE, and qtdragon also in QtWebEngine.
Reported by NTULINUX.
OMP_NUM_THREADS=1 drops the reservation (8.5 GB to 1.2 GB VmSize at
8 CPUs). OPENBLAS_NUM_THREADS=1 does not. LinuxCNC does no BLAS work
that needs threads. A value the user set is kept.
commit 5a3d2f7a9baa281f9beeca703305787a8138830b
Merge: 07aa2ba1 c14c08a8
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 28 12:56:18 2026 +0800
Merge pull request #4732 from grandixximo/rtapi-msg-newline-err
tests: do not track the stderr of rtapi-msg-newline
commit c14c08a8c62f613b73e72de283667f01d9403fbb
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 28 14:28:11 2026 +1100
tests: do not track the stderr of rtapi-msg-newline
test.sh writes halrun.err on every run. The copy in the tree was the output of a local run; ignore it like halrun.out. Reported by Hannes Diethelm.
commit bee44a7a9446715cbbf85777663e073dfefa050a
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Tue Oct 13 00:01:16 2026 +1100
tests: check the posemath parallel tests as a plain program
tests/blendmath compiled blendmath.c into a userspace program with -DULAPI. Since blendmath.c exports pmCircleEffectiveMinRadius() (#4643), EXPORT_SYMBOL is undefined there, which GCC 13 lets through as an implicit int and GCC 14 rejects. The two functions it checks are posemath's now, and posemath uses neither RTAPI nor ULAPI, so it becomes tests/posemath-parallel: a program linked with libposemath, with no blendmath.c to compile and nothing exported from a module for the test. The checks themselves are unchanged.
commit aa616ca79a8c77026a673accd480153c2d256bbc
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Tue Oct 13 00:01:16 2026 +1100
posemath: take the parallel checks over from blendmath
pmCartCartParallel() and pmCartCartAntiParallel() are vector helpers with nothing of the planner in them, so they go with the rest of the PmCartesian functions. The debug JSON output they wrote goes with the move, since posemath has no planner debug output.
commit 7ca68a2820f3fa62f63d291728ec6b1403888a3d
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Tue Oct 13 00:01:16 2026 +1100
libposemath: remove gomath
With genserkins on posemath nothing uses gomath. Its headers were never exported, so no module outside the tree could include them.
commit e99f39a1363bf4abc2770f761cf8bfeab10f1dbe
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Tue Oct 13 00:01:16 2026 +1100
genserkins: use posemath instead of gomath
genserkins was the only user of gomath. The pose, quaternion and RPY work now goes through posemath, which has the same routines. What posemath has no counterpart for stays with genser as static functions in genserfuncs.c: the small matrices of the Jacobian and their LU inverse, the Denavit-Hartenberg link pose, and the quaternion to rotation vector conversion, since pmQuatRotConvert() zeroes a rotation under 1e-6 and the inverse iterates to 1e-7.
pmPosePoseMult() writes the result's translation before it reads the first operand's, so products whose result is an operand go through a copy.
The thresholds are gomath's double ones, 1e-7, so the results do not move: over a grid of 592 poses the forward agrees to 1e-12, and the inverse returns the same joints and the same result at every pose except those with the wrist exactly straight, where its Jacobian is singular and the iteration may settle on another of the equivalent wrist solutions.
At a pitch of minus a quarter turn the RPY conversion now takes the branch posemath has for it; gomath tested plus a quarter turn twice (#389).
genser_kin_jac_inv() and genser_kin_jac_fwd() had no callers and go, with the declarations of functions genserkins.h named but nothing defined.
commit 07aa2ba191198003000d2acc52e629f8eb377026
Merge: c9a5a0a5 56729c53
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Tue Oct 27 08:41:14 2026 +0800
Merge pull request #4726 from grandixximo/sitepy-default-scheme
configure: fall back to the default scheme for SITEPY
commit 71e1c7c60f035515a7d84a3e8f0297fbf6a7bd19
Author: tzuohann <418dreamworks@gmail.com>
Date: Mon Oct 26 11:00:24 2026 -0400
halcompile: man page array ranges end at size-1 (#4714)
A pin or param declared [32:personality] runs 00..personality-1, but the
man page printed MM=00..personality. Print the bound as (size)-1, with the
size in parentheses so expressions such as personality & 0xff (logic)
read correctly. One-liner from BsAtHome in #4714, applied to pins and params.
commit c9a5a0a5034177c8db64cb44abf14d4f2eb166f7
Merge: 0f1aa81a 1f80ec40
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 19:42:25 2026 +0800
Merge pull request #4685 from grandixximo/kins-nonfinite-freeze
motion: a non-finite inverse in coordinated mode no longer hangs the servo thread
commit 54a868c694db296b1f7229933c8b9bec13962904
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 15:15:15 2026 +1100
genhexkins: take the forward's Newton step in roll, pitch and yaw rates
The forward kinematics is a Newton iteration on the platform pose that
steps roll, pitch and yaw by the solution of J delta = strut errors, but
it built the rotational columns of J as the strut moments (R a) x u.
Those are the rates per angular velocity, which equal the rates per
roll, pitch and yaw rate only at zero orientation. With the platform
tilted the step was off, and the iteration converged linearly instead of
quadratically.
Motion runs this forward on the joint feedback every servo cycle, seeded
with the pose of the cycle before. From such a seed, one cycle of motion
away, on the hexapod-sim geometry tilted to 20 degrees and turned to 30,
it took 12.6 iterations on average and 23 at most instead of three;
tilted to 40 and turned to 60, one pose in ten did not converge within
the 120 iteration limit. Running the sim through MDI tilts to A35 B35
C55, the most a feedback forward needed in the session was 117
iterations.
Take the rows against the rates, w = E [dr dp dy], with the E that
genhexKinematicsJacobian() uses. The same poses converge in three
iterations at a quarter of the cost, none fails, and the sim session
needs three at most.
tests/genhexkins-forward walks 600 tilted poses with
genhexkins.limit-iterations at 8, each seeded a cycle away; before this
change 480 of them did not converge.
commit 0f1aa81a04fc2480f4928f96fcf535c7f0f80916
Merge: e2d0d659 b0adf389
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 15:13:25 2026 +0800
Merge pull request #4702 from grandixximo/kins-params
kinematics: modules as functions of a parameter block, callable outside realtime
commit e2d0d659bbc82785f3dfcbf3ce2cdec70e007a8a
Merge: 16489afe de21b0b0
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 15:10:14 2026 +0800
Merge pull request #4697 from grandixximo/rtapi-msg-newline
rtapi: end every message that lacks the newline
commit 16489afe18a1c4d1e0c33cf701ef6561e42b85d3
Merge: ba7bd59e eca0503b
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 14:56:15 2026 +0800
Merge pull request #4725 from grandixximo/named-param-defining-sub
interp: an undefined named parameter in a sub definition reads as zero
commit 56729c53f58fe9e17d69951983ad621005753fbd
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 17:54:35 2026 +1100
configure: fall back to the default scheme for SITEPY
The 2.9 merge 2511cf1174 took the 2.9 SITEPY line, which falls back
to a hardcoded /usr/lib/python3/dist-packages when neither the
deb_system nor the rpm_prefix scheme exists. On Gentoo that path is
not on sys.path, so the linuxcnc module is not found. Master used to
fall back to the interpreter's default scheme; restore that.
Reported by Alec Ari (NTULINUX).
Fixes #4717
commit ba7bd59e081d4d5cf40b22187583614adda438bc
Merge: eff9542f a78e55f1
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 13:50:55 2026 +0800
Merge pull request #4723 from weblate/weblate-linuxcnc-linuxcnc
Translations update from Hosted Weblate
commit eca0503b8ae3c913b7e5aa90a03a8940643aa404
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 26 16:12:14 2026 +1100
interp: an undefined named parameter in a sub definition reads as zero
read_named_parameter() skips the "not defined" error while a sub is being defined, but returned without writing the result. The caller's stack variable stayed uninitialized and read_real_value() then tested it for NaN and infinity. On i386 the leftover value is sometimes NaN, so "o#<sub> call" inside a sub definition failed with "Calculation resulted in 'not a number'"; tests/interp/oword-bug315-p2 flaked on the i386 CI job this way. Valgrind reports the uninitialized read on x86-64 too.
commit b0adf38941343a3eb49bec74c4831d78c5badc5b
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Tue Sep 15 22:07:11 2026 +1000
kinematics.h: keep the interface, move the module side to kins_module.h
kinematics.h carried three things: the entry points motion, task and the interpreter call on a module, the helpers a module is written with, and the prototypes of particular modules that share their maths between two loadable modules. A consumer that wanted the flag values or the switch entry point read all of it.
kinematics.h now declares what a module presents to its callers: the kinematics type, the flags, forward, inverse, home, the tool and work frames, the tool frame inverse, the Jacobian, the switch, the type flags and the tool offset. kins_module.h, exported alongside it, takes the module side: the joint map and identity helpers, the tool frame library, the generic Jacobian, the parameter block and the shared code that runs an ops table. What trtfuncs.c and userkfuncs.c share with the modules that load them is in trtfuncs.h and userkfuncs.h next to them, in tree only.
SWITCHKINS_MAX_TYPES is defined in kinematics.h itself, where motion and NML read it, and kins_module.h aliases KINS_MAX_TYPES to it. Nothing declared moves or changes; only which header declares it.
commit 39be9ec8cfa6fd5fe1530854268f6c161c3bbddb
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 11 20:25:25 2026 +0800
docs: single-type modules in tree link kins_single.c
The note on kinematicsSwitchable() said the in-tree single-type modules
use KINS_NOT_SWITCHABLE. They are on the parameter block now and get
these entry points from kins_single.c. The macro stays for a module
written without the block.
commit 761a09bf307c805f15f76b8c3e0c4076a610f0ee
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Sep 14 16:48:22 2026 +1000
kinematics_user: read the module's pins by name, making nothing in HAL
The loader read the RT instance's pins through pins of its own, linked to
the signal each RT pin was on, and where a pin had no signal it made one
and linked the RT pin to it. That leaves the module's pins connected to
signals the config never made, so a net of one of them after the module
was first evaluated fails on a pin that is already connected.
Read each pin by name with hal_get_p() instead, at every refresh: nothing
is made in HAL, a pin netted later reads the signal from then on, and the
loader no longer has to be initialised before the caller's hal_ready().
commit 468c7a9be4ff84c31932c203ae666d913ffce997
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sat Sep 5 00:11:48 2026 +1000
kinematics: reach the frames and the tool frame inverse from outside realtime
The loader gains the two frames, the tool frame inverse and a survey of which joints turn the work, on kins_util.c code the library already carries; only the glue between the block form and the joint-only frame functions is new. The survey lets a caller hold the table still without a config entry naming it. A second survey tells the two orienting rotaries apart, the primary whose axis is fixed in the machine from the secondary whose axis it carries, by turning each a little and reading the axis of the resulting rotation; the sign of the secondary is how a caller names a pose rather than counting them. It answers only for exactly two such rotaries, so a robot wrist gets nothing. tests/kins-params checks the pair every module reports. kinematicsUserInitString() takes [KINS] KINEMATICS as the HAL file hands it to loadrt.
commit 7e47c37ed3cca5264ae1876b548e5507155efcd2
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Sep 7 16:30:15 2026 +1000
5axiskins: supply the work and tool frames
The head carries the tool and nothing turns the work, so the work frame is the machine frame and the tool frame is Rz(C) Ry(-B), the tilt left handed about y as the module's note 10 says. Its third column is the tool axis the forward already uses, from the tip towards the holder, so no native rotation is needed. Without them G53.1, G53.3, G53.6 and G68.3 refused on the bridgemill sim while every other five-axis module took them.
tests/kins-frames takes the module and gains two checks: the type the module models must supply frames of its own, since a switchable module's identity type passed on its neighbour's answers; and the W joint runs the tool out along the reported axis reversed, which ties the frame to the forward. Reversing the tilt, reversing the head's turn and dropping the frames each fail.
commit b2e6fcfe6dd3fd63e3a7b24fac2e9633471abd0e
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Sep 14 13:41:31 2026 +1000
5axiskins, maxkins: take the tool length from motion
The trt modules, genhexkins and pentakins already have motion hand them the offset in effect; these two still read a pin the config had to net from motion.tooloffset.z, and a missing net gave wrong joints with no error. Flag the entry as the tool, drop the nets from the sims, and have the kins-switch test check that G43.4 reaches the joints with nothing netted: in the tilted pose the length moves them by its tilt term, the same length along the tool instead of along Z.
commit ab0064c0aeccc4ab840b7f7bf20e3cfe1136ad74
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 16:33:19 2026 +1000
kinematics: take the tool offset from motion, not from a net
A module whose maths needs the tool length read it from a pin the config had to net from motion.tooloffset.z: a copy of controller state motion already holds, one cycle late, and a missing net gave wrong joints with no error. The block carries the tool, so motion hands it over: kinematicsSetTool() is called whenever the offset changes, referenced weakly so an older module still loads. kins_single.c and switchkins.c export it for every module on the block; the pin is read only until motion has sent anything, and a pin left disagreeing is reported once, since it is a config setting a tool length where the tool table should. A pin nobody set is not a disagreement. The non-RT loader takes the tool from the caller through kinematicsUserSetTool() where one is given, a planner knowing what a segment runs under better than the machine does.
tests/kins-tool-offset runs xyzac-trt-kins with nothing on its tool pin and checks that G43 reaches the joints, that netting the pin changes nothing and that G49 takes the length out; tests/kins-params checks the caller's tool on the loader.
commit 425f388956a66aba722f7d1f6dd1b31b425fc87f
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 13:24:58 2026 +1000
tests: check that a module answers the same outside realtime
tests/kins-params loads each module, evaluates it once in realtime
through the classic entry points (paritycheck.c publishes the forward,
the inverse and the Jacobian on pins) and once through the non-realtime
loader from python (check.py: kinsDescribe(), the block filled from the
module's pins, the same ops), and requires the same success and the
same numbers to rounding. 34 runs over the 24 modules, every
switchable type that has geometry of its own, the parallel machines
from a pose their forward can be seeded with.
Checked by mutation: the loader not refreshing the geometry fails 10
comparisons in the first module with a table; the loader seeding the
inverse with zeros instead of the caller's joints fails the three
translation joints of xyzacb_trsrn, which reads its rotary angles from
that array.
check.py holds the loader's libraries local, the way a GUI holds them under the interpreter it loads, so whatever a module needs in scope has to come from the loader: the out of tree switchkins module does not load without its core put in scope first.
commit fe2848320636629ed5c17063befe91230dc3ec08
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 13:24:57 2026 +1000
kinematics_user: take the joints in as well as out, and bind modules lazily
The loader zeroed the joints before a module's inverse and before an iterating forward. Motion hands a module the joints the machine is at and some read them, a nutating head its rotary angles, the hexapod its starting pose, so zeros put the loader on a different branch from realtime for xyzacb_trsrn. The caller's joints are the seed now, an iterating forward keeps the caller's pose, and the Jacobian runs its inverse from what the last inverse found.
A halcompile component references hal_export_funct() and the rest of what its rtapi_app_main() needs, which only the realtime HAL library provides, so dlopen with RTLD_NOW refused every component; nothing here calls that main, so bind lazily. The module is looked up in the directory it is installed in, with the HAL library within reach.
A module built out of tree takes the shared kinematics code from switchkins_core or kins_single_core, as it does in realtime. The loader finds which in the module's undefined symbols and puts that core in scope before the module, since the module takes the identity ops from it too, data that binds as the module loads, lazily or not. A module that does not load at all is one only realtime can run.
commit 1a97cb5c38990422beab0c7c2370ce11c78106df
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 13:24:58 2026 +1000
docs: describe the parameter block form of a kinematics module
The conventions chapter gains a section on the two blocks, the table,
the ops table and what the shared code does with them in and outside
realtime, and the Writing a Module list gains "no state". The frames
and Jacobian sections point at the ops table where they pointed at the
register calls. The switchkins chapter's Code Notes describe
switchkinsRegisterOps(), the table in kparms, switchkinsRunSetup() and
kinsDescribe(), keep the older registration as the older form, and the
outline is a module written the new way.
commit 114766a87d5ee447a5c4a6cac06898bb981d9aec
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 11 19:55:34 2026 +0800
switchkins: declare the primary and the machine frame kinstype from the ops table
A kins_ops table now says what its type IS the same way it says the
maths: .primary marks the module's working transform, and
switchkinsRegisterOps() bridges it into the declared flags exactly like
.identity. G43.4 resolves the switch target from the flag, so the
number of the working kinematics stops being a guess.
Like identity, primary may be declared for at most one kinstype; two
answers fail the module load. Every in-tree working transform declares
it: fiveaxis, the two trt tables, scara, puma, genser, genhex,
three21, millturn, tdr and the trsrn tcp tables. The trsrn tool
kinematics stays undeclared: it is a reporting mode, not the working
transform.
A third flag, KINSTYPE_MACHINE, names the machine frame type: the
machine with the orientation left out, XYZ the pivot in machine
coordinates and the rotary letters the rotary joints. On a machine
whose slides line up with its frame that is the identity type, so a
module that declares none has its identity type stand in, and every
in-tree module is of that kind. A module whose carriage does not line
up, a slanted slide or a composite Y on a mill-turn, declares its
machine frame type separately and keeps identity for a type whose
joints really are the axes, since the shortcuts taken on the identity
flag (the Jacobian, the tool offset change, the user-space loader's
KINEMATICS_IDENTITY) would be wrong on a transform. G13.1 and G49
cancel to the machine frame type; one at most, as for the others.
commit 667317a6f5f629fdf8a48afb8352e5ad96a08e95
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 13:24:57 2026 +1000
switchkinscomp: write the template on the parameter block
The out-of-tree template declares its geometry as a table, writes its
example type as ops over the block and supplies switchkinsSetup() like
the in-tree modules. EXTRA_SETUP() runs it through
switchkinsRunSetupWith() and kinsDescribe() replays it through
switchkinsDescribeWith(), both exported by switchkins_core, so the
template still builds with halcompile alone and includes no source.
The kparms it built was never zeroed, which the grown struct would have
turned into a crash; switchkinsRunSetupWith() zeroes it.
commit c27c519cfa782cadeb9bb8ac58f8a9f199bc600e
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 13:13:52 2026 +1000
genserkins, genhexkins, pentakins: move onto the parameter block
The three that build a geometry from many pins build it from the block on each call: genser its link description, genhex its base and platform points, pentakins its base points and effector circles. What they reported through output pins, iteration counts, strut corrections, the hexapod's fwd-kins-fail and gui pose, goes through the scratch, so each caller keeps its own. genhex and pentakins declare their forward as iterating and the switchkins core seeds it as before. genhexkins's six gui pose pins were inputs written by the module and are outputs now; pentakins's HAL parameters become pins of the same names. genserfuncs.c loses its haldata and globals, and ugenserkins builds a block and calls the ops.
commit 72bae90833c80b7eb4718d3003c5732663e1ac61
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 13:06:35 2026 +1000
millturn, xyzab_tdr_kins, xyzacb_trsrn, xyzbca_trsrn: move onto the parameter block
Each component declares its geometry as a table, writes its types as
ops over the block, and supplies switchkinsSetup() like the C modules
do; EXTRA_SETUP() runs it through switchkinsRunSetup() and initialises,
so the components link switchkins_setup.o too and export kinsDescribe()
with the rest. The trsrn TCP type registers its frames and Jacobian in
its ops table and the TOOL type the identity frames, as they were
registered before. The inverses go on reading the rotary angles from
their joint argument, as they always have. Pin names and defaults are
unchanged.
commit 6be13043632891b6ef95e62bc7c4f6eb279ac993
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 13:00:55 2026 +1000
scarakins, pumakins, three21kins: move onto the parameter block
Each arm declares its dimensions as a table, reads them from the block
and registers one ops table for its own type, with the identity and
userk types from the shared ops. pumakins keeps its flange frame and
declares the half turn through the ops table's native rotation, where
switchkinsRegisterFrames() carried it before. The setup functions and
haldata go; pin names and defaults are unchanged.
commit 8231c01a46590d0744042e00a7322f3d8b6ea556
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 12:57:51 2026 +1000
corexykins, rotatekins, rosekins, tripodkins, scorbot-kins, the deltas, matrixkins, userkins: move onto the parameter block
Each becomes a kins_module over one ops table and links kins_single.c. The maths is unchanged: where it read a pin it reads the block, what it kept between calls it keeps in the scratch, so rosekins counts its turns per caller and reports them as declared outputs, and tripodkins keeps its HAL_IO pins. kinematicsHome() goes from corexykins and rotatekins; nothing called it. The two deltas share their maths with a python module through a header whose geometry was statics; it is a struct the caller passes now, python API unchanged. matrixkins's nine coefficients were HAL parameters and are pins of the same names. In tree, matrixkins and userkins link kins_single.c; out of tree, userkins gets the same entry points from the new kins_single_core module, which the HAL file loads ahead of it, as switchkins_core serves a switchkins component.
commit 7adbf264479bc86dba7e71de2a29a51ec7f88fff
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 12:48:41 2026 +1000
trtfuncs, xyzac-trt-kins, xyzbc-trt-kins, maxkins: move onto the parameter block
The trt maths becomes two ops tables over one geometry table, TRT_PARAMS,
with the joint map read from the block instead of the JX statics and the
tool length from p->tool.tran.z, which the shared code fills from the
tool-offset entry. The two modules register the tables with
switchkinsRegisterOps() in the order sparm decides, and the identity and
userk types come from the shared ops. The joint assignment print and the
required-letter check that trtKinematicsSetup() did are now the shared
code's, so the setup function goes with the haldata.
maxkins keeps its fixed joint order and becomes a kins_single.c module:
the table declares pivot-length as the HAL_IO pin it was and
conventional-directions as before, and the three functions read the
block. Pin names and defaults are unchanged throughout.
commit 4b244c099c19108d4cc06260847e215a7323ff05
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Fri Sep 4 12:44:16 2026 +1000
kinematics: add the parameter block form of a module
A module reads its geometry from pins it created and keeps its type and iteration scratch in statics, so it can only answer for the machine as it is now, from inside realtime; a planner, a load-time check or a preview had to carry a second copy of the maths.
Add the form in which the caller supplies everything: a kins_params block with the type, the joint map, the tool and the geometry, a kins_scratch for what an iterative method carries between calls, and a kins_ops table with the forward, inverse, frames and Jacobian of one type as functions of the two. A module declares its geometry as a table of named entries; in RT the shared code makes one pin per entry under the names configs already use and copies pins in and outputs out around every call, so the maths never touches a pin. kins_single.c supplies the classic entry points for a module with one type, switchkins.c for several, dispatching a type registered with switchkinsRegisterOps() through the block and the older registrations as before, so modules convert one at a time. Every converted module exports kinsDescribe() for callers outside RT; one that does not reports itself RT-only.
trivkins, 5axiskins and userkfuncs convert here. The non-RT loader moves onto kinsDescribe() and nonrt_attach() goes; jacobian.cc asks the module for its Jacobian. An iterating ops forward restarts from the pose it last solved and otherwise from the caller's estimate, keeping a result only when the solve succeeded, and the gui forward of a pure type is seeded the same way. kinslimits reports the same caps for 5axiskins to the digit.
commit 9c052de55e625dbdbeb7be5685596e38475fde53
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Aug 10 18:05:21 2026 +1000
kinematics: evaluate a module outside RT by binding to its live pins
A module's haldata is a struct of pin handles, and a handle is a pointer to the value cell hal_get_real() reads, so a second copy of the module outside realtime can point its haldata at cells carrying the values the RT instance reads and its forward and inverse work unmodified, on live values, at any pose. Per module: export nonrt_attach(), which asks a caller-supplied resolver for each input pin by name, runs the same coordinate parse setup runs and returns the forward and inverse; the maths is untouched and no header grows per module.
The cells bound are pins of the caller's own component, connected to the signal the RT pin reads or to one made for the purpose, since a reference into another component's pin has that component's lifetime. Name lookup lives in the loader, userspace code linked against liblinuxcnchal; walking the HAL name space from an RT object is what the HAL isolation work removes. Input pins only, or the two copies write each other's state. Verified against the shared-memory snapshot design this replaces: identical caps from kinslimits, and a pin set by setp is seen without a motion thread running.
commit a78e55f1a4b5f0694c755381d7aac74f31bcdc06
Author: Andrei Stepanov <adem@users.noreply.hosted.weblate.org>
Date: Sun Oct 25 20:48:48 2026 +0100
Translated using Weblate (Russian)
Currently translated at 100.0% (420 of 420 strings)
Translated using Weblate (Russian)
Currently translated at 100.0% (3877 of 3877 strings)
Co-authored-by: Andrei Stepanov <adem@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/linuxcnc/gmocappy/ru/
Translate-URL: https://hosted.weblate.org/projects/linuxcnc/linuxcnc/ru/
Translation: LinuxCNC/LinuxCNC
Translation: LinuxCNC/LinuxCNC/Gmocappy
commit eff9542f49caddc1949446658d3f325bdcfeda95
Merge: c2cdd587 e06d24a8
Author: andypugh <andy@bodgesoc.org>
Date: Sun Oct 25 21:09:23 2026 +0000
Merge pull request #4623 from Rimas2200/fix/gomath-euler-singularities
posemath: fix negative pitch singularity in ZYX conversion
commit c2cdd587634f3d694aec3f0804b2fc8d7a6ca7e6
Merge: 5475b097 deeeb709
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 22:06:43 2026 +0100
Merge pull request #4701 from grandixximo/ui-smoke-quit-teardown
tests/ui-smoke: let linuxcnc shut down before signalling its group
commit 5475b097fd6919897671ea7397e2887b5d8e5eb3
Merge: 29e14eb5 f8bdefc4
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 22:04:07 2026 +0100
Merge pull request #4648 from hdiethelm/tests_parallel_v2
runtests: Add parallel mode
commit 29e14eb534800320a8c6550a85ed6c942c5fa7d2
Merge: 9a69a396 1ca1e02f
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 22:01:23 2026 +0100
Merge pull request #4521 from rene-dev/eoffset-float
change external offset to float
commit 9a69a3962f98829fa320717c69b52198f1617a9c
Merge: 0a41e883 2977d2ce
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:58:02 2026 +0100
Merge pull request #4686 from tzuohann/fix-program-units-3627
task: program_units follows the executing G20/G21, like gcodes (#3627)
commit 0a41e88331256a38fdeecec4c929a8133a157ac1
Merge: cbcc07a2 b8fa444d
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:55:31 2026 +0100
Merge pull request #4682 from grandixximo/ci-32bit
CI: build and test 32-bit Debian packages (i386, armhf)
commit cbcc07a214748082762b80ca3fce9a3462a60e62
Merge: b0645ba3 ade55391
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:54:46 2026 +0100
Merge pull request #4683 from grandixximo/hal-atomic-accessors
hal: access 64-bit pin values with relaxed atomics
commit b0645ba33d2c8a28cc818560eba09d40ca54a221
Merge: 05ac69a9 e49461f2
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:52:36 2026 +0100
Merge pull request #4699 from rene-dev/sim-pin-types
sim_pin: use the HAL type names halcmd reports
commit 05ac69a9d6345a5a7ee20d6393a25862320cff75
Merge: f1a13cd9 de352be9
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:51:44 2026 +0100
Merge pull request #4503 from hdiethelm/hm2_eth_oob_improvements
hm2_eth: Xenomai4 OOB improvements
commit f1a13cd99d1f373661f92f4e9c46eb939c10c1b6
Merge: 86a19b83 66cfc30b
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:48:46 2026 +0100
Merge pull request #4704 from dirkx/feat_rip-dcs
Feat rip dcs
commit 86a19b838adcf1339c2e0e286c1da063d098ef8a
Merge: 5a00475b 063fe6f3
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:47:13 2026 +0100
Merge pull request #4706 from LinuxCNC/smoe-patch-1
Fix sed command to escape hash in LANGUAGES assignment
commit 5a00475bea39160805802fdbcad1aa028dfcec7c
Merge: b6a0ec15 739e9210
Author: andypugh <andy@bodgesoc.org>
Date: Sun Oct 25 20:46:03 2026 +0000
Merge pull request #4716 from BsAtHome/fix_clang-rtapi_app-atomic
rtapi_app: clang 22 needs -latomic for linking on amd64
commit b6a0ec15b2439f8834218e0882caf45fea125ab0
Merge: ab3fb2a6 05519ac2
Author: Rene Hopf <renehopf@mac.com>
Date: Sun Oct 25 21:44:48 2026 +0100
Merge pull request #4718 from BsAtHome/fix_clang-32-missing-includes
build: Fix missing includes using clang 23 with new libc++ header policy
commit ab3fb2a6277287d1e770128e45e8e93178ef3205
Merge: 062dc7c0 cad55cfb
Author: andypugh <andy@bodgesoc.org>
Date: Sun Oct 25 20:40:42 2026 +0000
Merge pull request #4722 from hdiethelm/fix_latency_test
latency-test: Update to new hal types
commit cad55cfb4d89b1fa2710e8eae8c2cb972950233a
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Sun Oct 25 20:27:54 2026 +0100
latency-test: Update to new hal types
s32 was used, change to sint
commit d019900647ba3553807f706a363362b4e4514add
Author: linuxcnc <linuxcnc@jenni.msl.webweaving.org>
Date: Sat Oct 24 21:39:07 2026 +0000
Multi input AND/OR; much along the lines of logic(9) but with a controlled unconnected pin value that helps during machine conversation and an easier to read name.
commit 05519ac21c3b1d421e00d735ebdfdb8967dbd188
Author: Bertho Stultiens <bertho@vagrearg.org>
Date: Sat Oct 24 16:49:59 2026 +0200
build: Fix missing includes using clang 23 with new libc++ header policy.
commit 739e921042ea184ee483e8dd17a6ce511ee06efc
Author: Bertho Stultiens <bertho@vagrearg.org>
Date: Sat Oct 24 14:59:15 2026 +0200
rtapi_app: clang 22 needs -latomic for linking on amd64.
commit 66cfc30bde7947bfb3381ef3afb5aff71c1dc41f
Author: Dirk-Willem van Gulik <dirkx@webweaving.org>
Date: Thu Oct 22 11:47:11 2026 +0200
Clarify RIP and the ..; see https://github.com/LinuxCNC/linuxcnc/pull/4704#issuecomment-6330174960
commit de21b0b0f01c6863f6c136d06f905700e22ae64a
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 21 21:26:40 2026 +1100
rtapi: RTAI ends every message that lacks the newline too
The RTAI kernel handler and rtapi_print_msg() in RTAI user space follow the same rule as uspace: every rtapi_print_msg() message is a line, and rtapi_print() prints like printf. printk() shows a message without the newline only when the next one comes. The kernel handler now gives rt_printk() the text as an argument instead of as the format. Hannes Diethelm pointed out both on #4697.
commit 0440f1c380da449d3d879f8ec41dc4f9ea3b8a7f
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 21 12:35:08 2026 +1100
task, motion: one newline at the end of an error
An operator error is one line, and the GUIs and task's echo end it, so task drops the newline at the end of the text; motion's errors that end in one showed a blank line in every GUI. reportError() likewise adds its newline for the console only when the text lacks one.
commit d10eea027296b9888708bd3f63c05f4b616d20c9
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 21 12:35:08 2026 +1100
print each line with one rtapi_print_msg() call
Now that every message is a line, the places that built one line from several calls print it with one: motion's command debug output, rtapi_app's isolated cpuset report, the PPMC slot scan, halcmd's command echo and the hm2_modbus frame dumps. Hannes Diethelm listed most of them on #4697.
commit 063fe6f35d124c10fb10bfd7ff8bbd8b3e92d783
Author: Steffen Möller <moeller@debian.org>
Date: Wed Oct 21 11:26:07 2026 +0200
Fix sed command to escape hash in LANGUAGES assignment
Updated sed expression to escape hash character for compatibility across versions of GNU make.
commit 062dc7c097693bb68e76192516cd92878dd5ecdf
Merge: 3a1c48a1 c9b2331c
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 21 16:40:04 2026 +0800
Merge pull request #4703 from grandixximo/crashdump-coredumpctl-exe
tests/ui-smoke: match the versioned python in coredumpctl
commit 7751186d9afaecb3c0af0c311c6355dd1e022841
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sat Oct 17 16:02:16 2026 +1100
rtapi: end every message that lacks the newline
Every rtapi_print_msg() message is a line of its own: the uspace default handlers, in the main thread of rtapi_app, in the queue that prints the messages of its realtime threads and in user processes, add the newline when the text lacks one, at every level. rtapi_print() still prints like printf. A message that already ends in a newline does not change, so the existing formats and their translations stay as they are, and new code may leave the newline out.
tests/rtapi-msg-newline prints errors, a warning and an info message without a newline from the main thread of rtapi_app and from a realtime thread, an error with its newline, and an rtapi_print() line in two parts.
Fixes #4689.
commit c9b2331cdeb6fd90791daadf3f7ad2867127a552
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Wed Oct 21 12:27:42 2026 +1100
tests/ui-smoke: find our own core in coredumpctl
systemd-coredump lists the cores of every sandbox of a parallel run, and the PID it records is the host one, so taking the newest python core since arming can give one test the core of another. Hannes Diethelm pointed this out on #4703. Tag the launcher's environment with a UUID, which systemd-coredump keeps with the core, and dump the core whose environment carries the tag.
commit 2977d2ce002b34eea5ea82433179408073ed30dd
Author: tzuohann <2057796+tzuohann@users.noreply.github.com>
Date: Tue Oct 20 01:28:20 2026 -0400
tests/program-units: no homing, wait for the program to start, any sample counts
Review (grandixximo): the config has NO_FORCE_HOMING = 1, so the home and its
wait_complete() only raced the AUTO switch; the 1 s guard assumed the program
had started within a second; 100 samples needed the poll loop to keep 20 Hz
for the whole move. Now: no homing, wait (10 s timeout) for interp_state to
leave IDLE, then sample until it returns; fail only if no sample saw the G21
move -- the mismatch count is the real check.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
commit 59170bf57312b4249b0e33c22b1ee94098c72d7b
Author: Dirk-Willem van Gulik <dirkx@webweaving.org>
Date: Mon Oct 19 17:49:34 2026 +0200
Clarify how a Run in Place, RIP, environment is set up.
commit 1dc847e9ebb698a14b3ac99633949fce02c23d8c
Author: Dirk-Willem van Gulik <dirkx@webweaving.org>
Date: Mon Oct 19 17:48:13 2026 +0200
Leave a breadcrum when doing a make: Nothing to be done for `docs'. when that is not yet configured
commit 616a2e0a68da19240aeb8c065b2d29facfb0d099
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Mon Oct 19 15:21:59 2026 +1100
tests/ui-smoke: match the versioned python in coredumpctl
A bare name given to coredumpctl matches the command name, and the GUIs run from a "#!/usr/bin/python3.13" line, so systemd-coredump records them as "gmoccapy", "qtvcp" and so on, with /usr/bin/python3.13 as the executable. The "python3" match found nothing and crashdump.sh never got the core. Match the resolved path of python3 instead, which coredumpctl compares with the executable, and give the same path to gdb. Hannes Diethelm found it in #4648.
commit f8bdefc4cf35ae57c43520fafedd4027278ced72
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Sun Oct 18 18:46:12 2026 +0200
CI: Enable parallel tests / switch docker to 26.04
The CI base images docker are swiched to 26.04. This should have no
influence, due to a debian docker is run inside.
Fallback to single threaded if bwrap is to old is implemented in
runtests. This is the case for ubuntu 24.04 and debian bookworm.
commit a30b7ea20b038c33b79b2ad5bf305f573ab6524a
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Sun Oct 18 15:01:07 2026 +0200
runtests_flaky: Add parallel execution script for runtests
This is useful to detect flaky tests or race conditions.
commit 5a3a0a5c239319d2e8218e7aff726c1d78b44b57
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Sat Oct 17 15:27:08 2026 +0200
runtests: Check -j to have an integer argument
commit a26affebc65ed80452db6a8fcbcc4f7e4a34f0f0
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Sat Oct 17 15:10:59 2026 +0200
runtests: Specify output directory for parallel mode
commit 3b6eacd720fb76cb10046258de242cc3a7859ea0
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Sat Oct 17 15:01:37 2026 +0200
runtests: Disable cpu assignment for rtapi_app in parallel mode
Setting RTAPI_CPU_NUMBER=-1 disables the CPU assignment for the
realtime threads. If this is not done, all rtapi_app processes run on
one CPU, slowing down the tests.
commit 3a8655f61635670c0bf50d1f5f7b29523ea25062
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Tue Oct 6 23:08:57 2026 +0200
runtests: Parallel test mode
This allows to run tests in parallel using bwarp for isolation of the
linuxcnc processes
commit 6e7ef6b2b1c820290e2ca7f7b563ef64080583d3
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Tue Oct 6 23:05:40 2026 +0200
runtests: Extract test runner to function
commit 6c7c1184c4dddc2eb3fd29824d932155f693a18e
Author: Hannes Diethelm <hannes.diethelm@gmail.com>
Date: Tue Oct 6 23:00:40 2026 +0200
runtests: Exit on ctrl-c
commit deeeb709bde15915a700dd89e8a9f43249d74d11
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 18 17:17:40 2026 +1100
tests/tp/circle-curvature: drop the leftover ${SUDO}
runtests no longer sets SUDO since the tests stopped using sudo, and
the skip file keeps the test off installed packages.
commit db0f96e742fe71bc4fa5d37fa49f6794004f1346
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 18 17:17:39 2026 +1100
tests/ui-smoke: let linuxcnc shut down before signalling its group
Once the GUI had quit, quit-launch.sh sent SIGTERM to the whole linuxcnc
process group at once. linuxcnc was then already shutting down after
its GUI, so under load the signal reached it while it unloaded: the
halcmd and rtapi_app clients died halfway ("child did not exit
normally"), linuxcnc's SIGTERM trap ran its cleanup a second time on
top of the first, and the motion shared memory was left behind (SHMERR
in touchy-quit, #4669).
After a clean quit the launcher now waits up to 30 s for linuxcnc to
exit by itself, and only then signals what is left. With a component
that takes 1 s to unload, touchy-quit gave that SHMERR on every run
and now passes.
commit 3a1c48a1eeb8cbeaf47b00c6e2dd815cff81b1f6
Merge: 55e5db94 990d9817
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 18 10:54:34 2026 +0800
Merge pull request #4663 from grandixximo/ci-no-sudo
tests: drop sudo from the test suite and the package CI job
commit 55e5db94ba9ba39db622da4a8d4108bb48e1f000
Merge: 60972dfd 4c2f5863
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 18 09:30:19 2026 +0800
Merge pull request #4684 from grandixximo/raster-enabled-flicker
raster: do not show a running raster as disabled mid-cycle
commit 60972dfd735676a9576bb1d8ad96c0515c8eec9f
Merge: f5120aca 92c9fac8
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 18 09:15:03 2026 +0800
Merge pull request #4680 from grandixximo/g282-homing-runs
task: count a G28.2 homing run that ends between two status reads
commit f5120aca9f86688aa0d9480f507ec0132b8c1f15
Merge: 73d80f4f 25d86247
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 18 09:08:45 2026 +0800
Merge pull request #4666 from grandixximo/probe-queue-test
task: do not take a motion status from before a command as current (#3650)
commit 25d86247d629cf319402fef8f2ee47ff03fe0de2
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sat Oct 17 16:15:15 2026 +1100
tests: stale-motion-status: slow the controller only once task is up
At startup task reads the motion status once a second and gives up
after ten tries. The tries come at the same point of the servo period
each time, so with slowkins keeping the controller busy for most of
the period from load on, all ten could miss the free part of the
period: "can't read motion status" under load (#4669). With a wait of
99% of the period from load the startup failed that way in some runs.
slow-controller now sets the wait once task has handled its first
command. The commands after it still run with the controller busy for
most of the period, and pass with a wait of 99% too.
commit 81e10e1e44fe225d20791e2f34a1cb1ce0e41c4c
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 11 12:18:40 2026 +1100
tests: add stale-motion-status
Probe at alternating heights, and check that the machine is on and in
auto mode once wait_complete() returns. late-controller runs the
controller a 50 ms servo period after the command handler,
slow-controller uses kinematics that make the controller take most of
the servo period, so that status reads fail. Both fail on master, and
each needs one of the two changes before.
commit dfc6bc0feb2d1f47057eb12140ed3a8362d17e43
Author: Luca Toniolo <10792599+grandixximo@users.noreply.github.com>
Date: Sun Oct 11 12:18:03 2026 +1100
task: keep motion busy when a status read fails after a command
emcMotionUpdate() returns early when the status or config read fails,
which happens while motion-controller runs, and leaves the motion status
as it was. Right after a command that copy predates it, and with a probe
just queued it says motion is done. Report motion busy until a read that
has seen the command succeeds.