Auto-install Lua, smooth all panels, airspace overlay + launcher region picker
FlyWithLua auto-install: bridge drops fms-sync/ui-sync/terrain-probe into X-Plane's FlyWithLua Scripts dir on startup and self-updates (content-compare). Graceful when no X-Plane / no FlyWithLua. /api/lua/install + status in health. Desktop app bundles the scripts and passes LUA_SRC_DIR to the sidecar. Smoothing: shared useEased/useEasedAngle hook (api/ease.js) with render-bail on settle. VFR steam gauges now interpolate to 60fps instead of stepping at the ~10Hz value stream. MFD ownship no longer vibrates — position/heading eased in a single rAF loop, follow-pan without animated-panTo pile-up (pauses on range zoom). Airspace overlay: server/airspace.js loads per-region GeoJSON, classifies (B/C/D/TMA/CTR/MOA/Restricted/Prohibited/Danger), bbox query, and downloads regions on demand — FAA (US, key-free) and OpenAIP (Europe, user key). New AIRSPACE softkey draws chart-coloured boundaries (B blue, C magenta, D dashed), non-interactive so map-clicks still drop waypoints. Launcher gains a "Lufträume" section to pick/download regions via the running bridge. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+29
-3
@@ -11,10 +11,12 @@ import http from 'node:http';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { CONFIG, DATAREFS, WRITABLE_DATAREFS, COMMANDS } from './config.js';
|
||||
import { loadNavData, search as navSearch, navStatus, nearest as navNearest, bbox as navBbox, runwaysNear as navRunways, airwaysBbox as navAirways } from './navdata.js';
|
||||
import { loadNavData, search as navSearch, navStatus, nearest as navNearest, bbox as navBbox, runwaysNear as navRunways, airwaysBbox as navAirways, xplaneRoot } from './navdata.js';
|
||||
import { parseProcedures, procedureLegs as procLegs } from './procedures.js';
|
||||
import * as fp from './flightplan.js';
|
||||
import { pushToSim, startFmsSync, startTerrainSync } from './fmssync.js';
|
||||
import { installLuaScripts } from './luainstall.js';
|
||||
import { loadAirspace, airspaceBbox, airspaceStatus, regionList, installRegion } from './airspace.js';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
// WEB_DIST can be overridden (e.g. the desktop app points it at the cockpit
|
||||
@@ -34,6 +36,7 @@ const state = {
|
||||
cmdNameToId: new Map(), // sim/... -> id
|
||||
xpSocket: null,
|
||||
reqId: 1,
|
||||
lua: null, // last FlyWithLua-install report (see luainstall.js)
|
||||
};
|
||||
|
||||
const clients = new Set(); // connected browser sockets
|
||||
@@ -211,8 +214,14 @@ const app = express();
|
||||
// by design, so a wildcard here is harmless and keeps tablets/the app simple.
|
||||
app.use('/api', (_req, res, next) => { res.set('Access-Control-Allow-Origin', '*'); next(); });
|
||||
app.get('/api/health', (_req, res) =>
|
||||
res.json({ xpConnected: state.xpConnected, datarefs: state.drefIdToAlias.size, clients: clients.size, nav: navStatus() })
|
||||
res.json({ xpConnected: state.xpConnected, datarefs: state.drefIdToAlias.size, clients: clients.size, nav: navStatus(), lua: state.lua })
|
||||
);
|
||||
// Re-run the FlyWithLua companion install on demand (e.g. after installing
|
||||
// FlyWithLua, or to push a freshly edited script without restarting the bridge).
|
||||
app.post('/api/lua/install', (_req, res) => {
|
||||
state.lua = installLuaScripts(xplaneRoot(), log);
|
||||
res.json(state.lua);
|
||||
});
|
||||
// Waypoint / navaid / airport search from X-Plane's own nav database.
|
||||
app.get('/api/nav/search', (req, res) => res.json(navSearch(req.query.q || '', 25)));
|
||||
// NEAREST airports/navaids to a point (NRST page).
|
||||
@@ -228,6 +237,19 @@ app.get('/api/nav/bbox', (req, res) =>
|
||||
app.get('/api/nav/airways', (req, res) =>
|
||||
res.json(navAirways(+req.query.s, +req.query.w, +req.query.n, +req.query.e, +req.query.limit || 500))
|
||||
);
|
||||
// Airspace polygons inside a map window — for the MFD AIRSPACE overlay. Data
|
||||
// comes from region GeoJSON files the user installs via the launcher (X-Plane
|
||||
// ships none). See server/airspace.js.
|
||||
app.get('/api/airspace/bbox', (req, res) =>
|
||||
res.json(airspaceBbox(+req.query.s, +req.query.w, +req.query.n, +req.query.e, +req.query.limit || 400))
|
||||
);
|
||||
// Available airspace regions + how many features of each are installed.
|
||||
app.get('/api/airspace/regions', (_req, res) => res.json({ regions: regionList(), status: airspaceStatus() }));
|
||||
// Download + install a region's airspace (FAA US is key-free; OpenAIP needs key).
|
||||
app.post('/api/airspace/install', express.json(), async (req, res) => {
|
||||
const r = await installRegion(req.body?.region, { apiKey: req.body?.apiKey, log });
|
||||
res.json(r);
|
||||
});
|
||||
// Runways near a point — drawn in the PFD synthetic-vision view.
|
||||
app.get('/api/nav/runways', (req, res) =>
|
||||
res.json(navRunways(+req.query.lat, +req.query.lon, +req.query.radius || 12))
|
||||
@@ -342,7 +364,11 @@ function startDemo() {
|
||||
server.listen(CONFIG.bridgePort, CONFIG.bridgeHost, () => {
|
||||
log(`Bridge UI: http://${CONFIG.bridgeHost}:${CONFIG.bridgePort}`);
|
||||
log(`On tablets: http://<this-PC-LAN-IP>:${CONFIG.bridgePort}`);
|
||||
loadNavData(); // async; FMS resolves idents once ready
|
||||
loadNavData(); // async; FMS resolves idents once ready (sets root synchronously)
|
||||
// Drop the FlyWithLua companion scripts into the sim so the user never copies
|
||||
// files by hand; keeps the installed copies up to date on every start.
|
||||
state.lua = installLuaScripts(xplaneRoot(), log);
|
||||
loadAirspace(log); // installed region GeoJSON → /api/airspace/bbox overlay
|
||||
// FMS two-way sync (Sim → App): adopt plans built/edited in the real G1000
|
||||
startFmsSync({
|
||||
getPlan: () => fp.getPlan(),
|
||||
|
||||
Reference in New Issue
Block a user