@airframes/acars-decoder 1.8.6 → 1.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/dist/index.d.mts +8 -3
- package/dist/index.d.ts +8 -3
- package/dist/index.js +1075 -430
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1075 -430
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -2
package/dist/index.mjs
CHANGED
|
@@ -1,85 +1,87 @@
|
|
|
1
1
|
// lib/IcaoDecoder.ts
|
|
2
|
-
var IcaoDecoder = class {
|
|
2
|
+
var IcaoDecoder = class _IcaoDecoder {
|
|
3
3
|
name;
|
|
4
4
|
icao;
|
|
5
|
+
// Military ICAO address ranges (as [start, end] tuples, inclusive)
|
|
6
|
+
static MILITARY_RANGES = [
|
|
7
|
+
[65648, 65679],
|
|
8
|
+
// Egypt
|
|
9
|
+
[671744, 675839],
|
|
10
|
+
// Algeria
|
|
11
|
+
[3407616, 3407871],
|
|
12
|
+
// Italy
|
|
13
|
+
[3473408, 3670015],
|
|
14
|
+
// Spain
|
|
15
|
+
[3842048, 3866623],
|
|
16
|
+
// France 1
|
|
17
|
+
[3895296, 3932159],
|
|
18
|
+
// France 2
|
|
19
|
+
[4104192, 4112383],
|
|
20
|
+
// Germany 1
|
|
21
|
+
[4145152, 4177919],
|
|
22
|
+
// Germany 2
|
|
23
|
+
[4194304, 4194367],
|
|
24
|
+
// UK 1
|
|
25
|
+
[4440064, 4444159],
|
|
26
|
+
// UK 2
|
|
27
|
+
[4472832, 4485119],
|
|
28
|
+
// Austria
|
|
29
|
+
[4517888, 4521983],
|
|
30
|
+
// Belgium
|
|
31
|
+
[4550656, 4554751],
|
|
32
|
+
// Bulgaria
|
|
33
|
+
[4584448, 4584703],
|
|
34
|
+
// Denmark
|
|
35
|
+
[4620288, 4621311],
|
|
36
|
+
// Greece
|
|
37
|
+
[4668416, 4668431],
|
|
38
|
+
// Hungary
|
|
39
|
+
[4686080, 4686335],
|
|
40
|
+
// Norway
|
|
41
|
+
[4718592, 4722687],
|
|
42
|
+
// Netherlands
|
|
43
|
+
[4773888, 4774015],
|
|
44
|
+
// Poland
|
|
45
|
+
[4815872, 4816127],
|
|
46
|
+
// Portugal
|
|
47
|
+
[4817952, 4817967],
|
|
48
|
+
// Czech
|
|
49
|
+
[4943872, 4947967],
|
|
50
|
+
// Switzerland
|
|
51
|
+
[4948480, 4948735],
|
|
52
|
+
// Turkey
|
|
53
|
+
[7389296, 7389311],
|
|
54
|
+
// Oman
|
|
55
|
+
[7406168, 7406223],
|
|
56
|
+
// Saudi 1
|
|
57
|
+
[7406464, 7406495],
|
|
58
|
+
// Saudi 2
|
|
59
|
+
[7571968, 7572223],
|
|
60
|
+
// Israel
|
|
61
|
+
[8189952, 8190719],
|
|
62
|
+
// Australia
|
|
63
|
+
[8389120, 8389375],
|
|
64
|
+
// India
|
|
65
|
+
[11401160, 11534335],
|
|
66
|
+
// USA
|
|
67
|
+
[12713984, 12845055],
|
|
68
|
+
// Canada
|
|
69
|
+
[14942208, 14950399]
|
|
70
|
+
// Brazil
|
|
71
|
+
];
|
|
5
72
|
constructor(icao) {
|
|
6
73
|
this.name = "icao-decoder-typescript";
|
|
7
74
|
this.icao = icao;
|
|
8
75
|
}
|
|
9
76
|
isMilitary() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
var DateTimeUtils = class {
|
|
17
|
-
// Expects a four digit UTC time string (HHMM)
|
|
18
|
-
static UTCToString(UTCString) {
|
|
19
|
-
let utcDate = /* @__PURE__ */ new Date();
|
|
20
|
-
utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
|
|
21
|
-
return utcDate.toTimeString();
|
|
22
|
-
}
|
|
23
|
-
// Expects a six digit date string and a four digit UTC time string
|
|
24
|
-
// (DDMMYY) (HHMM)
|
|
25
|
-
static UTCDateTimeToString(dateString, timeString) {
|
|
26
|
-
let utcDate = /* @__PURE__ */ new Date();
|
|
27
|
-
utcDate.setUTCDate(+dateString.substr(0, 2));
|
|
28
|
-
utcDate.setUTCMonth(+dateString.substr(2, 2));
|
|
29
|
-
if (dateString.length === 6) {
|
|
30
|
-
utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
|
|
31
|
-
}
|
|
32
|
-
if (timeString.length === 6) {
|
|
33
|
-
utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));
|
|
34
|
-
} else {
|
|
35
|
-
utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
|
|
36
|
-
}
|
|
37
|
-
return utcDate.toUTCString();
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* @param time HHMMSS or HHMM
|
|
42
|
-
* @returns seconds since midnight
|
|
43
|
-
*/
|
|
44
|
-
static convertHHMMSSToTod(time) {
|
|
45
|
-
if (time.length === 4) {
|
|
46
|
-
time += "00";
|
|
47
|
-
}
|
|
48
|
-
const h = Number(time.substring(0, 2));
|
|
49
|
-
const m = Number(time.substring(2, 4));
|
|
50
|
-
const s = Number(time.substring(4, 6));
|
|
51
|
-
const tod = h * 3600 + m * 60 + s;
|
|
52
|
-
return tod;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
*
|
|
56
|
-
* @param time HHMMSS
|
|
57
|
-
* @param date MMDDYY or MMDDYYYY
|
|
58
|
-
* @returns seconds since epoch
|
|
59
|
-
*/
|
|
60
|
-
static convertDateTimeToEpoch(time, date) {
|
|
61
|
-
if (date.length === 6) {
|
|
62
|
-
date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
|
|
63
|
-
}
|
|
64
|
-
const timestamp = `${date.substring(4, 8)}-${date.substring(0, 2)}-${date.substring(2, 4)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;
|
|
65
|
-
const millis = Date.parse(timestamp);
|
|
66
|
-
return millis / 1e3;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Converts a timestamp to a string
|
|
70
|
-
*
|
|
71
|
-
* ISO-8601 format for 'epoch'
|
|
72
|
-
* HH:MM:SS for 'tod'
|
|
73
|
-
* @param time
|
|
74
|
-
* @param format
|
|
75
|
-
* @returns
|
|
76
|
-
*/
|
|
77
|
-
static timestampToString(time, format) {
|
|
78
|
-
const date = new Date(time * 1e3);
|
|
79
|
-
if (format == "tod") {
|
|
80
|
-
return date.toISOString().slice(11, 19);
|
|
77
|
+
const i = this.icao;
|
|
78
|
+
const n = parseInt(i, 16);
|
|
79
|
+
for (const [start, end] of _IcaoDecoder.MILITARY_RANGES) {
|
|
80
|
+
if (start <= n && n <= end) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
81
83
|
}
|
|
82
|
-
return
|
|
84
|
+
return false;
|
|
83
85
|
}
|
|
84
86
|
};
|
|
85
87
|
|
|
@@ -109,7 +111,9 @@ var DecoderPlugin = class {
|
|
|
109
111
|
this.options = options;
|
|
110
112
|
}
|
|
111
113
|
id() {
|
|
112
|
-
console.log(
|
|
114
|
+
console.log(
|
|
115
|
+
"DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!"
|
|
116
|
+
);
|
|
113
117
|
return "abstract_decoder_plugin";
|
|
114
118
|
}
|
|
115
119
|
meetsStateRequirements() {
|
|
@@ -136,7 +140,7 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
136
140
|
/**
|
|
137
141
|
* Decode a string of coordinates into an object with latitude and longitude in millidegrees
|
|
138
142
|
* @param stringCoords - The string of coordinates to decode
|
|
139
|
-
*
|
|
143
|
+
*
|
|
140
144
|
* @returns An object with latitude and longitude properties
|
|
141
145
|
*/
|
|
142
146
|
static decodeStringCoordinates(stringCoords) {
|
|
@@ -156,11 +160,11 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
156
160
|
return void 0;
|
|
157
161
|
}
|
|
158
162
|
/**
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
163
|
+
* Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
|
|
164
|
+
* @param stringCoords - The string of coordinates to decode
|
|
165
|
+
*
|
|
166
|
+
* @returns An object with latitude and longitude properties
|
|
167
|
+
*/
|
|
164
168
|
static decodeStringCoordinatesDecimalMinutes(stringCoords) {
|
|
165
169
|
const firstChar = stringCoords.substring(0, 1);
|
|
166
170
|
let middleChar = stringCoords.substring(6, 7);
|
|
@@ -199,6 +203,85 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
199
203
|
}
|
|
200
204
|
};
|
|
201
205
|
|
|
206
|
+
// lib/DateTimeUtils.ts
|
|
207
|
+
var DateTimeUtils = class {
|
|
208
|
+
// Expects a four digit UTC time string (HHMM)
|
|
209
|
+
static UTCToString(UTCString) {
|
|
210
|
+
let utcDate = /* @__PURE__ */ new Date();
|
|
211
|
+
utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
|
|
212
|
+
return utcDate.toTimeString();
|
|
213
|
+
}
|
|
214
|
+
// Expects a six digit date string and a four digit UTC time string
|
|
215
|
+
// (DDMMYY) (HHMM)
|
|
216
|
+
static UTCDateTimeToString(dateString, timeString) {
|
|
217
|
+
let utcDate = /* @__PURE__ */ new Date();
|
|
218
|
+
utcDate.setUTCDate(+dateString.substr(0, 2));
|
|
219
|
+
utcDate.setUTCMonth(+dateString.substr(2, 2));
|
|
220
|
+
if (dateString.length === 6) {
|
|
221
|
+
utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
|
|
222
|
+
}
|
|
223
|
+
if (timeString.length === 6) {
|
|
224
|
+
utcDate.setUTCHours(
|
|
225
|
+
+timeString.substr(0, 2),
|
|
226
|
+
+timeString.substr(2, 2),
|
|
227
|
+
+timeString.substr(4, 2)
|
|
228
|
+
);
|
|
229
|
+
} else {
|
|
230
|
+
utcDate.setUTCHours(
|
|
231
|
+
+timeString.substr(0, 2),
|
|
232
|
+
+timeString.substr(2, 2),
|
|
233
|
+
0
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
return utcDate.toUTCString();
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
*
|
|
240
|
+
* @param time HHMMSS or HHMM
|
|
241
|
+
* @returns seconds since midnight
|
|
242
|
+
*/
|
|
243
|
+
static convertHHMMSSToTod(time) {
|
|
244
|
+
if (time.length === 4) {
|
|
245
|
+
time += "00";
|
|
246
|
+
}
|
|
247
|
+
const h = Number(time.substring(0, 2));
|
|
248
|
+
const m = Number(time.substring(2, 4));
|
|
249
|
+
const s = Number(time.substring(4, 6));
|
|
250
|
+
const tod = h * 3600 + m * 60 + s;
|
|
251
|
+
return tod;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
*
|
|
255
|
+
* @param time HHMMSS
|
|
256
|
+
* @param date MMDDYY or MMDDYYYY
|
|
257
|
+
* @returns seconds since epoch
|
|
258
|
+
*/
|
|
259
|
+
static convertDateTimeToEpoch(time, date) {
|
|
260
|
+
if (date.length === 6) {
|
|
261
|
+
date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
|
|
262
|
+
}
|
|
263
|
+
const timestamp = `${date.substring(4, 8)}-${date.substring(0, 2)}-${date.substring(2, 4)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;
|
|
264
|
+
const millis = Date.parse(timestamp);
|
|
265
|
+
return millis / 1e3;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Converts a timestamp to a string
|
|
269
|
+
*
|
|
270
|
+
* ISO-8601 format for 'epoch'
|
|
271
|
+
* HH:MM:SS for 'tod'
|
|
272
|
+
* @param time
|
|
273
|
+
* @param format
|
|
274
|
+
* @returns
|
|
275
|
+
*/
|
|
276
|
+
static timestampToString(time, format) {
|
|
277
|
+
const date = new Date(time * 1e3);
|
|
278
|
+
if (format == "tod") {
|
|
279
|
+
return date.toISOString().slice(11, 19);
|
|
280
|
+
}
|
|
281
|
+
return date.toISOString().slice(0, -5) + "Z";
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
|
|
202
285
|
// lib/utils/route_utils.ts
|
|
203
286
|
var RouteUtils = class _RouteUtils {
|
|
204
287
|
static formatFlightState(state) {
|
|
@@ -253,20 +336,36 @@ var RouteUtils = class _RouteUtils {
|
|
|
253
336
|
static getWaypoint(leg) {
|
|
254
337
|
const regex = leg.match(/^([A-Z]+)(\d{3})-(\d{4})$/);
|
|
255
338
|
if (regex?.length == 4) {
|
|
256
|
-
return {
|
|
339
|
+
return {
|
|
340
|
+
name: regex[1],
|
|
341
|
+
offset: {
|
|
342
|
+
bearing: parseInt(regex[2]),
|
|
343
|
+
distance: parseInt(regex[3]) / 10
|
|
344
|
+
}
|
|
345
|
+
};
|
|
257
346
|
}
|
|
258
347
|
const waypoint = leg.split(",");
|
|
259
348
|
if (waypoint.length == 2) {
|
|
260
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
349
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
350
|
+
waypoint[1]
|
|
351
|
+
);
|
|
261
352
|
if (position) {
|
|
262
|
-
return {
|
|
353
|
+
return {
|
|
354
|
+
name: waypoint[0],
|
|
355
|
+
latitude: position.latitude,
|
|
356
|
+
longitude: position.longitude
|
|
357
|
+
};
|
|
263
358
|
}
|
|
264
359
|
}
|
|
265
360
|
if (leg.length == 13 || leg.length == 14) {
|
|
266
361
|
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);
|
|
267
362
|
const name = waypoint.length == 2 ? waypoint[0] : "";
|
|
268
363
|
if (position) {
|
|
269
|
-
return {
|
|
364
|
+
return {
|
|
365
|
+
name,
|
|
366
|
+
latitude: position.latitude,
|
|
367
|
+
longitude: position.longitude
|
|
368
|
+
};
|
|
270
369
|
}
|
|
271
370
|
}
|
|
272
371
|
return { name: leg };
|
|
@@ -531,7 +630,9 @@ var ResultFormatter = class {
|
|
|
531
630
|
if (value.length === 0) {
|
|
532
631
|
return;
|
|
533
632
|
}
|
|
534
|
-
decodeResult.raw.outside_air_temperature = Number(
|
|
633
|
+
decodeResult.raw.outside_air_temperature = Number(
|
|
634
|
+
value.replace("M", "-").replace("P", "+")
|
|
635
|
+
);
|
|
535
636
|
decodeResult.formatted.items.push({
|
|
536
637
|
type: "outside_air_temperature",
|
|
537
638
|
code: "OATEMP",
|
|
@@ -748,17 +849,112 @@ var ResultFormatter = class {
|
|
|
748
849
|
value: `${decodeResult.raw.sublabel}`
|
|
749
850
|
});
|
|
750
851
|
}
|
|
852
|
+
static requestedAltitudes(decodeResult, values) {
|
|
853
|
+
decodeResult.raw.requested_alts = values;
|
|
854
|
+
decodeResult.formatted.items.push({
|
|
855
|
+
type: "requested_altitudes",
|
|
856
|
+
code: "REQ_ALTS",
|
|
857
|
+
label: "Requested Altitudes",
|
|
858
|
+
value: `${decodeResult.raw.requested_alts.join(", ")}`
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
static desiredAltitude(decodeResult, value) {
|
|
862
|
+
decodeResult.raw.desired_alt = value;
|
|
863
|
+
decodeResult.formatted.items.push({
|
|
864
|
+
type: "desired_altitude",
|
|
865
|
+
code: "DES_ALT",
|
|
866
|
+
label: "Desired Altitude",
|
|
867
|
+
value: `${decodeResult.raw.desired_alt}`
|
|
868
|
+
});
|
|
869
|
+
}
|
|
870
|
+
static startPoint(decodeResult, value) {
|
|
871
|
+
decodeResult.raw.start_point = value;
|
|
872
|
+
decodeResult.formatted.items.push({
|
|
873
|
+
type: "start_point",
|
|
874
|
+
code: "START",
|
|
875
|
+
label: "Start Point",
|
|
876
|
+
value: `${decodeResult.raw.start_point}`
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
static routeNumber(decodeResult, value) {
|
|
880
|
+
decodeResult.raw.route_number = value;
|
|
881
|
+
decodeResult.formatted.items.push({
|
|
882
|
+
type: "route_number",
|
|
883
|
+
code: "RTE_NUM",
|
|
884
|
+
label: "Route Number",
|
|
885
|
+
value: `${decodeResult.raw.route_number}`
|
|
886
|
+
});
|
|
887
|
+
}
|
|
888
|
+
static flightPlan(decodeResult, value) {
|
|
889
|
+
decodeResult.raw.flight_plan = value;
|
|
890
|
+
decodeResult.formatted.items.push({
|
|
891
|
+
type: "flight_plan",
|
|
892
|
+
code: "FPN",
|
|
893
|
+
label: "Flight Plan",
|
|
894
|
+
value: `${decodeResult.raw.flight_plan}`
|
|
895
|
+
});
|
|
896
|
+
}
|
|
897
|
+
static groundAddress(decodeResult, value) {
|
|
898
|
+
decodeResult.raw.ground_address = value;
|
|
899
|
+
decodeResult.formatted.items.push({
|
|
900
|
+
type: "ground_address",
|
|
901
|
+
code: "GND_ADDR",
|
|
902
|
+
label: "Ground Address",
|
|
903
|
+
value: `${decodeResult.raw.ground_address}`
|
|
904
|
+
});
|
|
905
|
+
}
|
|
751
906
|
static unknown(decodeResult, value, sep = ",") {
|
|
752
|
-
if (!decodeResult.remaining.text)
|
|
753
|
-
|
|
754
|
-
else
|
|
755
|
-
decodeResult.remaining.text += sep + value;
|
|
907
|
+
if (!decodeResult.remaining.text) decodeResult.remaining.text = value;
|
|
908
|
+
else decodeResult.remaining.text += sep + value;
|
|
756
909
|
}
|
|
757
910
|
static unknownArr(decodeResult, value, sep = ",") {
|
|
758
911
|
this.unknown(decodeResult, value.join(sep), sep);
|
|
759
912
|
}
|
|
760
913
|
};
|
|
761
914
|
|
|
915
|
+
// lib/plugins/CBand.ts
|
|
916
|
+
var CBand = class extends DecoderPlugin {
|
|
917
|
+
name = "c-band";
|
|
918
|
+
qualifiers() {
|
|
919
|
+
return {
|
|
920
|
+
labels: ["*"]
|
|
921
|
+
};
|
|
922
|
+
}
|
|
923
|
+
decode(message, options = {}) {
|
|
924
|
+
let decodeResult = this.defaultResult();
|
|
925
|
+
decodeResult.decoder.name = this.name;
|
|
926
|
+
decodeResult.message = message;
|
|
927
|
+
let cband = message.text.match(
|
|
928
|
+
/^(?<msgno>[A-Z]\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/
|
|
929
|
+
);
|
|
930
|
+
if (cband?.groups) {
|
|
931
|
+
const messageText = message.text.substring(10);
|
|
932
|
+
const decoded = this.decoder.decode(
|
|
933
|
+
{
|
|
934
|
+
label: message.label,
|
|
935
|
+
sublabel: message.sublabel,
|
|
936
|
+
text: messageText
|
|
937
|
+
},
|
|
938
|
+
options
|
|
939
|
+
);
|
|
940
|
+
if (decoded.decoded) {
|
|
941
|
+
ResultFormatter.flightNumber(
|
|
942
|
+
decodeResult,
|
|
943
|
+
cband.groups.airline + Number(cband.groups.number)
|
|
944
|
+
);
|
|
945
|
+
decodeResult.decoded = true;
|
|
946
|
+
decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
|
|
947
|
+
decodeResult.decoder.name = this.name + "-" + decoded.decoder.name;
|
|
948
|
+
decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
|
|
949
|
+
decodeResult.formatted.description = decoded.formatted.description;
|
|
950
|
+
decodeResult.formatted.items.push(...decoded.formatted.items);
|
|
951
|
+
decodeResult.remaining = decoded.remaining;
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
return decodeResult;
|
|
955
|
+
}
|
|
956
|
+
};
|
|
957
|
+
|
|
762
958
|
// lib/plugins/Label_5Z_Slash.ts
|
|
763
959
|
var Label_5Z_Slash = class extends DecoderPlugin {
|
|
764
960
|
name = "label-5z-slash";
|
|
@@ -829,12 +1025,23 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
829
1025
|
ResultFormatter.departureAirport(decodeResult, info[1]);
|
|
830
1026
|
ResultFormatter.arrivalAirport(decodeResult, info[2]);
|
|
831
1027
|
decodeResult.raw.day = Number(info[3]);
|
|
832
|
-
ResultFormatter.time_of_day(
|
|
1028
|
+
ResultFormatter.time_of_day(
|
|
1029
|
+
decodeResult,
|
|
1030
|
+
DateTimeUtils.convertHHMMSSToTod(info[4])
|
|
1031
|
+
);
|
|
833
1032
|
ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));
|
|
834
1033
|
ResultFormatter.unknownArr(decodeResult, data.slice(3), "/");
|
|
835
1034
|
} else if (type === "B3") {
|
|
836
|
-
ResultFormatter.departureAirport(
|
|
837
|
-
|
|
1035
|
+
ResultFormatter.departureAirport(
|
|
1036
|
+
decodeResult,
|
|
1037
|
+
header[1].substring(0, 3),
|
|
1038
|
+
"IATA"
|
|
1039
|
+
);
|
|
1040
|
+
ResultFormatter.arrivalAirport(
|
|
1041
|
+
decodeResult,
|
|
1042
|
+
header[1].substring(3),
|
|
1043
|
+
"IATA"
|
|
1044
|
+
);
|
|
838
1045
|
decodeResult.raw.day = Number(header[2]);
|
|
839
1046
|
ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));
|
|
840
1047
|
if (header.length > 4) {
|
|
@@ -845,19 +1052,36 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
845
1052
|
ResultFormatter.departureAirport(decodeResult, info[1]);
|
|
846
1053
|
ResultFormatter.arrivalAirport(decodeResult, info[2]);
|
|
847
1054
|
decodeResult.raw.day = Number(info[3]);
|
|
848
|
-
ResultFormatter.time_of_day(
|
|
1055
|
+
ResultFormatter.time_of_day(
|
|
1056
|
+
decodeResult,
|
|
1057
|
+
DateTimeUtils.convertHHMMSSToTod(info[4])
|
|
1058
|
+
);
|
|
849
1059
|
ResultFormatter.unknownArr(decodeResult, info.slice(5), " ");
|
|
850
1060
|
} else if (type === "C3") {
|
|
851
|
-
ResultFormatter.departureAirport(
|
|
852
|
-
|
|
1061
|
+
ResultFormatter.departureAirport(
|
|
1062
|
+
decodeResult,
|
|
1063
|
+
header[1].substring(0, 3),
|
|
1064
|
+
"IATA"
|
|
1065
|
+
);
|
|
1066
|
+
ResultFormatter.arrivalAirport(
|
|
1067
|
+
decodeResult,
|
|
1068
|
+
header[1].substring(3),
|
|
1069
|
+
"IATA"
|
|
1070
|
+
);
|
|
853
1071
|
} else if (type === "ET") {
|
|
854
1072
|
const airports = data[2].split(" ");
|
|
855
1073
|
ResultFormatter.departureAirport(decodeResult, airports[1]);
|
|
856
1074
|
ResultFormatter.arrivalAirport(decodeResult, airports[2]);
|
|
857
1075
|
decodeResult.raw.day = Number(airports[3]);
|
|
858
|
-
ResultFormatter.time_of_day(
|
|
1076
|
+
ResultFormatter.time_of_day(
|
|
1077
|
+
decodeResult,
|
|
1078
|
+
DateTimeUtils.convertHHMMSSToTod(airports[4])
|
|
1079
|
+
);
|
|
859
1080
|
const estimates = data[3].split(" ");
|
|
860
|
-
ResultFormatter.eta(
|
|
1081
|
+
ResultFormatter.eta(
|
|
1082
|
+
decodeResult,
|
|
1083
|
+
DateTimeUtils.convertHHMMSSToTod(estimates[1])
|
|
1084
|
+
);
|
|
861
1085
|
ResultFormatter.unknown(decodeResult, estimates[2]);
|
|
862
1086
|
} else {
|
|
863
1087
|
if (options.debug) {
|
|
@@ -880,7 +1104,6 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
880
1104
|
|
|
881
1105
|
// lib/plugins/Label_10_LDR.ts
|
|
882
1106
|
var Label_10_LDR = class extends DecoderPlugin {
|
|
883
|
-
// eslint-disable-line camelcase
|
|
884
1107
|
name = "label-10-ldr";
|
|
885
1108
|
qualifiers() {
|
|
886
1109
|
return {
|
|
@@ -919,7 +1142,10 @@ var Label_10_LDR = class extends DecoderPlugin {
|
|
|
919
1142
|
if (altRwy != "") {
|
|
920
1143
|
ResultFormatter.alternateRunway(decodeResult, altRwy);
|
|
921
1144
|
}
|
|
922
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1145
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1146
|
+
...parts.slice(0, 5),
|
|
1147
|
+
...parts.slice(15)
|
|
1148
|
+
]);
|
|
923
1149
|
decodeResult.decoded = true;
|
|
924
1150
|
decodeResult.decoder.decodeLevel = "partial";
|
|
925
1151
|
return decodeResult;
|
|
@@ -928,7 +1154,6 @@ var Label_10_LDR = class extends DecoderPlugin {
|
|
|
928
1154
|
|
|
929
1155
|
// lib/plugins/Label_10_POS.ts
|
|
930
1156
|
var Label_10_POS = class extends DecoderPlugin {
|
|
931
|
-
// eslint-disable-line camelcase
|
|
932
1157
|
name = "label-10-pos";
|
|
933
1158
|
qualifiers() {
|
|
934
1159
|
return {
|
|
@@ -959,7 +1184,11 @@ var Label_10_POS = class extends DecoderPlugin {
|
|
|
959
1184
|
};
|
|
960
1185
|
ResultFormatter.position(decodeResult, position);
|
|
961
1186
|
ResultFormatter.altitude(decodeResult, Number(parts[7]));
|
|
962
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1187
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1188
|
+
parts[0],
|
|
1189
|
+
...parts.slice(3, 7),
|
|
1190
|
+
...parts.slice(8)
|
|
1191
|
+
]);
|
|
963
1192
|
decodeResult.decoded = true;
|
|
964
1193
|
decodeResult.decoder.decodeLevel = "partial";
|
|
965
1194
|
return decodeResult;
|
|
@@ -968,7 +1197,6 @@ var Label_10_POS = class extends DecoderPlugin {
|
|
|
968
1197
|
|
|
969
1198
|
// lib/plugins/Label_10_Slash.ts
|
|
970
1199
|
var Label_10_Slash = class extends DecoderPlugin {
|
|
971
|
-
// eslint-disable-line camelcase
|
|
972
1200
|
name = "label-10-slash";
|
|
973
1201
|
qualifiers() {
|
|
974
1202
|
return {
|
|
@@ -1001,23 +1229,34 @@ var Label_10_Slash = class extends DecoderPlugin {
|
|
|
1001
1229
|
ResultFormatter.heading(decodeResult, Number(parts[5]));
|
|
1002
1230
|
ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));
|
|
1003
1231
|
ResultFormatter.arrivalAirport(decodeResult, parts[7]);
|
|
1004
|
-
ResultFormatter.eta(
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1232
|
+
ResultFormatter.eta(
|
|
1233
|
+
decodeResult,
|
|
1234
|
+
DateTimeUtils.convertHHMMSSToTod(parts[8])
|
|
1235
|
+
);
|
|
1236
|
+
const waypoints = [
|
|
1237
|
+
{
|
|
1238
|
+
name: parts[11]
|
|
1239
|
+
},
|
|
1240
|
+
{
|
|
1241
|
+
name: parts[12],
|
|
1242
|
+
time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
|
|
1243
|
+
timeFormat: "tod"
|
|
1244
|
+
},
|
|
1245
|
+
{
|
|
1246
|
+
name: parts[14],
|
|
1247
|
+
time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
|
|
1248
|
+
timeFormat: "tod"
|
|
1249
|
+
}
|
|
1250
|
+
];
|
|
1016
1251
|
ResultFormatter.route(decodeResult, { waypoints });
|
|
1017
1252
|
if (parts[16]) {
|
|
1018
1253
|
ResultFormatter.departureAirport(decodeResult, parts[16]);
|
|
1019
1254
|
}
|
|
1020
|
-
ResultFormatter.unknownArr(
|
|
1255
|
+
ResultFormatter.unknownArr(
|
|
1256
|
+
decodeResult,
|
|
1257
|
+
[parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],
|
|
1258
|
+
"/"
|
|
1259
|
+
);
|
|
1021
1260
|
decodeResult.decoded = true;
|
|
1022
1261
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1023
1262
|
return decodeResult;
|
|
@@ -1042,7 +1281,7 @@ var Label_12_N_Space = class extends DecoderPlugin {
|
|
|
1042
1281
|
let results = message.text.match(variant1Regex);
|
|
1043
1282
|
if (results?.groups) {
|
|
1044
1283
|
if (options.debug) {
|
|
1045
|
-
console.log(
|
|
1284
|
+
console.log("Label 12 N : results");
|
|
1046
1285
|
console.log(results);
|
|
1047
1286
|
}
|
|
1048
1287
|
ResultFormatter.position(decodeResult, {
|
|
@@ -1051,7 +1290,11 @@ var Label_12_N_Space = class extends DecoderPlugin {
|
|
|
1051
1290
|
});
|
|
1052
1291
|
const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
|
|
1053
1292
|
ResultFormatter.altitude(decodeResult, altitude);
|
|
1054
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1293
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1294
|
+
results.groups.unkwn1,
|
|
1295
|
+
results.groups.unkwn2,
|
|
1296
|
+
results.groups.unkwn3
|
|
1297
|
+
]);
|
|
1055
1298
|
decodeResult.decoded = true;
|
|
1056
1299
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1057
1300
|
return decodeResult;
|
|
@@ -1093,15 +1336,32 @@ var Label_12_POS = class extends DecoderPlugin {
|
|
|
1093
1336
|
const lat = data[0].substring(0, 8);
|
|
1094
1337
|
const lon = data[0].substring(8);
|
|
1095
1338
|
ResultFormatter.position(decodeResult, {
|
|
1096
|
-
latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1097
|
-
|
|
1339
|
+
latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1340
|
+
Number(lat.substring(1, 4)),
|
|
1341
|
+
Number(lat.substring(4, 6)),
|
|
1342
|
+
Number(lat.substring(6, 8))
|
|
1343
|
+
),
|
|
1344
|
+
longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1345
|
+
Number(lon.substring(1, 4)),
|
|
1346
|
+
Number(lon.substring(4, 6)),
|
|
1347
|
+
Number(lon.substring(6, 8))
|
|
1348
|
+
)
|
|
1098
1349
|
});
|
|
1099
1350
|
ResultFormatter.unknown(decodeResult, data[1]);
|
|
1100
|
-
ResultFormatter.time_of_day(
|
|
1351
|
+
ResultFormatter.time_of_day(
|
|
1352
|
+
decodeResult,
|
|
1353
|
+
DateTimeUtils.convertHHMMSSToTod(data[2])
|
|
1354
|
+
);
|
|
1101
1355
|
ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
|
|
1102
1356
|
ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
|
|
1103
|
-
ResultFormatter.currentFuel(
|
|
1104
|
-
|
|
1357
|
+
ResultFormatter.currentFuel(
|
|
1358
|
+
decodeResult,
|
|
1359
|
+
Number(data[7].substring(3).trim())
|
|
1360
|
+
);
|
|
1361
|
+
ResultFormatter.eta(
|
|
1362
|
+
decodeResult,
|
|
1363
|
+
DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim())
|
|
1364
|
+
);
|
|
1105
1365
|
ResultFormatter.departureAirport(decodeResult, data[9]);
|
|
1106
1366
|
ResultFormatter.arrivalAirport(decodeResult, data[10]);
|
|
1107
1367
|
ResultFormatter.unknown(decodeResult, data[11]);
|
|
@@ -1113,7 +1373,6 @@ var Label_12_POS = class extends DecoderPlugin {
|
|
|
1113
1373
|
|
|
1114
1374
|
// lib/plugins/Label_13Through18_Slash.ts
|
|
1115
1375
|
var Label_13Through18_Slash = class extends DecoderPlugin {
|
|
1116
|
-
// eslint-disable-line camelcase
|
|
1117
1376
|
name = "label-13-18-slash";
|
|
1118
1377
|
qualifiers() {
|
|
1119
1378
|
return {
|
|
@@ -1160,11 +1419,22 @@ var Label_13Through18_Slash = class extends DecoderPlugin {
|
|
|
1160
1419
|
const location = lines[i].substring(5).split(",");
|
|
1161
1420
|
let position;
|
|
1162
1421
|
if (location[0].startsWith("+") || location[0].startsWith("-")) {
|
|
1163
|
-
position = {
|
|
1422
|
+
position = {
|
|
1423
|
+
latitude: Number(location[0]),
|
|
1424
|
+
longitude: Number(location[1])
|
|
1425
|
+
};
|
|
1164
1426
|
} else {
|
|
1165
1427
|
position = {
|
|
1166
|
-
latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1167
|
-
|
|
1428
|
+
latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1429
|
+
Number(location[0].substring(1, 3)),
|
|
1430
|
+
Number(location[0].substring(3, 5)),
|
|
1431
|
+
Number(location[0].substring(5, 7))
|
|
1432
|
+
),
|
|
1433
|
+
longitude: CoordinateUtils.getDirection(location[1][0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1434
|
+
Number(location[1].substring(1, 4)),
|
|
1435
|
+
Number(location[1].substring(4, 6)),
|
|
1436
|
+
Number(location[1].substring(6, 8))
|
|
1437
|
+
)
|
|
1168
1438
|
};
|
|
1169
1439
|
}
|
|
1170
1440
|
ResultFormatter.position(decodeResult, position);
|
|
@@ -1215,22 +1485,38 @@ var Label_15 = class extends DecoderPlugin {
|
|
|
1215
1485
|
decodeResult.message = message;
|
|
1216
1486
|
if (message.text.startsWith("(2") && message.text.endsWith("(Z")) {
|
|
1217
1487
|
const between = message.text.substring(2, message.text.length - 2);
|
|
1218
|
-
ResultFormatter.position(
|
|
1488
|
+
ResultFormatter.position(
|
|
1489
|
+
decodeResult,
|
|
1490
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
1491
|
+
between.substring(0, 13)
|
|
1492
|
+
)
|
|
1493
|
+
);
|
|
1219
1494
|
if (between.length === 25) {
|
|
1220
1495
|
ResultFormatter.unknown(decodeResult, between.substring(13, 19));
|
|
1221
1496
|
const alt = between.substring(19, 22);
|
|
1222
1497
|
if (alt != "---") {
|
|
1223
1498
|
ResultFormatter.altitude(decodeResult, 100 * Number(alt));
|
|
1224
1499
|
}
|
|
1225
|
-
ResultFormatter.temperature(
|
|
1500
|
+
ResultFormatter.temperature(
|
|
1501
|
+
decodeResult,
|
|
1502
|
+
between.substring(22).replaceAll(" ", "0")
|
|
1503
|
+
);
|
|
1226
1504
|
} else if (between.substring(13, 16) === "OFF") {
|
|
1227
1505
|
const ddmmyy = between.substring(16, 22);
|
|
1228
1506
|
const hhmm = between.substring(22, 26);
|
|
1229
1507
|
if (ddmmyy != "------") {
|
|
1230
1508
|
const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
|
|
1231
|
-
ResultFormatter.off(
|
|
1509
|
+
ResultFormatter.off(
|
|
1510
|
+
decodeResult,
|
|
1511
|
+
DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy),
|
|
1512
|
+
"epoch"
|
|
1513
|
+
);
|
|
1232
1514
|
} else {
|
|
1233
|
-
ResultFormatter.off(
|
|
1515
|
+
ResultFormatter.off(
|
|
1516
|
+
decodeResult,
|
|
1517
|
+
DateTimeUtils.convertHHMMSSToTod(hhmm),
|
|
1518
|
+
"tod"
|
|
1519
|
+
);
|
|
1234
1520
|
}
|
|
1235
1521
|
ResultFormatter.unknown(decodeResult, between.substring(26));
|
|
1236
1522
|
} else {
|
|
@@ -1275,7 +1561,10 @@ var Label_15_FST = class extends DecoderPlugin {
|
|
|
1275
1561
|
const lat = Number(stringCoords.substring(1, 7)) / 1e4 * (firstChar === "S" ? -1 : 1);
|
|
1276
1562
|
const lon = Number(stringCoords.substring(8, 15)) / 1e4 * (middleChar === "W" ? -1 : 1);
|
|
1277
1563
|
ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });
|
|
1278
|
-
ResultFormatter.altitude(
|
|
1564
|
+
ResultFormatter.altitude(
|
|
1565
|
+
decodeResult,
|
|
1566
|
+
Number(stringCoords.substring(15)) * 100
|
|
1567
|
+
);
|
|
1279
1568
|
} else {
|
|
1280
1569
|
decodeResult.decoded = false;
|
|
1281
1570
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -1371,7 +1660,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
|
|
|
1371
1660
|
let results = message.text.match(variant1Regex);
|
|
1372
1661
|
if (results?.groups) {
|
|
1373
1662
|
if (options.debug) {
|
|
1374
|
-
console.log(
|
|
1663
|
+
console.log("Label 16 N : results");
|
|
1375
1664
|
console.log(results);
|
|
1376
1665
|
}
|
|
1377
1666
|
let pos = {
|
|
@@ -1381,7 +1670,10 @@ var Label_16_N_Space = class extends DecoderPlugin {
|
|
|
1381
1670
|
const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
|
|
1382
1671
|
ResultFormatter.position(decodeResult, pos);
|
|
1383
1672
|
ResultFormatter.altitude(decodeResult, altitude);
|
|
1384
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1673
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1674
|
+
results.groups.unkwn1,
|
|
1675
|
+
results.groups.unkwn2
|
|
1676
|
+
]);
|
|
1385
1677
|
decodeResult.decoded = true;
|
|
1386
1678
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1387
1679
|
return decodeResult;
|
|
@@ -1389,7 +1681,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
|
|
|
1389
1681
|
results = message.text.match(variant2Regex);
|
|
1390
1682
|
if (results?.groups) {
|
|
1391
1683
|
if (options.debug) {
|
|
1392
|
-
console.log(
|
|
1684
|
+
console.log("Label 16 N : results");
|
|
1393
1685
|
console.log(results);
|
|
1394
1686
|
}
|
|
1395
1687
|
let pos = {
|
|
@@ -1435,17 +1727,22 @@ var Label_16_POSA1 = class extends DecoderPlugin {
|
|
|
1435
1727
|
decodeResult.decoder.decodeLevel = "none";
|
|
1436
1728
|
return decodeResult;
|
|
1437
1729
|
}
|
|
1438
|
-
ResultFormatter.position(
|
|
1730
|
+
ResultFormatter.position(
|
|
1731
|
+
decodeResult,
|
|
1732
|
+
CoordinateUtils.decodeStringCoordinates(fields[0].substring(5))
|
|
1733
|
+
);
|
|
1439
1734
|
const waypoint = fields[1].trim();
|
|
1440
1735
|
const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);
|
|
1441
1736
|
ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);
|
|
1442
1737
|
const nextWaypoint = fields[4].trim();
|
|
1443
1738
|
const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);
|
|
1444
1739
|
ResultFormatter.unknownArr(decodeResult, fields.slice(6), ",");
|
|
1445
|
-
ResultFormatter.route(decodeResult, {
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1740
|
+
ResultFormatter.route(decodeResult, {
|
|
1741
|
+
waypoints: [
|
|
1742
|
+
{ name: waypoint, time, timeFormat: "tod" },
|
|
1743
|
+
{ name: nextWaypoint, time: nextTime, timeFormat: "tod" }
|
|
1744
|
+
]
|
|
1745
|
+
});
|
|
1449
1746
|
decodeResult.decoded = true;
|
|
1450
1747
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1451
1748
|
return decodeResult;
|
|
@@ -1480,7 +1777,10 @@ var Label_16_TOD = class extends DecoderPlugin {
|
|
|
1480
1777
|
if (fields[1] !== "") {
|
|
1481
1778
|
ResultFormatter.altitude(decodeResult, Number(fields[1]));
|
|
1482
1779
|
}
|
|
1483
|
-
ResultFormatter.eta(
|
|
1780
|
+
ResultFormatter.eta(
|
|
1781
|
+
decodeResult,
|
|
1782
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
1783
|
+
);
|
|
1484
1784
|
ResultFormatter.unknown(decodeResult, fields[3]);
|
|
1485
1785
|
const temp = fields[4].split("/");
|
|
1486
1786
|
const posFields = temp[0].split(" ");
|
|
@@ -1501,9 +1801,9 @@ var Label_16_TOD = class extends DecoderPlugin {
|
|
|
1501
1801
|
var FlightPlanUtils = class _FlightPlanUtils {
|
|
1502
1802
|
/**
|
|
1503
1803
|
* Processes flight plan data
|
|
1504
|
-
*
|
|
1804
|
+
*
|
|
1505
1805
|
* Expected format is [header, key1, val1, ... keyN, valN]
|
|
1506
|
-
*
|
|
1806
|
+
*
|
|
1507
1807
|
* @param decodeResult - results
|
|
1508
1808
|
* @param data - original message split by ':'
|
|
1509
1809
|
* @returns whether all fields were processed or not
|
|
@@ -1535,6 +1835,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
1535
1835
|
case "F":
|
|
1536
1836
|
addRoute(decodeResult, value);
|
|
1537
1837
|
break;
|
|
1838
|
+
case "FP":
|
|
1839
|
+
ResultFormatter.flightPlan(decodeResult, value.trim());
|
|
1840
|
+
break;
|
|
1538
1841
|
case "R":
|
|
1539
1842
|
addRunway(decodeResult, value);
|
|
1540
1843
|
break;
|
|
@@ -1589,6 +1892,14 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
1589
1892
|
label: "Route Status",
|
|
1590
1893
|
value: "Route Mapped"
|
|
1591
1894
|
});
|
|
1895
|
+
} else if (header.startsWith("RS")) {
|
|
1896
|
+
decodeResult.raw.route_status = "RS";
|
|
1897
|
+
decodeResult.formatted.items.push({
|
|
1898
|
+
type: "status",
|
|
1899
|
+
code: "ROUTE_STATUS",
|
|
1900
|
+
label: "Route Status",
|
|
1901
|
+
value: "Route Saved"
|
|
1902
|
+
});
|
|
1592
1903
|
} else {
|
|
1593
1904
|
decodeResult.remaining.text += header;
|
|
1594
1905
|
allKnownFields = false;
|
|
@@ -1608,7 +1919,7 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
1608
1919
|
decodeResult.raw.procedures.push({ type, route });
|
|
1609
1920
|
const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);
|
|
1610
1921
|
decodeResult.formatted.items.push({
|
|
1611
|
-
type:
|
|
1922
|
+
type: "procedure",
|
|
1612
1923
|
code: "proc",
|
|
1613
1924
|
label: `${procedureName} Procedure`,
|
|
1614
1925
|
value: RouteUtils.routeToString(route)
|
|
@@ -1629,7 +1940,9 @@ function addRunway(decodeResult, value) {
|
|
|
1629
1940
|
}
|
|
1630
1941
|
function addRoute(decodeResult, value) {
|
|
1631
1942
|
const route = value.split(".");
|
|
1632
|
-
ResultFormatter.route(decodeResult, {
|
|
1943
|
+
ResultFormatter.route(decodeResult, {
|
|
1944
|
+
waypoints: route.map((leg) => RouteUtils.getWaypoint(leg))
|
|
1945
|
+
});
|
|
1633
1946
|
}
|
|
1634
1947
|
function addCompanyRoute(decodeResult, value) {
|
|
1635
1948
|
const segments = value.split(".");
|
|
@@ -1683,15 +1996,27 @@ var H1Helper = class _H1Helper {
|
|
|
1683
1996
|
case "AF":
|
|
1684
1997
|
processAirField(decodeResult, data2.split(","));
|
|
1685
1998
|
break;
|
|
1999
|
+
case "AK":
|
|
2000
|
+
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2001
|
+
break;
|
|
1686
2002
|
case "CG":
|
|
1687
2003
|
processCenterOfGravity(decodeResult, data2.split(","));
|
|
1688
2004
|
break;
|
|
1689
2005
|
case "DC":
|
|
1690
2006
|
processDateCode(decodeResult, data2.split(","));
|
|
1691
2007
|
break;
|
|
2008
|
+
case "DI":
|
|
2009
|
+
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2010
|
+
break;
|
|
1692
2011
|
case "DT":
|
|
1693
2012
|
processDT(decodeResult, data2.split(","));
|
|
1694
2013
|
break;
|
|
2014
|
+
case "DQ":
|
|
2015
|
+
ResultFormatter.desiredAltitude(
|
|
2016
|
+
decodeResult,
|
|
2017
|
+
parseInt(data2, 10) * 100
|
|
2018
|
+
);
|
|
2019
|
+
break;
|
|
1695
2020
|
case "ET":
|
|
1696
2021
|
processETA(data2, decodeResult, fields, i);
|
|
1697
2022
|
break;
|
|
@@ -1704,6 +2029,9 @@ var H1Helper = class _H1Helper {
|
|
|
1704
2029
|
case "FX":
|
|
1705
2030
|
ResultFormatter.freetext(decodeResult, data2);
|
|
1706
2031
|
break;
|
|
2032
|
+
case "GA":
|
|
2033
|
+
ResultFormatter.groundAddress(decodeResult, data2);
|
|
2034
|
+
break;
|
|
1707
2035
|
case "ID":
|
|
1708
2036
|
processIdentification(decodeResult, data2.split(","));
|
|
1709
2037
|
break;
|
|
@@ -1720,11 +2048,18 @@ var H1Helper = class _H1Helper {
|
|
|
1720
2048
|
case "RI":
|
|
1721
2049
|
case "RM":
|
|
1722
2050
|
case "RP":
|
|
2051
|
+
case "RS":
|
|
1723
2052
|
FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(":"));
|
|
1724
2053
|
break;
|
|
2054
|
+
case "RN":
|
|
2055
|
+
ResultFormatter.routeNumber(decodeResult, data2);
|
|
2056
|
+
break;
|
|
1725
2057
|
case "SN":
|
|
1726
2058
|
decodeResult.raw.serial_number = data2;
|
|
1727
2059
|
break;
|
|
2060
|
+
case "SP":
|
|
2061
|
+
ResultFormatter.startPoint(decodeResult, data2);
|
|
2062
|
+
break;
|
|
1728
2063
|
case "TD":
|
|
1729
2064
|
processTimeOfDeparture(decodeResult, data2.split(","));
|
|
1730
2065
|
break;
|
|
@@ -1737,6 +2072,9 @@ var H1Helper = class _H1Helper {
|
|
|
1737
2072
|
case "WD":
|
|
1738
2073
|
processWindData(decodeResult, data2);
|
|
1739
2074
|
break;
|
|
2075
|
+
case "WQ":
|
|
2076
|
+
processWeatherQuery(decodeResult, data2.split(":"));
|
|
2077
|
+
break;
|
|
1740
2078
|
default:
|
|
1741
2079
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
1742
2080
|
}
|
|
@@ -1745,15 +2083,11 @@ var H1Helper = class _H1Helper {
|
|
|
1745
2083
|
return true;
|
|
1746
2084
|
}
|
|
1747
2085
|
static processPS(decodeResult, data) {
|
|
1748
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2086
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2087
|
+
data[0]
|
|
2088
|
+
);
|
|
1749
2089
|
if (position) {
|
|
1750
|
-
|
|
1751
|
-
decodeResult.formatted.items.push({
|
|
1752
|
-
type: "aircraft_position",
|
|
1753
|
-
code: "POS",
|
|
1754
|
-
label: "Aircraft Position",
|
|
1755
|
-
value: CoordinateUtils.coordinateString(position)
|
|
1756
|
-
});
|
|
2090
|
+
ResultFormatter.position(decodeResult, position);
|
|
1757
2091
|
}
|
|
1758
2092
|
if (data.length === 9) {
|
|
1759
2093
|
processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
|
|
@@ -1770,7 +2104,9 @@ var H1Helper = class _H1Helper {
|
|
|
1770
2104
|
}
|
|
1771
2105
|
}
|
|
1772
2106
|
static processPosition(decodeResult, data) {
|
|
1773
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2107
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2108
|
+
data[0]
|
|
2109
|
+
);
|
|
1774
2110
|
if (position) {
|
|
1775
2111
|
ResultFormatter.position(decodeResult, position);
|
|
1776
2112
|
}
|
|
@@ -1786,7 +2122,15 @@ var H1Helper = class _H1Helper {
|
|
|
1786
2122
|
}
|
|
1787
2123
|
}
|
|
1788
2124
|
static processTimeStamp(decodeResult, data) {
|
|
1789
|
-
|
|
2125
|
+
if (data.length > 2) {
|
|
2126
|
+
const positionData = data.slice(1);
|
|
2127
|
+
positionData[0] = positionData[0].substring(6);
|
|
2128
|
+
this.processPosition(decodeResult, positionData);
|
|
2129
|
+
}
|
|
2130
|
+
let time = DateTimeUtils.convertDateTimeToEpoch(
|
|
2131
|
+
data[0],
|
|
2132
|
+
data[1].substring(0, 6)
|
|
2133
|
+
);
|
|
1790
2134
|
if (Number.isNaN(time)) {
|
|
1791
2135
|
const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
|
|
1792
2136
|
time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
|
|
@@ -1797,10 +2141,16 @@ var H1Helper = class _H1Helper {
|
|
|
1797
2141
|
function processETA(data, decodeResult, fields, i) {
|
|
1798
2142
|
if (data.length === 5) {
|
|
1799
2143
|
ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));
|
|
1800
|
-
ResultFormatter.eta(
|
|
2144
|
+
ResultFormatter.eta(
|
|
2145
|
+
decodeResult,
|
|
2146
|
+
DateTimeUtils.convertHHMMSSToTod(data.substring(1))
|
|
2147
|
+
);
|
|
1801
2148
|
} else if (data.length === 6) {
|
|
1802
2149
|
ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));
|
|
1803
|
-
ResultFormatter.eta(
|
|
2150
|
+
ResultFormatter.eta(
|
|
2151
|
+
decodeResult,
|
|
2152
|
+
DateTimeUtils.convertHHMMSSToTod(data.substring(2))
|
|
2153
|
+
);
|
|
1804
2154
|
} else {
|
|
1805
2155
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
1806
2156
|
}
|
|
@@ -1855,7 +2205,10 @@ function processDT(decodeResult, data) {
|
|
|
1855
2205
|
ResultFormatter.currentFuel(decodeResult, Number(data[2]));
|
|
1856
2206
|
}
|
|
1857
2207
|
if (data.length > 3) {
|
|
1858
|
-
ResultFormatter.eta(
|
|
2208
|
+
ResultFormatter.eta(
|
|
2209
|
+
decodeResult,
|
|
2210
|
+
DateTimeUtils.convertHHMMSSToTod(data[3])
|
|
2211
|
+
);
|
|
1859
2212
|
}
|
|
1860
2213
|
if (data.length > 4) {
|
|
1861
2214
|
ResultFormatter.remainingFuel(decodeResult, Number(data[4]));
|
|
@@ -1895,18 +2248,30 @@ function processCenterOfGravity(decodeResult, data) {
|
|
|
1895
2248
|
ResultFormatter.unknown(decodeResult, data.join(","));
|
|
1896
2249
|
}
|
|
1897
2250
|
}
|
|
1898
|
-
function parseMessageType(decodeResult,
|
|
2251
|
+
function parseMessageType(decodeResult, messagePart) {
|
|
2252
|
+
const messageParts = messagePart.split(",");
|
|
2253
|
+
const messageType = messageParts[0];
|
|
1899
2254
|
if (messageType.startsWith("POS")) {
|
|
1900
|
-
H1Helper.processPosition(decodeResult,
|
|
2255
|
+
H1Helper.processPosition(decodeResult, messagePart.substring(3).split(","));
|
|
1901
2256
|
return processMessageType(decodeResult, "POS");
|
|
1902
|
-
} else if (messageType.length ===
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
2257
|
+
} else if (messageType.length === 6) {
|
|
2258
|
+
const part1 = processMessageType(decodeResult, messageType.substring(0, 3));
|
|
2259
|
+
const description = decodeResult.formatted.description;
|
|
2260
|
+
const part2 = processMessageType(decodeResult, messageType.substring(3, 6));
|
|
2261
|
+
decodeResult.formatted.description = description + " for " + decodeResult.formatted.description;
|
|
2262
|
+
if (messageParts.length > 1) {
|
|
2263
|
+
ResultFormatter.unknown(
|
|
2264
|
+
decodeResult,
|
|
2265
|
+
messageParts.slice(1).join(","),
|
|
2266
|
+
"/"
|
|
2267
|
+
);
|
|
1907
2268
|
}
|
|
2269
|
+
return part1 && part2;
|
|
1908
2270
|
}
|
|
1909
|
-
|
|
2271
|
+
if (messageParts.length > 1) {
|
|
2272
|
+
ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(","), "/");
|
|
2273
|
+
}
|
|
2274
|
+
return processMessageType(decodeResult, messageType);
|
|
1910
2275
|
}
|
|
1911
2276
|
function processMessageType(decodeResult, type) {
|
|
1912
2277
|
if (type === "FPN") {
|
|
@@ -1923,6 +2288,12 @@ function processMessageType(decodeResult, type) {
|
|
|
1923
2288
|
decodeResult.formatted.description = "Progress Report";
|
|
1924
2289
|
} else if (type === "PWI") {
|
|
1925
2290
|
decodeResult.formatted.description = "Pilot Weather Information";
|
|
2291
|
+
} else if (type === "REJ") {
|
|
2292
|
+
decodeResult.formatted.description = "Reject";
|
|
2293
|
+
} else if (type === "REQ") {
|
|
2294
|
+
decodeResult.formatted.description = "Request";
|
|
2295
|
+
} else if (type === "RES") {
|
|
2296
|
+
decodeResult.formatted.description = "Response";
|
|
1926
2297
|
} else {
|
|
1927
2298
|
decodeResult.formatted.description = "Unknown H1 Message";
|
|
1928
2299
|
return false;
|
|
@@ -1938,6 +2309,22 @@ function processDateCode(decodeResult, data) {
|
|
|
1938
2309
|
decodeResult.raw.message_timestamp = time;
|
|
1939
2310
|
}
|
|
1940
2311
|
}
|
|
2312
|
+
function processWeatherQuery(decodeResult, data) {
|
|
2313
|
+
if (data.length !== 2) {
|
|
2314
|
+
ResultFormatter.unknown(decodeResult, data.join(":"), "WQ/");
|
|
2315
|
+
return;
|
|
2316
|
+
}
|
|
2317
|
+
const alts = data[0].split(".");
|
|
2318
|
+
const route = data[1].split(".");
|
|
2319
|
+
ResultFormatter.requestedAltitudes(
|
|
2320
|
+
decodeResult,
|
|
2321
|
+
alts.map((a) => parseInt(a, 10) * 100)
|
|
2322
|
+
);
|
|
2323
|
+
const waypoints = route.map((wp) => {
|
|
2324
|
+
return { name: wp };
|
|
2325
|
+
});
|
|
2326
|
+
ResultFormatter.route(decodeResult, { waypoints });
|
|
2327
|
+
}
|
|
1941
2328
|
function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
1942
2329
|
const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
|
|
1943
2330
|
const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
|
|
@@ -1950,13 +2337,7 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
|
1950
2337
|
nextWaypoint.timeFormat = timeFormat;
|
|
1951
2338
|
const thenWaypoint = RouteUtils.getWaypoint(then || "?");
|
|
1952
2339
|
const waypoints = [lastWaypoint, nextWaypoint, thenWaypoint];
|
|
1953
|
-
|
|
1954
|
-
decodeResult.formatted.items.push({
|
|
1955
|
-
type: "aircraft_route",
|
|
1956
|
-
code: "ROUTE",
|
|
1957
|
-
label: "Aircraft Route",
|
|
1958
|
-
value: RouteUtils.routeToString(decodeResult.raw.route)
|
|
1959
|
-
});
|
|
2340
|
+
ResultFormatter.route(decodeResult, { waypoints });
|
|
1960
2341
|
}
|
|
1961
2342
|
function processWindData(decodeResult, message) {
|
|
1962
2343
|
const wind = [];
|
|
@@ -2031,7 +2412,10 @@ var Label_1J_2J_FTX = class extends DecoderPlugin {
|
|
|
2031
2412
|
const parts = msg.split("/");
|
|
2032
2413
|
let decoded = false;
|
|
2033
2414
|
if (parts[0].length > 3) {
|
|
2034
|
-
decoded = H1Helper.decodeH1Message(
|
|
2415
|
+
decoded = H1Helper.decodeH1Message(
|
|
2416
|
+
decodeResult,
|
|
2417
|
+
msg.slice(parts[0].length - 3)
|
|
2418
|
+
);
|
|
2035
2419
|
decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
|
|
2036
2420
|
} else {
|
|
2037
2421
|
decoded = H1Helper.decodeH1Message(decodeResult, msg);
|
|
@@ -2067,16 +2451,26 @@ var Label_1M_Slash = class extends DecoderPlugin {
|
|
|
2067
2451
|
const results = message.text.split(/\n|\//).slice(1);
|
|
2068
2452
|
if (results) {
|
|
2069
2453
|
if (options.debug) {
|
|
2070
|
-
console.log(
|
|
2454
|
+
console.log("Label 1M ETA: results");
|
|
2071
2455
|
console.log(results);
|
|
2072
2456
|
}
|
|
2073
2457
|
decodeResult.raw.flight_number = results[0];
|
|
2074
2458
|
ResultFormatter.departureAirport(decodeResult, results[3]);
|
|
2075
2459
|
ResultFormatter.arrivalAirport(decodeResult, results[4]);
|
|
2076
2460
|
ResultFormatter.alternateAirport(decodeResult, results[5]);
|
|
2077
|
-
ResultFormatter.arrivalRunway(
|
|
2461
|
+
ResultFormatter.arrivalRunway(
|
|
2462
|
+
decodeResult,
|
|
2463
|
+
results[8].replace(results[4], "")
|
|
2464
|
+
);
|
|
2078
2465
|
const yymmdd = results[2];
|
|
2079
|
-
ResultFormatter.eta(
|
|
2466
|
+
ResultFormatter.eta(
|
|
2467
|
+
decodeResult,
|
|
2468
|
+
DateTimeUtils.convertDateTimeToEpoch(
|
|
2469
|
+
results[7] + "00",
|
|
2470
|
+
yymmdd.substring(2, 4) + yymmdd.substring(4, 6) + yymmdd.substring(0, 2)
|
|
2471
|
+
),
|
|
2472
|
+
"epoch"
|
|
2473
|
+
);
|
|
2080
2474
|
}
|
|
2081
2475
|
decodeResult.decoded = true;
|
|
2082
2476
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2086,7 +2480,6 @@ var Label_1M_Slash = class extends DecoderPlugin {
|
|
|
2086
2480
|
|
|
2087
2481
|
// lib/plugins/Label_1L_3-line.ts
|
|
2088
2482
|
var Label_1L_3Line = class extends DecoderPlugin {
|
|
2089
|
-
// eslint-disable-line camelcase
|
|
2090
2483
|
name = "label-1l-3-line";
|
|
2091
2484
|
qualifiers() {
|
|
2092
2485
|
return {
|
|
@@ -2174,7 +2567,6 @@ var Label_1L_3Line = class extends DecoderPlugin {
|
|
|
2174
2567
|
|
|
2175
2568
|
// lib/plugins/Label_1L_070.ts
|
|
2176
2569
|
var Label_1L_070 = class extends DecoderPlugin {
|
|
2177
|
-
// eslint-disable-line camelcase
|
|
2178
2570
|
name = "label-1l-070";
|
|
2179
2571
|
qualifiers() {
|
|
2180
2572
|
return {
|
|
@@ -2208,8 +2600,14 @@ var Label_1L_070 = class extends DecoderPlugin {
|
|
|
2208
2600
|
}
|
|
2209
2601
|
ResultFormatter.departureAirport(decodeResult, parts[0]);
|
|
2210
2602
|
ResultFormatter.arrivalAirport(decodeResult, parts[1]);
|
|
2211
|
-
ResultFormatter.time_of_day(
|
|
2212
|
-
|
|
2603
|
+
ResultFormatter.time_of_day(
|
|
2604
|
+
decodeResult,
|
|
2605
|
+
DateTimeUtils.convertHHMMSSToTod(parts[2])
|
|
2606
|
+
);
|
|
2607
|
+
ResultFormatter.eta(
|
|
2608
|
+
decodeResult,
|
|
2609
|
+
DateTimeUtils.convertHHMMSSToTod(parts[3])
|
|
2610
|
+
);
|
|
2213
2611
|
ResultFormatter.position(decodeResult, {
|
|
2214
2612
|
latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),
|
|
2215
2613
|
longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1))
|
|
@@ -2223,7 +2621,6 @@ var Label_1L_070 = class extends DecoderPlugin {
|
|
|
2223
2621
|
|
|
2224
2622
|
// lib/plugins/Label_1L_660.ts
|
|
2225
2623
|
var Label_1L_660 = class extends DecoderPlugin {
|
|
2226
|
-
// eslint-disable-line camelcase
|
|
2227
2624
|
name = "label-1l-660";
|
|
2228
2625
|
qualifiers() {
|
|
2229
2626
|
return {
|
|
@@ -2255,12 +2652,17 @@ var Label_1L_660 = class extends DecoderPlugin {
|
|
|
2255
2652
|
decodeResult.decoder.decodeLevel = "none";
|
|
2256
2653
|
return decodeResult;
|
|
2257
2654
|
}
|
|
2258
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2655
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2656
|
+
parts[0]
|
|
2657
|
+
);
|
|
2259
2658
|
if (position) {
|
|
2260
2659
|
ResultFormatter.position(decodeResult, position);
|
|
2261
2660
|
}
|
|
2262
2661
|
const hhmmss = parts[1].substring(0, 6);
|
|
2263
|
-
ResultFormatter.time_of_day(
|
|
2662
|
+
ResultFormatter.time_of_day(
|
|
2663
|
+
decodeResult,
|
|
2664
|
+
DateTimeUtils.convertHHMMSSToTod(hhmmss)
|
|
2665
|
+
);
|
|
2264
2666
|
const fl = parts[1].substring(6, 9);
|
|
2265
2667
|
ResultFormatter.altitude(decodeResult, Number(fl) * 100);
|
|
2266
2668
|
const next = parts[1].substring(9);
|
|
@@ -2274,7 +2676,6 @@ var Label_1L_660 = class extends DecoderPlugin {
|
|
|
2274
2676
|
|
|
2275
2677
|
// lib/plugins/Label_1L_Slash.ts
|
|
2276
2678
|
var Label_1L_Slash = class extends DecoderPlugin {
|
|
2277
|
-
// eslint-disable-line camelcase
|
|
2278
2679
|
name = "label-1l-1-line";
|
|
2279
2680
|
qualifiers() {
|
|
2280
2681
|
return {
|
|
@@ -2313,7 +2714,10 @@ var Label_1L_Slash = class extends DecoderPlugin {
|
|
|
2313
2714
|
ResultFormatter.position(decodeResult, position);
|
|
2314
2715
|
const utc = data.get("UTC");
|
|
2315
2716
|
if (utc) {
|
|
2316
|
-
ResultFormatter.time_of_day(
|
|
2717
|
+
ResultFormatter.time_of_day(
|
|
2718
|
+
decodeResult,
|
|
2719
|
+
DateTimeUtils.convertHHMMSSToTod(utc)
|
|
2720
|
+
);
|
|
2317
2721
|
data.delete("UTC");
|
|
2318
2722
|
}
|
|
2319
2723
|
const alt = data.get("ALT");
|
|
@@ -2364,7 +2768,10 @@ var Label_20_POS = class extends DecoderPlugin {
|
|
|
2364
2768
|
console.log(`DEBUG: ${this.name}: Variation 1 detected`);
|
|
2365
2769
|
}
|
|
2366
2770
|
const rawCoords = fields[0];
|
|
2367
|
-
ResultFormatter.position(
|
|
2771
|
+
ResultFormatter.position(
|
|
2772
|
+
decodeResult,
|
|
2773
|
+
CoordinateUtils.decodeStringCoordinates(rawCoords)
|
|
2774
|
+
);
|
|
2368
2775
|
decodeResult.decoded = true;
|
|
2369
2776
|
decodeResult.decoder.decodeLevel = "full";
|
|
2370
2777
|
} else if (fields.length == 5) {
|
|
@@ -2379,7 +2786,9 @@ var Label_20_POS = class extends DecoderPlugin {
|
|
|
2379
2786
|
decodeResult.decoder.decodeLevel = "full";
|
|
2380
2787
|
} else {
|
|
2381
2788
|
if (options.debug) {
|
|
2382
|
-
console.log(
|
|
2789
|
+
console.log(
|
|
2790
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
|
|
2791
|
+
);
|
|
2383
2792
|
}
|
|
2384
2793
|
decodeResult.decoded = false;
|
|
2385
2794
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2407,17 +2816,29 @@ var Label_21_POS = class extends DecoderPlugin {
|
|
|
2407
2816
|
const fields = content.split(",");
|
|
2408
2817
|
if (fields.length == 9) {
|
|
2409
2818
|
processPosition(decodeResult, fields[0].trim());
|
|
2410
|
-
ResultFormatter.time_of_day(
|
|
2819
|
+
ResultFormatter.time_of_day(
|
|
2820
|
+
decodeResult,
|
|
2821
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
2822
|
+
);
|
|
2411
2823
|
ResultFormatter.altitude(decodeResult, Number(fields[3]));
|
|
2412
2824
|
ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ""));
|
|
2413
|
-
ResultFormatter.eta(
|
|
2825
|
+
ResultFormatter.eta(
|
|
2826
|
+
decodeResult,
|
|
2827
|
+
DateTimeUtils.convertHHMMSSToTod(fields[7])
|
|
2828
|
+
);
|
|
2414
2829
|
ResultFormatter.arrivalAirport(decodeResult, fields[8]);
|
|
2415
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
2830
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
2831
|
+
fields[1],
|
|
2832
|
+
fields[4],
|
|
2833
|
+
fields[5]
|
|
2834
|
+
]);
|
|
2416
2835
|
decodeResult.decoded = true;
|
|
2417
2836
|
decodeResult.decoder.decodeLevel = "partial";
|
|
2418
2837
|
} else {
|
|
2419
2838
|
if (options.debug) {
|
|
2420
|
-
console.log(
|
|
2839
|
+
console.log(
|
|
2840
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
|
|
2841
|
+
);
|
|
2421
2842
|
}
|
|
2422
2843
|
decodeResult.decoded = false;
|
|
2423
2844
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2460,12 +2881,27 @@ var Label_22_OFF = class extends DecoderPlugin {
|
|
|
2460
2881
|
return decodeResult;
|
|
2461
2882
|
}
|
|
2462
2883
|
ResultFormatter.flightNumber(decodeResult, fields[0]);
|
|
2463
|
-
ResultFormatter.departureDay(
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2884
|
+
ResultFormatter.departureDay(
|
|
2885
|
+
decodeResult,
|
|
2886
|
+
Number(fields[1].substring(0, 2))
|
|
2887
|
+
);
|
|
2888
|
+
ResultFormatter.arrivalDay(
|
|
2889
|
+
decodeResult,
|
|
2890
|
+
Number(fields[1].substring(2, 4))
|
|
2891
|
+
);
|
|
2892
|
+
ResultFormatter.time_of_day(
|
|
2893
|
+
decodeResult,
|
|
2894
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8))
|
|
2895
|
+
);
|
|
2896
|
+
ResultFormatter.departureAirport(
|
|
2897
|
+
decodeResult,
|
|
2898
|
+
fields[1].substring(8, 12)
|
|
2899
|
+
);
|
|
2467
2900
|
ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));
|
|
2468
|
-
ResultFormatter.off(
|
|
2901
|
+
ResultFormatter.off(
|
|
2902
|
+
decodeResult,
|
|
2903
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22))
|
|
2904
|
+
);
|
|
2469
2905
|
ResultFormatter.unknown(decodeResult, fields[1].substring(22));
|
|
2470
2906
|
decodeResult.decoded = true;
|
|
2471
2907
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2478,7 +2914,10 @@ var Label_22_OFF = class extends DecoderPlugin {
|
|
|
2478
2914
|
}
|
|
2479
2915
|
ResultFormatter.departureAirport(decodeResult, fields[0]);
|
|
2480
2916
|
ResultFormatter.arrivalAirport(decodeResult, fields[1]);
|
|
2481
|
-
ResultFormatter.off(
|
|
2917
|
+
ResultFormatter.off(
|
|
2918
|
+
decodeResult,
|
|
2919
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
2920
|
+
);
|
|
2482
2921
|
ResultFormatter.unknown(decodeResult, fields[3]);
|
|
2483
2922
|
decodeResult.decoded = true;
|
|
2484
2923
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2490,17 +2929,31 @@ var Label_22_OFF = class extends DecoderPlugin {
|
|
|
2490
2929
|
return decodeResult;
|
|
2491
2930
|
}
|
|
2492
2931
|
ResultFormatter.flightNumber(decodeResult, fields[0]);
|
|
2493
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2932
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2933
|
+
fields[1].substring(0, 14)
|
|
2934
|
+
);
|
|
2494
2935
|
if (position) {
|
|
2495
2936
|
ResultFormatter.position(decodeResult, position);
|
|
2496
2937
|
}
|
|
2497
2938
|
ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));
|
|
2498
|
-
ResultFormatter.time_of_day(
|
|
2499
|
-
|
|
2939
|
+
ResultFormatter.time_of_day(
|
|
2940
|
+
decodeResult,
|
|
2941
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20))
|
|
2942
|
+
);
|
|
2943
|
+
ResultFormatter.departureAirport(
|
|
2944
|
+
decodeResult,
|
|
2945
|
+
fields[1].substring(20, 24)
|
|
2946
|
+
);
|
|
2500
2947
|
ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));
|
|
2501
|
-
ResultFormatter.off(
|
|
2948
|
+
ResultFormatter.off(
|
|
2949
|
+
decodeResult,
|
|
2950
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32))
|
|
2951
|
+
);
|
|
2502
2952
|
ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));
|
|
2503
|
-
ResultFormatter.eta(
|
|
2953
|
+
ResultFormatter.eta(
|
|
2954
|
+
decodeResult,
|
|
2955
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40))
|
|
2956
|
+
);
|
|
2504
2957
|
decodeResult.decoded = true;
|
|
2505
2958
|
decodeResult.decoder.decodeLevel = "partial";
|
|
2506
2959
|
} else {
|
|
@@ -2531,7 +2984,9 @@ var Label_22_POS = class extends DecoderPlugin {
|
|
|
2531
2984
|
const fields = message.text.split(",");
|
|
2532
2985
|
if (fields.length !== 11) {
|
|
2533
2986
|
if (options.debug) {
|
|
2534
|
-
console.log(
|
|
2987
|
+
console.log(
|
|
2988
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(",")}`
|
|
2989
|
+
);
|
|
2535
2990
|
}
|
|
2536
2991
|
decodeResult.decoded = false;
|
|
2537
2992
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2545,7 +3000,10 @@ var Label_22_POS = class extends DecoderPlugin {
|
|
|
2545
3000
|
latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,
|
|
2546
3001
|
longitude: CoordinateUtils.getDirection(fields[0][8]) * lon
|
|
2547
3002
|
});
|
|
2548
|
-
ResultFormatter.time_of_day(
|
|
3003
|
+
ResultFormatter.time_of_day(
|
|
3004
|
+
decodeResult,
|
|
3005
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
3006
|
+
);
|
|
2549
3007
|
ResultFormatter.altitude(decodeResult, Number(fields[3]));
|
|
2550
3008
|
ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);
|
|
2551
3009
|
decodeResult.decoded = true;
|
|
@@ -2581,11 +3039,20 @@ var Label_2P_FM3 = class extends DecoderPlugin {
|
|
|
2581
3039
|
ResultFormatter.flightNumber(decodeResult, header[0].substring(4));
|
|
2582
3040
|
}
|
|
2583
3041
|
if (header[1].length === 4) {
|
|
2584
|
-
ResultFormatter.time_of_day(
|
|
3042
|
+
ResultFormatter.time_of_day(
|
|
3043
|
+
decodeResult,
|
|
3044
|
+
DateTimeUtils.convertHHMMSSToTod(header[1])
|
|
3045
|
+
);
|
|
2585
3046
|
} else {
|
|
2586
|
-
ResultFormatter.time_of_day(
|
|
3047
|
+
ResultFormatter.time_of_day(
|
|
3048
|
+
decodeResult,
|
|
3049
|
+
DateTimeUtils.convertHHMMSSToTod(header[1])
|
|
3050
|
+
);
|
|
2587
3051
|
}
|
|
2588
|
-
ResultFormatter.eta(
|
|
3052
|
+
ResultFormatter.eta(
|
|
3053
|
+
decodeResult,
|
|
3054
|
+
DateTimeUtils.convertHHMMSSToTod(parts[1])
|
|
3055
|
+
);
|
|
2589
3056
|
const lat = parts[2].replaceAll(" ", "");
|
|
2590
3057
|
const lon = parts[3].replaceAll(" ", "");
|
|
2591
3058
|
if (lat[0] === "N" || lat[0] === "S") {
|
|
@@ -2594,7 +3061,10 @@ var Label_2P_FM3 = class extends DecoderPlugin {
|
|
|
2594
3061
|
longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
|
|
2595
3062
|
});
|
|
2596
3063
|
} else {
|
|
2597
|
-
ResultFormatter.position(decodeResult, {
|
|
3064
|
+
ResultFormatter.position(decodeResult, {
|
|
3065
|
+
latitude: Number(lat),
|
|
3066
|
+
longitude: Number(lon)
|
|
3067
|
+
});
|
|
2598
3068
|
}
|
|
2599
3069
|
ResultFormatter.altitude(decodeResult, Number(parts[4]));
|
|
2600
3070
|
ResultFormatter.unknown(decodeResult, parts[5]);
|
|
@@ -2642,9 +3112,18 @@ var Label_2P_FM4 = class extends DecoderPlugin {
|
|
|
2642
3112
|
ResultFormatter.departureAirport(decodeResult, header[1]);
|
|
2643
3113
|
ResultFormatter.arrivalAirport(decodeResult, parts[1]);
|
|
2644
3114
|
ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));
|
|
2645
|
-
ResultFormatter.time_of_day(
|
|
2646
|
-
|
|
2647
|
-
|
|
3115
|
+
ResultFormatter.time_of_day(
|
|
3116
|
+
decodeResult,
|
|
3117
|
+
DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2))
|
|
3118
|
+
);
|
|
3119
|
+
ResultFormatter.eta(
|
|
3120
|
+
decodeResult,
|
|
3121
|
+
DateTimeUtils.convertHHMMSSToTod(parts[3])
|
|
3122
|
+
);
|
|
3123
|
+
ResultFormatter.position(decodeResult, {
|
|
3124
|
+
latitude: Number(parts[4].replaceAll(" ", "")),
|
|
3125
|
+
longitude: Number(parts[5].replaceAll(" ", ""))
|
|
3126
|
+
});
|
|
2648
3127
|
ResultFormatter.altitude(decodeResult, Number(parts[6]));
|
|
2649
3128
|
ResultFormatter.heading(decodeResult, Number(parts[7]));
|
|
2650
3129
|
ResultFormatter.unknown(decodeResult, parts[8]);
|
|
@@ -2687,9 +3166,18 @@ var Label_2P_FM5 = class extends DecoderPlugin {
|
|
|
2687
3166
|
}
|
|
2688
3167
|
ResultFormatter.departureAirport(decodeResult, header[1]);
|
|
2689
3168
|
ResultFormatter.arrivalAirport(decodeResult, parts[1]);
|
|
2690
|
-
ResultFormatter.time_of_day(
|
|
2691
|
-
|
|
2692
|
-
|
|
3169
|
+
ResultFormatter.time_of_day(
|
|
3170
|
+
decodeResult,
|
|
3171
|
+
DateTimeUtils.convertHHMMSSToTod(parts[2])
|
|
3172
|
+
);
|
|
3173
|
+
ResultFormatter.eta(
|
|
3174
|
+
decodeResult,
|
|
3175
|
+
DateTimeUtils.convertHHMMSSToTod(parts[3])
|
|
3176
|
+
);
|
|
3177
|
+
ResultFormatter.position(decodeResult, {
|
|
3178
|
+
latitude: Number(parts[4].replaceAll(" ", "")),
|
|
3179
|
+
longitude: Number(parts[5].replaceAll(" ", ""))
|
|
3180
|
+
});
|
|
2693
3181
|
ResultFormatter.altitude(decodeResult, Number(parts[6]));
|
|
2694
3182
|
ResultFormatter.unknown(decodeResult, parts[7]);
|
|
2695
3183
|
ResultFormatter.unknown(decodeResult, parts[8]);
|
|
@@ -2726,7 +3214,10 @@ var Label_2P_POS = class extends DecoderPlugin {
|
|
|
2726
3214
|
const parts = msg.split("/");
|
|
2727
3215
|
let decoded = false;
|
|
2728
3216
|
if (parts[0].length > 3) {
|
|
2729
|
-
decoded = H1Helper.decodeH1Message(
|
|
3217
|
+
decoded = H1Helper.decodeH1Message(
|
|
3218
|
+
decodeResult,
|
|
3219
|
+
msg.slice(parts[0].length - 3)
|
|
3220
|
+
);
|
|
2730
3221
|
decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
|
|
2731
3222
|
} else {
|
|
2732
3223
|
decoded = H1Helper.decodeH1Message(decodeResult, msg);
|
|
@@ -2763,7 +3254,10 @@ var Label_24_Slash = class extends DecoderPlugin {
|
|
|
2763
3254
|
if (fields.length == 10 && fields[0] == "" && fields[9] == "") {
|
|
2764
3255
|
const mmddyy = fields[1].substring(4, 6) + fields[1].substring(2, 4) + fields[1].substring(0, 2);
|
|
2765
3256
|
const hhmmss = fields[2] + "00";
|
|
2766
|
-
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
3257
|
+
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
3258
|
+
hhmmss,
|
|
3259
|
+
mmddyy
|
|
3260
|
+
);
|
|
2767
3261
|
ResultFormatter.flightNumber(decodeResult, fields[3]);
|
|
2768
3262
|
ResultFormatter.altitude(decodeResult, Number(fields[4]));
|
|
2769
3263
|
const lat = fields[5];
|
|
@@ -2773,13 +3267,18 @@ var Label_24_Slash = class extends DecoderPlugin {
|
|
|
2773
3267
|
longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
|
|
2774
3268
|
};
|
|
2775
3269
|
ResultFormatter.position(decodeResult, position);
|
|
2776
|
-
ResultFormatter.eta(
|
|
3270
|
+
ResultFormatter.eta(
|
|
3271
|
+
decodeResult,
|
|
3272
|
+
DateTimeUtils.convertHHMMSSToTod(fields[8])
|
|
3273
|
+
);
|
|
2777
3274
|
ResultFormatter.unknown(decodeResult, fields[7]);
|
|
2778
3275
|
decodeResult.decoded = true;
|
|
2779
3276
|
decodeResult.decoder.decodeLevel = "partial";
|
|
2780
3277
|
} else {
|
|
2781
3278
|
if (options.debug) {
|
|
2782
|
-
console.log(
|
|
3279
|
+
console.log(
|
|
3280
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`
|
|
3281
|
+
);
|
|
2783
3282
|
}
|
|
2784
3283
|
decodeResult.decoded = false;
|
|
2785
3284
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2805,16 +3304,22 @@ var Label_30_Slash_EA = class extends DecoderPlugin {
|
|
|
2805
3304
|
const results = message.text.split(/\n|\//).slice(1);
|
|
2806
3305
|
if (results) {
|
|
2807
3306
|
if (options.debug) {
|
|
2808
|
-
console.log(
|
|
3307
|
+
console.log("Label 30 EA: results");
|
|
2809
3308
|
console.log(results);
|
|
2810
3309
|
}
|
|
2811
3310
|
}
|
|
2812
|
-
ResultFormatter.eta(
|
|
3311
|
+
ResultFormatter.eta(
|
|
3312
|
+
decodeResult,
|
|
3313
|
+
DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4))
|
|
3314
|
+
);
|
|
2813
3315
|
if (results[1].substring(0, 2) === "DS") {
|
|
2814
3316
|
ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
|
|
2815
3317
|
ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
|
|
2816
3318
|
} else {
|
|
2817
|
-
ResultFormatter.unknown(
|
|
3319
|
+
ResultFormatter.unknown(
|
|
3320
|
+
decodeResult,
|
|
3321
|
+
"/".concat(results[1], "/", results[2])
|
|
3322
|
+
);
|
|
2818
3323
|
}
|
|
2819
3324
|
decodeResult.decoded = true;
|
|
2820
3325
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2839,17 +3344,26 @@ var Label_44_ETA = class extends DecoderPlugin {
|
|
|
2839
3344
|
const data = message.text.split(",");
|
|
2840
3345
|
if (data.length >= 9) {
|
|
2841
3346
|
if (options.debug) {
|
|
2842
|
-
console.log(
|
|
3347
|
+
console.log("Label 44 ETA Report: groups");
|
|
2843
3348
|
console.log(data);
|
|
2844
3349
|
}
|
|
2845
|
-
ResultFormatter.position(
|
|
3350
|
+
ResultFormatter.position(
|
|
3351
|
+
decodeResult,
|
|
3352
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3353
|
+
);
|
|
2846
3354
|
ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));
|
|
2847
3355
|
ResultFormatter.departureAirport(decodeResult, data[3]);
|
|
2848
3356
|
ResultFormatter.arrivalAirport(decodeResult, data[4]);
|
|
2849
3357
|
ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));
|
|
2850
3358
|
ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));
|
|
2851
|
-
ResultFormatter.time_of_day(
|
|
2852
|
-
|
|
3359
|
+
ResultFormatter.time_of_day(
|
|
3360
|
+
decodeResult,
|
|
3361
|
+
DateTimeUtils.convertHHMMSSToTod(data[6])
|
|
3362
|
+
);
|
|
3363
|
+
ResultFormatter.eta(
|
|
3364
|
+
decodeResult,
|
|
3365
|
+
DateTimeUtils.convertHHMMSSToTod(data[7])
|
|
3366
|
+
);
|
|
2853
3367
|
const fuel = Number(data[8]);
|
|
2854
3368
|
if (!isNaN(fuel)) {
|
|
2855
3369
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -2889,15 +3403,21 @@ var Label_44_IN = class extends DecoderPlugin {
|
|
|
2889
3403
|
const data = message.text.split(",");
|
|
2890
3404
|
if (data.length >= 7) {
|
|
2891
3405
|
if (options.debug) {
|
|
2892
|
-
console.log(
|
|
3406
|
+
console.log("Label 44 In Air Report: groups");
|
|
2893
3407
|
console.log(data);
|
|
2894
3408
|
}
|
|
2895
|
-
ResultFormatter.position(
|
|
3409
|
+
ResultFormatter.position(
|
|
3410
|
+
decodeResult,
|
|
3411
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3412
|
+
);
|
|
2896
3413
|
ResultFormatter.departureAirport(decodeResult, data[2]);
|
|
2897
3414
|
ResultFormatter.arrivalAirport(decodeResult, data[3]);
|
|
2898
3415
|
ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
|
|
2899
3416
|
ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
|
|
2900
|
-
ResultFormatter.in(
|
|
3417
|
+
ResultFormatter.in(
|
|
3418
|
+
decodeResult,
|
|
3419
|
+
DateTimeUtils.convertHHMMSSToTod(data[5])
|
|
3420
|
+
);
|
|
2901
3421
|
const fuel = Number(data[6]);
|
|
2902
3422
|
if (!isNaN(fuel)) {
|
|
2903
3423
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -2937,16 +3457,25 @@ var Label_44_OFF = class extends DecoderPlugin {
|
|
|
2937
3457
|
const data = message.text.split(",");
|
|
2938
3458
|
if (data.length >= 8) {
|
|
2939
3459
|
if (options.debug) {
|
|
2940
|
-
console.log(
|
|
3460
|
+
console.log("Label 44 Off Runway Report: groups");
|
|
2941
3461
|
console.log(data);
|
|
2942
3462
|
}
|
|
2943
|
-
ResultFormatter.position(
|
|
3463
|
+
ResultFormatter.position(
|
|
3464
|
+
decodeResult,
|
|
3465
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3466
|
+
);
|
|
2944
3467
|
ResultFormatter.departureAirport(decodeResult, data[2]);
|
|
2945
3468
|
ResultFormatter.arrivalAirport(decodeResult, data[3]);
|
|
2946
3469
|
ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
|
|
2947
3470
|
ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
|
|
2948
|
-
ResultFormatter.off(
|
|
2949
|
-
|
|
3471
|
+
ResultFormatter.off(
|
|
3472
|
+
decodeResult,
|
|
3473
|
+
DateTimeUtils.convertHHMMSSToTod(data[5])
|
|
3474
|
+
);
|
|
3475
|
+
ResultFormatter.eta(
|
|
3476
|
+
decodeResult,
|
|
3477
|
+
DateTimeUtils.convertHHMMSSToTod(data[6])
|
|
3478
|
+
);
|
|
2950
3479
|
const fuel = Number(data[7]);
|
|
2951
3480
|
if (!isNaN(fuel)) {
|
|
2952
3481
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -2986,15 +3515,21 @@ var Label_44_ON = class extends DecoderPlugin {
|
|
|
2986
3515
|
const data = message.text.split(",");
|
|
2987
3516
|
if (data.length >= 7) {
|
|
2988
3517
|
if (options.debug) {
|
|
2989
|
-
console.log(
|
|
3518
|
+
console.log("Label 44 On Runway Report: groups");
|
|
2990
3519
|
console.log(data);
|
|
2991
3520
|
}
|
|
2992
|
-
ResultFormatter.position(
|
|
3521
|
+
ResultFormatter.position(
|
|
3522
|
+
decodeResult,
|
|
3523
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3524
|
+
);
|
|
2993
3525
|
ResultFormatter.departureAirport(decodeResult, data[2]);
|
|
2994
3526
|
ResultFormatter.arrivalAirport(decodeResult, data[3]);
|
|
2995
3527
|
ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
|
|
2996
3528
|
ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
|
|
2997
|
-
ResultFormatter.on(
|
|
3529
|
+
ResultFormatter.on(
|
|
3530
|
+
decodeResult,
|
|
3531
|
+
DateTimeUtils.convertHHMMSSToTod(data[5])
|
|
3532
|
+
);
|
|
2998
3533
|
const fuel = Number(data[6]);
|
|
2999
3534
|
if (!isNaN(fuel)) {
|
|
3000
3535
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -3035,19 +3570,39 @@ var Label_44_POS = class extends DecoderPlugin {
|
|
|
3035
3570
|
const results = message.text.match(regex);
|
|
3036
3571
|
if (results?.groups) {
|
|
3037
3572
|
if (options.debug) {
|
|
3038
|
-
console.log(
|
|
3573
|
+
console.log("Label 44 Position Report: groups");
|
|
3039
3574
|
console.log(results.groups);
|
|
3040
3575
|
}
|
|
3041
|
-
ResultFormatter.position(
|
|
3576
|
+
ResultFormatter.position(
|
|
3577
|
+
decodeResult,
|
|
3578
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
3579
|
+
results.groups.unsplit_coords
|
|
3580
|
+
)
|
|
3581
|
+
);
|
|
3042
3582
|
const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
|
|
3043
|
-
ResultFormatter.month(
|
|
3044
|
-
|
|
3045
|
-
|
|
3046
|
-
|
|
3583
|
+
ResultFormatter.month(
|
|
3584
|
+
decodeResult,
|
|
3585
|
+
Number(results.groups.current_date.substring(0, 2))
|
|
3586
|
+
);
|
|
3587
|
+
ResultFormatter.day(
|
|
3588
|
+
decodeResult,
|
|
3589
|
+
Number(results.groups.current_date.substring(2, 4))
|
|
3590
|
+
);
|
|
3591
|
+
ResultFormatter.time_of_day(
|
|
3592
|
+
decodeResult,
|
|
3593
|
+
DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00")
|
|
3594
|
+
);
|
|
3595
|
+
ResultFormatter.eta(
|
|
3596
|
+
decodeResult,
|
|
3597
|
+
DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00")
|
|
3598
|
+
);
|
|
3047
3599
|
if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
|
|
3048
3600
|
decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
|
|
3049
3601
|
}
|
|
3050
|
-
ResultFormatter.departureAirport(
|
|
3602
|
+
ResultFormatter.departureAirport(
|
|
3603
|
+
decodeResult,
|
|
3604
|
+
results.groups.departure_icao
|
|
3605
|
+
);
|
|
3051
3606
|
ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
|
|
3052
3607
|
ResultFormatter.altitude(decodeResult, flight_level * 100);
|
|
3053
3608
|
}
|
|
@@ -3085,7 +3640,7 @@ var Label_44_Slash = class extends DecoderPlugin {
|
|
|
3085
3640
|
const data = fields[3].split(",");
|
|
3086
3641
|
if (data.length >= 6) {
|
|
3087
3642
|
if (options.debug) {
|
|
3088
|
-
console.log(
|
|
3643
|
+
console.log("Label 44 Slash: groups");
|
|
3089
3644
|
console.log(data);
|
|
3090
3645
|
}
|
|
3091
3646
|
ResultFormatter.position(decodeResult, {
|
|
@@ -3135,34 +3690,33 @@ var Label_4A = class extends DecoderPlugin {
|
|
|
3135
3690
|
decodeResult.decoder.name = this.name;
|
|
3136
3691
|
decodeResult.message = message;
|
|
3137
3692
|
decodeResult.formatted.description = "Latest New Format";
|
|
3138
|
-
let text = message.text;
|
|
3139
|
-
if (text.match(/^M\d{2}A\w{6}/)) {
|
|
3140
|
-
ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
|
|
3141
|
-
text = text.substring(10);
|
|
3142
|
-
}
|
|
3143
3693
|
decodeResult.decoded = true;
|
|
3144
|
-
const fields = text.split(",");
|
|
3694
|
+
const fields = message.text.split(",");
|
|
3145
3695
|
if (fields.length === 11) {
|
|
3146
|
-
ResultFormatter.time_of_day(
|
|
3696
|
+
ResultFormatter.time_of_day(
|
|
3697
|
+
decodeResult,
|
|
3698
|
+
DateTimeUtils.convertHHMMSSToTod(fields[0])
|
|
3699
|
+
);
|
|
3147
3700
|
ResultFormatter.tail(decodeResult, fields[2].replace(".", ""));
|
|
3148
|
-
if (fields[3])
|
|
3149
|
-
ResultFormatter.callsign(decodeResult, fields[3]);
|
|
3701
|
+
if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);
|
|
3150
3702
|
ResultFormatter.departureAirport(decodeResult, fields[4]);
|
|
3151
3703
|
ResultFormatter.arrivalAirport(decodeResult, fields[5]);
|
|
3152
|
-
const alt = text.substring(48, 51);
|
|
3153
|
-
if (alt !== "") {
|
|
3154
|
-
ResultFormatter.altitude(decodeResult, Number(alt) * 100);
|
|
3155
|
-
}
|
|
3156
3704
|
ResultFormatter.unknownArr(decodeResult, fields.slice(8));
|
|
3157
3705
|
} else if (fields.length === 6) {
|
|
3158
3706
|
if (fields[0].match(/^[NS]/)) {
|
|
3159
|
-
ResultFormatter.position(
|
|
3707
|
+
ResultFormatter.position(
|
|
3708
|
+
decodeResult,
|
|
3709
|
+
CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13))
|
|
3710
|
+
);
|
|
3160
3711
|
let wp1 = {
|
|
3161
3712
|
name: fields[0].substring(13).trim(),
|
|
3162
3713
|
time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),
|
|
3163
3714
|
timeFormat: "tod"
|
|
3164
3715
|
};
|
|
3165
|
-
ResultFormatter.altitude(
|
|
3716
|
+
ResultFormatter.altitude(
|
|
3717
|
+
decodeResult,
|
|
3718
|
+
Number(fields[1].substring(6, 9)) * 100
|
|
3719
|
+
);
|
|
3166
3720
|
let wp2 = {
|
|
3167
3721
|
name: fields[1].substring(9).trim(),
|
|
3168
3722
|
time: DateTimeUtils.convertHHMMSSToTod(fields[2]),
|
|
@@ -3172,21 +3726,31 @@ var Label_4A = class extends DecoderPlugin {
|
|
|
3172
3726
|
ResultFormatter.temperature(decodeResult, fields[3]);
|
|
3173
3727
|
ResultFormatter.unknownArr(decodeResult, fields.slice(4));
|
|
3174
3728
|
} else {
|
|
3175
|
-
ResultFormatter.time_of_day(
|
|
3176
|
-
|
|
3729
|
+
ResultFormatter.time_of_day(
|
|
3730
|
+
decodeResult,
|
|
3731
|
+
DateTimeUtils.convertHHMMSSToTod(fields[0])
|
|
3732
|
+
);
|
|
3733
|
+
ResultFormatter.eta(
|
|
3734
|
+
decodeResult,
|
|
3735
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1])
|
|
3736
|
+
);
|
|
3177
3737
|
ResultFormatter.unknown(decodeResult, fields[2]);
|
|
3178
3738
|
ResultFormatter.altitude(decodeResult, Number(fields[3]));
|
|
3179
|
-
ResultFormatter.position(
|
|
3739
|
+
ResultFormatter.position(
|
|
3740
|
+
decodeResult,
|
|
3741
|
+
CoordinateUtils.decodeStringCoordinates(
|
|
3742
|
+
(fields[4] + fields[5]).replace(/[ \.]/g, "")
|
|
3743
|
+
)
|
|
3744
|
+
);
|
|
3180
3745
|
}
|
|
3181
3746
|
} else {
|
|
3182
3747
|
decodeResult.decoded = false;
|
|
3183
|
-
ResultFormatter.unknown(decodeResult, text);
|
|
3748
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3184
3749
|
}
|
|
3185
3750
|
if (decodeResult.decoded) {
|
|
3186
3751
|
if (!decodeResult.remaining.text)
|
|
3187
3752
|
decodeResult.decoder.decodeLevel = "full";
|
|
3188
|
-
else
|
|
3189
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3753
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3190
3754
|
} else {
|
|
3191
3755
|
decodeResult.decoder.decodeLevel = "none";
|
|
3192
3756
|
}
|
|
@@ -3209,11 +3773,16 @@ var Label_4A_01 = class extends DecoderPlugin {
|
|
|
3209
3773
|
decodeResult.message = message;
|
|
3210
3774
|
decodeResult.formatted.description = "Latest New Format";
|
|
3211
3775
|
decodeResult.decoded = true;
|
|
3212
|
-
let rgx = message.text.match(
|
|
3776
|
+
let rgx = message.text.match(
|
|
3777
|
+
/^01([A-Z]{2})([A-Z]{2})\s*(\w+)\/(\d{6})([A-Z]{4})([A-Z]{4})\r\n([+-]\s*\d+)(\d{3}\.\d)([+-]\s*\d+\.\d)/
|
|
3778
|
+
);
|
|
3213
3779
|
if (rgx) {
|
|
3214
3780
|
ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);
|
|
3215
3781
|
ResultFormatter.callsign(decodeResult, rgx[3]);
|
|
3216
|
-
ResultFormatter.time_of_day(
|
|
3782
|
+
ResultFormatter.time_of_day(
|
|
3783
|
+
decodeResult,
|
|
3784
|
+
DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00")
|
|
3785
|
+
);
|
|
3217
3786
|
ResultFormatter.departureAirport(decodeResult, rgx[5]);
|
|
3218
3787
|
ResultFormatter.arrivalAirport(decodeResult, rgx[6]);
|
|
3219
3788
|
ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, "")));
|
|
@@ -3226,8 +3795,7 @@ var Label_4A_01 = class extends DecoderPlugin {
|
|
|
3226
3795
|
if (decodeResult.decoded) {
|
|
3227
3796
|
if (!decodeResult.remaining.text)
|
|
3228
3797
|
decodeResult.decoder.decodeLevel = "full";
|
|
3229
|
-
else
|
|
3230
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3798
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3231
3799
|
} else {
|
|
3232
3800
|
decodeResult.decoder.decodeLevel = "none";
|
|
3233
3801
|
}
|
|
@@ -3251,14 +3819,16 @@ var Label_4A_DIS = class extends DecoderPlugin {
|
|
|
3251
3819
|
decodeResult.formatted.description = "Latest New Format";
|
|
3252
3820
|
decodeResult.decoded = true;
|
|
3253
3821
|
const fields = message.text.split(",");
|
|
3254
|
-
ResultFormatter.time_of_day(
|
|
3822
|
+
ResultFormatter.time_of_day(
|
|
3823
|
+
decodeResult,
|
|
3824
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
|
|
3825
|
+
);
|
|
3255
3826
|
ResultFormatter.callsign(decodeResult, fields[2]);
|
|
3256
3827
|
ResultFormatter.freetext(decodeResult, fields.slice(3).join(""));
|
|
3257
3828
|
if (decodeResult.decoded) {
|
|
3258
3829
|
if (!decodeResult.remaining.text)
|
|
3259
3830
|
decodeResult.decoder.decodeLevel = "full";
|
|
3260
|
-
else
|
|
3261
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3831
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3262
3832
|
} else {
|
|
3263
3833
|
decodeResult.decoder.decodeLevel = "none";
|
|
3264
3834
|
}
|
|
@@ -3283,8 +3853,15 @@ var Label_4A_DOOR = class extends DecoderPlugin {
|
|
|
3283
3853
|
decodeResult.decoded = true;
|
|
3284
3854
|
const fields = message.text.split(" ");
|
|
3285
3855
|
if (fields.length === 3) {
|
|
3286
|
-
ResultFormatter.door_event(
|
|
3287
|
-
|
|
3856
|
+
ResultFormatter.door_event(
|
|
3857
|
+
decodeResult,
|
|
3858
|
+
fields[0].split("/")[1],
|
|
3859
|
+
fields[1]
|
|
3860
|
+
);
|
|
3861
|
+
ResultFormatter.time_of_day(
|
|
3862
|
+
decodeResult,
|
|
3863
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2] + "00")
|
|
3864
|
+
);
|
|
3288
3865
|
} else {
|
|
3289
3866
|
decodeResult.decoded = false;
|
|
3290
3867
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
@@ -3292,8 +3869,7 @@ var Label_4A_DOOR = class extends DecoderPlugin {
|
|
|
3292
3869
|
if (decodeResult.decoded) {
|
|
3293
3870
|
if (!decodeResult.remaining.text)
|
|
3294
3871
|
decodeResult.decoder.decodeLevel = "full";
|
|
3295
|
-
else
|
|
3296
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3872
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3297
3873
|
} else {
|
|
3298
3874
|
decodeResult.decoder.decodeLevel = "none";
|
|
3299
3875
|
}
|
|
@@ -3325,8 +3901,7 @@ var Label_4A_Slash_01 = class extends DecoderPlugin {
|
|
|
3325
3901
|
if (decodeResult.decoded) {
|
|
3326
3902
|
if (!decodeResult.remaining.text)
|
|
3327
3903
|
decodeResult.decoder.decodeLevel = "full";
|
|
3328
|
-
else
|
|
3329
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3904
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3330
3905
|
} else {
|
|
3331
3906
|
decodeResult.decoder.decodeLevel = "none";
|
|
3332
3907
|
}
|
|
@@ -3379,24 +3954,35 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
3379
3954
|
decodeResult.decoder.name = this.name;
|
|
3380
3955
|
decodeResult.message = message;
|
|
3381
3956
|
decodeResult.formatted.description = "Airline Defined";
|
|
3382
|
-
let text = message.text;
|
|
3383
|
-
if (text.match(/^M\d{2}A\w{6}/)) {
|
|
3384
|
-
ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
|
|
3385
|
-
text = text.substring(10);
|
|
3386
|
-
}
|
|
3387
3957
|
decodeResult.decoded = true;
|
|
3958
|
+
const text = message.text;
|
|
3388
3959
|
const fields = text.split(",");
|
|
3389
3960
|
if (text.length === 51) {
|
|
3390
3961
|
decodeResult.raw.day = text.substring(0, 2);
|
|
3391
3962
|
ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));
|
|
3392
3963
|
ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));
|
|
3393
|
-
ResultFormatter.position(
|
|
3394
|
-
|
|
3395
|
-
|
|
3964
|
+
ResultFormatter.position(
|
|
3965
|
+
decodeResult,
|
|
3966
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
3967
|
+
text.substring(30, 45).replace(/^(.)0/, "$1")
|
|
3968
|
+
)
|
|
3969
|
+
);
|
|
3970
|
+
ResultFormatter.altitude(
|
|
3971
|
+
decodeResult,
|
|
3972
|
+
Number(text.substring(48, 51)) * 100
|
|
3973
|
+
);
|
|
3974
|
+
ResultFormatter.unknownArr(
|
|
3975
|
+
decodeResult,
|
|
3976
|
+
[text.substring(2, 4), text.substring(19, 29)],
|
|
3977
|
+
" "
|
|
3978
|
+
);
|
|
3396
3979
|
} else if (fields.length === 33) {
|
|
3397
3980
|
decodeResult.raw.date = fields[3];
|
|
3398
3981
|
if (fields[1] === "B") {
|
|
3399
|
-
ResultFormatter.position(decodeResult, {
|
|
3982
|
+
ResultFormatter.position(decodeResult, {
|
|
3983
|
+
latitude: Number(fields[4]),
|
|
3984
|
+
longitude: Number(fields[5])
|
|
3985
|
+
});
|
|
3400
3986
|
ResultFormatter.altitude(decodeResult, Number(fields[6]));
|
|
3401
3987
|
}
|
|
3402
3988
|
ResultFormatter.departureAirport(decodeResult, fields[8]);
|
|
@@ -3407,7 +3993,12 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
3407
3993
|
ResultFormatter.alternateRunway(decodeResult, fields[12].split("/")[0]);
|
|
3408
3994
|
}
|
|
3409
3995
|
ResultFormatter.checksum(decodeResult, fields[32]);
|
|
3410
|
-
ResultFormatter.unknownArr(
|
|
3996
|
+
ResultFormatter.unknownArr(
|
|
3997
|
+
decodeResult,
|
|
3998
|
+
[...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(
|
|
3999
|
+
(f) => f != ""
|
|
4000
|
+
)
|
|
4001
|
+
);
|
|
3411
4002
|
} else {
|
|
3412
4003
|
decodeResult.decoded = false;
|
|
3413
4004
|
ResultFormatter.unknown(decodeResult, text);
|
|
@@ -3415,8 +4006,7 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
3415
4006
|
if (decodeResult.decoded) {
|
|
3416
4007
|
if (!decodeResult.remaining.text)
|
|
3417
4008
|
decodeResult.decoder.decodeLevel = "full";
|
|
3418
|
-
else
|
|
3419
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4009
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3420
4010
|
} else {
|
|
3421
4011
|
decodeResult.decoder.decodeLevel = "none";
|
|
3422
4012
|
}
|
|
@@ -3451,9 +4041,16 @@ var Label_4T_AGFSR = class extends DecoderPlugin {
|
|
|
3451
4041
|
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
3452
4042
|
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
3453
4043
|
ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
|
|
3454
|
-
ResultFormatter.departureAirport(
|
|
4044
|
+
ResultFormatter.departureAirport(
|
|
4045
|
+
decodeResult,
|
|
4046
|
+
data[3].substring(0, 3),
|
|
4047
|
+
"IATA"
|
|
4048
|
+
);
|
|
3455
4049
|
ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
|
|
3456
|
-
ResultFormatter.time_of_day(
|
|
4050
|
+
ResultFormatter.time_of_day(
|
|
4051
|
+
decodeResult,
|
|
4052
|
+
DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4))
|
|
4053
|
+
);
|
|
3457
4054
|
ResultFormatter.unknown(decodeResult, data[5], "/");
|
|
3458
4055
|
const lat = data[6].substring(0, 7);
|
|
3459
4056
|
const lon = data[6].substring(7, 15);
|
|
@@ -3486,7 +4083,10 @@ var Label_58 = class extends DecoderPlugin {
|
|
|
3486
4083
|
if (data.length === 8) {
|
|
3487
4084
|
ResultFormatter.flightNumber(decodeResult, data[0]);
|
|
3488
4085
|
ResultFormatter.day(decodeResult, Number(data[1]));
|
|
3489
|
-
ResultFormatter.time_of_day(
|
|
4086
|
+
ResultFormatter.time_of_day(
|
|
4087
|
+
decodeResult,
|
|
4088
|
+
DateTimeUtils.convertHHMMSSToTod(data[2])
|
|
4089
|
+
);
|
|
3490
4090
|
const lat = data[3];
|
|
3491
4091
|
const lon = data[4];
|
|
3492
4092
|
ResultFormatter.position(decodeResult, {
|
|
@@ -3540,7 +4140,10 @@ var Label_4T_ETA = class extends DecoderPlugin {
|
|
|
3540
4140
|
const etaData = data[2].split(" ");
|
|
3541
4141
|
ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
|
|
3542
4142
|
ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
|
|
3543
|
-
ResultFormatter.eta(
|
|
4143
|
+
ResultFormatter.eta(
|
|
4144
|
+
decodeResult,
|
|
4145
|
+
DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4))
|
|
4146
|
+
);
|
|
3544
4147
|
decodeResult.decoded = true;
|
|
3545
4148
|
decodeResult.decoder.decodeLevel = "full";
|
|
3546
4149
|
return decodeResult;
|
|
@@ -3572,7 +4175,10 @@ var Label_80 = class extends DecoderPlugin {
|
|
|
3572
4175
|
this.parseTags(more.trim(), decodeResult);
|
|
3573
4176
|
}
|
|
3574
4177
|
}
|
|
3575
|
-
this.parseHeader(
|
|
4178
|
+
this.parseHeader(
|
|
4179
|
+
headerParts[headerParts.length - 1].trim(),
|
|
4180
|
+
decodeResult
|
|
4181
|
+
);
|
|
3576
4182
|
for (let i = 1; i < lines.length; i++) {
|
|
3577
4183
|
const line = lines[i];
|
|
3578
4184
|
const parts = line.split("/");
|
|
@@ -3660,10 +4266,16 @@ var Label_80 = class extends DecoderPlugin {
|
|
|
3660
4266
|
case "FB":
|
|
3661
4267
|
break;
|
|
3662
4268
|
case "FOB":
|
|
3663
|
-
ResultFormatter.currentFuel(
|
|
4269
|
+
ResultFormatter.currentFuel(
|
|
4270
|
+
results,
|
|
4271
|
+
parseInt(val.replace(/\D/g, ""), 10)
|
|
4272
|
+
);
|
|
3664
4273
|
break;
|
|
3665
4274
|
case "UTC":
|
|
3666
|
-
ResultFormatter.time_of_day(
|
|
4275
|
+
ResultFormatter.time_of_day(
|
|
4276
|
+
results,
|
|
4277
|
+
DateTimeUtils.convertHHMMSSToTod(val)
|
|
4278
|
+
);
|
|
3667
4279
|
break;
|
|
3668
4280
|
case "ETA":
|
|
3669
4281
|
const hhmm = val.split(".")[0].replace(":", "");
|
|
@@ -3692,11 +4304,20 @@ var Label_80 = class extends DecoderPlugin {
|
|
|
3692
4304
|
const header = csvParts[0].trim().split(/\s+/);
|
|
3693
4305
|
ResultFormatter.unknown(results, header[0], " ");
|
|
3694
4306
|
ResultFormatter.unknown(results, header[1], " ");
|
|
3695
|
-
ResultFormatter.position(
|
|
4307
|
+
ResultFormatter.position(
|
|
4308
|
+
results,
|
|
4309
|
+
CoordinateUtils.decodeStringCoordinates(header[2])
|
|
4310
|
+
);
|
|
3696
4311
|
ResultFormatter.unknown(results, csvParts[1]);
|
|
3697
|
-
ResultFormatter.time_of_day(
|
|
4312
|
+
ResultFormatter.time_of_day(
|
|
4313
|
+
results,
|
|
4314
|
+
DateTimeUtils.convertHHMMSSToTod(csvParts[2])
|
|
4315
|
+
);
|
|
3698
4316
|
ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ",");
|
|
3699
|
-
ResultFormatter.temperature(
|
|
4317
|
+
ResultFormatter.temperature(
|
|
4318
|
+
results,
|
|
4319
|
+
((csvParts[6].charAt(0) === "M" ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString()
|
|
4320
|
+
);
|
|
3700
4321
|
ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));
|
|
3701
4322
|
ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));
|
|
3702
4323
|
}
|
|
@@ -3715,12 +4336,8 @@ var Label_83 = class extends DecoderPlugin {
|
|
|
3715
4336
|
decodeResult.decoder.name = this.name;
|
|
3716
4337
|
decodeResult.message = message;
|
|
3717
4338
|
decodeResult.formatted.description = "Airline Defined";
|
|
3718
|
-
let text = message.text;
|
|
3719
|
-
if (text.match(/^M\d{2}A\w{6}/)) {
|
|
3720
|
-
ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
|
|
3721
|
-
text = text.substring(10);
|
|
3722
|
-
}
|
|
3723
4339
|
decodeResult.decoded = true;
|
|
4340
|
+
const text = message.text;
|
|
3724
4341
|
if (text.substring(0, 10) === "4DH3 ETAT2") {
|
|
3725
4342
|
const fields = text.split(/\s+/);
|
|
3726
4343
|
if (fields[2].length > 5) {
|
|
@@ -3731,10 +4348,15 @@ var Label_83 = class extends DecoderPlugin {
|
|
|
3731
4348
|
ResultFormatter.departureAirport(decodeResult, subfields[0]);
|
|
3732
4349
|
ResultFormatter.arrivalAirport(decodeResult, subfields[1]);
|
|
3733
4350
|
ResultFormatter.tail(decodeResult, fields[4].replace(/\./g, ""));
|
|
3734
|
-
ResultFormatter.eta(
|
|
4351
|
+
ResultFormatter.eta(
|
|
4352
|
+
decodeResult,
|
|
4353
|
+
DateTimeUtils.convertHHMMSSToTod(fields[6] + "00")
|
|
4354
|
+
);
|
|
3735
4355
|
} else if (text.substring(0, 5) === "001PR") {
|
|
3736
4356
|
decodeResult.raw.day = text.substring(5, 7);
|
|
3737
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
4357
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
4358
|
+
text.substring(13, 28).replace(/\./g, "")
|
|
4359
|
+
);
|
|
3738
4360
|
if (position) {
|
|
3739
4361
|
ResultFormatter.position(decodeResult, position);
|
|
3740
4362
|
}
|
|
@@ -3747,27 +4369,23 @@ var Label_83 = class extends DecoderPlugin {
|
|
|
3747
4369
|
ResultFormatter.arrivalAirport(decodeResult, fields[1]);
|
|
3748
4370
|
decodeResult.raw.day = fields[2].substring(0, 2);
|
|
3749
4371
|
decodeResult.raw.time = fields[2].substring(2);
|
|
3750
|
-
ResultFormatter.position(
|
|
3751
|
-
|
|
3752
|
-
|
|
3753
|
-
|
|
3754
|
-
longitude: Number(fields[4].replace(/\s/g, ""))
|
|
3755
|
-
}
|
|
3756
|
-
);
|
|
4372
|
+
ResultFormatter.position(decodeResult, {
|
|
4373
|
+
latitude: Number(fields[3].replace(/\s/g, "")),
|
|
4374
|
+
longitude: Number(fields[4].replace(/\s/g, ""))
|
|
4375
|
+
});
|
|
3757
4376
|
ResultFormatter.altitude(decodeResult, Number(fields[5]));
|
|
3758
4377
|
ResultFormatter.groundspeed(decodeResult, Number(fields[6]));
|
|
3759
4378
|
ResultFormatter.heading(decodeResult, Number(fields[7]));
|
|
3760
4379
|
ResultFormatter.unknown(decodeResult, fields[8]);
|
|
3761
4380
|
} else {
|
|
3762
4381
|
decodeResult.decoded = false;
|
|
3763
|
-
ResultFormatter.unknown(decodeResult,
|
|
4382
|
+
ResultFormatter.unknown(decodeResult, text);
|
|
3764
4383
|
}
|
|
3765
4384
|
}
|
|
3766
4385
|
if (decodeResult.decoded) {
|
|
3767
4386
|
if (!decodeResult.remaining.text)
|
|
3768
4387
|
decodeResult.decoder.decodeLevel = "full";
|
|
3769
|
-
else
|
|
3770
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4388
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3771
4389
|
} else {
|
|
3772
4390
|
decodeResult.decoder.decodeLevel = "none";
|
|
3773
4391
|
}
|
|
@@ -3792,10 +4410,13 @@ var Label_8E = class extends DecoderPlugin {
|
|
|
3792
4410
|
const results = message.text.match(regex);
|
|
3793
4411
|
if (results?.groups) {
|
|
3794
4412
|
if (options.debug) {
|
|
3795
|
-
console.log(
|
|
4413
|
+
console.log("Label 8E ETA: groups");
|
|
3796
4414
|
console.log(results.groups);
|
|
3797
4415
|
}
|
|
3798
|
-
ResultFormatter.eta(
|
|
4416
|
+
ResultFormatter.eta(
|
|
4417
|
+
decodeResult,
|
|
4418
|
+
DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta)
|
|
4419
|
+
);
|
|
3799
4420
|
ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
|
|
3800
4421
|
}
|
|
3801
4422
|
decodeResult.decoded = true;
|
|
@@ -3865,11 +4486,26 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
3865
4486
|
const msg = message.text.replace(/\n|\r/g, "");
|
|
3866
4487
|
const parts = msg.split("#");
|
|
3867
4488
|
let decoded = false;
|
|
3868
|
-
if (
|
|
4489
|
+
if (msg.startsWith("/")) {
|
|
4490
|
+
const headerData = msg.split(".");
|
|
4491
|
+
const decoded2 = H1Helper.decodeH1Message(
|
|
4492
|
+
decodeResult,
|
|
4493
|
+
headerData.slice(1).join(".")
|
|
4494
|
+
);
|
|
4495
|
+
if (decoded2) {
|
|
4496
|
+
decodeResult.remaining.text = headerData[0] + "." + decodeResult.remaining.text;
|
|
4497
|
+
decodeResult.decoded = decoded2;
|
|
4498
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
4499
|
+
}
|
|
4500
|
+
return decodeResult;
|
|
4501
|
+
} else if (parts.length === 1) {
|
|
3869
4502
|
decoded = H1Helper.decodeH1Message(decodeResult, msg);
|
|
3870
4503
|
} else if (parts.length == 2) {
|
|
3871
4504
|
const offset = isNaN(parseInt(parts[1][1])) ? 3 : 4;
|
|
3872
|
-
decoded = H1Helper.decodeH1Message(
|
|
4505
|
+
decoded = H1Helper.decodeH1Message(
|
|
4506
|
+
decodeResult,
|
|
4507
|
+
msg.slice(parts[0].length + offset)
|
|
4508
|
+
);
|
|
3873
4509
|
if (decoded && parts[0].length > 0) {
|
|
3874
4510
|
ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));
|
|
3875
4511
|
decodeResult.remaining.text = parts[0].substring(0, 4) + "#" + parts[1].substring(0, offset - 1) + "/" + decodeResult.remaining.text;
|
|
@@ -4003,7 +4639,10 @@ var Label_H1_FLR = class extends DecoderPlugin {
|
|
|
4003
4639
|
const datetime = data.substring(0, 12);
|
|
4004
4640
|
const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
|
|
4005
4641
|
ResultFormatter.unknown(decodeResult, data.substring(12), "/");
|
|
4006
|
-
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4642
|
+
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4643
|
+
datetime.substring(6),
|
|
4644
|
+
date
|
|
4645
|
+
);
|
|
4007
4646
|
decodeResult.raw.fault_message = msg;
|
|
4008
4647
|
decodeResult.formatted.items.push({
|
|
4009
4648
|
type: "fault",
|
|
@@ -4083,65 +4722,6 @@ var Label_H1_OHMA = class extends DecoderPlugin {
|
|
|
4083
4722
|
}
|
|
4084
4723
|
};
|
|
4085
4724
|
|
|
4086
|
-
// lib/plugins/Label_H1_Slash.ts
|
|
4087
|
-
var Label_H1_Slash = class extends DecoderPlugin {
|
|
4088
|
-
name = "label-h1-slash";
|
|
4089
|
-
qualifiers() {
|
|
4090
|
-
return {
|
|
4091
|
-
labels: ["H1"],
|
|
4092
|
-
preambles: ["/"]
|
|
4093
|
-
};
|
|
4094
|
-
}
|
|
4095
|
-
decode(message, options = {}) {
|
|
4096
|
-
let decodeResult = this.defaultResult();
|
|
4097
|
-
decodeResult.decoder.name = this.name;
|
|
4098
|
-
decodeResult.formatted.description = "Position Report";
|
|
4099
|
-
decodeResult.message = message;
|
|
4100
|
-
const checksum = message.text.slice(-4);
|
|
4101
|
-
const data = message.text.slice(0, message.text.length - 4);
|
|
4102
|
-
const fields = data.split("/");
|
|
4103
|
-
if (fields[0] !== "") {
|
|
4104
|
-
ResultFormatter.unknown(decodeResult, message.text);
|
|
4105
|
-
decodeResult.decoded = false;
|
|
4106
|
-
decodeResult.decoder.decodeLevel = "none";
|
|
4107
|
-
return decodeResult;
|
|
4108
|
-
}
|
|
4109
|
-
const headerData = fields[1].split(".");
|
|
4110
|
-
ResultFormatter.unknown(decodeResult, headerData[0]);
|
|
4111
|
-
if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
|
|
4112
|
-
H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
|
|
4113
|
-
} else if (headerData[1] === "POS") {
|
|
4114
|
-
} else if (headerData[1].startsWith("POS")) {
|
|
4115
|
-
H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
|
|
4116
|
-
} else {
|
|
4117
|
-
ResultFormatter.unknown(decodeResult, headerData[1], ".");
|
|
4118
|
-
}
|
|
4119
|
-
for (let i = 2; i < fields.length; i++) {
|
|
4120
|
-
const field = fields[i];
|
|
4121
|
-
if (field.startsWith("TS")) {
|
|
4122
|
-
H1Helper.processTimeStamp(decodeResult, field.substring(2, 15).split(","));
|
|
4123
|
-
} else if (field.startsWith("PS")) {
|
|
4124
|
-
H1Helper.processPS(decodeResult, field.substring(2).split(","));
|
|
4125
|
-
} else {
|
|
4126
|
-
ResultFormatter.unknown(decodeResult, field, "/");
|
|
4127
|
-
}
|
|
4128
|
-
}
|
|
4129
|
-
if (decodeResult.formatted.items.length === 0) {
|
|
4130
|
-
if (options.debug) {
|
|
4131
|
-
console.log(`Decoder: Unknown H1 message: ${message.text}`);
|
|
4132
|
-
}
|
|
4133
|
-
ResultFormatter.unknown(decodeResult, message.text);
|
|
4134
|
-
decodeResult.decoded = false;
|
|
4135
|
-
decodeResult.decoder.decodeLevel = "none";
|
|
4136
|
-
return decodeResult;
|
|
4137
|
-
}
|
|
4138
|
-
ResultFormatter.checksum(decodeResult, checksum);
|
|
4139
|
-
decodeResult.decoded = true;
|
|
4140
|
-
decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
|
|
4141
|
-
return decodeResult;
|
|
4142
|
-
}
|
|
4143
|
-
};
|
|
4144
|
-
|
|
4145
4725
|
// lib/plugins/Label_H1_StarPOS.ts
|
|
4146
4726
|
var Label_H1_StarPOS = class extends DecoderPlugin {
|
|
4147
4727
|
name = "label-h1-star-pos";
|
|
@@ -4168,7 +4748,10 @@ var Label_H1_StarPOS = class extends DecoderPlugin {
|
|
|
4168
4748
|
}
|
|
4169
4749
|
ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));
|
|
4170
4750
|
ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));
|
|
4171
|
-
ResultFormatter.time_of_day(
|
|
4751
|
+
ResultFormatter.time_of_day(
|
|
4752
|
+
decodeResult,
|
|
4753
|
+
DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12))
|
|
4754
|
+
);
|
|
4172
4755
|
ResultFormatter.position(decodeResult, {
|
|
4173
4756
|
// Deg Min, no sec
|
|
4174
4757
|
latitude: CoordinateUtils.getDirection(msg.substring(12, 13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),
|
|
@@ -4205,7 +4788,10 @@ var Label_H1_WRN = class extends DecoderPlugin {
|
|
|
4205
4788
|
const datetime = data.substring(0, 12);
|
|
4206
4789
|
const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
|
|
4207
4790
|
ResultFormatter.unknown(decodeResult, data.substring(12), "/");
|
|
4208
|
-
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4791
|
+
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4792
|
+
datetime.substring(6),
|
|
4793
|
+
date
|
|
4794
|
+
);
|
|
4209
4795
|
decodeResult.raw.warning_message = msg;
|
|
4210
4796
|
decodeResult.formatted.items.push({
|
|
4211
4797
|
type: "warning",
|
|
@@ -4265,8 +4851,7 @@ var Label_HX = class extends DecoderPlugin {
|
|
|
4265
4851
|
if (decodeResult.decoded) {
|
|
4266
4852
|
if (!decodeResult.remaining.text)
|
|
4267
4853
|
decodeResult.decoder.decodeLevel = "full";
|
|
4268
|
-
else
|
|
4269
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4854
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
4270
4855
|
} else {
|
|
4271
4856
|
decodeResult.decoder.decodeLevel = "none";
|
|
4272
4857
|
}
|
|
@@ -4398,10 +4983,16 @@ var MIAMCoreUtils = class {
|
|
|
4398
4983
|
}
|
|
4399
4984
|
},
|
|
4400
4985
|
["F" /* FileTransferRequest */]: () => {
|
|
4401
|
-
return {
|
|
4986
|
+
return {
|
|
4987
|
+
decoded: false,
|
|
4988
|
+
error: "File Transfer Request not implemented"
|
|
4989
|
+
};
|
|
4402
4990
|
},
|
|
4403
4991
|
["K" /* FileTransferAccept */]: () => {
|
|
4404
|
-
return {
|
|
4992
|
+
return {
|
|
4993
|
+
decoded: false,
|
|
4994
|
+
error: "File Transfer Accept not implemented"
|
|
4995
|
+
};
|
|
4405
4996
|
},
|
|
4406
4997
|
["S" /* FileSegment */]: () => {
|
|
4407
4998
|
return { decoded: false, error: "File Segment not implemented" };
|
|
@@ -4983,7 +5574,9 @@ var MIAMCoreUtils = class {
|
|
|
4983
5574
|
const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
|
|
4984
5575
|
if (pduSize > msgSize) {
|
|
4985
5576
|
pduIsComplete = false;
|
|
4986
|
-
pduErrors.push(
|
|
5577
|
+
pduErrors.push(
|
|
5578
|
+
"v1 PDU truncated: expecting " + pduSize + ", got " + msgSize
|
|
5579
|
+
);
|
|
4987
5580
|
}
|
|
4988
5581
|
hdr = hdr.subarray(4);
|
|
4989
5582
|
tail = hdr.subarray(0, 7).toString("ascii");
|
|
@@ -5031,7 +5624,9 @@ var MIAMCoreUtils = class {
|
|
|
5031
5624
|
}
|
|
5032
5625
|
hdr = hdr.subarray(crcLen);
|
|
5033
5626
|
if (body !== void 0 && body.length > 0) {
|
|
5034
|
-
if ([1 /* Deflate */, 1 /* Deflate */].indexOf(
|
|
5627
|
+
if ([1 /* Deflate */, 1 /* Deflate */].indexOf(
|
|
5628
|
+
pduCompression
|
|
5629
|
+
) >= 0) {
|
|
5035
5630
|
try {
|
|
5036
5631
|
const decompress = new zlib2.InflateRaw({});
|
|
5037
5632
|
decompress.write(body);
|
|
@@ -5040,10 +5635,14 @@ var MIAMCoreUtils = class {
|
|
|
5040
5635
|
} catch (e) {
|
|
5041
5636
|
pduErrors.push("Inflation failed for body: " + e);
|
|
5042
5637
|
}
|
|
5043
|
-
} else if ([0 /* None */, 0 /* None */].indexOf(
|
|
5638
|
+
} else if ([0 /* None */, 0 /* None */].indexOf(
|
|
5639
|
+
pduCompression
|
|
5640
|
+
) >= 0) {
|
|
5044
5641
|
pduData = body;
|
|
5045
5642
|
} else {
|
|
5046
|
-
pduErrors.push(
|
|
5643
|
+
pduErrors.push(
|
|
5644
|
+
"Unsupported v" + version + " compression type: " + pduCompression
|
|
5645
|
+
);
|
|
5047
5646
|
}
|
|
5048
5647
|
if (pduData !== null) {
|
|
5049
5648
|
const crcAlgoHandlerByVersion = {
|
|
@@ -5063,7 +5662,9 @@ var MIAMCoreUtils = class {
|
|
|
5063
5662
|
if (crcCheck === pduCrc) {
|
|
5064
5663
|
pduCrcIsOk = true;
|
|
5065
5664
|
} else {
|
|
5066
|
-
pduErrors.push(
|
|
5665
|
+
pduErrors.push(
|
|
5666
|
+
"Body failed CRC check: provided=" + pduCrc + ", generated=" + crcCheck
|
|
5667
|
+
);
|
|
5067
5668
|
}
|
|
5068
5669
|
}
|
|
5069
5670
|
} else {
|
|
@@ -5106,7 +5707,13 @@ var MIAMCoreUtils = class {
|
|
|
5106
5707
|
static VersionPduHandlerTable = {
|
|
5107
5708
|
[1 /* V1 */]: {
|
|
5108
5709
|
[0 /* Data */]: (hdr, body) => {
|
|
5109
|
-
return this.corePduDataHandler(
|
|
5710
|
+
return this.corePduDataHandler(
|
|
5711
|
+
1 /* V1 */,
|
|
5712
|
+
20,
|
|
5713
|
+
MIAMCoreV1CRCLength,
|
|
5714
|
+
hdr,
|
|
5715
|
+
body
|
|
5716
|
+
);
|
|
5110
5717
|
},
|
|
5111
5718
|
[1 /* Ack */]: () => {
|
|
5112
5719
|
return { decoded: false, error: "v1 Ack PDU not implemented" };
|
|
@@ -5120,7 +5727,13 @@ var MIAMCoreUtils = class {
|
|
|
5120
5727
|
},
|
|
5121
5728
|
[2 /* V2 */]: {
|
|
5122
5729
|
[0 /* Data */]: (hdr, body) => {
|
|
5123
|
-
return this.corePduDataHandler(
|
|
5730
|
+
return this.corePduDataHandler(
|
|
5731
|
+
2 /* V2 */,
|
|
5732
|
+
7,
|
|
5733
|
+
MIAMCoreV2CRCLength,
|
|
5734
|
+
hdr,
|
|
5735
|
+
body
|
|
5736
|
+
);
|
|
5124
5737
|
},
|
|
5125
5738
|
[1 /* Ack */]: () => {
|
|
5126
5739
|
return { decoded: false, error: "v2 Ack PDU not implemented" };
|
|
@@ -5152,28 +5765,39 @@ var Label_MA = class extends DecoderPlugin {
|
|
|
5152
5765
|
decodeResult.decoded = true;
|
|
5153
5766
|
ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
|
|
5154
5767
|
if (miamResult.message.data.acars.sublabel) {
|
|
5155
|
-
ResultFormatter.sublabel(
|
|
5768
|
+
ResultFormatter.sublabel(
|
|
5769
|
+
decodeResult,
|
|
5770
|
+
miamResult.message.data.acars.sublabel
|
|
5771
|
+
);
|
|
5156
5772
|
}
|
|
5157
5773
|
if (miamResult.message.data.acars.tail) {
|
|
5158
|
-
ResultFormatter.tail(
|
|
5774
|
+
ResultFormatter.tail(
|
|
5775
|
+
decodeResult,
|
|
5776
|
+
miamResult.message.data.acars.tail.replace(".", "")
|
|
5777
|
+
);
|
|
5159
5778
|
}
|
|
5160
5779
|
const messageText = miamResult.message.data.acars.text;
|
|
5161
5780
|
if (miamResult.message.data.crcOk && miamResult.message.data.complete && messageText) {
|
|
5162
5781
|
decodeResult.decoder.decodeLevel = "full";
|
|
5163
|
-
const decoded = this.decoder.decode(
|
|
5164
|
-
|
|
5165
|
-
|
|
5166
|
-
|
|
5167
|
-
|
|
5782
|
+
const decoded = this.decoder.decode(
|
|
5783
|
+
{
|
|
5784
|
+
label: miamResult.message.data.acars.label,
|
|
5785
|
+
sublabel: miamResult.message.data.acars.sublabel,
|
|
5786
|
+
text: messageText
|
|
5787
|
+
},
|
|
5788
|
+
options
|
|
5789
|
+
);
|
|
5168
5790
|
if (decoded.decoded) {
|
|
5169
5791
|
decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
|
|
5170
5792
|
decodeResult.formatted.items.push(...decoded.formatted.items);
|
|
5793
|
+
decodeResult.remaining = decoded.remaining;
|
|
5171
5794
|
} else {
|
|
5172
5795
|
ResultFormatter.text(decodeResult, messageText);
|
|
5796
|
+
decodeResult.remaining = { text: messageText };
|
|
5173
5797
|
}
|
|
5174
5798
|
} else if (messageText) {
|
|
5175
5799
|
decodeResult.decoder.decodeLevel = "partial";
|
|
5176
|
-
|
|
5800
|
+
decodeResult.remaining = { text: messageText };
|
|
5177
5801
|
} else {
|
|
5178
5802
|
decodeResult.decoder.decodeLevel = "partial";
|
|
5179
5803
|
}
|
|
@@ -5301,15 +5925,19 @@ var Label_QR = class extends DecoderPlugin {
|
|
|
5301
5925
|
const decodeResult = this.defaultResult();
|
|
5302
5926
|
decodeResult.decoder.name = this.name;
|
|
5303
5927
|
decodeResult.formatted.description = "ON Report";
|
|
5304
|
-
ResultFormatter.departureAirport(
|
|
5928
|
+
ResultFormatter.departureAirport(
|
|
5929
|
+
decodeResult,
|
|
5930
|
+
message.text.substring(0, 4)
|
|
5931
|
+
);
|
|
5305
5932
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5306
|
-
ResultFormatter.on(
|
|
5933
|
+
ResultFormatter.on(
|
|
5934
|
+
decodeResult,
|
|
5935
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
|
|
5936
|
+
);
|
|
5307
5937
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5308
5938
|
decodeResult.decoded = true;
|
|
5309
|
-
if (!decodeResult.remaining.text)
|
|
5310
|
-
|
|
5311
|
-
else
|
|
5312
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
5939
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
5940
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5313
5941
|
return decodeResult;
|
|
5314
5942
|
}
|
|
5315
5943
|
};
|
|
@@ -5326,15 +5954,19 @@ var Label_QP = class extends DecoderPlugin {
|
|
|
5326
5954
|
const decodeResult = this.defaultResult();
|
|
5327
5955
|
decodeResult.decoder.name = this.name;
|
|
5328
5956
|
decodeResult.formatted.description = "OUT Report";
|
|
5329
|
-
ResultFormatter.departureAirport(
|
|
5957
|
+
ResultFormatter.departureAirport(
|
|
5958
|
+
decodeResult,
|
|
5959
|
+
message.text.substring(0, 4)
|
|
5960
|
+
);
|
|
5330
5961
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5331
|
-
ResultFormatter.out(
|
|
5962
|
+
ResultFormatter.out(
|
|
5963
|
+
decodeResult,
|
|
5964
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
|
|
5965
|
+
);
|
|
5332
5966
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5333
5967
|
decodeResult.decoded = true;
|
|
5334
|
-
if (!decodeResult.remaining.text)
|
|
5335
|
-
|
|
5336
|
-
else
|
|
5337
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
5968
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
5969
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5338
5970
|
return decodeResult;
|
|
5339
5971
|
}
|
|
5340
5972
|
};
|
|
@@ -5351,15 +5983,19 @@ var Label_QS = class extends DecoderPlugin {
|
|
|
5351
5983
|
const decodeResult = this.defaultResult();
|
|
5352
5984
|
decodeResult.decoder.name = this.name;
|
|
5353
5985
|
decodeResult.formatted.description = "IN Report";
|
|
5354
|
-
ResultFormatter.departureAirport(
|
|
5986
|
+
ResultFormatter.departureAirport(
|
|
5987
|
+
decodeResult,
|
|
5988
|
+
message.text.substring(0, 4)
|
|
5989
|
+
);
|
|
5355
5990
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5356
|
-
ResultFormatter.in(
|
|
5991
|
+
ResultFormatter.in(
|
|
5992
|
+
decodeResult,
|
|
5993
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
|
|
5994
|
+
);
|
|
5357
5995
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5358
5996
|
decodeResult.decoded = true;
|
|
5359
|
-
if (!decodeResult.remaining.text)
|
|
5360
|
-
|
|
5361
|
-
else
|
|
5362
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
5997
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
5998
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5363
5999
|
return decodeResult;
|
|
5364
6000
|
}
|
|
5365
6001
|
};
|
|
@@ -5377,11 +6013,17 @@ var Label_QQ = class extends DecoderPlugin {
|
|
|
5377
6013
|
decodeResult.decoder.name = this.name;
|
|
5378
6014
|
decodeResult.message = message;
|
|
5379
6015
|
decodeResult.formatted.description = "OFF Report";
|
|
5380
|
-
ResultFormatter.departureAirport(
|
|
6016
|
+
ResultFormatter.departureAirport(
|
|
6017
|
+
decodeResult,
|
|
6018
|
+
message.text.substring(0, 4)
|
|
6019
|
+
);
|
|
5381
6020
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5382
6021
|
if (message.text.substring(12, 19) === "\r\n001FE") {
|
|
5383
6022
|
decodeResult.raw.day = message.text.substring(19, 21);
|
|
5384
|
-
ResultFormatter.off(
|
|
6023
|
+
ResultFormatter.off(
|
|
6024
|
+
decodeResult,
|
|
6025
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27))
|
|
6026
|
+
);
|
|
5385
6027
|
let latdir = message.text.substring(27, 28);
|
|
5386
6028
|
let latdeg = Number(message.text.substring(28, 30));
|
|
5387
6029
|
let latmin = Number(message.text.substring(30, 34));
|
|
@@ -5395,20 +6037,24 @@ var Label_QQ = class extends DecoderPlugin {
|
|
|
5395
6037
|
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
5396
6038
|
ResultFormatter.position(decodeResult, pos);
|
|
5397
6039
|
if (decodeResult.remaining.text !== "---") {
|
|
5398
|
-
ResultFormatter.groundspeed(
|
|
6040
|
+
ResultFormatter.groundspeed(
|
|
6041
|
+
decodeResult,
|
|
6042
|
+
Number(message.text.substring(45, 48))
|
|
6043
|
+
);
|
|
5399
6044
|
} else {
|
|
5400
6045
|
ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
|
|
5401
6046
|
}
|
|
5402
6047
|
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
5403
6048
|
} else {
|
|
5404
|
-
ResultFormatter.off(
|
|
6049
|
+
ResultFormatter.off(
|
|
6050
|
+
decodeResult,
|
|
6051
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00")
|
|
6052
|
+
);
|
|
5405
6053
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5406
6054
|
}
|
|
5407
6055
|
decodeResult.decoded = true;
|
|
5408
|
-
if (!decodeResult.remaining.text)
|
|
5409
|
-
|
|
5410
|
-
else
|
|
5411
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
6056
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
6057
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5412
6058
|
return decodeResult;
|
|
5413
6059
|
}
|
|
5414
6060
|
};
|
|
@@ -5422,6 +6068,7 @@ var MessageDecoder = class {
|
|
|
5422
6068
|
this.name = "acars-decoder-typescript";
|
|
5423
6069
|
this.plugins = [];
|
|
5424
6070
|
this.debug = false;
|
|
6071
|
+
this.registerPlugin(new CBand(this));
|
|
5425
6072
|
this.registerPlugin(new Label_ColonComma(this));
|
|
5426
6073
|
this.registerPlugin(new Label_5Z_Slash(this));
|
|
5427
6074
|
this.registerPlugin(new Label_10_LDR(this));
|
|
@@ -5472,7 +6119,6 @@ var MessageDecoder = class {
|
|
|
5472
6119
|
this.registerPlugin(new Label_H1_OHMA(this));
|
|
5473
6120
|
this.registerPlugin(new Label_H1_WRN(this));
|
|
5474
6121
|
this.registerPlugin(new Label_H1(this));
|
|
5475
|
-
this.registerPlugin(new Label_H1_Slash(this));
|
|
5476
6122
|
this.registerPlugin(new Label_H1_StarPOS(this));
|
|
5477
6123
|
this.registerPlugin(new Label_HX(this));
|
|
5478
6124
|
this.registerPlugin(new Label_58(this));
|
|
@@ -5488,14 +6134,13 @@ var MessageDecoder = class {
|
|
|
5488
6134
|
this.registerPlugin(new Label_QS(this));
|
|
5489
6135
|
}
|
|
5490
6136
|
registerPlugin(plugin) {
|
|
5491
|
-
const pluginInstance = plugin;
|
|
5492
6137
|
this.plugins.push(plugin);
|
|
5493
6138
|
return true;
|
|
5494
6139
|
}
|
|
5495
6140
|
decode(message, options = {}) {
|
|
5496
6141
|
const usablePlugins = this.plugins.filter((plugin) => {
|
|
5497
6142
|
const qualifiers = plugin.qualifiers();
|
|
5498
|
-
if (qualifiers.labels.includes(message.label)) {
|
|
6143
|
+
if (qualifiers.labels.includes(message.label) || qualifiers.labels.length === 1 && qualifiers.labels[0] === "*") {
|
|
5499
6144
|
if (qualifiers.preambles && qualifiers.preambles.length > 0) {
|
|
5500
6145
|
const matching = qualifiers.preambles.filter((preamble) => {
|
|
5501
6146
|
return message.text.substring(0, preamble.length) === preamble;
|