Initial commit: X-Plane G1000 web cockpit + bridge + Tauri desktop app
- server/: Node bridge (datarefs/commands, navdata, CIFP procedures, flight plan) - web/: React cockpit (PFD/MFD/Map, VFR six-pack, AFCS, FMS CDU), PWA, collapsible sidebar - desktop/: Tauri 2 launcher (Bun sidecar, system tray, updater) + Linux build via Docker - scripts/: prep-desktop, build-linux, Gitea release + latest.json Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
# X-Plane Glass Cockpit (Web)
|
||||
|
||||
Bring X-Plane 12 instruments — a G1000-style **PFD**, an **MFD**, and an
|
||||
**autopilot** panel — to any iPad, tablet or laptop on your network. Pure web,
|
||||
no app install on the tablets. Just open a browser.
|
||||
|
||||
```
|
||||
X-Plane 12 Node bridge (this repo) your devices
|
||||
┌──────────┐ ws ┌────────────────────┐ ws/http ┌──────────┐
|
||||
│ Web API │◀──────▶│ resolves dataref │◀───────────▶│ iPad │
|
||||
│ :8086 │ REST │ IDs, streams values │ │ laptop │
|
||||
│ (local) │ │ serves the React UI │ │ phone │
|
||||
└──────────┘ └────────────────────┘ └──────────┘
|
||||
binds 0.0.0.0:8080
|
||||
```
|
||||
|
||||
## Why a bridge?
|
||||
X-Plane's built-in web server (v12.1.1+) only listens on `localhost`, dataref
|
||||
IDs change every session, and CORS blocks browsers. The bridge runs **on the
|
||||
same PC as X-Plane**, talks to it locally, and re-broadcasts everything to your
|
||||
LAN — to as many tablets as you like at once.
|
||||
|
||||
## Requirements
|
||||
- **X-Plane 12.1.1 or newer** (the web API ships built-in; nothing to enable).
|
||||
- **Node.js 18+** on the PC running X-Plane (`node --version`).
|
||||
|
||||
## Setup (run these on the X-Plane PC)
|
||||
```bash
|
||||
cd X-PLANE-MOD
|
||||
npm install # also installs the web app's deps
|
||||
npm run build # builds the React UI into web/dist
|
||||
npm start # starts the bridge on http://0.0.0.0:8080
|
||||
```
|
||||
|
||||
## Open it
|
||||
1. Make sure X-Plane is running and you're in a flight.
|
||||
2. On a tablet/laptop on the **same Wi-Fi**, open:
|
||||
`http://<PC-LAN-IP>:8080`
|
||||
- Find the IP: macOS `ipconfig getifaddr en0` · Windows `ipconfig` (IPv4).
|
||||
3. The status pill top-right shows **X-PLANE** (green) when data is flowing,
|
||||
**NO SIM** if the bridge is up but X-Plane isn't reachable, **OFFLINE** if
|
||||
the tablet can't reach the bridge.
|
||||
4. Tip: on iPad, "Add to Home Screen" → it opens full-screen like a real app.
|
||||
|
||||
## Development (hot reload)
|
||||
```bash
|
||||
npm run dev:bridge # terminal 1 — the bridge on :8080
|
||||
npm run dev:web # terminal 2 — Vite dev server with HMR (proxies to bridge)
|
||||
```
|
||||
Open the URL Vite prints. Edits to `web/src/**` reload instantly.
|
||||
|
||||
## Configuration
|
||||
All env vars are optional (defaults shown):
|
||||
| Var | Default | Meaning |
|
||||
|-----|---------|---------|
|
||||
| `BRIDGE_PORT` | `8080` | Port the UI/LAN server listens on |
|
||||
| `XPLANE_HOST` | `localhost` | Where X-Plane's web API is |
|
||||
| `XPLANE_PORT` | `8086` | X-Plane web API port |
|
||||
|
||||
## Adding instruments / datarefs
|
||||
Everything is driven by [`server/config.js`](server/config.js):
|
||||
- **`DATAREFS`** — values streamed to the UI (alias → `sim/...` name).
|
||||
- **`WRITABLE_DATAREFS`** — values the UI may set (knobs/bugs).
|
||||
- **`COMMANDS`** — buttons the UI may press (mode toggles).
|
||||
|
||||
Add a `sim/...` name there, then read `values.<alias>` in any component. For
|
||||
**G1000-specific** gauges, add that aircraft's `laminar/...` or
|
||||
`sim/cockpit2/...` datarefs the same way.
|
||||
|
||||
## Notes & limits
|
||||
- Update rate is X-Plane's (~10–20 Hz) — fine for instruments, this isn't a
|
||||
scenery stream.
|
||||
- The autopilot buttons fire X-Plane's own commands, so the sim stays the
|
||||
source of truth. Mode-highlight bits (`AP_BITS` in `AutopilotPanel.jsx`) are
|
||||
best-effort and can differ per aircraft.
|
||||
- LAN only by design. Don't expose port 8080 to the public internet.
|
||||
Reference in New Issue
Block a user