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
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:
| Component | File | Responsibility |
|---|---|---|
FplValidateJob | Jobs/FplValidateJob.cs | Main validation orchestrator — coordinates all field checks |
RegexChecker | Validation/RegexChecker.cs | Centralized regex pattern matching with timeout protection |
OtherInfoChecker | Validation/OtherInfoChecker.cs | F18 indicator parsing and validation |
FlightRouteChecker | Validation/FlightRouteChecker.cs | Route string parsing and validation (F15e) |
SupplementaryInfoChecker | Validation/SupplementaryInfoChecker.cs | F19 supplementary data validation |
ValidationConfig | Validation/ValidationConfig.cs | Configuration: project variant, limits, feature flags |
ValidationSelection | Validation/ValidationSelection.cs | Selective validation — choose which fields to validate |
AisGisClient | Validation/AisGisClient.cs | External AIS/GIS interface for aerodrome and route verification |
PatternChecker | (Comm library) | Shared ASCII pattern checking, enum parsing utilities |
| Model | Purpose |
|---|---|
FplValidate | Strongly-typed FPL model (uses enums — throws on invalid values) |
FplValidateWeak | Weakly-typed model (uses strings instead of enums — allows meaningful error messages for invalid values) |
Equipment | COM/NAV (F10a), SSR (F10b), ADS (F10c) equipment |
CruisingSpeed | Speed unit + value (F15a/b) |
FlightLevel | Level unit + value (F15c/d) |
SupplementaryInfo | F19 endurance, persons, survival, dinghies, PIC, etc. |
AdditionalInfo | Pilot/sender contact details |
ListMessages | Collects errors and warnings with message codes |
^[A-Z0-9]{1,7}$I — entire flight IFRV — entire flight VFRY — initially IFR, then changesZ — initially VFR, then changesS — scheduled air serviceN — non-scheduled air transportG — general aviationM — militaryX — other^[A-Z][A-Z0-9]{1,3}$ZZZZ → requires TYP/ in F18TYP/ in F18L — Light (≤7000kg)M — Medium (7000–136000kg)H — Heavy (≥136000kg)J — Super (A380-800, AN-225)R → must have PBN/ in F18Z → must have COM/, DAT/, or NAV/ in F18Y (8.33 kHz) — mandatory based on configN — no SSR transponder (standalone, no ADS)ZZZZ → requires DEP/ in F18 with coordinatesAFIL → airfiled flight plan (special handling)K (km/h), N (knots), M (Mach)F (flight level): 3 digits (F350)A (altitude): 3 digits (A045)S (metric level): 4 digits (S1130)M (metric altitude): 4 digits (M0840)VFR — no value (cannot be used with IFR/Y flight rules)ZZZZ → requires DEST/ in F18 with coordinatesZZZZ → requires ALTN/ in F18 with coordinates| Check | Fields | Rule |
|---|---|---|
| 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. |
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.
| Indicator | Description | Validation |
|---|---|---|
| STS/ | Flight status (FFR, HOSP, MEDEVAC, SAR, STATE, etc.) | Valid status values, affects Y-mandatory exemption |
| PBN/ | PBN capabilities | Max 8 items, cross-checked with F10a equipment |
| NAV/ | Navigation equipment details | Required if Z in F10a |
| COM/ | Communication equipment details | Required if Z in F10a, EXM833 special handling |
| DAT/ | Data link equipment | Required 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 boundaries | Required if VFR crossing FIR boundaries |
| RMK/ | Remarks | PHONE mandatory (configurable) |
| OPR/ | Operator | Mandatory (configurable) |
| DOF/ | Date of flight | NOT allowed (rejected) |
| EUR/ | European indicator | PROTECTED value handling |
| ORGN/ | Originator | Syntax check |
| REG/ | Registration | Syntax check |
| SEL/ | SELCAL code | Syntax check |
| RALT/ | En-route alternate | Aerodrome code syntax |
| TALT/ | Take-off alternate | Aerodrome code syntax |
| RIF/ | Reclearance in flight | Syntax check |
| RVR/ | RVR value | Numeric |
| CODE/ | Mode S code | Hex format |
| DLE/ | Delay en-route | Syntax check |
| STAYINFO | Stay information | Required if route has STAY markers |
INDICATOR/value (no space between indicator and slash)When enabled, the system calls an external AIS/GIS SOAP service for enhanced validation:
AisGisAdValidation)AisGisRouteValidation)Implementation: AisGisClient connects via SOAP/WCF to the configured AisGISInterfaceURL.
| Parameter | Default | Description |
|---|---|---|
| ProjectVersion | — | Country variant: SK, HU, PL, NL |
| F10_Y_Mandatory | — | 8.33 kHz equipment: NO / IFR / YES |
| OherInfoOprMandatory | false | F18 OPR/ indicator mandatory |
| OherInfoRmkPhoneMandatory | false | F18 RMK/ must contain phone number |
| PicPhoneMandatory | false | F19 PIC must contain phone number |
| AddInfoPilotTelMandatory | false | Additional info pilot telephone mandatory |
| AisGisAdValidation | false | Enable AIS/GIS aerodrome validation |
| AisGisRouteValidation | false | Enable AIS/GIS route validation |
| VfrRouteFirstLastDCT | false | VFR routes must start and end with DCT |
| SpecialArcTypes | — | CSV list of special aircraft types (GLID, balloons, etc.) |
| LATEST_IFR_EOBT | 1H | Latest time to file before IFR EOBT |
| LATEST_VFR_EOBT | 1H | Latest time to file before VFR EOBT |
| EARLIEST_IFR_EOBT | 120H | Earliest time to file before IFR EOBT |
| EARLIEST_VFR_EOBT | 120H | Earliest time to file before VFR EOBT |
| — | Regex for email validation | |
| PhoneNr | — | Regex for phone number validation |
| ConnStringIbaf | — | SQL Server connection for aircraft type DB |
| AisGISInterfaceURL | — | SOAP endpoint for AIS/GIS service |
Uses PHP DateInterval-like syntax: 30M = 30 min, 1H = 1 hour, 1H30M = 90 min.
| Variant | Differences |
|---|---|
SK (Slovakia) |
|
HU (Hungary) |
|
PL (Poland) |
|
NL (Netherlands) |
|
| Code | Field | Message | Type |
|---|---|---|---|
FplFormErr_arcid | F7 | Invalid Aircraft Identification | ERROR |
FplFormErr_fr | F8a | Invalid Flight Rules | ERROR |
FplFormErr_fr_flvlv | F8a | Flight Rules not compliant with VFR Flight Level | ERROR |
FplFormErr_fltype | F8b | Invalid Type of Flight | ERROR |
FplFormErr_numberAcs | F9a | Invalid Number of Aircrafts | ERROR |
FplFormErr_atype | F9b | Invalid Type of Aircraft | ERROR |
FplFormErr_wtc | F9c | Invalid Wake Turbulence Category | ERROR |
FplFormErr_equip1 | F10a | Invalid Equipment | ERROR |
FplFormErr_equip1_ZReq | F10a | Z is required | ERROR |
FplFormErr_equip1_YReq | F10a | Y is required | ERROR |
FplFormErr_equip1_exm833 | F10a | EXM833 exemption: Y not allowed | ERROR |
FplFormErr_equip2 | F10b | Invalid SSR Equipment | ERROR |
FplFormErr_equip2_IPX | F10b | I, P, X mutually exclusive | ERROR |
FplFormErr_equip2_EHLS | F10b | I/P/X excludes E,H,L,S | ERROR |
FplFormErr_equip3 | F10c | Invalid ADS Equipment | ERROR |
FplFormErr_adep_invalid | F13a | Invalid Departure Aerodrome | ERROR |
FplFormErr_eobdt_invalid | F13b | Invalid EOBT | ERROR |
FplFormErr_eobdt_between | F13b | EOBT must be between {0}, {1} | ERROR |
FplFormErr_eobdt_least | F13b | FPL should be filed at least {0} before EOBT | WARN |
FplFormErr_speedm_invalid | F15a | Invalid Cruising Speed Type | ERROR |
FplFormErr_speedv_invalid | F15b | Invalid Cruising Speed Value | ERROR |
FplFormErr_flvlm_invalid | F15c | Invalid Flight Level Type | ERROR |
FplFormErr_flvlv_invalid | F15d | Invalid Flight Level Value | ERROR |
FplFormErr_routeTxt_* | F15e | Various route errors | ERROR |
FplFormErr_ades_invalid | F16a | Invalid Destination Aerodrome | ERROR |
FplFormErr_teet_invalid | F16b | Invalid Total EET | ERROR |
FplFormErr_altad_invalid | F16c | Invalid 1st Alternate Aerodrome | ERROR |
FplFormErr_alt2ad_invalid | F16d | Invalid 2nd Alternate Aerodrome | ERROR |
FplFormErr_otherTxt_* | F18 | Various F18 indicator errors | ERROR |
FplFormErr_supl* | F19 | Various supplementary info errors | ERROR |
FplFormErr_addInfo* | Add | Various additional info errors | ERROR |
FplFormWarn_adep_NoGisVal | F13a | ADEP cannot be validated to GIS | WARN |
FplFormWarn_ades_NoGisVal | F16a | ADES cannot be validated to GIS | WARN |
FplFormWarn_altAd_NoGisVal | F16c/d | Alternate cannot be validated to GIS | WARN |
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