The Agent only opened the on-screen passcode splash when IsMachineConfigured() was false (Ethernet adapter on DHCP). But during SecureConfig the Service assigns a TEMPORARY static IP to the adapter so it can broadcast — which flips IsMachineConfigured() to true. So an Agent starting at auto-login (in the SecureConfig wait window) saw a "configured" adapter and skipped the splash entirely; the Request ID / Passphrase only reached the log and the COM2 plasma display, never the screen. Gate the splash on the configuring.json file the Service writes (before the temp IP) as well as the DHCP check, and make the splash dismiss robustly when SecureConfig finishes (file gone after being seen, or the machine becomes configured). The COM2 plasma path in the Service was already correct. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
TeslaLauncher
.NET 8 (win-x64, self-contained) rewrite of the original Elsewhen Studios LLC software (Windows 2000 / .NET Framework 2.0).
Architecture
TeslaLauncher has three components that work together:
TeslaLauncherService (Windows Service, Session 0)
- Runs at boot before any user logs in
- Listens on TCP 53290 for OFB-encrypted framed-JSON RPC from TeslaConsole
- Forwards commands to the Agent via Named Pipe (
TeslaLauncherIPC) - Handles first-boot network configuration (SecureConfig)
- Handles game file transfers from the Console (InstallProduct)
TeslaLauncherAgent (WinForms tray app, user session)
- Runs in the logged-in user's desktop session
- Executes commands that require desktop access: launching/killing apps, volume control
- Manages
LaunchApps.xml(installed games registry) - On first boot, displays SecureConfig Request ID and Passphrase
SecureConfig (first-boot protocol)
- Assigns a temporary IP and broadcasts a UDP beacon so the Console can discover the pod
- Operator reads the Passphrase off the pod screen and enters it into the Console
- Console sends AES-encrypted network configuration (IP, mask, gateway, DNS, hostname)
- TCP handshake establishes an OFB-encrypted session with RSA key exchange
- Session key is saved for all subsequent Console connections
Communication Flow
TeslaConsole ──TCP 53290 (OFB + framed JSON)──> TeslaLauncherService
│
Named Pipe (JSON)
│
v
TeslaLauncherAgent
Files
| File | Description |
|---|---|
TeslaLauncherService.cs |
Windows Service implementation |
TeslaLauncherService.csproj |
Service project (net8.0-windows, x64, self-contained) |
TeslaLauncherAgent.cs |
Userspace Agent implementation |
TeslaLauncherAgent.csproj |
Agent project (WinForms, net8.0-windows, x64) |
LaunchModels_Shared.cs |
Service↔Agent IPC types (Tesla.Launcher.Shared). Wire types (Tesla.Net) now come from ../Contract/Tesla.Contract.csproj |
SecureConfig.cs |
First-boot secure configuration protocol |
build.bat |
Builds both components |
install.bat |
Installs on a cockpit PC (run as Administrator) |
Building
Requirements:
- .NET 8 SDK
- Internet access for NuGet restore (first build only)
build.bat :: build both components + assemble the package
build.bat /service :: build Service only
build.bat /agent :: build Agent only
Output goes to TeslaLauncher\ with Service\ and Agent\ subdirectories plus
install.bat. The projects are published in place (self-contained, single-file,
win-x64) — they reference ../Contract, so they cannot be staged into a temp
folder. No .NET runtime is required on the target pod.
Installation
- Copy the
TeslaLauncher\folder to each cockpit PC - Run
TeslaLauncher\install.batas Administrator
The installer:
- Registers the Service (delayed auto-start)
- Configures the Agent for auto-login startup
- Installs OpenAL and DirectX runtimes
- Enables SMB1 file sharing
- Creates
C:\Gameswith appropriate permissions - Resets network adapters to DHCP for SecureConfig
First Boot
- Cockpit boots with DHCP (unconfigured state)
- Service runs SecureConfig: broadcasts beacon, displays codes on screen
- Console operator sees the pod's Request ID and enters the Passphrase
- Console sends encrypted network configuration
- Pod applies the configuration and is ready for normal operation
Normal Operation
The Console connects to each configured pod on TCP 53290 and can:
- Install/uninstall simulation games
- Launch/kill applications
- Get/set volume level
- Query pod status (FullUpdate)
- Shutdown or reboot the pod
Key Paths
| Path | Purpose |
|---|---|
C:\ProgramData\TeslaLauncher\TeslaKeyStore.key |
Session key (32 bytes) |
C:\ProgramData\TeslaLauncher\LaunchApps.xml |
Installed games registry |
C:\ProgramData\TeslaLauncher\configuring.json |
Transient: SecureConfig codes for Agent display |
C:\Games\ |
Game installation directory |
Wire Protocol
The Console talks to the Service with length-prefixed System.Text.Json frames
over the OFB-encrypted TCP stream (dispatch by method name) — see
../Contract/PodRpcProtocol.cs, shared by both ends. This replaced the original
BinaryFormatter + serialized-MethodBase scheme. The Tesla.Net wire types now
live in ../Contract/Tesla.Contract.csproj, the single source of truth shared with
the Console.
The Service-to-Agent IPC uses length-prefixed JSON over a Named Pipe, with flat types that avoid the nested struct layout of the wire format.