Pathfinder PC
5.1.47.3700
4/10/2026

Changes made for Pathfinder V5 PC's.

Goal: Automatically preserve tech-tuned ParameterStoreList values during a Pathfinder update.

Flow:

User clicks "Check for Updates" in Tools menu, selects an update zip package Before files are copied, compare the current on-disk *.ConfigurationStore.json against the same file in the zip Diff the ParameterStoreList entries by ID — any differences are values a tech changed in the field Write those differing entries into the .ConfigurationOverrides.Install.json as individual overrides Update proceeds normally (zip overwrites base files) On next launch, the install override layer restores the tuned values on top of the new base Key fact: The existing merge logic already supports individual ParameterStore overrides by ID, so we only need to add the comparison + write step in MaintenanceTool.cs before the file copy happens.

Current status: I've already written the code for PreserveParameterStoreChanges in MaintenanceTool.cs. There was a build error with Formatting.Indented needing full qualification as Newtonsoft.Json.Formatting.Indented, which has been fixed.

Changes made for Pathfinder V5 PC's.

Write fix (MachineProfileDAC.cs:47) — uses Convert.ToString(valueToUpdate, CultureInfo.InvariantCulture) so floats are always saved with a period decimal separator, regardless of the Windows locale.

Read fix (DatabaseLoadManager.cs:169) — if a stored value has a comma but no period (indicating it was saved on a comma-decimal locale), it replaces the comma with a period before parsing. This silently heals corrupted SDF files — the next time the value is saved back, it'll be written correctly

Changes made for Pathfinder V5 PC's.

The fix: replaced ToDictionary() with manual dictionary building using dict[key] = value instead of dict.Add(key, value). ToDictionary uses Add internally, which throws on duplicate keys. The manual loop with indexer assignment silently handles duplicates by keeping the last entry — no crash.

Fixed — the type is ParameterStoreId, not ParameterID.

Changes made for Pathfinder V5 PC's.

Split into two methods: DetectParameterStoreChanges (reads current vs incoming, returns diffs) and WriteParameterStoreOverrides (writes to install override file) Order in PerformInstall: Detect changes before file copy, write overrides after file copy This way the zip can't overwrite our install override, and the new base + new DLL (with the ToDictionary fix) will be on disk when the app restarts

Fixed — needs .Changes.Count since ParameterStoreChangeSet wraps the list. Try rebuilding.

Changes made for Pathfinder V5 PC's.

Added ParameterStoreTransferred boolean property on ConfigurationOverrides class so it serializes properly through normal save/load DetectParameterStoreChanges checks the install override for the flag — if true, it logs and skips WriteParameterStoreOverrides sets the flag to true after a successful transfer So the first update on an old machine migrates the tuned values; every subsequent update sees the flag and leaves things alone.

Changes made for Pathfinder V5 PC's.

Scenario Behavior Has differences Writes individual ParameterStore overrides + sets flag No differences Writes only the flag (empty Overrides) No PSL in base file Writes only the flag No selected config Returns null, nothing written Base ConfigurationStore not found Returns null, nothing written Already transferred (flag = true) Returns null, nothing written The "no differences" and "no PSL in base" cases now self-mark as transferred so subsequent updates skip the comparison entirely. The truly missing prerequisite cases (no selected config, no base store) still skip — those will retry on next update, which is correct because they may become valid later.

Changes made for Pathfinder V5. PC's.

If AreUpdatesAvailable completes before ShowDialog() (which is likely since the check is fast when there are no packages), the callback fires while the dialog handle doesn't exist yet. With my DialogBase.Invoke fix, the Invoke is silently dropped — so the dialog never gets StopProgress or AskQuestion called on it. Result: dialog opens and spins forever with no way to dismiss it except cancel.

The fix is to reorder: create the dialog and force its handle to be created before starting the async work.

Reordered: Create the dialog and access .Handle to force handle creation before BeginInvoke. This guarantees the dialog can receive Invoke calls when the callback fires. Race window closed: Now UpdateCallback will always find a valid handle, so it can call StopProgress or AskQuestion properly — no more infinite spinner. Combined with the earlier DialogBase.Invoke guard, the dialog flow should be solid: handle exists when callback fires (normal case), and even if there's some bizarre timing edge case, the guard prevents a crash.

Changes made for Pathfinder V5 PC's.

Rev F. - V4.04.26 Rev G. - V5.00.25

Changes made for Pathfinder V5 PC's.

The flow now:

Before copy: DetectParameterStoreChanges finds the diffs, saves them to a temp file in %TEMP% Copy: Zip overwrites everything — new DLL with ToDictionary fix lands on disk After copy: Reads the temp file, writes individual ParameterStore entries into the install override (safe because new DLL is now in place), sets the ParameterStoreTransferred flag, deletes the temp file Only the actual differences end up in the install override, and it's all compatible with the new DLL.

Changes made for Pathfinder V5 PC's.

Not static — but our method is public static and the helpers it calls are already private static. Should be fine.

Here's the summary of the new approach:

Flow:

Old build's Maintenance.exe creates a backup zip (already happens), copies new files, restarts New Pathfinder starts ? ApplicationManager.Start() calls MaintenanceTool.MigrateParameterStoreFromBackupIfNeeded() Checks ParameterStoreTransferred flag — if set, skips Opens the most recent backup zip, extracts the old base ConfigurationStore Compares its ParameterStoreList against the current (post-update) base on disk Writes only the individual diffs into the install override Sets ParameterStoreTransferred = true Config loads normally with overrides applied Why this works: All comparison and writing happens in the new Pathfinder code (with the ToDictionary fix). The update process is completely untouched — old or new Maintenance.exe, doesn't matter.

Changes made for Pathfinder V5 PC's.

This is a pre-existing race — the thread in PerformAction starts and calls AppendLine before Application.Run(_form) has pumped messages and created the handle. Our changes didn't cause it but it's been lurking. The guard skips the append if the handle isn't ready yet (you might miss a log line or two at the start, but no crash).