5.1.42.3681
2/27/2026
Changes made for Pathfinder V5 PC's.
Problem Pathfinder froze when changing machine configuration or machine options. The app would show the "Pathfinder will now restart" dialog, but after dismissing it, the window would hang and never restart.
Root Cause The freeze was caused by CloseCommDevice() deadlocking on _lock in FoldbusEthernet_IO — the queue thread was stuck inside SendCommand() holding that same lock, and no amount of signaling could make it release the lock fast enough because StopMessagePump() Join timeouts would expire first. Additionally, Application.Restart() triggered a re-entrant shutdown cascade through form closing events.
Files Changed
QueueManager.cs — Check _stopCommRequested at the top of every loop iteration and after acquiring the mutex / completing ProcessCommand(), so the queue thread exits promptly during shutdown instead of only checking when the queue is empty. Made _stopCommRequested volatile.
StatusRequestCO.cs — Changed context.Send() to context.Post() in EventProcessingLoop and added a _eventThreadShouldStop guard. Prevents deadlock between the event processing thread (waiting for UI thread) and the UI thread (waiting for event thread to stop).
FoldbusEthernet_IO.cs — Set ReceiveTimeout = 1000 on the UDP client so Receive() throws after 1 second instead of blocking forever. Wired up the previously empty SetResponseTimeout() method.
ControllerRunStateCommManager.cs — Added overload SetControllerToPowerDown(out ManualResetEvent) that returns the command's Processed handle so callers can wait for completion.
MachineCommunicationManager.cs — Added PowerDown(out ManualResetEvent) overload. Added StopCommunication(bool closeCommDevice) overload that skips CloseCommDevice during restart (avoiding the deadlock). Set StopCommunicating = true as the first action in StopCommunication so UDP send/receive loops bail out immediately.
FoldingMachinePhysicalDevice.cs — Made stopCommunicating field volatile for cross-thread visibility.
ApplicationManager.cs — RestartPathfinder() now waits up to 3s for the PowerDown command to complete, uses StopCommunication(closeCommDevice: false) to avoid the lock deadlock, and uses Process.Start() + Environment.Exit(0) instead of Application.Restart() to avoid the re-entrant form-closing shutdown cascade. Same PowerDown wait added to ExitPathfinder(). Added using System.Diagnostics.
Changes made for Pathfinder V5 PC's.
- JogPanel.Designer.cs:394 — Fixed tableLayoutPanel15 column from 5 to 4 (matching all other info panels)
- JogPanel.cs:1581-1583 — Added tableLayoutPanel15.Visible = false when loading table is disabled (and true when enabled)
- Reverted — tableLayoutPanel14 row styles back to original 70%/30%, and lblSystemPressure.TextAlign back to original MiddleCenter
Changes made for Pathfinder V5 PC's.
Configurations for WeckenmannKS-HydraulicVFD-V2 and WeckenmannKSV2 have been added to Pathfinder. These base files were filled in with parameter and calibration values from user override files from backups.
Changes made for Pathfinder V5 PC's.
Added the ThalmannPICOV2CLBG configuration with default parameters and backgauge calibration set to what was in a backup in the overrides.
Changes made for Pathfinder V5 PC's.
In Pathfinder there is a section under Diagnostics/Input and Output Status that shows the labels for what and where the I/O is on the selected machine. This information does not show up unless a blackbox controller is communicating with Pathfinder. This is unnecessary since Pathfinder is the one with the I/O information. The fix was to make sure the labels are shown regardless if a controller is connected or not. Also, a change was made to not show I/O past 24 if they don't exist on that machine.
Root Cause: MachineCommunicationManager.cs:1809 — GetInputFunctions() and GetOutputFunctions() use .Take(BlackBoxCount * 24) to limit results. BlackBoxCount is only set when the controller responds to a UART version request. When offline, it stays at 0, so .Take(0) returns empty dictionaries and no labels are displayed.
Fix: When BlackBoxCount is 0 (no controller connected yet), skip the .Take() limit entirely and show all enabled I/O labels from the machine configuration. When connected, the limit is still applied as before to match the actual number of physical I/O pins on the controller(s).
IOStatus.cs — In UpdateFunctionAssignments(), after receiving the input/output dictionaries from the configuration, it now checks the max pin ID. If no I/O goes beyond pin 24, it removes rows 25–48 from the DataTable and updates numberOfPorts to 24. This means UpdateActiveInputs/UpdateActiveOutputs will also only iterate over 24 rows. Machines with 2 controllers (pins > 24) still get the full 48 rows.
Changes made for Pathfinder V5 PC's.
The jog buttons have a picture of the axis to move and how the motion is supposed to go. The axis is labeled to the right of these buttons, but sometimes the buttons will be pressed thinking they are a different axis which can cause damage. The fix was to label all jog buttons in the jog screens with the axis they are (e.g CB, BG, LB,...).
In the reference screen the buttons for referencing an axis have also been labeled which is really helpful since there is no indication which axis the button is for without studying the picture on the button.