✈️ FPL Validation Design Document

EventFplSvc — ICAO Flight Plan Validation Engine
Based on source analysis of EventFplSvc (.NET/C#) and ICAO PANS-ATM Appendix 2
R-SYS s.r.o. — Author: Peter Kotian

1. System Overview

The EventFplSvc is a .NET microservice that validates ICAO flight plans (FPL) according to PANS-ATM Appendix 2 rules. It operates as part of a larger Air Traffic Management system, handling:

2. Architecture

Key Components

ComponentFileResponsibility
FplValidateJobJobs/FplValidateJob.csMain validation orchestrator — coordinates all field checks
RegexCheckerValidation/RegexChecker.csCentralized regex pattern matching with timeout protection
OtherInfoCheckerValidation/OtherInfoChecker.csF18 indicator parsing and validation
FlightRouteCheckerValidation/FlightRouteChecker.csRoute string parsing and validation (F15e)
SupplementaryInfoCheckerValidation/SupplementaryInfoChecker.csF19 supplementary data validation
ValidationConfigValidation/ValidationConfig.csConfiguration: project variant, limits, feature flags
ValidationSelectionValidation/ValidationSelection.csSelective validation — choose which fields to validate
AisGisClientValidation/AisGisClient.csExternal AIS/GIS interface for aerodrome and route verification
PatternChecker(Comm library)Shared ASCII pattern checking, enum parsing utilities

Data Models

ModelPurpose
FplValidateStrongly-typed FPL model (uses enums — throws on invalid values)
FplValidateWeakWeakly-typed model (uses strings instead of enums — allows meaningful error messages for invalid values)
EquipmentCOM/NAV (F10a), SSR (F10b), ADS (F10c) equipment
CruisingSpeedSpeed unit + value (F15a/b)
FlightLevelLevel unit + value (F15c/d)
SupplementaryInfoF19 endurance, persons, survival, dinghies, PIC, etc.
AdditionalInfoPilot/sender contact details
ListMessagesCollects errors and warnings with message codes

3. Validation Flow

FplValidateJob.Validate(fpl, customSelection, ct) │ ├─ Clear() — reset state │ ├─ Pre-parse F18 — OtherInfoChecker.Check() │ Parse indicators from F18 other info text │ Store in dictIndicators for cross-checks later │ ├─ F7 Aircraft ID ─── ^[A-Z0-9]{1,7}$ ├─ F8a Flight Rules ─── I | V | Y | Z ├─ F8b Flight Type ─── S | N | G | M | X ├─ F9a Number of Aircraft ─── 2–99 (if present) ├─ F9b Aircraft Type ─── ^[A-Z][A-Z0-9]{1,3}$ │ ├─ ZZZZ → must have TYP/ in F18 │ ├─ not ZZZZ → must NOT have TYP/ in F18 │ └─ not special → DB lookup for WTC verification ├─ F9c Wake Turbulence ─── L | M | H | J (+ DB cross-check) │ ├─ F10a COM/NAV Equipment ─── regex + Y/Z cross-checks ├─ F10b SSR Equipment ─── regex + mutual exclusion (I,P,X) ├─ F10c ADS Equipment ─── regex (if SSR has ADS indicators) │ ├─ F13b EOBT ─── time window: [latestEobt, earliestEobt] ├─ F15a Speed Unit ─── K | N | M ├─ F15b Speed Value ─── 3 or 4 digits (M=3, K/N=4) ├─ F15c Flight Level Unit ─── F | A | S | M | VFR ├─ F15d Flight Level Value ─── 3 digits (F/A) or 4 digits (S/M) │ ├─ F15e Route ─── full or basic check │ ├─ HU variant: basic check only │ ├─ AIS/GIS route validation (if enabled) │ └─ Local regex-based route parsing (fallback) │ ├─ F13a ADEP ─── 4-char ICAO code or ZZZZ/AFIL ├─ F16a ADES ─── 4-char ICAO code or ZZZZ ├─ F16b Total EET ─── must be > 0 ├─ F16c ALT Aerodrome ─── 4-char ICAO code or ZZZZ ├─ F16d 2nd ALT Aerodrome ─── 4-char ICAO code or ZZZZ │ ├─ F18 Other Info ─── indicator validation + cross-checks │ ├─ PBN vs F10a cross-check │ ├─ EET required if crossing FIR boundaries │ ├─ STAYINFO required if route has STAY markers │ ├─ RMK/PHONE mandatory (configurable) │ └─ OPR mandatory (configurable) │ ├─ F19 Supplementary Info ─── endurance, persons, PIC, survival, etc. │ └─ Additional Info ─── pilot/sender contact validation Result: errors.Count == 0 → valid Result: errors.Count > 0 → invalid (errors + warnings returned)

4. Field-by-Field Validations

F7
Aircraft Identification
F8a
Flight Rules
F8b
Type of Flight
F9a
Number of Aircraft
F9b
Type of Aircraft
F9c
Wake Turbulence Category
F10a
COM/NAV Equipment
F10b/c
SSR & ADS Equipment
F13a
Departure Aerodrome
F13b
EOBT (Estimated Off-Block Time)
F15a/b
Cruising Speed
F15c/d
Cruising Level
F15e
Route
F16a
Destination Aerodrome
F16b
Total Estimated Elapsed Time
F16c/d
Alternate Aerodromes
F19
Supplementary Information

5. Cross-Field Checks

CheckFieldsRule
CROSS PBN ↔ Equipment F10a ↔ F18 If R in F10a → must have PBN/ in F18 (max 8 items). Each PBN marker (B1–T2) requires specific F10a indicators (D, G, I, O, S).
CROSS Type ↔ TYP/ F9b ↔ F18 If F9b = ZZZZ → must have TYP/ in F18. If F9b ≠ ZZZZ → must NOT have TYP/.
CROSS ADEP ↔ DEP/ F13a ↔ F18 If ADEP = ZZZZ/AFIL → must have DEP/ in F18 with LAT/LON coordinates. If normal ICAO code → must NOT have DEP/.
CROSS ADES ↔ DEST/ F16a ↔ F18 If ADES = ZZZZ → must have DEST/ in F18 with LAT/LON coordinates. If normal ICAO code → must NOT have DEST/.
CROSS ALTN ↔ ALTN/ F16c/d ↔ F18 Each ZZZZ alternate requires a corresponding LAT/LON coordinate pair in F18 ALTN/.
CROSS Z ↔ COM/DAT/NAV F10a ↔ F18 If Z in F10a → must have COM/, DAT/, or NAV/ in F18.
CROSS EXM833 ↔ Equipment F18 ↔ F10a If COM/EXM833 in F18 → Z required in F10a, Y forbidden.
CROSS Flight Rules ↔ Level F8a ↔ F15c IFR or Y flight rules cannot use VFR flight level.
CROSS Flight Rules ↔ Route F8a ↔ F15e Y rules → route must contain VFR. Z rules → route must contain IFR.
CROSS EET ↔ FIR crossing F18 ↔ F13a/F16a If VFR and ADEP/ADES in different countries (first 2 chars differ) → EET/ required in F18.
CROSS Endurance ↔ EET F19a ↔ F16b Endurance must be ≥ Total EET (except for GLID aircraft type).
CROSS WTC ↔ Database F9c ↔ IBAF DB Wake turbulence category cross-checked with aircraft type database lookup.
CROSS STAYINFO F15e ↔ F18 If route contains STAY markers → STAYINFO required in F18.

6. F18 Other Information Indicators

F18 is a free-text field containing structured indicators in the format INDICATOR/value. The system parses these indicators and validates both their syntax and cross-references with other fields.

IndicatorDescriptionValidation
STS/Flight status (FFR, HOSP, MEDEVAC, SAR, STATE, etc.)Valid status values, affects Y-mandatory exemption
PBN/PBN capabilitiesMax 8 items, cross-checked with F10a equipment
NAV/Navigation equipment detailsRequired if Z in F10a
COM/Communication equipment detailsRequired if Z in F10a, EXM833 special handling
DAT/Data link equipmentRequired if Z in F10a
TYP/Aircraft type (for ZZZZ)Required iff F9b = ZZZZ
DEP/Departure aerodrome (for ZZZZ/AFIL)Required iff F13a = ZZZZ/AFIL, must have LAT/LON
DEST/Destination aerodrome (for ZZZZ)Required iff F16a = ZZZZ, must have LAT/LON
ALTN/Alternate aerodromes (for ZZZZ)LAT/LON count must match ZZZZ alternates count
EET/Estimated elapsed time at FIR boundariesRequired if VFR crossing FIR boundaries
RMK/RemarksPHONE mandatory (configurable)
OPR/OperatorMandatory (configurable)
DOF/Date of flightNOT allowed (rejected)
EUR/European indicatorPROTECTED value handling
ORGN/OriginatorSyntax check
REG/RegistrationSyntax check
SEL/SELCAL codeSyntax check
RALT/En-route alternateAerodrome code syntax
TALT/Take-off alternateAerodrome code syntax
RIF/Reclearance in flightSyntax check
RVR/RVR valueNumeric
CODE/Mode S codeHex format
DLE/Delay en-routeSyntax check
STAYINFOStay informationRequired if route has STAY markers

Indicator Parsing Rules

7. External Validation (AIS/GIS)

When enabled, the system calls an external AIS/GIS SOAP service for enhanced validation:

Aerodrome Validation (AisGisAdValidation)

Route Validation (AisGisRouteValidation)

Implementation: AisGisClient connects via SOAP/WCF to the configured AisGISInterfaceURL.

8. Configuration

ParameterDefaultDescription
ProjectVersionCountry variant: SK, HU, PL, NL
F10_Y_Mandatory8.33 kHz equipment: NO / IFR / YES
OherInfoOprMandatoryfalseF18 OPR/ indicator mandatory
OherInfoRmkPhoneMandatoryfalseF18 RMK/ must contain phone number
PicPhoneMandatoryfalseF19 PIC must contain phone number
AddInfoPilotTelMandatoryfalseAdditional info pilot telephone mandatory
AisGisAdValidationfalseEnable AIS/GIS aerodrome validation
AisGisRouteValidationfalseEnable AIS/GIS route validation
VfrRouteFirstLastDCTfalseVFR routes must start and end with DCT
SpecialArcTypesCSV list of special aircraft types (GLID, balloons, etc.)
LATEST_IFR_EOBT1HLatest time to file before IFR EOBT
LATEST_VFR_EOBT1HLatest time to file before VFR EOBT
EARLIEST_IFR_EOBT120HEarliest time to file before IFR EOBT
EARLIEST_VFR_EOBT120HEarliest time to file before VFR EOBT
EmailRegex for email validation
PhoneNrRegex for phone number validation
ConnStringIbafSQL Server connection for aircraft type DB
AisGISInterfaceURLSOAP endpoint for AIS/GIS service

EOBT Time Format

Uses PHP DateInterval-like syntax: 30M = 30 min, 1H = 1 hour, 1H30M = 90 min.

9. Project Variants

VariantDifferences
SK (Slovakia)
  • EOBT warning if filed too close (instead of error)
  • Full route validation with AIS/GIS
HU (Hungary)
  • Basic route checks only (no full parsing)
  • Simplified Y/Z flight rules check on route
PL (Poland)
  • EOBT warning if filed too close (same as SK)
  • Full route validation
NL (Netherlands)
  • EOBT warning if filed too close (same as SK/PL)
  • Full route validation

10. Error Message Catalog

CodeFieldMessageType
FplFormErr_arcidF7Invalid Aircraft IdentificationERROR
FplFormErr_frF8aInvalid Flight RulesERROR
FplFormErr_fr_flvlvF8aFlight Rules not compliant with VFR Flight LevelERROR
FplFormErr_fltypeF8bInvalid Type of FlightERROR
FplFormErr_numberAcsF9aInvalid Number of AircraftsERROR
FplFormErr_atypeF9bInvalid Type of AircraftERROR
FplFormErr_wtcF9cInvalid Wake Turbulence CategoryERROR
FplFormErr_equip1F10aInvalid EquipmentERROR
FplFormErr_equip1_ZReqF10aZ is requiredERROR
FplFormErr_equip1_YReqF10aY is requiredERROR
FplFormErr_equip1_exm833F10aEXM833 exemption: Y not allowedERROR
FplFormErr_equip2F10bInvalid SSR EquipmentERROR
FplFormErr_equip2_IPXF10bI, P, X mutually exclusiveERROR
FplFormErr_equip2_EHLSF10bI/P/X excludes E,H,L,SERROR
FplFormErr_equip3F10cInvalid ADS EquipmentERROR
FplFormErr_adep_invalidF13aInvalid Departure AerodromeERROR
FplFormErr_eobdt_invalidF13bInvalid EOBTERROR
FplFormErr_eobdt_betweenF13bEOBT must be between {0}, {1}ERROR
FplFormErr_eobdt_leastF13bFPL should be filed at least {0} before EOBTWARN
FplFormErr_speedm_invalidF15aInvalid Cruising Speed TypeERROR
FplFormErr_speedv_invalidF15bInvalid Cruising Speed ValueERROR
FplFormErr_flvlm_invalidF15cInvalid Flight Level TypeERROR
FplFormErr_flvlv_invalidF15dInvalid Flight Level ValueERROR
FplFormErr_routeTxt_*F15eVarious route errorsERROR
FplFormErr_ades_invalidF16aInvalid Destination AerodromeERROR
FplFormErr_teet_invalidF16bInvalid Total EETERROR
FplFormErr_altad_invalidF16cInvalid 1st Alternate AerodromeERROR
FplFormErr_alt2ad_invalidF16dInvalid 2nd Alternate AerodromeERROR
FplFormErr_otherTxt_*F18Various F18 indicator errorsERROR
FplFormErr_supl*F19Various supplementary info errorsERROR
FplFormErr_addInfo*AddVarious additional info errorsERROR
FplFormWarn_adep_NoGisValF13aADEP cannot be validated to GISWARN
FplFormWarn_ades_NoGisValF16aADES cannot be validated to GISWARN
FplFormWarn_altAd_NoGisValF16c/dAlternate cannot be validated to GISWARN

Generated from source analysis of EventFplSvc by R-SYS s.r.o. and ICAO PANS-ATM Appendix 2 (Doc 4444).

Document version: 2026-03-06 | Arnold @ aidrill.net