Settings -> Enable Custom Bitmaps was a static bool with no backing store: it defaulted to off on every launch, so an operator had to re-tick it each session and any custom plasma art was silently ignored until they did. New ConsoleSettings persists machine-level menu toggles as XML in %ProgramData%\Tesla Console\console.settings, alongside RPDefaults.rpd / BTDefaults.btd / local.siteconfig. It is loaded once from Main and never from a static initializer: the differential suite drives PlasmaBitmaps directly and must keep seeing the original defaults rather than whatever this machine has saved. A missing file is the first-run case; a corrupt one is ignored and rewritten by the next toggle, because losing a menu setting must never stop the console starting. Custom art is now version-controlled and rolls with the release. New Console\Plasma Images\ is copied into the package, and the lookup searches %ProgramData%\Tesla Console\Plasma Images first and the exe-relative folder second, so a release can never clobber a site's own name bitmaps. install.bat creates the data-dir folder before the icacls grant so an unelevated operator can write it. Ships with three 128x32 name bitmaps (Deadmeat, Muerte, Phrogg); Muerte arrived as "Muerte_128x32-2.bmp", a name the lookup can never build, so it is renamed to match its pilot. Two fixes fell out of making the flag sticky. Path.Combine ran on the raw participant name outside the try block, so with the option on a pilot named "A:B" threw ArgumentException straight out of egg generation; names that cannot be a Windows file name now just render procedurally. And the art was loaded with Image.FromFile, which keeps the bitmap backed by the file and locked for its whole lifetime — it is copied out through a stream now, so art can be swapped between missions without restarting the console. Verified against the built net40 exe: all three shipped bitmaps resolve by pilot name, ProgramData wins over the shipped copy, a wrong-size file is ignored, an illegal-character name does not throw, the file is not left locked, and the settings round-trip and corrupt-file tolerance both hold. Diff suite 106/106. Version bumped 4.11.4.4 -> 4.11.4.5 across Console, Launcher, vPOD, the install/build banners, the diff-suite version assertion and the README's latest-release pointer. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
5.1 KiB
TeslaSuite
The Tesla cockpit-pod software, in one repository:
| Folder | What it is | Target |
|---|---|---|
Console/ |
TeslaConsole — the operator console (WinForms) that configures and drives the pods. A decompiled reconstruction of the original TeslaConsole.exe (now the modernized 4.11.4.x line), with a differential test suite pinning it to the original 4.11.3.37076 baseline. |
.NET Framework 4.0 |
Launcher/ |
TeslaLauncher — the pod-side launcher: ONE userland tray app (RPC listener + app launcher). A clean rewrite of the original; the old Service+Agent split (a Session 0 workaround) is gone. | .NET Framework 4.0 |
Contract/ |
Tesla.Contract — the shared Console↔Launcher RPC contract: wire types, the client, and the framed-JSON protocol. Emits assembly TeslaConsoleLaunchLib. |
.NET Framework 4.0 |
SecureConfig/ |
Tesla.SecureConfig — the first-boot pod provisioning protocol (UDP beacons, OFB crypto, RSA key exchange). Emits assembly TeslaSecureConfiguration. |
.NET Framework 4.0 |
vPOD/ |
vPOD — a virtual pod for testing the consoles without cockpit hardware: impersonates both the game client (Munga, TCP 1501) and the pod's TeslaLauncher (provisioning + Site Management / Install Product on TCP 53290). | .NET Framework 4.0 |
Everything targets net40 on purpose (the XP11 port, v4.11.4.3): it is the newest
.NET Framework that installs on Windows XP SP3, and net40 assemblies run in-place on
the 4.8 runtime that ships in Windows 10/11 — so the same binaries cover the original
XP-era cockpit PCs and modern hardware. That rules out net45+ APIs
(System.Text.Json, ZipFile, async/await, ...); JSON is Newtonsoft, zip extraction
is the launcher's own MiniZip.cs.
The console and launcher talk over TCP 53290 using length-prefixed JSON
frames over an OFB-encrypted stream (Contract/PodRpcProtocol.cs),
dispatched by method name. The wire contract lives in one source project
(Contract/) referenced by both sides — a single source of truth, no
duplication or hand-syncing.
Note: Red Planet game control uses a separate protocol (Munga, TCP 1501) via the vendored
Munga Net.dll— not the RPC channel above. The game itself is C++ and lives in its own repo (gitea.mysticmachines.com/VWE/RP411.git).
Building
dotnet build TeslaSuite.sln -c Release
dotnet test Console/tests/TeslaConsole.DiffTests # differential + protocol + crypto guards
Pod deployment: Launcher/build.bat publishes the
framework-dependent net40 package into Launcher/dist/ — the launcher itself is tiny,
but the package bundles the pod redists (DirectX June 2010, OpenAL, UltraVNC, and
dotNetFx40_Full_x86_x64.exe for XP-era pods that don't have .NET 4.0 yet).
Launcher/install.bat deploys it on a cockpit PC — dual-OS
(XP SP3 and Win10/11 code paths): auto-login, Run-key registration for the single
launcher binary, firewall + box hardening. The operator console packages
the same way: Console/build-package.bat → Console/dist/,
installed with Console/install.bat. vPOD packages with
vPOD/pack.ps1 → vPOD/dist/vPOD.zip, deployable to a pod via the
console's Install Product (or run directly on any machine).
Release packages for all three are attached to the Gitea releases (latest: v4.11.4.5).
Layout notes
Console/original/TeslaConsole.exe— the 4.11.3.37076 reference baseline the differential tests compare against. Keep it.Console/lib/*.dll— the remaining vendored binary dependencies (Munga Net,BitmapLibrary,WeifenLuodocking). The originalTeslaConsoleLaunchLib.dllandTeslaSecureConfiguration.dllare also kept here, but only as byte-compatibility test baselines — both are now built from source (Contract/,SecureConfig/).Console/RedPlanet/Apps.xml— the data-driven product catalog (see the console's Site Management → Add Product / Register Product on Pods).
History
The system was modernized in 2026: the duplicated wire contract was extracted to a single
source project, BinaryFormatter (an RCE sink, and what pinned the launcher to an old
runtime) was replaced with the framed-JSON protocol, and the launcher was rebuilt — briefly
on net8/x64, then on net48, then (the XP11 port, v4.11.4.3) the whole suite settled on
net40 so one set of binaries runs on the original Windows XP SP3 cockpit hardware and
on Windows 10/11 alike. XP11 also merged the launcher's Service+Agent pair — a workaround
for Vista+ Session 0 isolation that XP never needed — back into a single userland app, and
moved the console's .resx BinaryFormatter bitmaps to raw embedded images (their runtime
reader doesn't exist on net40). The whole console↔pod path (provisioning, install, launch)
is validated on real pods; the net40 build is bench-validated on Win11's 4.8 runtime (real
XP SP3 hardware still pending).