-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
377 lines (356 loc) · 22 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name='viewport' content='width=device-width,initial-scale=1.0'/>
<title>ICAO ATS and OLDI Message Parser,
ICAO ATS Parser,
ICAO OLDI Parser,
ICAO ATS Message Parser,
ICAO OLDI Message Parser,
ICAO Message Parser,
ICAO Parser,
ATS Parser,
OLDI Parser,
ATS Message Parser,
OLDI Message Parser,
</title>
<meta name="google-site-verification" content="awWwElk8GXFJIvmNuEuEowc-MlPdyv4D-TgYx4_UHsA"/>
<meta name="author" content="pventon"/>
<meta name="author" content="Peter Venton"/>
<meta name="description" content="ICAO ATS and OLDI Message Parser"/>
<meta name="description" content="OLDI Parser"/>
<meta name="description" content="ICAO Parser"/>
<meta name="description" content="ICAO Message Parser"/>
<meta name="description" content="OLDI Message Parser"/>
<meta name="description" content="ATS Parser"/>
<meta name="description" content="ICAO ATS Parser"/>
<meta name="description" content="ICAO ATS Message Parser"/>
<meta name="description" content="ICAO DOC 4444 Compliant Parser"/>
<meta name="keyword" content="ICAO OLDI ATS Parser Message Messages"/>
</head>
<body>
<h1>ICAO ATS and OLDI Message Parser</h1>
<p>This is the web page for an open source <a href="https://github.com/">GitHub</a> repository containing an
<b>ICAO ATS and OLDI Message Parser</b>. The <b>ICAO ATS and OLDI Message Parser</b> is implemented using
Python version 3.10.7. A more recent version of Python must be used in order to support <b>switch</b>
statements used in the source code.
</p>
<p>The open source <a href="https://github.com/">GitHub</a> repository for the <b>ICAO ATS and OLDI Message
Parser</b> can be found <a href="https://github.com/pventon/ICAO-ATS-and-OLDI-Message-Parser">here</a>.
</p>
<p>The <b>ICAO ATS and OLDI Message Parser</b> uses a standalone <b>ICAO Field 15 Parser</b> that is
also available as an open source <a href="https://github.com/">GitHub</a> project that can be found
<a href="https://github.com/pventon/ICAO-F15-Parser">here</a>.
</p>
<p>All software on both the <b>ICAO ATS and OLDI Message Parser</b> and <b>ICAO Field 15 Parser</b>
<a href="https://github.com/">GitHub</a> repositories has been written by Peter Venton (user
<a href="https://github.com/pventon">pventon</a> on <a href="https://github.com/">GitHub</a>).
</p>
<p>An acronym list is provided at the end of this readme for readers unfamiliar with ATC acronyms.
</p>
<p>For a more detailed description of methods useful to a caller refer to
<a href="MethodSynopsis.html">ICAO ATS and OLDI Parser Method Synopsis</a>.
</p>
<p>Full source code documentation can be found
<a href="Documents/html/index.html">here</a>.
</p>
<h2>Overview</h2>
<p>ICAO ATS and OLDI messages conform to the syntax and semantic standards described in ICAO DOC 4444.
</p>
<p>ATS messages contain an application header described in the ICAO Annex 10, Volume II document. OLDI
messages do not have an application header. Both types of message have additional header information
that is processed by the appropriate protocol handler, this parser does not deal with the protocol
handler header.
</p>
<p>The <b>ICAO ATS and OLDI Message Parser</b> is able to process the following:</p>
<ul>
<li>Messages with or without the application header;</li>
<li>Messages with or without an application header, with or without the open and closed brackets;</li>
</ul>
<p>The <b>ICAO ATS and OLDI Message Parser</b> automatically determines if messages have the header and/or
brackets.
</p>
<p>All fields are parsed and copied to an FPR for the caller to process further. ICAO field 15 is processed
using a dedicated Field 15 Parser (available <a href="https://github.com/pventon/ICAO-F15-Parser">here</a>);
The field 15 parser performs route extraction on field 15 that results in an extracted route sequence also
stored in the FPR.
</p>
<p>Message content is defined in configuration data; each message title consists of a finite set of ICAO
fields. For ICAO ATS messages the field content is fixed and defined in ICAO DOC 4444. OLDI message
content is also based on its title, but in addition, the content is dependent on the adjacent unit
communications link that OLDI messages are exchanged on.
</p>
<p>The <b>ICAO ATS and OLDI Message Parser</b> determines the adjacent unit identifier from
a message title and selects the field content using a combination of the message title and adjacent
unit name.
</p>
<p>Route extraction is performed on field 15 and the extracted route stored in the FPR. For details on
Field 15 parsing refer to the ICAO Field 15 Parser repository
<a href="https://github.com/pventon/ICAO-F15-Parser">here</a>.
</p>
<p>Each field and its subfield(s) are parsed for correct syntax and semantics; should an error be detected,
accurate error messages are generated describing an error found in a particular field. The zero based
index of a field and subfield are stored with all fields and subfields; these indices can be used for
highlighting errors in a GUI.
</p>
<h2>Current Functionality</h2>
<p>The current implementation parses all the 'basic' ICAO fields F3, F5, F7, F8, F9, F10, F13, F14, F15,
F16, F17, F20 and F21 and their associated subfields. The ICAO fields F18, F19 and F22 are 'compound'
fields made up of numerous keyword/data fields where each keyword/data field can be a basic
ICAO field. This parser fully parses F18, F19 and F22 and all their keyword/data fields. The flight
plan record stores a complete F22 flight plan that is populated by F22 subfields. Theoretically, F22
is able to specify all the fields for a complete flight plan, hence an F22 flight plan is stored
within the flight plan proper. Any errors reported for F22 subfields are copied to the main flight
plan record for convenience to the caller. Duplicated F22 subfield errors are also reported.
</p>
<p>Fields F18 and F19 are parsed for correct keyword/data format with all subfields copied to the flight
plan. Errors are reported if the keyword/data format is found to be incorrect or text is found outside
a keyword/data subfield. All F18 and F19 subfields are fully parsed.
</p>
<p>OLDI define two extra fields (80 and 81) that the parser fully supports with appropriate
error messages etc. These fields are an addition to the ICAO F22 suite of keyword/data.
</p>
<p><b><i>A parsed message can be output as an XML string by calling FlightPlanRecord.as_xml()</i></b>
</p>
<h2>Consistency Checking</h2>
<p>The <b>ICAO ATS and OLDI Message Parser</b> performs consistency checking between various fields
once a flight plan has been parsed. The consistency checking can only be carried out on messages that
contain the required fields, the message titles subject to consistency checking are:
</p>
<ul>
<li>AFP</li>
<li>ALR</li>
<li>APL</li>
<li>CPL</li>
<li>FPL</li>
</ul>
<p>The consistency checks carried out are:
</p>
<ul>
<li>Flight rules between F8a and the flight rules derived by the F15 parsing and route extraction
process; these must match.</li>
<li>If F10a contains the letter 'Z' then one or more of the F18 subfields 'COM', 'NAV' or 'DAT'
must be present;</li>
<li>If F10a contains the letter 'R' then the F18 'PBN' subfield must be present and contain one
or more of the indicators 'B1', 'B2', 'B3', 'B4' or 'B5';</li>
<li>If F18 contains the subfield 'PBN', F10a must contain an 'R';</li>
<li>If F18 'PBN' contains one or more of the indicators 'B1', 'B2', 'C1', 'C2', 'D1', 'D2', 'O1'
or 'O2', then F10a must contain the letter 'G';</li>
<li>If F18 'PBN' contains one or more of the indicators 'B1', 'B3', 'C1', 'C3', 'D1', 'D3', 'O1'
or 'O3', then F10a must contain the letter 'D';</li>
<li>If F18 'PBN' contains one or more of the indicators 'B1' or 'B4', then F10a must contain
either an 'O' or 'S' and a 'D';</li>
<li>If F18 'PBN' contains one or more of the indicators 'B1', 'B5', 'C1', 'C4', 'D1', 'D4', 'O1'
or 'O4', then F10a must contain the letter 'I';</li>
<li>If F18 'PBN' contains one or more of the indicators 'C1', 'C4', 'D1', 'D4', 'O1' or 'O4',
then F10a must contain the letter 'D';</li>
<li>If F9b contains ZZZZ then field 18 must contain the TYP subfield;</li>
<li>If F13a contains ZZZZ then field 18 must contain the DEP subfield;</li>
<li>If F16a contains ZZZZ then field 18 must contain the DEST subfield;</li>
</ul>
<p>To simplify the consistency requirements between F10 and F18 shown above, (these were taken from the
EUROCONTROL FPL 2012 URD), they can be viewed in a tabular form where each row shows that the letter
in the first column must be present in F10a if any of the items in the remaining columns appears in the
F18 PBN subfield.
</p>
<table>
<colgroup>
<col span="1" style="background-color:darkgrey">
<col span="17" style="background-color:lightgrey">
</colgroup>
<tr><th>Compulsory</th></tr>
<tr><th>in F10 'a'</th><th>B1</th><th>B2</th><th>B3</th><th>B4</th><th>B5</th><th>C1</th><th>C2</th><th>C3</th><th>C4</th><th>D1</th><th>D2</th><th>D3</th><th>D4</th><th>O1</th><th>O2</th><th>O3</th><th>O4</th></tr>
<tr><td>D</td><td>X</td><td></td><td>X</td><td>X</td><td></td><td>X</td><td></td><td>X</td><td>X</td><td>X</td><td></td><td>X</td><td>X</td><td>X</td><td></td><td>X</td><td>X</td></tr>
<tr><td>G</td><td>X</td><td>X</td><td></td><td></td><td></td><td>X</td><td>X</td><td></td><td></td><td>X</td><td>X</td><td></td><td></td><td>X</td><td>X</td><td></td><td></td></tr>
<tr><td>I</td><td>X</td><td></td><td></td><td></td><td>X</td><td>X</td><td></td><td></td><td>X</td><td>X</td><td></td><td></td><td>X</td><td>X</td><td></td><td></td><td>X</td></tr>
<tr><td>O or S</td><td>X</td><td></td><td></td><td>X</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td>R</td><td>X</td><td>X</td><td>X</td><td>X</td><td>X</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
</table>
<h2>Current Limitations</h2>
<p>None as 23rd October 2022 that the author is currently aware of;
</p>
<h2>Future Upgrades</h2>
<p>No modifications pending as of 23rd October 2022;
</p>
<h2>Errata and Faults</h2>
<p>Although every attempt has been made to reduce the number of software coding errors and resulting
chaos that can ensue as a result of such errors, it is highly likely that this early release will
have a few bugs. The possible combinations of message structure and semantics run into millions of
combinations, and it's impossible to test them all. There are a lot of unit tests that check the
individual field parsers and messages in their entirety, but even with so many tests, there may
still be some bugs in the software.
</p>
<p>Should any use be made of this software and errors found, do not hesitate to contact me at
<a href="mailto:peter.venton@flightatm.com">peter.venton@flightatm.com</a>, so I may attempt to
fix/correct any issues, or alternatively post any errors on the discussion page or bug tracker
that I believe is supplied as part of GitHub.
</p>
<p><b>Good luck and Enjoy!</b>
</p>
<h1>ICAO ATS and OLDI Message Parser Usage</h1>
<p>This section provides a 'quickstart' for using the <b>ICAO ATS and OLDI Parser</b>.
</p>
<p>For a more detailed description of methods useful to a caller refer to
<a href="MethodSynopsis.html">ICAO ATS and OLDI Parser Method Synopsis</a>.
</p>
<p>In the root directory of the repository there is a class called <b>IcaoAtsMessageParser</b> that is the
calling interface to the ICAO ATS and OLDI Message Parser.
</p>
<p>Example usage of the ICAO ATS and OLDI Message Parser;
</p>
<table>
<colgroup>
<col span="1" style="background-color:lightgrey">
</colgroup>
<tr><td>
<pre><code># The following example ATS FPL message will be used for the discussions that follow...</code></pre>
<pre><code>icao_message: str = "(FPL-TEST01-IS-B737/M-S/C-LOWW0800-N0450f350 PNT B9 LNZ1A-EGLL0200-0)"</code></pre>
</td></tr>
</table>
<p>There are two methods provided for parsing a message titled Option 1 and Option 2 below.
</p>
<h2>Option 1</h2>
<table>
<colgroup>
<col span="1" style="background-color:lightgrey">
</colgroup>
<tr><td>
<pre><code># Instantiate the parser...</code></pre>
<pre><code>icao_message_parser: IcaoAtsMessageParser = IcaoAtsMessageParser()</code></pre>
</td></tr>
<tr><td>
<pre><code># Parse the message...</code></pre>
<pre><code>flight_plan_record: FlightPlanRecord = icao_message_parser.parse_message_p1(icao_message)</code></pre>
</td></tr>
<tr><td>
<pre><code># Check if any errors were reported in the basic field processing...</code></pre>
<pre><code>if flight_plan_record.errors_detected():</code></pre>
<pre><code> # For fields other than field 15 call the following method, this returns a list of ErrorRecord's...</code></pre>
<pre><code> basic_field_errors: [ErrorRecord] = flight_plan_record.get_erroneous_fields()</code></pre>
</td></tr>
<tr><td>
<pre><code># For field 15, get the Extracted Route Sequence and get the errors, returns a list of Tokens...</code></pre>
<pre><code>if flight_plan_record.get_extracted_route_sequence().get_number_of_errors() > 0:</code></pre>
<pre><code> field_15_errors: [Token] = flight_plan_record.get_extracted_route_sequence().get_all_errors()</code></pre></td></tr>
<tr><td>
<pre><code># To extract fields and / or subfields use the methods in the following example code...</code></pre>
<pre><code># Get the complete ICAO Field 9</code></pre>
<pre><code>f9: str = flight_plan_record.get_icao_field(FieldIdentifiers.F9).get_field_text()</code></pre>
</td></tr>
<tr><td>
<pre><code># Get the ICAO subfield 9c, WTC</code></pre>
<pre><code>f9c: str = flight_plan_record.get_icao_subfield(</code></pre>
<pre><code> FieldIdentifiers.F9, SubFieldIdentifiers.F9c).get_field_text()</code></pre>
</td></tr>
</table>
<h2>Option 2</h2>
<table>
<colgroup>
<col span="1" style="background-color:lightgrey">
</colgroup>
<tr><td>
<pre><code># Instantiate a FlightPlanRecord, the output is written into this class instance.</code></pre>
<pre><code>flight_plan_record: FlightPlanRecord = FlightPlanRecord() </code></pre>
</td></tr>
<tr><td>
<pre><code># Instantiate the parser...</code></pre>
<pre><code>icao_message_parser = IcaoAtsMessageParser() </code></pre>
</td></tr>
<tr><td>
<pre><code># Parse the message...</code></pre>
<pre><code>result = icao_message_parser.parse_message_p2(flight_plan_record, icao_message) </code></pre>
</td></tr>
<tr><td>
<pre><code># If errors were detected, result will be False; to get the error records do the following...</code></pre>
<pre><code>if not result:</code></pre>
<pre><code> # For fields other than field 15 call the following method, this returns a list of ErrorRecord's...</code></pre>
<pre><code> basic_field_errors: [ErrorRecord] = flight_plan_record.get_erroneous_fields() </code></pre>
</td></tr>
<tr><td>
<pre><code># For field 15, get the Extracted Route Sequence and get the errors, returns a list of Tokens...</code></pre>
<pre><code>if flight_plan_record.get_extracted_route_sequence().get_number_of_errors() > 0:</code></pre>
<pre><code> field_15_errors: [Token] = flight_plan_record.get_extracted_route_sequence().get_all_errors() </code></pre>
</td></tr>
<tr><td>
<pre><code># To extract fields and / or subfields use the methods in the following example code...</code></pre>
<pre><code># Get the complete ICAO Field 13</code></pre>
<pre><code>f13: str = flight_plan_record.get_icao_field(FieldIdentifiers.F13).get_field_text() </code></pre>
</td></tr>
<tr><td>
<pre><code># Get the ICAO field 16 EET (Field 16 'b')</code></pre>
<pre><code>f16b: str = flight_plan_record.get_icao_subfield(</code></pre>
<pre><code>FieldIdentifiers.F16, SubFieldIdentifiers.F16b).get_field_text() </code></pre>
</td></tr>
</table>
<h1>Acronyms</h1>
<table>
<colgroup>
<col span="1" style="background-color:darkgrey">
<col style="background-color:lightgrey">
</colgroup>
<tr><th>Acronym</th><th>Acronym Definition</th></tr>
<tr><td>ABI</td><td>OLDI Advanced Boundary Information</td></tr>
<tr><td>ACH</td><td>ATS ATC Change Message</td></tr>
<tr><td>ACT</td><td>OLDI Activation Message</td></tr>
<tr><td>ACP</td><td>ATS Advanced Coordination Procedure Message</td></tr>
<tr><td>ACP</td><td>OLDI Advanced Coordination Procedure Message</td></tr>
<tr><td>ADEP</td><td>Aerodrome of Departure (Given as an ICAO Location Indicator)</td></tr>
<tr><td>ADES</td><td>Aerodrome of Destination (Given as an ICAO Location Indicator)</td></tr>
<tr><td>AFP</td><td>ATS ATC Flightplan Proposal Message</td></tr>
<tr><td>AIP</td><td>Aeronautical Information Publication</td></tr>
<tr><td>ALR</td><td>ATS ATC Alerting Message</td></tr>
<tr><td>AMA</td><td>OLDI Arrival Management Message</td></tr>
<tr><td>APL</td><td>ATS ATC Flight Plan Message</td></tr>
<tr><td>ARR</td><td>ATS Arrival Message</td></tr>
<tr><td>ATC</td><td>Air Traffic Control</td></tr>
<tr><td>ATS</td><td>Air Traffic Service</td></tr>
<tr><td>CDN</td><td>ATS Change Message</td></tr>
<tr><td>CDN</td><td>OLDI Coordination Message</td></tr>
<tr><td>CFMU</td><td>Central Flow Management Unit</td></tr>
<tr><td>CNL</td><td>ATS Cancel Message</td></tr>
<tr><td>COD</td><td>OLDI Advanced Coordination Procedure</td></tr>
<tr><td>CPL</td><td>OLDI Current Flight Plan Message</td></tr>
<tr><td>CPL</td><td>ATS Current Flight Plan Message</td></tr>
<tr><td>DCT</td><td>Direct (used to specify direct routing between points)</td></tr>
<tr><td>DEP</td><td>ATS Departure Message</td></tr>
<tr><td>DLA</td><td>ATS Delay Message</td></tr>
<tr><td>ERS</td><td>Extracted Route Sequence</td></tr>
<tr><td>EST</td><td>ATS Estimate Message</td></tr>
<tr><td>ETO</td><td>Estimated Time Over</td></tr>
<tr><td>FPL</td><td>ATS Flight Plan Message</td></tr>
<tr><td>FPR</td><td>Flight Plan Record</td></tr>
<tr><td>FNM</td><td>Gander Oceanic Message</td></tr>
<tr><td>GAT</td><td>General Air Traffic</td></tr>
<tr><td>GUI</td><td>Graphical User Interface</td></tr>
<tr><td>ICAO</td><td>International Civil Aviation Organisation</td></tr>
<tr><td>IFR</td><td>Instrument Flight Rules</td></tr>
<tr><td>IFPS</td><td>Initial Flight Planing System</td></tr>
<tr><td>IFPSTOP</td><td>Indicates end of IFR routing (used by the CFMU IFPS)</td></tr>
<tr><td>IFPSTART</td><td>Indicates start of IFR routing (used by the CFMU IFPS)</td></tr>
<tr><td>INF</td><td>OLDI Information Message</td></tr>
<tr><td>LAM</td><td>OLDI Logical Acknowledgement</td></tr>
<tr><td>MAC</td><td>OLDI Message for the Abrogation of Coordination</td></tr>
<tr><td>MFS</td><td>Oceanic Centre Message</td></tr>
<tr><td>OAT</td><td>Operational Air Traffic (typically military)</td></tr>
<tr><td>OCM</td><td>OLDI Oceanic Clearance Message</td></tr>
<tr><td>PAC</td><td>OLDI Preliminary Activation Message</td></tr>
<tr><td>PRP</td><td>Published Route Points</td></tr>
<tr><td>RAP</td><td>OLDI Referred Activate Proposal Message</td></tr>
<tr><td>RCF</td><td>ATS Radio communication failure</td></tr>
<tr><td>REJ</td><td>OLDI Reject Message</td></tr>
<tr><td>REV</td><td>OLDI Revision Message</td></tr>
<tr><td>RJC</td><td>OLDI Reject Coordination Message</td></tr>
<tr><td>ROC</td><td>OLDI Request Oceanic Clearance Message</td></tr>
<tr><td>RRV</td><td>OLDI Referred Revision Proposal Message</td></tr>
<tr><td>RQP</td><td>ATS Request Flight Plan Message</td></tr>
<tr><td>RQS</td><td>ATS Request Supplementary Flight Plan Information Message</td></tr>
<tr><td>SBY</td><td>OLDI Standby Message</td></tr>
<tr><td>SI</td><td>Metric measurement system</td></tr>
<tr><td>SID</td><td>Standard Instrument Departure</td></tr>
<tr><td>SPL</td><td>ATS Supplementary Flight Plan Message</td></tr>
<tr><td>STAR</td><td>Standard Arrival Route</td></tr>
<tr><td>VFR</td><td>Visual Flight Rules</td></tr>
</table>
</body>
</html>