Parse Annex 2B mandatory arrival routings and repair the best few
candidates (not just the lowest-error one):
- core::rad: MandatoryArr + RadData.mandatory_arr +
mandatory_arr_transitions(ades) -> allowed point-sequences.
- rad crate: parse_mandatory_arr() (VIA-clauses in NOT-AVBL-EXC rows,
scoped to ARR airports). via_sequences() now scans all parenthesised
transition groups (contain DCT/airway), not just contiguous "VIA (",
because sub-option markers separate them ("VIA i) (KARDU DCT KALMO)").
rad-tool `manarr [ADES]`. LIML now yields KARDU KALMO etc.
- discover: "manarr" candidates route to the transition's on-airway
anchor then splice the (often off-airway) transition points in via DCT.
- attempt_once repairs the top-2 candidates and keeps the best result:
the lowest-raw-error candidate isn't always the most repairable (a
mandate-satisfying route may carry more mechanical errors than a route
stuck on an unfixable mandatory).
Collapses the dense-FRA near-misses: EGLL-EDDM 7->1 err, EDDF-LIRF 3->1
(mandatory PROF205 resolved; residual is a single ROUTE49). Coverage 6/10,
no regression (passing pairs short-circuit on accept). 49 tests green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
flightplanner
Outil de flight planning local et offline pour la simulation de vol
(MSFS / P3D / X-Plane), dans l'esprit de PFPX en plus simple. Aucune dépendance
cloud : navdata X-Plane importée en base SQLite locale, routing par réseau
d'airways, plan carburant, export .pln / .fms / OFP texte.
État : MVP en construction. Voir
TODO.mdpour l'avancement, etIDEAS.mdpour la vision produit long terme (briefing complet type SkyNexus/SimBrief : météo, NOTAM, carte enroute, charts…).
Architecture
Workspace Cargo à deux crates :
| Crate | Rôle |
|---|---|
flightplanner-core |
Logique métier : parsing navdata, base SQLite, routing, perf, export |
flightplanner-cli |
Binaire flightplanner (interface clap) |
Une interface web locale (Axum) pourra s'ajouter plus tard sans toucher au cœur.
Prérequis
- Rust stable (toolchain MSVC sous Windows) — https://rustup.rs
- Un compilateur C :
rusqliteest utilisé en modebundled(SQLite compilé depuis la source). Sous Windows, installer les Visual Studio Build Tools (workload « Développement Desktop en C++ »).
Récupérer la navdata X-Plane (gratuit)
L'outil lit le format texte X-Plane. La donnée par défaut, libre, est fournie avec X-Plane 11/12 dans :
<dossier X-Plane>/Resources/default data/
Fichiers utilisés :
| Fichier | Contenu |
|---|---|
earth_fix.dat |
Waypoints / fixes |
earth_nav.dat |
Navaids (VOR, DME, NDB, ILS...) |
earth_awy.dat |
Airways (segments entre waypoints) |
Copier ces fichiers dans un dossier local, p. ex. ./navdata/ (ignoré par git).
Pour une navdata à jour (cycle AIRAC courant), une souscription Navigraph est possible, mais hors périmètre du MVP : ici on part de la donnée X-Plane gratuite, importée manuellement.
Utilisation
# 1) Importer la navdata en base SQLite locale
flightplanner import-navdata --source ./navdata/ --db flightplanner.db
# 2) Router (FL-aware si --cruise-fl ou profil avion fourni)
flightplanner route --from LFPG --to EGLL --db flightplanner.db
# 3) Route + carburant + pré-check IFPS + exports
flightplanner route --from LFPG --to EGLL --db flightplanner.db \
--aircraft A320 --cruise-fl 340 \
--check-ifps --ofp \
--pln LFPG-EGLL.pln --fms LFPG-EGLL.fms
# Pré-check IFPS d'une chaîne de route arbitraire
flightplanner ifps-check --route "LFPG DCT PON UT300 ... MODMI DCT EGLL" --fl 340 --db flightplanner.db
Aéroports : les coordonnées viennent des seuils de piste des fichiers
CIFP/<ICAO>.dat. Pour router au-delà de la paire testée, extraire tout le dossierCIFP/de l'archive navdata dans./navdata/CIFP/avant l'import.
Check IFPS : le
--check-ifpsest un pré-check local best-effort (non officiel). Un vrai check IFPS fiable nécessite un validateur online (Autorouter / Eurocontrol NM) — voirIDEAS.md.
Développement
cargo build
cargo test
cargo fmt && cargo clippy
Licence
MIT OR Apache-2.0. La navdata X-Plane est soumise à sa propre licence et n'est pas redistribuée dans ce dépôt.