@airframes/acars-decoder 1.8.5 → 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 +1079 -436
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1079 -436
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -2
package/dist/index.js
CHANGED
|
@@ -36,87 +36,89 @@ __export(index_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(index_exports);
|
|
37
37
|
|
|
38
38
|
// lib/IcaoDecoder.ts
|
|
39
|
-
var IcaoDecoder = class {
|
|
39
|
+
var IcaoDecoder = class _IcaoDecoder {
|
|
40
40
|
name;
|
|
41
41
|
icao;
|
|
42
|
+
// Military ICAO address ranges (as [start, end] tuples, inclusive)
|
|
43
|
+
static MILITARY_RANGES = [
|
|
44
|
+
[65648, 65679],
|
|
45
|
+
// Egypt
|
|
46
|
+
[671744, 675839],
|
|
47
|
+
// Algeria
|
|
48
|
+
[3407616, 3407871],
|
|
49
|
+
// Italy
|
|
50
|
+
[3473408, 3670015],
|
|
51
|
+
// Spain
|
|
52
|
+
[3842048, 3866623],
|
|
53
|
+
// France 1
|
|
54
|
+
[3895296, 3932159],
|
|
55
|
+
// France 2
|
|
56
|
+
[4104192, 4112383],
|
|
57
|
+
// Germany 1
|
|
58
|
+
[4145152, 4177919],
|
|
59
|
+
// Germany 2
|
|
60
|
+
[4194304, 4194367],
|
|
61
|
+
// UK 1
|
|
62
|
+
[4440064, 4444159],
|
|
63
|
+
// UK 2
|
|
64
|
+
[4472832, 4485119],
|
|
65
|
+
// Austria
|
|
66
|
+
[4517888, 4521983],
|
|
67
|
+
// Belgium
|
|
68
|
+
[4550656, 4554751],
|
|
69
|
+
// Bulgaria
|
|
70
|
+
[4584448, 4584703],
|
|
71
|
+
// Denmark
|
|
72
|
+
[4620288, 4621311],
|
|
73
|
+
// Greece
|
|
74
|
+
[4668416, 4668431],
|
|
75
|
+
// Hungary
|
|
76
|
+
[4686080, 4686335],
|
|
77
|
+
// Norway
|
|
78
|
+
[4718592, 4722687],
|
|
79
|
+
// Netherlands
|
|
80
|
+
[4773888, 4774015],
|
|
81
|
+
// Poland
|
|
82
|
+
[4815872, 4816127],
|
|
83
|
+
// Portugal
|
|
84
|
+
[4817952, 4817967],
|
|
85
|
+
// Czech
|
|
86
|
+
[4943872, 4947967],
|
|
87
|
+
// Switzerland
|
|
88
|
+
[4948480, 4948735],
|
|
89
|
+
// Turkey
|
|
90
|
+
[7389296, 7389311],
|
|
91
|
+
// Oman
|
|
92
|
+
[7406168, 7406223],
|
|
93
|
+
// Saudi 1
|
|
94
|
+
[7406464, 7406495],
|
|
95
|
+
// Saudi 2
|
|
96
|
+
[7571968, 7572223],
|
|
97
|
+
// Israel
|
|
98
|
+
[8189952, 8190719],
|
|
99
|
+
// Australia
|
|
100
|
+
[8389120, 8389375],
|
|
101
|
+
// India
|
|
102
|
+
[11401160, 11534335],
|
|
103
|
+
// USA
|
|
104
|
+
[12713984, 12845055],
|
|
105
|
+
// Canada
|
|
106
|
+
[14942208, 14950399]
|
|
107
|
+
// Brazil
|
|
108
|
+
];
|
|
42
109
|
constructor(icao) {
|
|
43
110
|
this.name = "icao-decoder-typescript";
|
|
44
111
|
this.icao = icao;
|
|
45
112
|
}
|
|
46
113
|
isMilitary() {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
var DateTimeUtils = class {
|
|
54
|
-
// Expects a four digit UTC time string (HHMM)
|
|
55
|
-
static UTCToString(UTCString) {
|
|
56
|
-
let utcDate = /* @__PURE__ */ new Date();
|
|
57
|
-
utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
|
|
58
|
-
return utcDate.toTimeString();
|
|
59
|
-
}
|
|
60
|
-
// Expects a six digit date string and a four digit UTC time string
|
|
61
|
-
// (DDMMYY) (HHMM)
|
|
62
|
-
static UTCDateTimeToString(dateString, timeString) {
|
|
63
|
-
let utcDate = /* @__PURE__ */ new Date();
|
|
64
|
-
utcDate.setUTCDate(+dateString.substr(0, 2));
|
|
65
|
-
utcDate.setUTCMonth(+dateString.substr(2, 2));
|
|
66
|
-
if (dateString.length === 6) {
|
|
67
|
-
utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
|
|
68
|
-
}
|
|
69
|
-
if (timeString.length === 6) {
|
|
70
|
-
utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));
|
|
71
|
-
} else {
|
|
72
|
-
utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
|
|
73
|
-
}
|
|
74
|
-
return utcDate.toUTCString();
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
*
|
|
78
|
-
* @param time HHMMSS or HHMM
|
|
79
|
-
* @returns seconds since midnight
|
|
80
|
-
*/
|
|
81
|
-
static convertHHMMSSToTod(time) {
|
|
82
|
-
if (time.length === 4) {
|
|
83
|
-
time += "00";
|
|
84
|
-
}
|
|
85
|
-
const h = Number(time.substring(0, 2));
|
|
86
|
-
const m = Number(time.substring(2, 4));
|
|
87
|
-
const s = Number(time.substring(4, 6));
|
|
88
|
-
const tod = h * 3600 + m * 60 + s;
|
|
89
|
-
return tod;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
*
|
|
93
|
-
* @param time HHMMSS
|
|
94
|
-
* @param date MMDDYY or MMDDYYYY
|
|
95
|
-
* @returns seconds since epoch
|
|
96
|
-
*/
|
|
97
|
-
static convertDateTimeToEpoch(time, date) {
|
|
98
|
-
if (date.length === 6) {
|
|
99
|
-
date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
|
|
100
|
-
}
|
|
101
|
-
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`;
|
|
102
|
-
const millis = Date.parse(timestamp);
|
|
103
|
-
return millis / 1e3;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Converts a timestamp to a string
|
|
107
|
-
*
|
|
108
|
-
* ISO-8601 format for 'epoch'
|
|
109
|
-
* HH:MM:SS for 'tod'
|
|
110
|
-
* @param time
|
|
111
|
-
* @param format
|
|
112
|
-
* @returns
|
|
113
|
-
*/
|
|
114
|
-
static timestampToString(time, format) {
|
|
115
|
-
const date = new Date(time * 1e3);
|
|
116
|
-
if (format == "tod") {
|
|
117
|
-
return date.toISOString().slice(11, 19);
|
|
114
|
+
const i = this.icao;
|
|
115
|
+
const n = parseInt(i, 16);
|
|
116
|
+
for (const [start, end] of _IcaoDecoder.MILITARY_RANGES) {
|
|
117
|
+
if (start <= n && n <= end) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
118
120
|
}
|
|
119
|
-
return
|
|
121
|
+
return false;
|
|
120
122
|
}
|
|
121
123
|
};
|
|
122
124
|
|
|
@@ -146,7 +148,9 @@ var DecoderPlugin = class {
|
|
|
146
148
|
this.options = options;
|
|
147
149
|
}
|
|
148
150
|
id() {
|
|
149
|
-
console.log(
|
|
151
|
+
console.log(
|
|
152
|
+
"DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!"
|
|
153
|
+
);
|
|
150
154
|
return "abstract_decoder_plugin";
|
|
151
155
|
}
|
|
152
156
|
meetsStateRequirements() {
|
|
@@ -173,7 +177,7 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
173
177
|
/**
|
|
174
178
|
* Decode a string of coordinates into an object with latitude and longitude in millidegrees
|
|
175
179
|
* @param stringCoords - The string of coordinates to decode
|
|
176
|
-
*
|
|
180
|
+
*
|
|
177
181
|
* @returns An object with latitude and longitude properties
|
|
178
182
|
*/
|
|
179
183
|
static decodeStringCoordinates(stringCoords) {
|
|
@@ -193,11 +197,11 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
193
197
|
return void 0;
|
|
194
198
|
}
|
|
195
199
|
/**
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
200
|
+
* Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
|
|
201
|
+
* @param stringCoords - The string of coordinates to decode
|
|
202
|
+
*
|
|
203
|
+
* @returns An object with latitude and longitude properties
|
|
204
|
+
*/
|
|
201
205
|
static decodeStringCoordinatesDecimalMinutes(stringCoords) {
|
|
202
206
|
const firstChar = stringCoords.substring(0, 1);
|
|
203
207
|
let middleChar = stringCoords.substring(6, 7);
|
|
@@ -236,6 +240,85 @@ var CoordinateUtils = class _CoordinateUtils {
|
|
|
236
240
|
}
|
|
237
241
|
};
|
|
238
242
|
|
|
243
|
+
// lib/DateTimeUtils.ts
|
|
244
|
+
var DateTimeUtils = class {
|
|
245
|
+
// Expects a four digit UTC time string (HHMM)
|
|
246
|
+
static UTCToString(UTCString) {
|
|
247
|
+
let utcDate = /* @__PURE__ */ new Date();
|
|
248
|
+
utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
|
|
249
|
+
return utcDate.toTimeString();
|
|
250
|
+
}
|
|
251
|
+
// Expects a six digit date string and a four digit UTC time string
|
|
252
|
+
// (DDMMYY) (HHMM)
|
|
253
|
+
static UTCDateTimeToString(dateString, timeString) {
|
|
254
|
+
let utcDate = /* @__PURE__ */ new Date();
|
|
255
|
+
utcDate.setUTCDate(+dateString.substr(0, 2));
|
|
256
|
+
utcDate.setUTCMonth(+dateString.substr(2, 2));
|
|
257
|
+
if (dateString.length === 6) {
|
|
258
|
+
utcDate.setUTCFullYear(2e3 + +dateString.substr(4, 2));
|
|
259
|
+
}
|
|
260
|
+
if (timeString.length === 6) {
|
|
261
|
+
utcDate.setUTCHours(
|
|
262
|
+
+timeString.substr(0, 2),
|
|
263
|
+
+timeString.substr(2, 2),
|
|
264
|
+
+timeString.substr(4, 2)
|
|
265
|
+
);
|
|
266
|
+
} else {
|
|
267
|
+
utcDate.setUTCHours(
|
|
268
|
+
+timeString.substr(0, 2),
|
|
269
|
+
+timeString.substr(2, 2),
|
|
270
|
+
0
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
return utcDate.toUTCString();
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
*
|
|
277
|
+
* @param time HHMMSS or HHMM
|
|
278
|
+
* @returns seconds since midnight
|
|
279
|
+
*/
|
|
280
|
+
static convertHHMMSSToTod(time) {
|
|
281
|
+
if (time.length === 4) {
|
|
282
|
+
time += "00";
|
|
283
|
+
}
|
|
284
|
+
const h = Number(time.substring(0, 2));
|
|
285
|
+
const m = Number(time.substring(2, 4));
|
|
286
|
+
const s = Number(time.substring(4, 6));
|
|
287
|
+
const tod = h * 3600 + m * 60 + s;
|
|
288
|
+
return tod;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
*
|
|
292
|
+
* @param time HHMMSS
|
|
293
|
+
* @param date MMDDYY or MMDDYYYY
|
|
294
|
+
* @returns seconds since epoch
|
|
295
|
+
*/
|
|
296
|
+
static convertDateTimeToEpoch(time, date) {
|
|
297
|
+
if (date.length === 6) {
|
|
298
|
+
date = date.substring(0, 4) + `20${date.substring(4, 6)}`;
|
|
299
|
+
}
|
|
300
|
+
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`;
|
|
301
|
+
const millis = Date.parse(timestamp);
|
|
302
|
+
return millis / 1e3;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Converts a timestamp to a string
|
|
306
|
+
*
|
|
307
|
+
* ISO-8601 format for 'epoch'
|
|
308
|
+
* HH:MM:SS for 'tod'
|
|
309
|
+
* @param time
|
|
310
|
+
* @param format
|
|
311
|
+
* @returns
|
|
312
|
+
*/
|
|
313
|
+
static timestampToString(time, format) {
|
|
314
|
+
const date = new Date(time * 1e3);
|
|
315
|
+
if (format == "tod") {
|
|
316
|
+
return date.toISOString().slice(11, 19);
|
|
317
|
+
}
|
|
318
|
+
return date.toISOString().slice(0, -5) + "Z";
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
|
|
239
322
|
// lib/utils/route_utils.ts
|
|
240
323
|
var RouteUtils = class _RouteUtils {
|
|
241
324
|
static formatFlightState(state) {
|
|
@@ -290,20 +373,36 @@ var RouteUtils = class _RouteUtils {
|
|
|
290
373
|
static getWaypoint(leg) {
|
|
291
374
|
const regex = leg.match(/^([A-Z]+)(\d{3})-(\d{4})$/);
|
|
292
375
|
if (regex?.length == 4) {
|
|
293
|
-
return {
|
|
376
|
+
return {
|
|
377
|
+
name: regex[1],
|
|
378
|
+
offset: {
|
|
379
|
+
bearing: parseInt(regex[2]),
|
|
380
|
+
distance: parseInt(regex[3]) / 10
|
|
381
|
+
}
|
|
382
|
+
};
|
|
294
383
|
}
|
|
295
384
|
const waypoint = leg.split(",");
|
|
296
385
|
if (waypoint.length == 2) {
|
|
297
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
386
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
387
|
+
waypoint[1]
|
|
388
|
+
);
|
|
298
389
|
if (position) {
|
|
299
|
-
return {
|
|
390
|
+
return {
|
|
391
|
+
name: waypoint[0],
|
|
392
|
+
latitude: position.latitude,
|
|
393
|
+
longitude: position.longitude
|
|
394
|
+
};
|
|
300
395
|
}
|
|
301
396
|
}
|
|
302
397
|
if (leg.length == 13 || leg.length == 14) {
|
|
303
398
|
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);
|
|
304
399
|
const name = waypoint.length == 2 ? waypoint[0] : "";
|
|
305
400
|
if (position) {
|
|
306
|
-
return {
|
|
401
|
+
return {
|
|
402
|
+
name,
|
|
403
|
+
latitude: position.latitude,
|
|
404
|
+
longitude: position.longitude
|
|
405
|
+
};
|
|
307
406
|
}
|
|
308
407
|
}
|
|
309
408
|
return { name: leg };
|
|
@@ -568,7 +667,9 @@ var ResultFormatter = class {
|
|
|
568
667
|
if (value.length === 0) {
|
|
569
668
|
return;
|
|
570
669
|
}
|
|
571
|
-
decodeResult.raw.outside_air_temperature = Number(
|
|
670
|
+
decodeResult.raw.outside_air_temperature = Number(
|
|
671
|
+
value.replace("M", "-").replace("P", "+")
|
|
672
|
+
);
|
|
572
673
|
decodeResult.formatted.items.push({
|
|
573
674
|
type: "outside_air_temperature",
|
|
574
675
|
code: "OATEMP",
|
|
@@ -785,17 +886,112 @@ var ResultFormatter = class {
|
|
|
785
886
|
value: `${decodeResult.raw.sublabel}`
|
|
786
887
|
});
|
|
787
888
|
}
|
|
889
|
+
static requestedAltitudes(decodeResult, values) {
|
|
890
|
+
decodeResult.raw.requested_alts = values;
|
|
891
|
+
decodeResult.formatted.items.push({
|
|
892
|
+
type: "requested_altitudes",
|
|
893
|
+
code: "REQ_ALTS",
|
|
894
|
+
label: "Requested Altitudes",
|
|
895
|
+
value: `${decodeResult.raw.requested_alts.join(", ")}`
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
static desiredAltitude(decodeResult, value) {
|
|
899
|
+
decodeResult.raw.desired_alt = value;
|
|
900
|
+
decodeResult.formatted.items.push({
|
|
901
|
+
type: "desired_altitude",
|
|
902
|
+
code: "DES_ALT",
|
|
903
|
+
label: "Desired Altitude",
|
|
904
|
+
value: `${decodeResult.raw.desired_alt}`
|
|
905
|
+
});
|
|
906
|
+
}
|
|
907
|
+
static startPoint(decodeResult, value) {
|
|
908
|
+
decodeResult.raw.start_point = value;
|
|
909
|
+
decodeResult.formatted.items.push({
|
|
910
|
+
type: "start_point",
|
|
911
|
+
code: "START",
|
|
912
|
+
label: "Start Point",
|
|
913
|
+
value: `${decodeResult.raw.start_point}`
|
|
914
|
+
});
|
|
915
|
+
}
|
|
916
|
+
static routeNumber(decodeResult, value) {
|
|
917
|
+
decodeResult.raw.route_number = value;
|
|
918
|
+
decodeResult.formatted.items.push({
|
|
919
|
+
type: "route_number",
|
|
920
|
+
code: "RTE_NUM",
|
|
921
|
+
label: "Route Number",
|
|
922
|
+
value: `${decodeResult.raw.route_number}`
|
|
923
|
+
});
|
|
924
|
+
}
|
|
925
|
+
static flightPlan(decodeResult, value) {
|
|
926
|
+
decodeResult.raw.flight_plan = value;
|
|
927
|
+
decodeResult.formatted.items.push({
|
|
928
|
+
type: "flight_plan",
|
|
929
|
+
code: "FPN",
|
|
930
|
+
label: "Flight Plan",
|
|
931
|
+
value: `${decodeResult.raw.flight_plan}`
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
static groundAddress(decodeResult, value) {
|
|
935
|
+
decodeResult.raw.ground_address = value;
|
|
936
|
+
decodeResult.formatted.items.push({
|
|
937
|
+
type: "ground_address",
|
|
938
|
+
code: "GND_ADDR",
|
|
939
|
+
label: "Ground Address",
|
|
940
|
+
value: `${decodeResult.raw.ground_address}`
|
|
941
|
+
});
|
|
942
|
+
}
|
|
788
943
|
static unknown(decodeResult, value, sep = ",") {
|
|
789
|
-
if (!decodeResult.remaining.text)
|
|
790
|
-
|
|
791
|
-
else
|
|
792
|
-
decodeResult.remaining.text += sep + value;
|
|
944
|
+
if (!decodeResult.remaining.text) decodeResult.remaining.text = value;
|
|
945
|
+
else decodeResult.remaining.text += sep + value;
|
|
793
946
|
}
|
|
794
947
|
static unknownArr(decodeResult, value, sep = ",") {
|
|
795
948
|
this.unknown(decodeResult, value.join(sep), sep);
|
|
796
949
|
}
|
|
797
950
|
};
|
|
798
951
|
|
|
952
|
+
// lib/plugins/CBand.ts
|
|
953
|
+
var CBand = class extends DecoderPlugin {
|
|
954
|
+
name = "c-band";
|
|
955
|
+
qualifiers() {
|
|
956
|
+
return {
|
|
957
|
+
labels: ["*"]
|
|
958
|
+
};
|
|
959
|
+
}
|
|
960
|
+
decode(message, options = {}) {
|
|
961
|
+
let decodeResult = this.defaultResult();
|
|
962
|
+
decodeResult.decoder.name = this.name;
|
|
963
|
+
decodeResult.message = message;
|
|
964
|
+
let cband = message.text.match(
|
|
965
|
+
/^(?<msgno>[A-Z]\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/
|
|
966
|
+
);
|
|
967
|
+
if (cband?.groups) {
|
|
968
|
+
const messageText = message.text.substring(10);
|
|
969
|
+
const decoded = this.decoder.decode(
|
|
970
|
+
{
|
|
971
|
+
label: message.label,
|
|
972
|
+
sublabel: message.sublabel,
|
|
973
|
+
text: messageText
|
|
974
|
+
},
|
|
975
|
+
options
|
|
976
|
+
);
|
|
977
|
+
if (decoded.decoded) {
|
|
978
|
+
ResultFormatter.flightNumber(
|
|
979
|
+
decodeResult,
|
|
980
|
+
cband.groups.airline + Number(cband.groups.number)
|
|
981
|
+
);
|
|
982
|
+
decodeResult.decoded = true;
|
|
983
|
+
decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
|
|
984
|
+
decodeResult.decoder.name = this.name + "-" + decoded.decoder.name;
|
|
985
|
+
decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
|
|
986
|
+
decodeResult.formatted.description = decoded.formatted.description;
|
|
987
|
+
decodeResult.formatted.items.push(...decoded.formatted.items);
|
|
988
|
+
decodeResult.remaining = decoded.remaining;
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
return decodeResult;
|
|
992
|
+
}
|
|
993
|
+
};
|
|
994
|
+
|
|
799
995
|
// lib/plugins/Label_5Z_Slash.ts
|
|
800
996
|
var Label_5Z_Slash = class extends DecoderPlugin {
|
|
801
997
|
name = "label-5z-slash";
|
|
@@ -866,12 +1062,23 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
866
1062
|
ResultFormatter.departureAirport(decodeResult, info[1]);
|
|
867
1063
|
ResultFormatter.arrivalAirport(decodeResult, info[2]);
|
|
868
1064
|
decodeResult.raw.day = Number(info[3]);
|
|
869
|
-
ResultFormatter.time_of_day(
|
|
1065
|
+
ResultFormatter.time_of_day(
|
|
1066
|
+
decodeResult,
|
|
1067
|
+
DateTimeUtils.convertHHMMSSToTod(info[4])
|
|
1068
|
+
);
|
|
870
1069
|
ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));
|
|
871
1070
|
ResultFormatter.unknownArr(decodeResult, data.slice(3), "/");
|
|
872
1071
|
} else if (type === "B3") {
|
|
873
|
-
ResultFormatter.departureAirport(
|
|
874
|
-
|
|
1072
|
+
ResultFormatter.departureAirport(
|
|
1073
|
+
decodeResult,
|
|
1074
|
+
header[1].substring(0, 3),
|
|
1075
|
+
"IATA"
|
|
1076
|
+
);
|
|
1077
|
+
ResultFormatter.arrivalAirport(
|
|
1078
|
+
decodeResult,
|
|
1079
|
+
header[1].substring(3),
|
|
1080
|
+
"IATA"
|
|
1081
|
+
);
|
|
875
1082
|
decodeResult.raw.day = Number(header[2]);
|
|
876
1083
|
ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));
|
|
877
1084
|
if (header.length > 4) {
|
|
@@ -882,19 +1089,36 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
882
1089
|
ResultFormatter.departureAirport(decodeResult, info[1]);
|
|
883
1090
|
ResultFormatter.arrivalAirport(decodeResult, info[2]);
|
|
884
1091
|
decodeResult.raw.day = Number(info[3]);
|
|
885
|
-
ResultFormatter.time_of_day(
|
|
1092
|
+
ResultFormatter.time_of_day(
|
|
1093
|
+
decodeResult,
|
|
1094
|
+
DateTimeUtils.convertHHMMSSToTod(info[4])
|
|
1095
|
+
);
|
|
886
1096
|
ResultFormatter.unknownArr(decodeResult, info.slice(5), " ");
|
|
887
1097
|
} else if (type === "C3") {
|
|
888
|
-
ResultFormatter.departureAirport(
|
|
889
|
-
|
|
1098
|
+
ResultFormatter.departureAirport(
|
|
1099
|
+
decodeResult,
|
|
1100
|
+
header[1].substring(0, 3),
|
|
1101
|
+
"IATA"
|
|
1102
|
+
);
|
|
1103
|
+
ResultFormatter.arrivalAirport(
|
|
1104
|
+
decodeResult,
|
|
1105
|
+
header[1].substring(3),
|
|
1106
|
+
"IATA"
|
|
1107
|
+
);
|
|
890
1108
|
} else if (type === "ET") {
|
|
891
1109
|
const airports = data[2].split(" ");
|
|
892
1110
|
ResultFormatter.departureAirport(decodeResult, airports[1]);
|
|
893
1111
|
ResultFormatter.arrivalAirport(decodeResult, airports[2]);
|
|
894
1112
|
decodeResult.raw.day = Number(airports[3]);
|
|
895
|
-
ResultFormatter.time_of_day(
|
|
1113
|
+
ResultFormatter.time_of_day(
|
|
1114
|
+
decodeResult,
|
|
1115
|
+
DateTimeUtils.convertHHMMSSToTod(airports[4])
|
|
1116
|
+
);
|
|
896
1117
|
const estimates = data[3].split(" ");
|
|
897
|
-
ResultFormatter.eta(
|
|
1118
|
+
ResultFormatter.eta(
|
|
1119
|
+
decodeResult,
|
|
1120
|
+
DateTimeUtils.convertHHMMSSToTod(estimates[1])
|
|
1121
|
+
);
|
|
898
1122
|
ResultFormatter.unknown(decodeResult, estimates[2]);
|
|
899
1123
|
} else {
|
|
900
1124
|
if (options.debug) {
|
|
@@ -917,7 +1141,6 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
917
1141
|
|
|
918
1142
|
// lib/plugins/Label_10_LDR.ts
|
|
919
1143
|
var Label_10_LDR = class extends DecoderPlugin {
|
|
920
|
-
// eslint-disable-line camelcase
|
|
921
1144
|
name = "label-10-ldr";
|
|
922
1145
|
qualifiers() {
|
|
923
1146
|
return {
|
|
@@ -956,7 +1179,10 @@ var Label_10_LDR = class extends DecoderPlugin {
|
|
|
956
1179
|
if (altRwy != "") {
|
|
957
1180
|
ResultFormatter.alternateRunway(decodeResult, altRwy);
|
|
958
1181
|
}
|
|
959
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1182
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1183
|
+
...parts.slice(0, 5),
|
|
1184
|
+
...parts.slice(15)
|
|
1185
|
+
]);
|
|
960
1186
|
decodeResult.decoded = true;
|
|
961
1187
|
decodeResult.decoder.decodeLevel = "partial";
|
|
962
1188
|
return decodeResult;
|
|
@@ -965,7 +1191,6 @@ var Label_10_LDR = class extends DecoderPlugin {
|
|
|
965
1191
|
|
|
966
1192
|
// lib/plugins/Label_10_POS.ts
|
|
967
1193
|
var Label_10_POS = class extends DecoderPlugin {
|
|
968
|
-
// eslint-disable-line camelcase
|
|
969
1194
|
name = "label-10-pos";
|
|
970
1195
|
qualifiers() {
|
|
971
1196
|
return {
|
|
@@ -996,7 +1221,11 @@ var Label_10_POS = class extends DecoderPlugin {
|
|
|
996
1221
|
};
|
|
997
1222
|
ResultFormatter.position(decodeResult, position);
|
|
998
1223
|
ResultFormatter.altitude(decodeResult, Number(parts[7]));
|
|
999
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1224
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1225
|
+
parts[0],
|
|
1226
|
+
...parts.slice(3, 7),
|
|
1227
|
+
...parts.slice(8)
|
|
1228
|
+
]);
|
|
1000
1229
|
decodeResult.decoded = true;
|
|
1001
1230
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1002
1231
|
return decodeResult;
|
|
@@ -1005,7 +1234,6 @@ var Label_10_POS = class extends DecoderPlugin {
|
|
|
1005
1234
|
|
|
1006
1235
|
// lib/plugins/Label_10_Slash.ts
|
|
1007
1236
|
var Label_10_Slash = class extends DecoderPlugin {
|
|
1008
|
-
// eslint-disable-line camelcase
|
|
1009
1237
|
name = "label-10-slash";
|
|
1010
1238
|
qualifiers() {
|
|
1011
1239
|
return {
|
|
@@ -1038,23 +1266,34 @@ var Label_10_Slash = class extends DecoderPlugin {
|
|
|
1038
1266
|
ResultFormatter.heading(decodeResult, Number(parts[5]));
|
|
1039
1267
|
ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));
|
|
1040
1268
|
ResultFormatter.arrivalAirport(decodeResult, parts[7]);
|
|
1041
|
-
ResultFormatter.eta(
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1269
|
+
ResultFormatter.eta(
|
|
1270
|
+
decodeResult,
|
|
1271
|
+
DateTimeUtils.convertHHMMSSToTod(parts[8])
|
|
1272
|
+
);
|
|
1273
|
+
const waypoints = [
|
|
1274
|
+
{
|
|
1275
|
+
name: parts[11]
|
|
1276
|
+
},
|
|
1277
|
+
{
|
|
1278
|
+
name: parts[12],
|
|
1279
|
+
time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
|
|
1280
|
+
timeFormat: "tod"
|
|
1281
|
+
},
|
|
1282
|
+
{
|
|
1283
|
+
name: parts[14],
|
|
1284
|
+
time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
|
|
1285
|
+
timeFormat: "tod"
|
|
1286
|
+
}
|
|
1287
|
+
];
|
|
1053
1288
|
ResultFormatter.route(decodeResult, { waypoints });
|
|
1054
1289
|
if (parts[16]) {
|
|
1055
1290
|
ResultFormatter.departureAirport(decodeResult, parts[16]);
|
|
1056
1291
|
}
|
|
1057
|
-
ResultFormatter.unknownArr(
|
|
1292
|
+
ResultFormatter.unknownArr(
|
|
1293
|
+
decodeResult,
|
|
1294
|
+
[parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],
|
|
1295
|
+
"/"
|
|
1296
|
+
);
|
|
1058
1297
|
decodeResult.decoded = true;
|
|
1059
1298
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1060
1299
|
return decodeResult;
|
|
@@ -1079,7 +1318,7 @@ var Label_12_N_Space = class extends DecoderPlugin {
|
|
|
1079
1318
|
let results = message.text.match(variant1Regex);
|
|
1080
1319
|
if (results?.groups) {
|
|
1081
1320
|
if (options.debug) {
|
|
1082
|
-
console.log(
|
|
1321
|
+
console.log("Label 12 N : results");
|
|
1083
1322
|
console.log(results);
|
|
1084
1323
|
}
|
|
1085
1324
|
ResultFormatter.position(decodeResult, {
|
|
@@ -1088,7 +1327,11 @@ var Label_12_N_Space = class extends DecoderPlugin {
|
|
|
1088
1327
|
});
|
|
1089
1328
|
const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
|
|
1090
1329
|
ResultFormatter.altitude(decodeResult, altitude);
|
|
1091
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1330
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1331
|
+
results.groups.unkwn1,
|
|
1332
|
+
results.groups.unkwn2,
|
|
1333
|
+
results.groups.unkwn3
|
|
1334
|
+
]);
|
|
1092
1335
|
decodeResult.decoded = true;
|
|
1093
1336
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1094
1337
|
return decodeResult;
|
|
@@ -1130,15 +1373,32 @@ var Label_12_POS = class extends DecoderPlugin {
|
|
|
1130
1373
|
const lat = data[0].substring(0, 8);
|
|
1131
1374
|
const lon = data[0].substring(8);
|
|
1132
1375
|
ResultFormatter.position(decodeResult, {
|
|
1133
|
-
latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1134
|
-
|
|
1376
|
+
latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1377
|
+
Number(lat.substring(1, 4)),
|
|
1378
|
+
Number(lat.substring(4, 6)),
|
|
1379
|
+
Number(lat.substring(6, 8))
|
|
1380
|
+
),
|
|
1381
|
+
longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1382
|
+
Number(lon.substring(1, 4)),
|
|
1383
|
+
Number(lon.substring(4, 6)),
|
|
1384
|
+
Number(lon.substring(6, 8))
|
|
1385
|
+
)
|
|
1135
1386
|
});
|
|
1136
1387
|
ResultFormatter.unknown(decodeResult, data[1]);
|
|
1137
|
-
ResultFormatter.time_of_day(
|
|
1388
|
+
ResultFormatter.time_of_day(
|
|
1389
|
+
decodeResult,
|
|
1390
|
+
DateTimeUtils.convertHHMMSSToTod(data[2])
|
|
1391
|
+
);
|
|
1138
1392
|
ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
|
|
1139
1393
|
ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
|
|
1140
|
-
ResultFormatter.currentFuel(
|
|
1141
|
-
|
|
1394
|
+
ResultFormatter.currentFuel(
|
|
1395
|
+
decodeResult,
|
|
1396
|
+
Number(data[7].substring(3).trim())
|
|
1397
|
+
);
|
|
1398
|
+
ResultFormatter.eta(
|
|
1399
|
+
decodeResult,
|
|
1400
|
+
DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim())
|
|
1401
|
+
);
|
|
1142
1402
|
ResultFormatter.departureAirport(decodeResult, data[9]);
|
|
1143
1403
|
ResultFormatter.arrivalAirport(decodeResult, data[10]);
|
|
1144
1404
|
ResultFormatter.unknown(decodeResult, data[11]);
|
|
@@ -1150,7 +1410,6 @@ var Label_12_POS = class extends DecoderPlugin {
|
|
|
1150
1410
|
|
|
1151
1411
|
// lib/plugins/Label_13Through18_Slash.ts
|
|
1152
1412
|
var Label_13Through18_Slash = class extends DecoderPlugin {
|
|
1153
|
-
// eslint-disable-line camelcase
|
|
1154
1413
|
name = "label-13-18-slash";
|
|
1155
1414
|
qualifiers() {
|
|
1156
1415
|
return {
|
|
@@ -1197,11 +1456,22 @@ var Label_13Through18_Slash = class extends DecoderPlugin {
|
|
|
1197
1456
|
const location = lines[i].substring(5).split(",");
|
|
1198
1457
|
let position;
|
|
1199
1458
|
if (location[0].startsWith("+") || location[0].startsWith("-")) {
|
|
1200
|
-
position = {
|
|
1459
|
+
position = {
|
|
1460
|
+
latitude: Number(location[0]),
|
|
1461
|
+
longitude: Number(location[1])
|
|
1462
|
+
};
|
|
1201
1463
|
} else {
|
|
1202
1464
|
position = {
|
|
1203
|
-
latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1204
|
-
|
|
1465
|
+
latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1466
|
+
Number(location[0].substring(1, 3)),
|
|
1467
|
+
Number(location[0].substring(3, 5)),
|
|
1468
|
+
Number(location[0].substring(5, 7))
|
|
1469
|
+
),
|
|
1470
|
+
longitude: CoordinateUtils.getDirection(location[1][0]) * CoordinateUtils.dmsToDecimalDegrees(
|
|
1471
|
+
Number(location[1].substring(1, 4)),
|
|
1472
|
+
Number(location[1].substring(4, 6)),
|
|
1473
|
+
Number(location[1].substring(6, 8))
|
|
1474
|
+
)
|
|
1205
1475
|
};
|
|
1206
1476
|
}
|
|
1207
1477
|
ResultFormatter.position(decodeResult, position);
|
|
@@ -1252,22 +1522,38 @@ var Label_15 = class extends DecoderPlugin {
|
|
|
1252
1522
|
decodeResult.message = message;
|
|
1253
1523
|
if (message.text.startsWith("(2") && message.text.endsWith("(Z")) {
|
|
1254
1524
|
const between = message.text.substring(2, message.text.length - 2);
|
|
1255
|
-
ResultFormatter.position(
|
|
1525
|
+
ResultFormatter.position(
|
|
1526
|
+
decodeResult,
|
|
1527
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
1528
|
+
between.substring(0, 13)
|
|
1529
|
+
)
|
|
1530
|
+
);
|
|
1256
1531
|
if (between.length === 25) {
|
|
1257
1532
|
ResultFormatter.unknown(decodeResult, between.substring(13, 19));
|
|
1258
1533
|
const alt = between.substring(19, 22);
|
|
1259
1534
|
if (alt != "---") {
|
|
1260
1535
|
ResultFormatter.altitude(decodeResult, 100 * Number(alt));
|
|
1261
1536
|
}
|
|
1262
|
-
ResultFormatter.temperature(
|
|
1537
|
+
ResultFormatter.temperature(
|
|
1538
|
+
decodeResult,
|
|
1539
|
+
between.substring(22).replaceAll(" ", "0")
|
|
1540
|
+
);
|
|
1263
1541
|
} else if (between.substring(13, 16) === "OFF") {
|
|
1264
1542
|
const ddmmyy = between.substring(16, 22);
|
|
1265
1543
|
const hhmm = between.substring(22, 26);
|
|
1266
1544
|
if (ddmmyy != "------") {
|
|
1267
1545
|
const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
|
|
1268
|
-
ResultFormatter.off(
|
|
1546
|
+
ResultFormatter.off(
|
|
1547
|
+
decodeResult,
|
|
1548
|
+
DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy),
|
|
1549
|
+
"epoch"
|
|
1550
|
+
);
|
|
1269
1551
|
} else {
|
|
1270
|
-
ResultFormatter.off(
|
|
1552
|
+
ResultFormatter.off(
|
|
1553
|
+
decodeResult,
|
|
1554
|
+
DateTimeUtils.convertHHMMSSToTod(hhmm),
|
|
1555
|
+
"tod"
|
|
1556
|
+
);
|
|
1271
1557
|
}
|
|
1272
1558
|
ResultFormatter.unknown(decodeResult, between.substring(26));
|
|
1273
1559
|
} else {
|
|
@@ -1312,7 +1598,10 @@ var Label_15_FST = class extends DecoderPlugin {
|
|
|
1312
1598
|
const lat = Number(stringCoords.substring(1, 7)) / 1e4 * (firstChar === "S" ? -1 : 1);
|
|
1313
1599
|
const lon = Number(stringCoords.substring(8, 15)) / 1e4 * (middleChar === "W" ? -1 : 1);
|
|
1314
1600
|
ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });
|
|
1315
|
-
ResultFormatter.altitude(
|
|
1601
|
+
ResultFormatter.altitude(
|
|
1602
|
+
decodeResult,
|
|
1603
|
+
Number(stringCoords.substring(15)) * 100
|
|
1604
|
+
);
|
|
1316
1605
|
} else {
|
|
1317
1606
|
decodeResult.decoded = false;
|
|
1318
1607
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -1408,7 +1697,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
|
|
|
1408
1697
|
let results = message.text.match(variant1Regex);
|
|
1409
1698
|
if (results?.groups) {
|
|
1410
1699
|
if (options.debug) {
|
|
1411
|
-
console.log(
|
|
1700
|
+
console.log("Label 16 N : results");
|
|
1412
1701
|
console.log(results);
|
|
1413
1702
|
}
|
|
1414
1703
|
let pos = {
|
|
@@ -1418,7 +1707,10 @@ var Label_16_N_Space = class extends DecoderPlugin {
|
|
|
1418
1707
|
const altitude = results.groups.alt == "GRD" || results.groups.alt == "***" ? 0 : Number(results.groups.alt);
|
|
1419
1708
|
ResultFormatter.position(decodeResult, pos);
|
|
1420
1709
|
ResultFormatter.altitude(decodeResult, altitude);
|
|
1421
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
1710
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
1711
|
+
results.groups.unkwn1,
|
|
1712
|
+
results.groups.unkwn2
|
|
1713
|
+
]);
|
|
1422
1714
|
decodeResult.decoded = true;
|
|
1423
1715
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1424
1716
|
return decodeResult;
|
|
@@ -1426,7 +1718,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
|
|
|
1426
1718
|
results = message.text.match(variant2Regex);
|
|
1427
1719
|
if (results?.groups) {
|
|
1428
1720
|
if (options.debug) {
|
|
1429
|
-
console.log(
|
|
1721
|
+
console.log("Label 16 N : results");
|
|
1430
1722
|
console.log(results);
|
|
1431
1723
|
}
|
|
1432
1724
|
let pos = {
|
|
@@ -1472,17 +1764,22 @@ var Label_16_POSA1 = class extends DecoderPlugin {
|
|
|
1472
1764
|
decodeResult.decoder.decodeLevel = "none";
|
|
1473
1765
|
return decodeResult;
|
|
1474
1766
|
}
|
|
1475
|
-
ResultFormatter.position(
|
|
1767
|
+
ResultFormatter.position(
|
|
1768
|
+
decodeResult,
|
|
1769
|
+
CoordinateUtils.decodeStringCoordinates(fields[0].substring(5))
|
|
1770
|
+
);
|
|
1476
1771
|
const waypoint = fields[1].trim();
|
|
1477
1772
|
const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);
|
|
1478
1773
|
ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);
|
|
1479
1774
|
const nextWaypoint = fields[4].trim();
|
|
1480
1775
|
const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);
|
|
1481
1776
|
ResultFormatter.unknownArr(decodeResult, fields.slice(6), ",");
|
|
1482
|
-
ResultFormatter.route(decodeResult, {
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1777
|
+
ResultFormatter.route(decodeResult, {
|
|
1778
|
+
waypoints: [
|
|
1779
|
+
{ name: waypoint, time, timeFormat: "tod" },
|
|
1780
|
+
{ name: nextWaypoint, time: nextTime, timeFormat: "tod" }
|
|
1781
|
+
]
|
|
1782
|
+
});
|
|
1486
1783
|
decodeResult.decoded = true;
|
|
1487
1784
|
decodeResult.decoder.decodeLevel = "partial";
|
|
1488
1785
|
return decodeResult;
|
|
@@ -1517,7 +1814,10 @@ var Label_16_TOD = class extends DecoderPlugin {
|
|
|
1517
1814
|
if (fields[1] !== "") {
|
|
1518
1815
|
ResultFormatter.altitude(decodeResult, Number(fields[1]));
|
|
1519
1816
|
}
|
|
1520
|
-
ResultFormatter.eta(
|
|
1817
|
+
ResultFormatter.eta(
|
|
1818
|
+
decodeResult,
|
|
1819
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
1820
|
+
);
|
|
1521
1821
|
ResultFormatter.unknown(decodeResult, fields[3]);
|
|
1522
1822
|
const temp = fields[4].split("/");
|
|
1523
1823
|
const posFields = temp[0].split(" ");
|
|
@@ -1538,9 +1838,9 @@ var Label_16_TOD = class extends DecoderPlugin {
|
|
|
1538
1838
|
var FlightPlanUtils = class _FlightPlanUtils {
|
|
1539
1839
|
/**
|
|
1540
1840
|
* Processes flight plan data
|
|
1541
|
-
*
|
|
1841
|
+
*
|
|
1542
1842
|
* Expected format is [header, key1, val1, ... keyN, valN]
|
|
1543
|
-
*
|
|
1843
|
+
*
|
|
1544
1844
|
* @param decodeResult - results
|
|
1545
1845
|
* @param data - original message split by ':'
|
|
1546
1846
|
* @returns whether all fields were processed or not
|
|
@@ -1572,6 +1872,9 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
1572
1872
|
case "F":
|
|
1573
1873
|
addRoute(decodeResult, value);
|
|
1574
1874
|
break;
|
|
1875
|
+
case "FP":
|
|
1876
|
+
ResultFormatter.flightPlan(decodeResult, value.trim());
|
|
1877
|
+
break;
|
|
1575
1878
|
case "R":
|
|
1576
1879
|
addRunway(decodeResult, value);
|
|
1577
1880
|
break;
|
|
@@ -1626,6 +1929,14 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
1626
1929
|
label: "Route Status",
|
|
1627
1930
|
value: "Route Mapped"
|
|
1628
1931
|
});
|
|
1932
|
+
} else if (header.startsWith("RS")) {
|
|
1933
|
+
decodeResult.raw.route_status = "RS";
|
|
1934
|
+
decodeResult.formatted.items.push({
|
|
1935
|
+
type: "status",
|
|
1936
|
+
code: "ROUTE_STATUS",
|
|
1937
|
+
label: "Route Status",
|
|
1938
|
+
value: "Route Saved"
|
|
1939
|
+
});
|
|
1629
1940
|
} else {
|
|
1630
1941
|
decodeResult.remaining.text += header;
|
|
1631
1942
|
allKnownFields = false;
|
|
@@ -1645,7 +1956,7 @@ var FlightPlanUtils = class _FlightPlanUtils {
|
|
|
1645
1956
|
decodeResult.raw.procedures.push({ type, route });
|
|
1646
1957
|
const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);
|
|
1647
1958
|
decodeResult.formatted.items.push({
|
|
1648
|
-
type:
|
|
1959
|
+
type: "procedure",
|
|
1649
1960
|
code: "proc",
|
|
1650
1961
|
label: `${procedureName} Procedure`,
|
|
1651
1962
|
value: RouteUtils.routeToString(route)
|
|
@@ -1666,7 +1977,9 @@ function addRunway(decodeResult, value) {
|
|
|
1666
1977
|
}
|
|
1667
1978
|
function addRoute(decodeResult, value) {
|
|
1668
1979
|
const route = value.split(".");
|
|
1669
|
-
ResultFormatter.route(decodeResult, {
|
|
1980
|
+
ResultFormatter.route(decodeResult, {
|
|
1981
|
+
waypoints: route.map((leg) => RouteUtils.getWaypoint(leg))
|
|
1982
|
+
});
|
|
1670
1983
|
}
|
|
1671
1984
|
function addCompanyRoute(decodeResult, value) {
|
|
1672
1985
|
const segments = value.split(".");
|
|
@@ -1720,15 +2033,27 @@ var H1Helper = class _H1Helper {
|
|
|
1720
2033
|
case "AF":
|
|
1721
2034
|
processAirField(decodeResult, data2.split(","));
|
|
1722
2035
|
break;
|
|
2036
|
+
case "AK":
|
|
2037
|
+
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2038
|
+
break;
|
|
1723
2039
|
case "CG":
|
|
1724
2040
|
processCenterOfGravity(decodeResult, data2.split(","));
|
|
1725
2041
|
break;
|
|
1726
2042
|
case "DC":
|
|
1727
2043
|
processDateCode(decodeResult, data2.split(","));
|
|
1728
2044
|
break;
|
|
2045
|
+
case "DI":
|
|
2046
|
+
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2047
|
+
break;
|
|
1729
2048
|
case "DT":
|
|
1730
2049
|
processDT(decodeResult, data2.split(","));
|
|
1731
2050
|
break;
|
|
2051
|
+
case "DQ":
|
|
2052
|
+
ResultFormatter.desiredAltitude(
|
|
2053
|
+
decodeResult,
|
|
2054
|
+
parseInt(data2, 10) * 100
|
|
2055
|
+
);
|
|
2056
|
+
break;
|
|
1732
2057
|
case "ET":
|
|
1733
2058
|
processETA(data2, decodeResult, fields, i);
|
|
1734
2059
|
break;
|
|
@@ -1741,6 +2066,9 @@ var H1Helper = class _H1Helper {
|
|
|
1741
2066
|
case "FX":
|
|
1742
2067
|
ResultFormatter.freetext(decodeResult, data2);
|
|
1743
2068
|
break;
|
|
2069
|
+
case "GA":
|
|
2070
|
+
ResultFormatter.groundAddress(decodeResult, data2);
|
|
2071
|
+
break;
|
|
1744
2072
|
case "ID":
|
|
1745
2073
|
processIdentification(decodeResult, data2.split(","));
|
|
1746
2074
|
break;
|
|
@@ -1757,11 +2085,18 @@ var H1Helper = class _H1Helper {
|
|
|
1757
2085
|
case "RI":
|
|
1758
2086
|
case "RM":
|
|
1759
2087
|
case "RP":
|
|
2088
|
+
case "RS":
|
|
1760
2089
|
FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(":"));
|
|
1761
2090
|
break;
|
|
2091
|
+
case "RN":
|
|
2092
|
+
ResultFormatter.routeNumber(decodeResult, data2);
|
|
2093
|
+
break;
|
|
1762
2094
|
case "SN":
|
|
1763
2095
|
decodeResult.raw.serial_number = data2;
|
|
1764
2096
|
break;
|
|
2097
|
+
case "SP":
|
|
2098
|
+
ResultFormatter.startPoint(decodeResult, data2);
|
|
2099
|
+
break;
|
|
1765
2100
|
case "TD":
|
|
1766
2101
|
processTimeOfDeparture(decodeResult, data2.split(","));
|
|
1767
2102
|
break;
|
|
@@ -1774,6 +2109,9 @@ var H1Helper = class _H1Helper {
|
|
|
1774
2109
|
case "WD":
|
|
1775
2110
|
processWindData(decodeResult, data2);
|
|
1776
2111
|
break;
|
|
2112
|
+
case "WQ":
|
|
2113
|
+
processWeatherQuery(decodeResult, data2.split(":"));
|
|
2114
|
+
break;
|
|
1777
2115
|
default:
|
|
1778
2116
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
1779
2117
|
}
|
|
@@ -1782,15 +2120,11 @@ var H1Helper = class _H1Helper {
|
|
|
1782
2120
|
return true;
|
|
1783
2121
|
}
|
|
1784
2122
|
static processPS(decodeResult, data) {
|
|
1785
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2123
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2124
|
+
data[0]
|
|
2125
|
+
);
|
|
1786
2126
|
if (position) {
|
|
1787
|
-
|
|
1788
|
-
decodeResult.formatted.items.push({
|
|
1789
|
-
type: "aircraft_position",
|
|
1790
|
-
code: "POS",
|
|
1791
|
-
label: "Aircraft Position",
|
|
1792
|
-
value: CoordinateUtils.coordinateString(position)
|
|
1793
|
-
});
|
|
2127
|
+
ResultFormatter.position(decodeResult, position);
|
|
1794
2128
|
}
|
|
1795
2129
|
if (data.length === 9) {
|
|
1796
2130
|
processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
|
|
@@ -1807,7 +2141,9 @@ var H1Helper = class _H1Helper {
|
|
|
1807
2141
|
}
|
|
1808
2142
|
}
|
|
1809
2143
|
static processPosition(decodeResult, data) {
|
|
1810
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2144
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2145
|
+
data[0]
|
|
2146
|
+
);
|
|
1811
2147
|
if (position) {
|
|
1812
2148
|
ResultFormatter.position(decodeResult, position);
|
|
1813
2149
|
}
|
|
@@ -1823,7 +2159,15 @@ var H1Helper = class _H1Helper {
|
|
|
1823
2159
|
}
|
|
1824
2160
|
}
|
|
1825
2161
|
static processTimeStamp(decodeResult, data) {
|
|
1826
|
-
|
|
2162
|
+
if (data.length > 2) {
|
|
2163
|
+
const positionData = data.slice(1);
|
|
2164
|
+
positionData[0] = positionData[0].substring(6);
|
|
2165
|
+
this.processPosition(decodeResult, positionData);
|
|
2166
|
+
}
|
|
2167
|
+
let time = DateTimeUtils.convertDateTimeToEpoch(
|
|
2168
|
+
data[0],
|
|
2169
|
+
data[1].substring(0, 6)
|
|
2170
|
+
);
|
|
1827
2171
|
if (Number.isNaN(time)) {
|
|
1828
2172
|
const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
|
|
1829
2173
|
time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
|
|
@@ -1834,10 +2178,16 @@ var H1Helper = class _H1Helper {
|
|
|
1834
2178
|
function processETA(data, decodeResult, fields, i) {
|
|
1835
2179
|
if (data.length === 5) {
|
|
1836
2180
|
ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));
|
|
1837
|
-
ResultFormatter.eta(
|
|
2181
|
+
ResultFormatter.eta(
|
|
2182
|
+
decodeResult,
|
|
2183
|
+
DateTimeUtils.convertHHMMSSToTod(data.substring(1))
|
|
2184
|
+
);
|
|
1838
2185
|
} else if (data.length === 6) {
|
|
1839
2186
|
ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));
|
|
1840
|
-
ResultFormatter.eta(
|
|
2187
|
+
ResultFormatter.eta(
|
|
2188
|
+
decodeResult,
|
|
2189
|
+
DateTimeUtils.convertHHMMSSToTod(data.substring(2))
|
|
2190
|
+
);
|
|
1841
2191
|
} else {
|
|
1842
2192
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
1843
2193
|
}
|
|
@@ -1892,7 +2242,10 @@ function processDT(decodeResult, data) {
|
|
|
1892
2242
|
ResultFormatter.currentFuel(decodeResult, Number(data[2]));
|
|
1893
2243
|
}
|
|
1894
2244
|
if (data.length > 3) {
|
|
1895
|
-
ResultFormatter.eta(
|
|
2245
|
+
ResultFormatter.eta(
|
|
2246
|
+
decodeResult,
|
|
2247
|
+
DateTimeUtils.convertHHMMSSToTod(data[3])
|
|
2248
|
+
);
|
|
1896
2249
|
}
|
|
1897
2250
|
if (data.length > 4) {
|
|
1898
2251
|
ResultFormatter.remainingFuel(decodeResult, Number(data[4]));
|
|
@@ -1932,18 +2285,30 @@ function processCenterOfGravity(decodeResult, data) {
|
|
|
1932
2285
|
ResultFormatter.unknown(decodeResult, data.join(","));
|
|
1933
2286
|
}
|
|
1934
2287
|
}
|
|
1935
|
-
function parseMessageType(decodeResult,
|
|
2288
|
+
function parseMessageType(decodeResult, messagePart) {
|
|
2289
|
+
const messageParts = messagePart.split(",");
|
|
2290
|
+
const messageType = messageParts[0];
|
|
1936
2291
|
if (messageType.startsWith("POS")) {
|
|
1937
|
-
H1Helper.processPosition(decodeResult,
|
|
2292
|
+
H1Helper.processPosition(decodeResult, messagePart.substring(3).split(","));
|
|
1938
2293
|
return processMessageType(decodeResult, "POS");
|
|
1939
|
-
} else if (messageType.length ===
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
2294
|
+
} else if (messageType.length === 6) {
|
|
2295
|
+
const part1 = processMessageType(decodeResult, messageType.substring(0, 3));
|
|
2296
|
+
const description = decodeResult.formatted.description;
|
|
2297
|
+
const part2 = processMessageType(decodeResult, messageType.substring(3, 6));
|
|
2298
|
+
decodeResult.formatted.description = description + " for " + decodeResult.formatted.description;
|
|
2299
|
+
if (messageParts.length > 1) {
|
|
2300
|
+
ResultFormatter.unknown(
|
|
2301
|
+
decodeResult,
|
|
2302
|
+
messageParts.slice(1).join(","),
|
|
2303
|
+
"/"
|
|
2304
|
+
);
|
|
1944
2305
|
}
|
|
2306
|
+
return part1 && part2;
|
|
1945
2307
|
}
|
|
1946
|
-
|
|
2308
|
+
if (messageParts.length > 1) {
|
|
2309
|
+
ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(","), "/");
|
|
2310
|
+
}
|
|
2311
|
+
return processMessageType(decodeResult, messageType);
|
|
1947
2312
|
}
|
|
1948
2313
|
function processMessageType(decodeResult, type) {
|
|
1949
2314
|
if (type === "FPN") {
|
|
@@ -1960,6 +2325,12 @@ function processMessageType(decodeResult, type) {
|
|
|
1960
2325
|
decodeResult.formatted.description = "Progress Report";
|
|
1961
2326
|
} else if (type === "PWI") {
|
|
1962
2327
|
decodeResult.formatted.description = "Pilot Weather Information";
|
|
2328
|
+
} else if (type === "REJ") {
|
|
2329
|
+
decodeResult.formatted.description = "Reject";
|
|
2330
|
+
} else if (type === "REQ") {
|
|
2331
|
+
decodeResult.formatted.description = "Request";
|
|
2332
|
+
} else if (type === "RES") {
|
|
2333
|
+
decodeResult.formatted.description = "Response";
|
|
1963
2334
|
} else {
|
|
1964
2335
|
decodeResult.formatted.description = "Unknown H1 Message";
|
|
1965
2336
|
return false;
|
|
@@ -1975,6 +2346,22 @@ function processDateCode(decodeResult, data) {
|
|
|
1975
2346
|
decodeResult.raw.message_timestamp = time;
|
|
1976
2347
|
}
|
|
1977
2348
|
}
|
|
2349
|
+
function processWeatherQuery(decodeResult, data) {
|
|
2350
|
+
if (data.length !== 2) {
|
|
2351
|
+
ResultFormatter.unknown(decodeResult, data.join(":"), "WQ/");
|
|
2352
|
+
return;
|
|
2353
|
+
}
|
|
2354
|
+
const alts = data[0].split(".");
|
|
2355
|
+
const route = data[1].split(".");
|
|
2356
|
+
ResultFormatter.requestedAltitudes(
|
|
2357
|
+
decodeResult,
|
|
2358
|
+
alts.map((a) => parseInt(a, 10) * 100)
|
|
2359
|
+
);
|
|
2360
|
+
const waypoints = route.map((wp) => {
|
|
2361
|
+
return { name: wp };
|
|
2362
|
+
});
|
|
2363
|
+
ResultFormatter.route(decodeResult, { waypoints });
|
|
2364
|
+
}
|
|
1978
2365
|
function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
1979
2366
|
const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
|
|
1980
2367
|
const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
|
|
@@ -1987,13 +2374,7 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
|
1987
2374
|
nextWaypoint.timeFormat = timeFormat;
|
|
1988
2375
|
const thenWaypoint = RouteUtils.getWaypoint(then || "?");
|
|
1989
2376
|
const waypoints = [lastWaypoint, nextWaypoint, thenWaypoint];
|
|
1990
|
-
|
|
1991
|
-
decodeResult.formatted.items.push({
|
|
1992
|
-
type: "aircraft_route",
|
|
1993
|
-
code: "ROUTE",
|
|
1994
|
-
label: "Aircraft Route",
|
|
1995
|
-
value: RouteUtils.routeToString(decodeResult.raw.route)
|
|
1996
|
-
});
|
|
2377
|
+
ResultFormatter.route(decodeResult, { waypoints });
|
|
1997
2378
|
}
|
|
1998
2379
|
function processWindData(decodeResult, message) {
|
|
1999
2380
|
const wind = [];
|
|
@@ -2068,7 +2449,10 @@ var Label_1J_2J_FTX = class extends DecoderPlugin {
|
|
|
2068
2449
|
const parts = msg.split("/");
|
|
2069
2450
|
let decoded = false;
|
|
2070
2451
|
if (parts[0].length > 3) {
|
|
2071
|
-
decoded = H1Helper.decodeH1Message(
|
|
2452
|
+
decoded = H1Helper.decodeH1Message(
|
|
2453
|
+
decodeResult,
|
|
2454
|
+
msg.slice(parts[0].length - 3)
|
|
2455
|
+
);
|
|
2072
2456
|
decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
|
|
2073
2457
|
} else {
|
|
2074
2458
|
decoded = H1Helper.decodeH1Message(decodeResult, msg);
|
|
@@ -2104,16 +2488,26 @@ var Label_1M_Slash = class extends DecoderPlugin {
|
|
|
2104
2488
|
const results = message.text.split(/\n|\//).slice(1);
|
|
2105
2489
|
if (results) {
|
|
2106
2490
|
if (options.debug) {
|
|
2107
|
-
console.log(
|
|
2491
|
+
console.log("Label 1M ETA: results");
|
|
2108
2492
|
console.log(results);
|
|
2109
2493
|
}
|
|
2110
2494
|
decodeResult.raw.flight_number = results[0];
|
|
2111
2495
|
ResultFormatter.departureAirport(decodeResult, results[3]);
|
|
2112
2496
|
ResultFormatter.arrivalAirport(decodeResult, results[4]);
|
|
2113
2497
|
ResultFormatter.alternateAirport(decodeResult, results[5]);
|
|
2114
|
-
ResultFormatter.arrivalRunway(
|
|
2498
|
+
ResultFormatter.arrivalRunway(
|
|
2499
|
+
decodeResult,
|
|
2500
|
+
results[8].replace(results[4], "")
|
|
2501
|
+
);
|
|
2115
2502
|
const yymmdd = results[2];
|
|
2116
|
-
ResultFormatter.eta(
|
|
2503
|
+
ResultFormatter.eta(
|
|
2504
|
+
decodeResult,
|
|
2505
|
+
DateTimeUtils.convertDateTimeToEpoch(
|
|
2506
|
+
results[7] + "00",
|
|
2507
|
+
yymmdd.substring(2, 4) + yymmdd.substring(4, 6) + yymmdd.substring(0, 2)
|
|
2508
|
+
),
|
|
2509
|
+
"epoch"
|
|
2510
|
+
);
|
|
2117
2511
|
}
|
|
2118
2512
|
decodeResult.decoded = true;
|
|
2119
2513
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2123,7 +2517,6 @@ var Label_1M_Slash = class extends DecoderPlugin {
|
|
|
2123
2517
|
|
|
2124
2518
|
// lib/plugins/Label_1L_3-line.ts
|
|
2125
2519
|
var Label_1L_3Line = class extends DecoderPlugin {
|
|
2126
|
-
// eslint-disable-line camelcase
|
|
2127
2520
|
name = "label-1l-3-line";
|
|
2128
2521
|
qualifiers() {
|
|
2129
2522
|
return {
|
|
@@ -2211,7 +2604,6 @@ var Label_1L_3Line = class extends DecoderPlugin {
|
|
|
2211
2604
|
|
|
2212
2605
|
// lib/plugins/Label_1L_070.ts
|
|
2213
2606
|
var Label_1L_070 = class extends DecoderPlugin {
|
|
2214
|
-
// eslint-disable-line camelcase
|
|
2215
2607
|
name = "label-1l-070";
|
|
2216
2608
|
qualifiers() {
|
|
2217
2609
|
return {
|
|
@@ -2245,8 +2637,14 @@ var Label_1L_070 = class extends DecoderPlugin {
|
|
|
2245
2637
|
}
|
|
2246
2638
|
ResultFormatter.departureAirport(decodeResult, parts[0]);
|
|
2247
2639
|
ResultFormatter.arrivalAirport(decodeResult, parts[1]);
|
|
2248
|
-
ResultFormatter.time_of_day(
|
|
2249
|
-
|
|
2640
|
+
ResultFormatter.time_of_day(
|
|
2641
|
+
decodeResult,
|
|
2642
|
+
DateTimeUtils.convertHHMMSSToTod(parts[2])
|
|
2643
|
+
);
|
|
2644
|
+
ResultFormatter.eta(
|
|
2645
|
+
decodeResult,
|
|
2646
|
+
DateTimeUtils.convertHHMMSSToTod(parts[3])
|
|
2647
|
+
);
|
|
2250
2648
|
ResultFormatter.position(decodeResult, {
|
|
2251
2649
|
latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),
|
|
2252
2650
|
longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1))
|
|
@@ -2260,7 +2658,6 @@ var Label_1L_070 = class extends DecoderPlugin {
|
|
|
2260
2658
|
|
|
2261
2659
|
// lib/plugins/Label_1L_660.ts
|
|
2262
2660
|
var Label_1L_660 = class extends DecoderPlugin {
|
|
2263
|
-
// eslint-disable-line camelcase
|
|
2264
2661
|
name = "label-1l-660";
|
|
2265
2662
|
qualifiers() {
|
|
2266
2663
|
return {
|
|
@@ -2292,12 +2689,17 @@ var Label_1L_660 = class extends DecoderPlugin {
|
|
|
2292
2689
|
decodeResult.decoder.decodeLevel = "none";
|
|
2293
2690
|
return decodeResult;
|
|
2294
2691
|
}
|
|
2295
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2692
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2693
|
+
parts[0]
|
|
2694
|
+
);
|
|
2296
2695
|
if (position) {
|
|
2297
2696
|
ResultFormatter.position(decodeResult, position);
|
|
2298
2697
|
}
|
|
2299
2698
|
const hhmmss = parts[1].substring(0, 6);
|
|
2300
|
-
ResultFormatter.time_of_day(
|
|
2699
|
+
ResultFormatter.time_of_day(
|
|
2700
|
+
decodeResult,
|
|
2701
|
+
DateTimeUtils.convertHHMMSSToTod(hhmmss)
|
|
2702
|
+
);
|
|
2301
2703
|
const fl = parts[1].substring(6, 9);
|
|
2302
2704
|
ResultFormatter.altitude(decodeResult, Number(fl) * 100);
|
|
2303
2705
|
const next = parts[1].substring(9);
|
|
@@ -2311,7 +2713,6 @@ var Label_1L_660 = class extends DecoderPlugin {
|
|
|
2311
2713
|
|
|
2312
2714
|
// lib/plugins/Label_1L_Slash.ts
|
|
2313
2715
|
var Label_1L_Slash = class extends DecoderPlugin {
|
|
2314
|
-
// eslint-disable-line camelcase
|
|
2315
2716
|
name = "label-1l-1-line";
|
|
2316
2717
|
qualifiers() {
|
|
2317
2718
|
return {
|
|
@@ -2350,7 +2751,10 @@ var Label_1L_Slash = class extends DecoderPlugin {
|
|
|
2350
2751
|
ResultFormatter.position(decodeResult, position);
|
|
2351
2752
|
const utc = data.get("UTC");
|
|
2352
2753
|
if (utc) {
|
|
2353
|
-
ResultFormatter.time_of_day(
|
|
2754
|
+
ResultFormatter.time_of_day(
|
|
2755
|
+
decodeResult,
|
|
2756
|
+
DateTimeUtils.convertHHMMSSToTod(utc)
|
|
2757
|
+
);
|
|
2354
2758
|
data.delete("UTC");
|
|
2355
2759
|
}
|
|
2356
2760
|
const alt = data.get("ALT");
|
|
@@ -2401,7 +2805,10 @@ var Label_20_POS = class extends DecoderPlugin {
|
|
|
2401
2805
|
console.log(`DEBUG: ${this.name}: Variation 1 detected`);
|
|
2402
2806
|
}
|
|
2403
2807
|
const rawCoords = fields[0];
|
|
2404
|
-
ResultFormatter.position(
|
|
2808
|
+
ResultFormatter.position(
|
|
2809
|
+
decodeResult,
|
|
2810
|
+
CoordinateUtils.decodeStringCoordinates(rawCoords)
|
|
2811
|
+
);
|
|
2405
2812
|
decodeResult.decoded = true;
|
|
2406
2813
|
decodeResult.decoder.decodeLevel = "full";
|
|
2407
2814
|
} else if (fields.length == 5) {
|
|
@@ -2416,7 +2823,9 @@ var Label_20_POS = class extends DecoderPlugin {
|
|
|
2416
2823
|
decodeResult.decoder.decodeLevel = "full";
|
|
2417
2824
|
} else {
|
|
2418
2825
|
if (options.debug) {
|
|
2419
|
-
console.log(
|
|
2826
|
+
console.log(
|
|
2827
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
|
|
2828
|
+
);
|
|
2420
2829
|
}
|
|
2421
2830
|
decodeResult.decoded = false;
|
|
2422
2831
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2444,17 +2853,29 @@ var Label_21_POS = class extends DecoderPlugin {
|
|
|
2444
2853
|
const fields = content.split(",");
|
|
2445
2854
|
if (fields.length == 9) {
|
|
2446
2855
|
processPosition(decodeResult, fields[0].trim());
|
|
2447
|
-
ResultFormatter.time_of_day(
|
|
2856
|
+
ResultFormatter.time_of_day(
|
|
2857
|
+
decodeResult,
|
|
2858
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
2859
|
+
);
|
|
2448
2860
|
ResultFormatter.altitude(decodeResult, Number(fields[3]));
|
|
2449
2861
|
ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ""));
|
|
2450
|
-
ResultFormatter.eta(
|
|
2862
|
+
ResultFormatter.eta(
|
|
2863
|
+
decodeResult,
|
|
2864
|
+
DateTimeUtils.convertHHMMSSToTod(fields[7])
|
|
2865
|
+
);
|
|
2451
2866
|
ResultFormatter.arrivalAirport(decodeResult, fields[8]);
|
|
2452
|
-
ResultFormatter.unknownArr(decodeResult, [
|
|
2867
|
+
ResultFormatter.unknownArr(decodeResult, [
|
|
2868
|
+
fields[1],
|
|
2869
|
+
fields[4],
|
|
2870
|
+
fields[5]
|
|
2871
|
+
]);
|
|
2453
2872
|
decodeResult.decoded = true;
|
|
2454
2873
|
decodeResult.decoder.decodeLevel = "partial";
|
|
2455
2874
|
} else {
|
|
2456
2875
|
if (options.debug) {
|
|
2457
|
-
console.log(
|
|
2876
|
+
console.log(
|
|
2877
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`
|
|
2878
|
+
);
|
|
2458
2879
|
}
|
|
2459
2880
|
decodeResult.decoded = false;
|
|
2460
2881
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2497,12 +2918,27 @@ var Label_22_OFF = class extends DecoderPlugin {
|
|
|
2497
2918
|
return decodeResult;
|
|
2498
2919
|
}
|
|
2499
2920
|
ResultFormatter.flightNumber(decodeResult, fields[0]);
|
|
2500
|
-
ResultFormatter.departureDay(
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2921
|
+
ResultFormatter.departureDay(
|
|
2922
|
+
decodeResult,
|
|
2923
|
+
Number(fields[1].substring(0, 2))
|
|
2924
|
+
);
|
|
2925
|
+
ResultFormatter.arrivalDay(
|
|
2926
|
+
decodeResult,
|
|
2927
|
+
Number(fields[1].substring(2, 4))
|
|
2928
|
+
);
|
|
2929
|
+
ResultFormatter.time_of_day(
|
|
2930
|
+
decodeResult,
|
|
2931
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8))
|
|
2932
|
+
);
|
|
2933
|
+
ResultFormatter.departureAirport(
|
|
2934
|
+
decodeResult,
|
|
2935
|
+
fields[1].substring(8, 12)
|
|
2936
|
+
);
|
|
2504
2937
|
ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));
|
|
2505
|
-
ResultFormatter.off(
|
|
2938
|
+
ResultFormatter.off(
|
|
2939
|
+
decodeResult,
|
|
2940
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22))
|
|
2941
|
+
);
|
|
2506
2942
|
ResultFormatter.unknown(decodeResult, fields[1].substring(22));
|
|
2507
2943
|
decodeResult.decoded = true;
|
|
2508
2944
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2515,7 +2951,10 @@ var Label_22_OFF = class extends DecoderPlugin {
|
|
|
2515
2951
|
}
|
|
2516
2952
|
ResultFormatter.departureAirport(decodeResult, fields[0]);
|
|
2517
2953
|
ResultFormatter.arrivalAirport(decodeResult, fields[1]);
|
|
2518
|
-
ResultFormatter.off(
|
|
2954
|
+
ResultFormatter.off(
|
|
2955
|
+
decodeResult,
|
|
2956
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
2957
|
+
);
|
|
2519
2958
|
ResultFormatter.unknown(decodeResult, fields[3]);
|
|
2520
2959
|
decodeResult.decoded = true;
|
|
2521
2960
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2527,17 +2966,31 @@ var Label_22_OFF = class extends DecoderPlugin {
|
|
|
2527
2966
|
return decodeResult;
|
|
2528
2967
|
}
|
|
2529
2968
|
ResultFormatter.flightNumber(decodeResult, fields[0]);
|
|
2530
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2969
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
2970
|
+
fields[1].substring(0, 14)
|
|
2971
|
+
);
|
|
2531
2972
|
if (position) {
|
|
2532
2973
|
ResultFormatter.position(decodeResult, position);
|
|
2533
2974
|
}
|
|
2534
2975
|
ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));
|
|
2535
|
-
ResultFormatter.time_of_day(
|
|
2536
|
-
|
|
2976
|
+
ResultFormatter.time_of_day(
|
|
2977
|
+
decodeResult,
|
|
2978
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20))
|
|
2979
|
+
);
|
|
2980
|
+
ResultFormatter.departureAirport(
|
|
2981
|
+
decodeResult,
|
|
2982
|
+
fields[1].substring(20, 24)
|
|
2983
|
+
);
|
|
2537
2984
|
ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));
|
|
2538
|
-
ResultFormatter.off(
|
|
2985
|
+
ResultFormatter.off(
|
|
2986
|
+
decodeResult,
|
|
2987
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32))
|
|
2988
|
+
);
|
|
2539
2989
|
ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));
|
|
2540
|
-
ResultFormatter.eta(
|
|
2990
|
+
ResultFormatter.eta(
|
|
2991
|
+
decodeResult,
|
|
2992
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40))
|
|
2993
|
+
);
|
|
2541
2994
|
decodeResult.decoded = true;
|
|
2542
2995
|
decodeResult.decoder.decodeLevel = "partial";
|
|
2543
2996
|
} else {
|
|
@@ -2568,7 +3021,9 @@ var Label_22_POS = class extends DecoderPlugin {
|
|
|
2568
3021
|
const fields = message.text.split(",");
|
|
2569
3022
|
if (fields.length !== 11) {
|
|
2570
3023
|
if (options.debug) {
|
|
2571
|
-
console.log(
|
|
3024
|
+
console.log(
|
|
3025
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(",")}`
|
|
3026
|
+
);
|
|
2572
3027
|
}
|
|
2573
3028
|
decodeResult.decoded = false;
|
|
2574
3029
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2582,7 +3037,10 @@ var Label_22_POS = class extends DecoderPlugin {
|
|
|
2582
3037
|
latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,
|
|
2583
3038
|
longitude: CoordinateUtils.getDirection(fields[0][8]) * lon
|
|
2584
3039
|
});
|
|
2585
|
-
ResultFormatter.time_of_day(
|
|
3040
|
+
ResultFormatter.time_of_day(
|
|
3041
|
+
decodeResult,
|
|
3042
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2])
|
|
3043
|
+
);
|
|
2586
3044
|
ResultFormatter.altitude(decodeResult, Number(fields[3]));
|
|
2587
3045
|
ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);
|
|
2588
3046
|
decodeResult.decoded = true;
|
|
@@ -2618,11 +3076,20 @@ var Label_2P_FM3 = class extends DecoderPlugin {
|
|
|
2618
3076
|
ResultFormatter.flightNumber(decodeResult, header[0].substring(4));
|
|
2619
3077
|
}
|
|
2620
3078
|
if (header[1].length === 4) {
|
|
2621
|
-
ResultFormatter.time_of_day(
|
|
3079
|
+
ResultFormatter.time_of_day(
|
|
3080
|
+
decodeResult,
|
|
3081
|
+
DateTimeUtils.convertHHMMSSToTod(header[1])
|
|
3082
|
+
);
|
|
2622
3083
|
} else {
|
|
2623
|
-
ResultFormatter.time_of_day(
|
|
3084
|
+
ResultFormatter.time_of_day(
|
|
3085
|
+
decodeResult,
|
|
3086
|
+
DateTimeUtils.convertHHMMSSToTod(header[1])
|
|
3087
|
+
);
|
|
2624
3088
|
}
|
|
2625
|
-
ResultFormatter.eta(
|
|
3089
|
+
ResultFormatter.eta(
|
|
3090
|
+
decodeResult,
|
|
3091
|
+
DateTimeUtils.convertHHMMSSToTod(parts[1])
|
|
3092
|
+
);
|
|
2626
3093
|
const lat = parts[2].replaceAll(" ", "");
|
|
2627
3094
|
const lon = parts[3].replaceAll(" ", "");
|
|
2628
3095
|
if (lat[0] === "N" || lat[0] === "S") {
|
|
@@ -2631,7 +3098,10 @@ var Label_2P_FM3 = class extends DecoderPlugin {
|
|
|
2631
3098
|
longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
|
|
2632
3099
|
});
|
|
2633
3100
|
} else {
|
|
2634
|
-
ResultFormatter.position(decodeResult, {
|
|
3101
|
+
ResultFormatter.position(decodeResult, {
|
|
3102
|
+
latitude: Number(lat),
|
|
3103
|
+
longitude: Number(lon)
|
|
3104
|
+
});
|
|
2635
3105
|
}
|
|
2636
3106
|
ResultFormatter.altitude(decodeResult, Number(parts[4]));
|
|
2637
3107
|
ResultFormatter.unknown(decodeResult, parts[5]);
|
|
@@ -2679,9 +3149,18 @@ var Label_2P_FM4 = class extends DecoderPlugin {
|
|
|
2679
3149
|
ResultFormatter.departureAirport(decodeResult, header[1]);
|
|
2680
3150
|
ResultFormatter.arrivalAirport(decodeResult, parts[1]);
|
|
2681
3151
|
ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));
|
|
2682
|
-
ResultFormatter.time_of_day(
|
|
2683
|
-
|
|
2684
|
-
|
|
3152
|
+
ResultFormatter.time_of_day(
|
|
3153
|
+
decodeResult,
|
|
3154
|
+
DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2))
|
|
3155
|
+
);
|
|
3156
|
+
ResultFormatter.eta(
|
|
3157
|
+
decodeResult,
|
|
3158
|
+
DateTimeUtils.convertHHMMSSToTod(parts[3])
|
|
3159
|
+
);
|
|
3160
|
+
ResultFormatter.position(decodeResult, {
|
|
3161
|
+
latitude: Number(parts[4].replaceAll(" ", "")),
|
|
3162
|
+
longitude: Number(parts[5].replaceAll(" ", ""))
|
|
3163
|
+
});
|
|
2685
3164
|
ResultFormatter.altitude(decodeResult, Number(parts[6]));
|
|
2686
3165
|
ResultFormatter.heading(decodeResult, Number(parts[7]));
|
|
2687
3166
|
ResultFormatter.unknown(decodeResult, parts[8]);
|
|
@@ -2724,9 +3203,18 @@ var Label_2P_FM5 = class extends DecoderPlugin {
|
|
|
2724
3203
|
}
|
|
2725
3204
|
ResultFormatter.departureAirport(decodeResult, header[1]);
|
|
2726
3205
|
ResultFormatter.arrivalAirport(decodeResult, parts[1]);
|
|
2727
|
-
ResultFormatter.time_of_day(
|
|
2728
|
-
|
|
2729
|
-
|
|
3206
|
+
ResultFormatter.time_of_day(
|
|
3207
|
+
decodeResult,
|
|
3208
|
+
DateTimeUtils.convertHHMMSSToTod(parts[2])
|
|
3209
|
+
);
|
|
3210
|
+
ResultFormatter.eta(
|
|
3211
|
+
decodeResult,
|
|
3212
|
+
DateTimeUtils.convertHHMMSSToTod(parts[3])
|
|
3213
|
+
);
|
|
3214
|
+
ResultFormatter.position(decodeResult, {
|
|
3215
|
+
latitude: Number(parts[4].replaceAll(" ", "")),
|
|
3216
|
+
longitude: Number(parts[5].replaceAll(" ", ""))
|
|
3217
|
+
});
|
|
2730
3218
|
ResultFormatter.altitude(decodeResult, Number(parts[6]));
|
|
2731
3219
|
ResultFormatter.unknown(decodeResult, parts[7]);
|
|
2732
3220
|
ResultFormatter.unknown(decodeResult, parts[8]);
|
|
@@ -2763,7 +3251,10 @@ var Label_2P_POS = class extends DecoderPlugin {
|
|
|
2763
3251
|
const parts = msg.split("/");
|
|
2764
3252
|
let decoded = false;
|
|
2765
3253
|
if (parts[0].length > 3) {
|
|
2766
|
-
decoded = H1Helper.decodeH1Message(
|
|
3254
|
+
decoded = H1Helper.decodeH1Message(
|
|
3255
|
+
decodeResult,
|
|
3256
|
+
msg.slice(parts[0].length - 3)
|
|
3257
|
+
);
|
|
2767
3258
|
decodeResult.remaining.text = parts[0].slice(0, 3) + "/" + decodeResult.remaining.text;
|
|
2768
3259
|
} else {
|
|
2769
3260
|
decoded = H1Helper.decodeH1Message(decodeResult, msg);
|
|
@@ -2800,7 +3291,10 @@ var Label_24_Slash = class extends DecoderPlugin {
|
|
|
2800
3291
|
if (fields.length == 10 && fields[0] == "" && fields[9] == "") {
|
|
2801
3292
|
const mmddyy = fields[1].substring(4, 6) + fields[1].substring(2, 4) + fields[1].substring(0, 2);
|
|
2802
3293
|
const hhmmss = fields[2] + "00";
|
|
2803
|
-
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
3294
|
+
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
3295
|
+
hhmmss,
|
|
3296
|
+
mmddyy
|
|
3297
|
+
);
|
|
2804
3298
|
ResultFormatter.flightNumber(decodeResult, fields[3]);
|
|
2805
3299
|
ResultFormatter.altitude(decodeResult, Number(fields[4]));
|
|
2806
3300
|
const lat = fields[5];
|
|
@@ -2810,13 +3304,18 @@ var Label_24_Slash = class extends DecoderPlugin {
|
|
|
2810
3304
|
longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
|
|
2811
3305
|
};
|
|
2812
3306
|
ResultFormatter.position(decodeResult, position);
|
|
2813
|
-
ResultFormatter.eta(
|
|
3307
|
+
ResultFormatter.eta(
|
|
3308
|
+
decodeResult,
|
|
3309
|
+
DateTimeUtils.convertHHMMSSToTod(fields[8])
|
|
3310
|
+
);
|
|
2814
3311
|
ResultFormatter.unknown(decodeResult, fields[7]);
|
|
2815
3312
|
decodeResult.decoded = true;
|
|
2816
3313
|
decodeResult.decoder.decodeLevel = "partial";
|
|
2817
3314
|
} else {
|
|
2818
3315
|
if (options.debug) {
|
|
2819
|
-
console.log(
|
|
3316
|
+
console.log(
|
|
3317
|
+
`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`
|
|
3318
|
+
);
|
|
2820
3319
|
}
|
|
2821
3320
|
decodeResult.decoded = false;
|
|
2822
3321
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -2842,16 +3341,22 @@ var Label_30_Slash_EA = class extends DecoderPlugin {
|
|
|
2842
3341
|
const results = message.text.split(/\n|\//).slice(1);
|
|
2843
3342
|
if (results) {
|
|
2844
3343
|
if (options.debug) {
|
|
2845
|
-
console.log(
|
|
3344
|
+
console.log("Label 30 EA: results");
|
|
2846
3345
|
console.log(results);
|
|
2847
3346
|
}
|
|
2848
3347
|
}
|
|
2849
|
-
ResultFormatter.eta(
|
|
3348
|
+
ResultFormatter.eta(
|
|
3349
|
+
decodeResult,
|
|
3350
|
+
DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4))
|
|
3351
|
+
);
|
|
2850
3352
|
if (results[1].substring(0, 2) === "DS") {
|
|
2851
3353
|
ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
|
|
2852
3354
|
ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
|
|
2853
3355
|
} else {
|
|
2854
|
-
ResultFormatter.unknown(
|
|
3356
|
+
ResultFormatter.unknown(
|
|
3357
|
+
decodeResult,
|
|
3358
|
+
"/".concat(results[1], "/", results[2])
|
|
3359
|
+
);
|
|
2855
3360
|
}
|
|
2856
3361
|
decodeResult.decoded = true;
|
|
2857
3362
|
decodeResult.decoder.decodeLevel = "partial";
|
|
@@ -2876,17 +3381,26 @@ var Label_44_ETA = class extends DecoderPlugin {
|
|
|
2876
3381
|
const data = message.text.split(",");
|
|
2877
3382
|
if (data.length >= 9) {
|
|
2878
3383
|
if (options.debug) {
|
|
2879
|
-
console.log(
|
|
3384
|
+
console.log("Label 44 ETA Report: groups");
|
|
2880
3385
|
console.log(data);
|
|
2881
3386
|
}
|
|
2882
|
-
ResultFormatter.position(
|
|
3387
|
+
ResultFormatter.position(
|
|
3388
|
+
decodeResult,
|
|
3389
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3390
|
+
);
|
|
2883
3391
|
ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));
|
|
2884
3392
|
ResultFormatter.departureAirport(decodeResult, data[3]);
|
|
2885
3393
|
ResultFormatter.arrivalAirport(decodeResult, data[4]);
|
|
2886
3394
|
ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));
|
|
2887
3395
|
ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));
|
|
2888
|
-
ResultFormatter.time_of_day(
|
|
2889
|
-
|
|
3396
|
+
ResultFormatter.time_of_day(
|
|
3397
|
+
decodeResult,
|
|
3398
|
+
DateTimeUtils.convertHHMMSSToTod(data[6])
|
|
3399
|
+
);
|
|
3400
|
+
ResultFormatter.eta(
|
|
3401
|
+
decodeResult,
|
|
3402
|
+
DateTimeUtils.convertHHMMSSToTod(data[7])
|
|
3403
|
+
);
|
|
2890
3404
|
const fuel = Number(data[8]);
|
|
2891
3405
|
if (!isNaN(fuel)) {
|
|
2892
3406
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -2926,15 +3440,21 @@ var Label_44_IN = class extends DecoderPlugin {
|
|
|
2926
3440
|
const data = message.text.split(",");
|
|
2927
3441
|
if (data.length >= 7) {
|
|
2928
3442
|
if (options.debug) {
|
|
2929
|
-
console.log(
|
|
3443
|
+
console.log("Label 44 In Air Report: groups");
|
|
2930
3444
|
console.log(data);
|
|
2931
3445
|
}
|
|
2932
|
-
ResultFormatter.position(
|
|
3446
|
+
ResultFormatter.position(
|
|
3447
|
+
decodeResult,
|
|
3448
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3449
|
+
);
|
|
2933
3450
|
ResultFormatter.departureAirport(decodeResult, data[2]);
|
|
2934
3451
|
ResultFormatter.arrivalAirport(decodeResult, data[3]);
|
|
2935
3452
|
ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
|
|
2936
3453
|
ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
|
|
2937
|
-
ResultFormatter.in(
|
|
3454
|
+
ResultFormatter.in(
|
|
3455
|
+
decodeResult,
|
|
3456
|
+
DateTimeUtils.convertHHMMSSToTod(data[5])
|
|
3457
|
+
);
|
|
2938
3458
|
const fuel = Number(data[6]);
|
|
2939
3459
|
if (!isNaN(fuel)) {
|
|
2940
3460
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -2974,16 +3494,25 @@ var Label_44_OFF = class extends DecoderPlugin {
|
|
|
2974
3494
|
const data = message.text.split(",");
|
|
2975
3495
|
if (data.length >= 8) {
|
|
2976
3496
|
if (options.debug) {
|
|
2977
|
-
console.log(
|
|
3497
|
+
console.log("Label 44 Off Runway Report: groups");
|
|
2978
3498
|
console.log(data);
|
|
2979
3499
|
}
|
|
2980
|
-
ResultFormatter.position(
|
|
3500
|
+
ResultFormatter.position(
|
|
3501
|
+
decodeResult,
|
|
3502
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3503
|
+
);
|
|
2981
3504
|
ResultFormatter.departureAirport(decodeResult, data[2]);
|
|
2982
3505
|
ResultFormatter.arrivalAirport(decodeResult, data[3]);
|
|
2983
3506
|
ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
|
|
2984
3507
|
ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
|
|
2985
|
-
ResultFormatter.off(
|
|
2986
|
-
|
|
3508
|
+
ResultFormatter.off(
|
|
3509
|
+
decodeResult,
|
|
3510
|
+
DateTimeUtils.convertHHMMSSToTod(data[5])
|
|
3511
|
+
);
|
|
3512
|
+
ResultFormatter.eta(
|
|
3513
|
+
decodeResult,
|
|
3514
|
+
DateTimeUtils.convertHHMMSSToTod(data[6])
|
|
3515
|
+
);
|
|
2987
3516
|
const fuel = Number(data[7]);
|
|
2988
3517
|
if (!isNaN(fuel)) {
|
|
2989
3518
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -3023,15 +3552,21 @@ var Label_44_ON = class extends DecoderPlugin {
|
|
|
3023
3552
|
const data = message.text.split(",");
|
|
3024
3553
|
if (data.length >= 7) {
|
|
3025
3554
|
if (options.debug) {
|
|
3026
|
-
console.log(
|
|
3555
|
+
console.log("Label 44 On Runway Report: groups");
|
|
3027
3556
|
console.log(data);
|
|
3028
3557
|
}
|
|
3029
|
-
ResultFormatter.position(
|
|
3558
|
+
ResultFormatter.position(
|
|
3559
|
+
decodeResult,
|
|
3560
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1])
|
|
3561
|
+
);
|
|
3030
3562
|
ResultFormatter.departureAirport(decodeResult, data[2]);
|
|
3031
3563
|
ResultFormatter.arrivalAirport(decodeResult, data[3]);
|
|
3032
3564
|
ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
|
|
3033
3565
|
ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
|
|
3034
|
-
ResultFormatter.on(
|
|
3566
|
+
ResultFormatter.on(
|
|
3567
|
+
decodeResult,
|
|
3568
|
+
DateTimeUtils.convertHHMMSSToTod(data[5])
|
|
3569
|
+
);
|
|
3035
3570
|
const fuel = Number(data[6]);
|
|
3036
3571
|
if (!isNaN(fuel)) {
|
|
3037
3572
|
ResultFormatter.remainingFuel(decodeResult, Number(fuel));
|
|
@@ -3072,19 +3607,39 @@ var Label_44_POS = class extends DecoderPlugin {
|
|
|
3072
3607
|
const results = message.text.match(regex);
|
|
3073
3608
|
if (results?.groups) {
|
|
3074
3609
|
if (options.debug) {
|
|
3075
|
-
console.log(
|
|
3610
|
+
console.log("Label 44 Position Report: groups");
|
|
3076
3611
|
console.log(results.groups);
|
|
3077
3612
|
}
|
|
3078
|
-
ResultFormatter.position(
|
|
3613
|
+
ResultFormatter.position(
|
|
3614
|
+
decodeResult,
|
|
3615
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
3616
|
+
results.groups.unsplit_coords
|
|
3617
|
+
)
|
|
3618
|
+
);
|
|
3079
3619
|
const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
|
|
3080
|
-
ResultFormatter.month(
|
|
3081
|
-
|
|
3082
|
-
|
|
3083
|
-
|
|
3620
|
+
ResultFormatter.month(
|
|
3621
|
+
decodeResult,
|
|
3622
|
+
Number(results.groups.current_date.substring(0, 2))
|
|
3623
|
+
);
|
|
3624
|
+
ResultFormatter.day(
|
|
3625
|
+
decodeResult,
|
|
3626
|
+
Number(results.groups.current_date.substring(2, 4))
|
|
3627
|
+
);
|
|
3628
|
+
ResultFormatter.time_of_day(
|
|
3629
|
+
decodeResult,
|
|
3630
|
+
DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00")
|
|
3631
|
+
);
|
|
3632
|
+
ResultFormatter.eta(
|
|
3633
|
+
decodeResult,
|
|
3634
|
+
DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00")
|
|
3635
|
+
);
|
|
3084
3636
|
if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
|
|
3085
3637
|
decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
|
|
3086
3638
|
}
|
|
3087
|
-
ResultFormatter.departureAirport(
|
|
3639
|
+
ResultFormatter.departureAirport(
|
|
3640
|
+
decodeResult,
|
|
3641
|
+
results.groups.departure_icao
|
|
3642
|
+
);
|
|
3088
3643
|
ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
|
|
3089
3644
|
ResultFormatter.altitude(decodeResult, flight_level * 100);
|
|
3090
3645
|
}
|
|
@@ -3122,7 +3677,7 @@ var Label_44_Slash = class extends DecoderPlugin {
|
|
|
3122
3677
|
const data = fields[3].split(",");
|
|
3123
3678
|
if (data.length >= 6) {
|
|
3124
3679
|
if (options.debug) {
|
|
3125
|
-
console.log(
|
|
3680
|
+
console.log("Label 44 Slash: groups");
|
|
3126
3681
|
console.log(data);
|
|
3127
3682
|
}
|
|
3128
3683
|
ResultFormatter.position(decodeResult, {
|
|
@@ -3172,34 +3727,33 @@ var Label_4A = class extends DecoderPlugin {
|
|
|
3172
3727
|
decodeResult.decoder.name = this.name;
|
|
3173
3728
|
decodeResult.message = message;
|
|
3174
3729
|
decodeResult.formatted.description = "Latest New Format";
|
|
3175
|
-
let text = message.text;
|
|
3176
|
-
if (text.match(/^M\d{2}A\w{6}/)) {
|
|
3177
|
-
ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
|
|
3178
|
-
text = text.substring(10);
|
|
3179
|
-
}
|
|
3180
3730
|
decodeResult.decoded = true;
|
|
3181
|
-
const fields = text.split(",");
|
|
3731
|
+
const fields = message.text.split(",");
|
|
3182
3732
|
if (fields.length === 11) {
|
|
3183
|
-
ResultFormatter.time_of_day(
|
|
3733
|
+
ResultFormatter.time_of_day(
|
|
3734
|
+
decodeResult,
|
|
3735
|
+
DateTimeUtils.convertHHMMSSToTod(fields[0])
|
|
3736
|
+
);
|
|
3184
3737
|
ResultFormatter.tail(decodeResult, fields[2].replace(".", ""));
|
|
3185
|
-
if (fields[3])
|
|
3186
|
-
ResultFormatter.callsign(decodeResult, fields[3]);
|
|
3738
|
+
if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);
|
|
3187
3739
|
ResultFormatter.departureAirport(decodeResult, fields[4]);
|
|
3188
3740
|
ResultFormatter.arrivalAirport(decodeResult, fields[5]);
|
|
3189
|
-
const alt = text.substring(48, 51);
|
|
3190
|
-
if (alt !== "") {
|
|
3191
|
-
ResultFormatter.altitude(decodeResult, Number(alt) * 100);
|
|
3192
|
-
}
|
|
3193
3741
|
ResultFormatter.unknownArr(decodeResult, fields.slice(8));
|
|
3194
3742
|
} else if (fields.length === 6) {
|
|
3195
3743
|
if (fields[0].match(/^[NS]/)) {
|
|
3196
|
-
ResultFormatter.position(
|
|
3744
|
+
ResultFormatter.position(
|
|
3745
|
+
decodeResult,
|
|
3746
|
+
CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13))
|
|
3747
|
+
);
|
|
3197
3748
|
let wp1 = {
|
|
3198
3749
|
name: fields[0].substring(13).trim(),
|
|
3199
3750
|
time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),
|
|
3200
3751
|
timeFormat: "tod"
|
|
3201
3752
|
};
|
|
3202
|
-
ResultFormatter.altitude(
|
|
3753
|
+
ResultFormatter.altitude(
|
|
3754
|
+
decodeResult,
|
|
3755
|
+
Number(fields[1].substring(6, 9)) * 100
|
|
3756
|
+
);
|
|
3203
3757
|
let wp2 = {
|
|
3204
3758
|
name: fields[1].substring(9).trim(),
|
|
3205
3759
|
time: DateTimeUtils.convertHHMMSSToTod(fields[2]),
|
|
@@ -3209,21 +3763,31 @@ var Label_4A = class extends DecoderPlugin {
|
|
|
3209
3763
|
ResultFormatter.temperature(decodeResult, fields[3]);
|
|
3210
3764
|
ResultFormatter.unknownArr(decodeResult, fields.slice(4));
|
|
3211
3765
|
} else {
|
|
3212
|
-
ResultFormatter.time_of_day(
|
|
3213
|
-
|
|
3766
|
+
ResultFormatter.time_of_day(
|
|
3767
|
+
decodeResult,
|
|
3768
|
+
DateTimeUtils.convertHHMMSSToTod(fields[0])
|
|
3769
|
+
);
|
|
3770
|
+
ResultFormatter.eta(
|
|
3771
|
+
decodeResult,
|
|
3772
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1])
|
|
3773
|
+
);
|
|
3214
3774
|
ResultFormatter.unknown(decodeResult, fields[2]);
|
|
3215
3775
|
ResultFormatter.altitude(decodeResult, Number(fields[3]));
|
|
3216
|
-
ResultFormatter.position(
|
|
3776
|
+
ResultFormatter.position(
|
|
3777
|
+
decodeResult,
|
|
3778
|
+
CoordinateUtils.decodeStringCoordinates(
|
|
3779
|
+
(fields[4] + fields[5]).replace(/[ \.]/g, "")
|
|
3780
|
+
)
|
|
3781
|
+
);
|
|
3217
3782
|
}
|
|
3218
3783
|
} else {
|
|
3219
3784
|
decodeResult.decoded = false;
|
|
3220
|
-
ResultFormatter.unknown(decodeResult, text);
|
|
3785
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3221
3786
|
}
|
|
3222
3787
|
if (decodeResult.decoded) {
|
|
3223
3788
|
if (!decodeResult.remaining.text)
|
|
3224
3789
|
decodeResult.decoder.decodeLevel = "full";
|
|
3225
|
-
else
|
|
3226
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3790
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3227
3791
|
} else {
|
|
3228
3792
|
decodeResult.decoder.decodeLevel = "none";
|
|
3229
3793
|
}
|
|
@@ -3246,11 +3810,16 @@ var Label_4A_01 = class extends DecoderPlugin {
|
|
|
3246
3810
|
decodeResult.message = message;
|
|
3247
3811
|
decodeResult.formatted.description = "Latest New Format";
|
|
3248
3812
|
decodeResult.decoded = true;
|
|
3249
|
-
let rgx = message.text.match(
|
|
3813
|
+
let rgx = message.text.match(
|
|
3814
|
+
/^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)/
|
|
3815
|
+
);
|
|
3250
3816
|
if (rgx) {
|
|
3251
3817
|
ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);
|
|
3252
3818
|
ResultFormatter.callsign(decodeResult, rgx[3]);
|
|
3253
|
-
ResultFormatter.time_of_day(
|
|
3819
|
+
ResultFormatter.time_of_day(
|
|
3820
|
+
decodeResult,
|
|
3821
|
+
DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00")
|
|
3822
|
+
);
|
|
3254
3823
|
ResultFormatter.departureAirport(decodeResult, rgx[5]);
|
|
3255
3824
|
ResultFormatter.arrivalAirport(decodeResult, rgx[6]);
|
|
3256
3825
|
ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, "")));
|
|
@@ -3263,8 +3832,7 @@ var Label_4A_01 = class extends DecoderPlugin {
|
|
|
3263
3832
|
if (decodeResult.decoded) {
|
|
3264
3833
|
if (!decodeResult.remaining.text)
|
|
3265
3834
|
decodeResult.decoder.decodeLevel = "full";
|
|
3266
|
-
else
|
|
3267
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3835
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3268
3836
|
} else {
|
|
3269
3837
|
decodeResult.decoder.decodeLevel = "none";
|
|
3270
3838
|
}
|
|
@@ -3288,14 +3856,16 @@ var Label_4A_DIS = class extends DecoderPlugin {
|
|
|
3288
3856
|
decodeResult.formatted.description = "Latest New Format";
|
|
3289
3857
|
decodeResult.decoded = true;
|
|
3290
3858
|
const fields = message.text.split(",");
|
|
3291
|
-
ResultFormatter.time_of_day(
|
|
3859
|
+
ResultFormatter.time_of_day(
|
|
3860
|
+
decodeResult,
|
|
3861
|
+
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
|
|
3862
|
+
);
|
|
3292
3863
|
ResultFormatter.callsign(decodeResult, fields[2]);
|
|
3293
3864
|
ResultFormatter.freetext(decodeResult, fields.slice(3).join(""));
|
|
3294
3865
|
if (decodeResult.decoded) {
|
|
3295
3866
|
if (!decodeResult.remaining.text)
|
|
3296
3867
|
decodeResult.decoder.decodeLevel = "full";
|
|
3297
|
-
else
|
|
3298
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3868
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3299
3869
|
} else {
|
|
3300
3870
|
decodeResult.decoder.decodeLevel = "none";
|
|
3301
3871
|
}
|
|
@@ -3320,8 +3890,15 @@ var Label_4A_DOOR = class extends DecoderPlugin {
|
|
|
3320
3890
|
decodeResult.decoded = true;
|
|
3321
3891
|
const fields = message.text.split(" ");
|
|
3322
3892
|
if (fields.length === 3) {
|
|
3323
|
-
ResultFormatter.door_event(
|
|
3324
|
-
|
|
3893
|
+
ResultFormatter.door_event(
|
|
3894
|
+
decodeResult,
|
|
3895
|
+
fields[0].split("/")[1],
|
|
3896
|
+
fields[1]
|
|
3897
|
+
);
|
|
3898
|
+
ResultFormatter.time_of_day(
|
|
3899
|
+
decodeResult,
|
|
3900
|
+
DateTimeUtils.convertHHMMSSToTod(fields[2] + "00")
|
|
3901
|
+
);
|
|
3325
3902
|
} else {
|
|
3326
3903
|
decodeResult.decoded = false;
|
|
3327
3904
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
@@ -3329,8 +3906,7 @@ var Label_4A_DOOR = class extends DecoderPlugin {
|
|
|
3329
3906
|
if (decodeResult.decoded) {
|
|
3330
3907
|
if (!decodeResult.remaining.text)
|
|
3331
3908
|
decodeResult.decoder.decodeLevel = "full";
|
|
3332
|
-
else
|
|
3333
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3909
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3334
3910
|
} else {
|
|
3335
3911
|
decodeResult.decoder.decodeLevel = "none";
|
|
3336
3912
|
}
|
|
@@ -3362,8 +3938,7 @@ var Label_4A_Slash_01 = class extends DecoderPlugin {
|
|
|
3362
3938
|
if (decodeResult.decoded) {
|
|
3363
3939
|
if (!decodeResult.remaining.text)
|
|
3364
3940
|
decodeResult.decoder.decodeLevel = "full";
|
|
3365
|
-
else
|
|
3366
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
3941
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3367
3942
|
} else {
|
|
3368
3943
|
decodeResult.decoder.decodeLevel = "none";
|
|
3369
3944
|
}
|
|
@@ -3416,24 +3991,35 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
3416
3991
|
decodeResult.decoder.name = this.name;
|
|
3417
3992
|
decodeResult.message = message;
|
|
3418
3993
|
decodeResult.formatted.description = "Airline Defined";
|
|
3419
|
-
let text = message.text;
|
|
3420
|
-
if (text.match(/^M\d{2}A\w{6}/)) {
|
|
3421
|
-
ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
|
|
3422
|
-
text = text.substring(10);
|
|
3423
|
-
}
|
|
3424
3994
|
decodeResult.decoded = true;
|
|
3995
|
+
const text = message.text;
|
|
3425
3996
|
const fields = text.split(",");
|
|
3426
3997
|
if (text.length === 51) {
|
|
3427
3998
|
decodeResult.raw.day = text.substring(0, 2);
|
|
3428
3999
|
ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));
|
|
3429
4000
|
ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));
|
|
3430
|
-
ResultFormatter.position(
|
|
3431
|
-
|
|
3432
|
-
|
|
4001
|
+
ResultFormatter.position(
|
|
4002
|
+
decodeResult,
|
|
4003
|
+
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
4004
|
+
text.substring(30, 45).replace(/^(.)0/, "$1")
|
|
4005
|
+
)
|
|
4006
|
+
);
|
|
4007
|
+
ResultFormatter.altitude(
|
|
4008
|
+
decodeResult,
|
|
4009
|
+
Number(text.substring(48, 51)) * 100
|
|
4010
|
+
);
|
|
4011
|
+
ResultFormatter.unknownArr(
|
|
4012
|
+
decodeResult,
|
|
4013
|
+
[text.substring(2, 4), text.substring(19, 29)],
|
|
4014
|
+
" "
|
|
4015
|
+
);
|
|
3433
4016
|
} else if (fields.length === 33) {
|
|
3434
4017
|
decodeResult.raw.date = fields[3];
|
|
3435
4018
|
if (fields[1] === "B") {
|
|
3436
|
-
ResultFormatter.position(decodeResult, {
|
|
4019
|
+
ResultFormatter.position(decodeResult, {
|
|
4020
|
+
latitude: Number(fields[4]),
|
|
4021
|
+
longitude: Number(fields[5])
|
|
4022
|
+
});
|
|
3437
4023
|
ResultFormatter.altitude(decodeResult, Number(fields[6]));
|
|
3438
4024
|
}
|
|
3439
4025
|
ResultFormatter.departureAirport(decodeResult, fields[8]);
|
|
@@ -3444,7 +4030,12 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
3444
4030
|
ResultFormatter.alternateRunway(decodeResult, fields[12].split("/")[0]);
|
|
3445
4031
|
}
|
|
3446
4032
|
ResultFormatter.checksum(decodeResult, fields[32]);
|
|
3447
|
-
ResultFormatter.unknownArr(
|
|
4033
|
+
ResultFormatter.unknownArr(
|
|
4034
|
+
decodeResult,
|
|
4035
|
+
[...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(
|
|
4036
|
+
(f) => f != ""
|
|
4037
|
+
)
|
|
4038
|
+
);
|
|
3448
4039
|
} else {
|
|
3449
4040
|
decodeResult.decoded = false;
|
|
3450
4041
|
ResultFormatter.unknown(decodeResult, text);
|
|
@@ -3452,8 +4043,7 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
3452
4043
|
if (decodeResult.decoded) {
|
|
3453
4044
|
if (!decodeResult.remaining.text)
|
|
3454
4045
|
decodeResult.decoder.decodeLevel = "full";
|
|
3455
|
-
else
|
|
3456
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4046
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3457
4047
|
} else {
|
|
3458
4048
|
decodeResult.decoder.decodeLevel = "none";
|
|
3459
4049
|
}
|
|
@@ -3488,9 +4078,16 @@ var Label_4T_AGFSR = class extends DecoderPlugin {
|
|
|
3488
4078
|
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
3489
4079
|
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
3490
4080
|
ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
|
|
3491
|
-
ResultFormatter.departureAirport(
|
|
4081
|
+
ResultFormatter.departureAirport(
|
|
4082
|
+
decodeResult,
|
|
4083
|
+
data[3].substring(0, 3),
|
|
4084
|
+
"IATA"
|
|
4085
|
+
);
|
|
3492
4086
|
ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
|
|
3493
|
-
ResultFormatter.time_of_day(
|
|
4087
|
+
ResultFormatter.time_of_day(
|
|
4088
|
+
decodeResult,
|
|
4089
|
+
DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4))
|
|
4090
|
+
);
|
|
3494
4091
|
ResultFormatter.unknown(decodeResult, data[5], "/");
|
|
3495
4092
|
const lat = data[6].substring(0, 7);
|
|
3496
4093
|
const lon = data[6].substring(7, 15);
|
|
@@ -3523,7 +4120,10 @@ var Label_58 = class extends DecoderPlugin {
|
|
|
3523
4120
|
if (data.length === 8) {
|
|
3524
4121
|
ResultFormatter.flightNumber(decodeResult, data[0]);
|
|
3525
4122
|
ResultFormatter.day(decodeResult, Number(data[1]));
|
|
3526
|
-
ResultFormatter.time_of_day(
|
|
4123
|
+
ResultFormatter.time_of_day(
|
|
4124
|
+
decodeResult,
|
|
4125
|
+
DateTimeUtils.convertHHMMSSToTod(data[2])
|
|
4126
|
+
);
|
|
3527
4127
|
const lat = data[3];
|
|
3528
4128
|
const lon = data[4];
|
|
3529
4129
|
ResultFormatter.position(decodeResult, {
|
|
@@ -3577,7 +4177,10 @@ var Label_4T_ETA = class extends DecoderPlugin {
|
|
|
3577
4177
|
const etaData = data[2].split(" ");
|
|
3578
4178
|
ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
|
|
3579
4179
|
ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
|
|
3580
|
-
ResultFormatter.eta(
|
|
4180
|
+
ResultFormatter.eta(
|
|
4181
|
+
decodeResult,
|
|
4182
|
+
DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4))
|
|
4183
|
+
);
|
|
3581
4184
|
decodeResult.decoded = true;
|
|
3582
4185
|
decodeResult.decoder.decodeLevel = "full";
|
|
3583
4186
|
return decodeResult;
|
|
@@ -3609,7 +4212,10 @@ var Label_80 = class extends DecoderPlugin {
|
|
|
3609
4212
|
this.parseTags(more.trim(), decodeResult);
|
|
3610
4213
|
}
|
|
3611
4214
|
}
|
|
3612
|
-
this.parseHeader(
|
|
4215
|
+
this.parseHeader(
|
|
4216
|
+
headerParts[headerParts.length - 1].trim(),
|
|
4217
|
+
decodeResult
|
|
4218
|
+
);
|
|
3613
4219
|
for (let i = 1; i < lines.length; i++) {
|
|
3614
4220
|
const line = lines[i];
|
|
3615
4221
|
const parts = line.split("/");
|
|
@@ -3697,10 +4303,16 @@ var Label_80 = class extends DecoderPlugin {
|
|
|
3697
4303
|
case "FB":
|
|
3698
4304
|
break;
|
|
3699
4305
|
case "FOB":
|
|
3700
|
-
ResultFormatter.currentFuel(
|
|
4306
|
+
ResultFormatter.currentFuel(
|
|
4307
|
+
results,
|
|
4308
|
+
parseInt(val.replace(/\D/g, ""), 10)
|
|
4309
|
+
);
|
|
3701
4310
|
break;
|
|
3702
4311
|
case "UTC":
|
|
3703
|
-
ResultFormatter.time_of_day(
|
|
4312
|
+
ResultFormatter.time_of_day(
|
|
4313
|
+
results,
|
|
4314
|
+
DateTimeUtils.convertHHMMSSToTod(val)
|
|
4315
|
+
);
|
|
3704
4316
|
break;
|
|
3705
4317
|
case "ETA":
|
|
3706
4318
|
const hhmm = val.split(".")[0].replace(":", "");
|
|
@@ -3729,11 +4341,20 @@ var Label_80 = class extends DecoderPlugin {
|
|
|
3729
4341
|
const header = csvParts[0].trim().split(/\s+/);
|
|
3730
4342
|
ResultFormatter.unknown(results, header[0], " ");
|
|
3731
4343
|
ResultFormatter.unknown(results, header[1], " ");
|
|
3732
|
-
ResultFormatter.position(
|
|
4344
|
+
ResultFormatter.position(
|
|
4345
|
+
results,
|
|
4346
|
+
CoordinateUtils.decodeStringCoordinates(header[2])
|
|
4347
|
+
);
|
|
3733
4348
|
ResultFormatter.unknown(results, csvParts[1]);
|
|
3734
|
-
ResultFormatter.time_of_day(
|
|
4349
|
+
ResultFormatter.time_of_day(
|
|
4350
|
+
results,
|
|
4351
|
+
DateTimeUtils.convertHHMMSSToTod(csvParts[2])
|
|
4352
|
+
);
|
|
3735
4353
|
ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ",");
|
|
3736
|
-
ResultFormatter.temperature(
|
|
4354
|
+
ResultFormatter.temperature(
|
|
4355
|
+
results,
|
|
4356
|
+
((csvParts[6].charAt(0) === "M" ? -1 : 1) * parseInt(csvParts[6].slice(1), 10)).toString()
|
|
4357
|
+
);
|
|
3737
4358
|
ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));
|
|
3738
4359
|
ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));
|
|
3739
4360
|
}
|
|
@@ -3752,12 +4373,8 @@ var Label_83 = class extends DecoderPlugin {
|
|
|
3752
4373
|
decodeResult.decoder.name = this.name;
|
|
3753
4374
|
decodeResult.message = message;
|
|
3754
4375
|
decodeResult.formatted.description = "Airline Defined";
|
|
3755
|
-
let text = message.text;
|
|
3756
|
-
if (text.match(/^M\d{2}A\w{6}/)) {
|
|
3757
|
-
ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
|
|
3758
|
-
text = text.substring(10);
|
|
3759
|
-
}
|
|
3760
4376
|
decodeResult.decoded = true;
|
|
4377
|
+
const text = message.text;
|
|
3761
4378
|
if (text.substring(0, 10) === "4DH3 ETAT2") {
|
|
3762
4379
|
const fields = text.split(/\s+/);
|
|
3763
4380
|
if (fields[2].length > 5) {
|
|
@@ -3768,10 +4385,15 @@ var Label_83 = class extends DecoderPlugin {
|
|
|
3768
4385
|
ResultFormatter.departureAirport(decodeResult, subfields[0]);
|
|
3769
4386
|
ResultFormatter.arrivalAirport(decodeResult, subfields[1]);
|
|
3770
4387
|
ResultFormatter.tail(decodeResult, fields[4].replace(/\./g, ""));
|
|
3771
|
-
ResultFormatter.eta(
|
|
4388
|
+
ResultFormatter.eta(
|
|
4389
|
+
decodeResult,
|
|
4390
|
+
DateTimeUtils.convertHHMMSSToTod(fields[6] + "00")
|
|
4391
|
+
);
|
|
3772
4392
|
} else if (text.substring(0, 5) === "001PR") {
|
|
3773
4393
|
decodeResult.raw.day = text.substring(5, 7);
|
|
3774
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
4394
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
|
|
4395
|
+
text.substring(13, 28).replace(/\./g, "")
|
|
4396
|
+
);
|
|
3775
4397
|
if (position) {
|
|
3776
4398
|
ResultFormatter.position(decodeResult, position);
|
|
3777
4399
|
}
|
|
@@ -3784,27 +4406,23 @@ var Label_83 = class extends DecoderPlugin {
|
|
|
3784
4406
|
ResultFormatter.arrivalAirport(decodeResult, fields[1]);
|
|
3785
4407
|
decodeResult.raw.day = fields[2].substring(0, 2);
|
|
3786
4408
|
decodeResult.raw.time = fields[2].substring(2);
|
|
3787
|
-
ResultFormatter.position(
|
|
3788
|
-
|
|
3789
|
-
|
|
3790
|
-
|
|
3791
|
-
longitude: Number(fields[4].replace(/\s/g, ""))
|
|
3792
|
-
}
|
|
3793
|
-
);
|
|
4409
|
+
ResultFormatter.position(decodeResult, {
|
|
4410
|
+
latitude: Number(fields[3].replace(/\s/g, "")),
|
|
4411
|
+
longitude: Number(fields[4].replace(/\s/g, ""))
|
|
4412
|
+
});
|
|
3794
4413
|
ResultFormatter.altitude(decodeResult, Number(fields[5]));
|
|
3795
4414
|
ResultFormatter.groundspeed(decodeResult, Number(fields[6]));
|
|
3796
4415
|
ResultFormatter.heading(decodeResult, Number(fields[7]));
|
|
3797
4416
|
ResultFormatter.unknown(decodeResult, fields[8]);
|
|
3798
4417
|
} else {
|
|
3799
4418
|
decodeResult.decoded = false;
|
|
3800
|
-
ResultFormatter.unknown(decodeResult,
|
|
4419
|
+
ResultFormatter.unknown(decodeResult, text);
|
|
3801
4420
|
}
|
|
3802
4421
|
}
|
|
3803
4422
|
if (decodeResult.decoded) {
|
|
3804
4423
|
if (!decodeResult.remaining.text)
|
|
3805
4424
|
decodeResult.decoder.decodeLevel = "full";
|
|
3806
|
-
else
|
|
3807
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4425
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
3808
4426
|
} else {
|
|
3809
4427
|
decodeResult.decoder.decodeLevel = "none";
|
|
3810
4428
|
}
|
|
@@ -3829,10 +4447,13 @@ var Label_8E = class extends DecoderPlugin {
|
|
|
3829
4447
|
const results = message.text.match(regex);
|
|
3830
4448
|
if (results?.groups) {
|
|
3831
4449
|
if (options.debug) {
|
|
3832
|
-
console.log(
|
|
4450
|
+
console.log("Label 8E ETA: groups");
|
|
3833
4451
|
console.log(results.groups);
|
|
3834
4452
|
}
|
|
3835
|
-
ResultFormatter.eta(
|
|
4453
|
+
ResultFormatter.eta(
|
|
4454
|
+
decodeResult,
|
|
4455
|
+
DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta)
|
|
4456
|
+
);
|
|
3836
4457
|
ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
|
|
3837
4458
|
}
|
|
3838
4459
|
decodeResult.decoded = true;
|
|
@@ -3902,11 +4523,26 @@ var Label_H1 = class extends DecoderPlugin {
|
|
|
3902
4523
|
const msg = message.text.replace(/\n|\r/g, "");
|
|
3903
4524
|
const parts = msg.split("#");
|
|
3904
4525
|
let decoded = false;
|
|
3905
|
-
if (
|
|
4526
|
+
if (msg.startsWith("/")) {
|
|
4527
|
+
const headerData = msg.split(".");
|
|
4528
|
+
const decoded2 = H1Helper.decodeH1Message(
|
|
4529
|
+
decodeResult,
|
|
4530
|
+
headerData.slice(1).join(".")
|
|
4531
|
+
);
|
|
4532
|
+
if (decoded2) {
|
|
4533
|
+
decodeResult.remaining.text = headerData[0] + "." + decodeResult.remaining.text;
|
|
4534
|
+
decodeResult.decoded = decoded2;
|
|
4535
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
4536
|
+
}
|
|
4537
|
+
return decodeResult;
|
|
4538
|
+
} else if (parts.length === 1) {
|
|
3906
4539
|
decoded = H1Helper.decodeH1Message(decodeResult, msg);
|
|
3907
4540
|
} else if (parts.length == 2) {
|
|
3908
4541
|
const offset = isNaN(parseInt(parts[1][1])) ? 3 : 4;
|
|
3909
|
-
decoded = H1Helper.decodeH1Message(
|
|
4542
|
+
decoded = H1Helper.decodeH1Message(
|
|
4543
|
+
decodeResult,
|
|
4544
|
+
msg.slice(parts[0].length + offset)
|
|
4545
|
+
);
|
|
3910
4546
|
if (decoded && parts[0].length > 0) {
|
|
3911
4547
|
ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));
|
|
3912
4548
|
decodeResult.remaining.text = parts[0].substring(0, 4) + "#" + parts[1].substring(0, offset - 1) + "/" + decodeResult.remaining.text;
|
|
@@ -4040,7 +4676,10 @@ var Label_H1_FLR = class extends DecoderPlugin {
|
|
|
4040
4676
|
const datetime = data.substring(0, 12);
|
|
4041
4677
|
const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
|
|
4042
4678
|
ResultFormatter.unknown(decodeResult, data.substring(12), "/");
|
|
4043
|
-
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4679
|
+
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4680
|
+
datetime.substring(6),
|
|
4681
|
+
date
|
|
4682
|
+
);
|
|
4044
4683
|
decodeResult.raw.fault_message = msg;
|
|
4045
4684
|
decodeResult.formatted.items.push({
|
|
4046
4685
|
type: "fault",
|
|
@@ -4120,65 +4759,6 @@ var Label_H1_OHMA = class extends DecoderPlugin {
|
|
|
4120
4759
|
}
|
|
4121
4760
|
};
|
|
4122
4761
|
|
|
4123
|
-
// lib/plugins/Label_H1_Slash.ts
|
|
4124
|
-
var Label_H1_Slash = class extends DecoderPlugin {
|
|
4125
|
-
name = "label-h1-slash";
|
|
4126
|
-
qualifiers() {
|
|
4127
|
-
return {
|
|
4128
|
-
labels: ["H1"],
|
|
4129
|
-
preambles: ["/"]
|
|
4130
|
-
};
|
|
4131
|
-
}
|
|
4132
|
-
decode(message, options = {}) {
|
|
4133
|
-
let decodeResult = this.defaultResult();
|
|
4134
|
-
decodeResult.decoder.name = this.name;
|
|
4135
|
-
decodeResult.formatted.description = "Position Report";
|
|
4136
|
-
decodeResult.message = message;
|
|
4137
|
-
const checksum = message.text.slice(-4);
|
|
4138
|
-
const data = message.text.slice(0, message.text.length - 4);
|
|
4139
|
-
const fields = data.split("/");
|
|
4140
|
-
if (fields[0] !== "") {
|
|
4141
|
-
ResultFormatter.unknown(decodeResult, message.text);
|
|
4142
|
-
decodeResult.decoded = false;
|
|
4143
|
-
decodeResult.decoder.decodeLevel = "none";
|
|
4144
|
-
return decodeResult;
|
|
4145
|
-
}
|
|
4146
|
-
const headerData = fields[1].split(".");
|
|
4147
|
-
ResultFormatter.unknown(decodeResult, headerData[0]);
|
|
4148
|
-
if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
|
|
4149
|
-
H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
|
|
4150
|
-
} else if (headerData[1] === "POS") {
|
|
4151
|
-
} else if (headerData[1].startsWith("POS")) {
|
|
4152
|
-
H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
|
|
4153
|
-
} else {
|
|
4154
|
-
ResultFormatter.unknown(decodeResult, headerData[1], ".");
|
|
4155
|
-
}
|
|
4156
|
-
for (let i = 2; i < fields.length; i++) {
|
|
4157
|
-
const field = fields[i];
|
|
4158
|
-
if (field.startsWith("TS")) {
|
|
4159
|
-
H1Helper.processTimeStamp(decodeResult, field.substring(2, 15).split(","));
|
|
4160
|
-
} else if (field.startsWith("PS")) {
|
|
4161
|
-
H1Helper.processPS(decodeResult, field.substring(2).split(","));
|
|
4162
|
-
} else {
|
|
4163
|
-
ResultFormatter.unknown(decodeResult, field, "/");
|
|
4164
|
-
}
|
|
4165
|
-
}
|
|
4166
|
-
if (decodeResult.formatted.items.length === 0) {
|
|
4167
|
-
if (options.debug) {
|
|
4168
|
-
console.log(`Decoder: Unknown H1 message: ${message.text}`);
|
|
4169
|
-
}
|
|
4170
|
-
ResultFormatter.unknown(decodeResult, message.text);
|
|
4171
|
-
decodeResult.decoded = false;
|
|
4172
|
-
decodeResult.decoder.decodeLevel = "none";
|
|
4173
|
-
return decodeResult;
|
|
4174
|
-
}
|
|
4175
|
-
ResultFormatter.checksum(decodeResult, checksum);
|
|
4176
|
-
decodeResult.decoded = true;
|
|
4177
|
-
decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
|
|
4178
|
-
return decodeResult;
|
|
4179
|
-
}
|
|
4180
|
-
};
|
|
4181
|
-
|
|
4182
4762
|
// lib/plugins/Label_H1_StarPOS.ts
|
|
4183
4763
|
var Label_H1_StarPOS = class extends DecoderPlugin {
|
|
4184
4764
|
name = "label-h1-star-pos";
|
|
@@ -4205,7 +4785,10 @@ var Label_H1_StarPOS = class extends DecoderPlugin {
|
|
|
4205
4785
|
}
|
|
4206
4786
|
ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));
|
|
4207
4787
|
ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));
|
|
4208
|
-
ResultFormatter.time_of_day(
|
|
4788
|
+
ResultFormatter.time_of_day(
|
|
4789
|
+
decodeResult,
|
|
4790
|
+
DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12))
|
|
4791
|
+
);
|
|
4209
4792
|
ResultFormatter.position(decodeResult, {
|
|
4210
4793
|
// Deg Min, no sec
|
|
4211
4794
|
latitude: CoordinateUtils.getDirection(msg.substring(12, 13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),
|
|
@@ -4242,7 +4825,10 @@ var Label_H1_WRN = class extends DecoderPlugin {
|
|
|
4242
4825
|
const datetime = data.substring(0, 12);
|
|
4243
4826
|
const date = datetime.substring(4, 6) + datetime.substring(2, 4) + datetime.substring(0, 2);
|
|
4244
4827
|
ResultFormatter.unknown(decodeResult, data.substring(12), "/");
|
|
4245
|
-
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4828
|
+
decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(
|
|
4829
|
+
datetime.substring(6),
|
|
4830
|
+
date
|
|
4831
|
+
);
|
|
4246
4832
|
decodeResult.raw.warning_message = msg;
|
|
4247
4833
|
decodeResult.formatted.items.push({
|
|
4248
4834
|
type: "warning",
|
|
@@ -4302,8 +4888,7 @@ var Label_HX = class extends DecoderPlugin {
|
|
|
4302
4888
|
if (decodeResult.decoded) {
|
|
4303
4889
|
if (!decodeResult.remaining.text)
|
|
4304
4890
|
decodeResult.decoder.decodeLevel = "full";
|
|
4305
|
-
else
|
|
4306
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
4891
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
4307
4892
|
} else {
|
|
4308
4893
|
decodeResult.decoder.decodeLevel = "none";
|
|
4309
4894
|
}
|
|
@@ -4435,10 +5020,16 @@ var MIAMCoreUtils = class {
|
|
|
4435
5020
|
}
|
|
4436
5021
|
},
|
|
4437
5022
|
["F" /* FileTransferRequest */]: () => {
|
|
4438
|
-
return {
|
|
5023
|
+
return {
|
|
5024
|
+
decoded: false,
|
|
5025
|
+
error: "File Transfer Request not implemented"
|
|
5026
|
+
};
|
|
4439
5027
|
},
|
|
4440
5028
|
["K" /* FileTransferAccept */]: () => {
|
|
4441
|
-
return {
|
|
5029
|
+
return {
|
|
5030
|
+
decoded: false,
|
|
5031
|
+
error: "File Transfer Accept not implemented"
|
|
5032
|
+
};
|
|
4442
5033
|
},
|
|
4443
5034
|
["S" /* FileSegment */]: () => {
|
|
4444
5035
|
return { decoded: false, error: "File Segment not implemented" };
|
|
@@ -5020,7 +5611,9 @@ var MIAMCoreUtils = class {
|
|
|
5020
5611
|
const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
|
|
5021
5612
|
if (pduSize > msgSize) {
|
|
5022
5613
|
pduIsComplete = false;
|
|
5023
|
-
pduErrors.push(
|
|
5614
|
+
pduErrors.push(
|
|
5615
|
+
"v1 PDU truncated: expecting " + pduSize + ", got " + msgSize
|
|
5616
|
+
);
|
|
5024
5617
|
}
|
|
5025
5618
|
hdr = hdr.subarray(4);
|
|
5026
5619
|
tail = hdr.subarray(0, 7).toString("ascii");
|
|
@@ -5068,7 +5661,9 @@ var MIAMCoreUtils = class {
|
|
|
5068
5661
|
}
|
|
5069
5662
|
hdr = hdr.subarray(crcLen);
|
|
5070
5663
|
if (body !== void 0 && body.length > 0) {
|
|
5071
|
-
if ([1 /* Deflate */, 1 /* Deflate */].indexOf(
|
|
5664
|
+
if ([1 /* Deflate */, 1 /* Deflate */].indexOf(
|
|
5665
|
+
pduCompression
|
|
5666
|
+
) >= 0) {
|
|
5072
5667
|
try {
|
|
5073
5668
|
const decompress = new zlib2.InflateRaw({});
|
|
5074
5669
|
decompress.write(body);
|
|
@@ -5077,10 +5672,14 @@ var MIAMCoreUtils = class {
|
|
|
5077
5672
|
} catch (e) {
|
|
5078
5673
|
pduErrors.push("Inflation failed for body: " + e);
|
|
5079
5674
|
}
|
|
5080
|
-
} else if ([0 /* None */, 0 /* None */].indexOf(
|
|
5675
|
+
} else if ([0 /* None */, 0 /* None */].indexOf(
|
|
5676
|
+
pduCompression
|
|
5677
|
+
) >= 0) {
|
|
5081
5678
|
pduData = body;
|
|
5082
5679
|
} else {
|
|
5083
|
-
pduErrors.push(
|
|
5680
|
+
pduErrors.push(
|
|
5681
|
+
"Unsupported v" + version + " compression type: " + pduCompression
|
|
5682
|
+
);
|
|
5084
5683
|
}
|
|
5085
5684
|
if (pduData !== null) {
|
|
5086
5685
|
const crcAlgoHandlerByVersion = {
|
|
@@ -5100,7 +5699,9 @@ var MIAMCoreUtils = class {
|
|
|
5100
5699
|
if (crcCheck === pduCrc) {
|
|
5101
5700
|
pduCrcIsOk = true;
|
|
5102
5701
|
} else {
|
|
5103
|
-
pduErrors.push(
|
|
5702
|
+
pduErrors.push(
|
|
5703
|
+
"Body failed CRC check: provided=" + pduCrc + ", generated=" + crcCheck
|
|
5704
|
+
);
|
|
5104
5705
|
}
|
|
5105
5706
|
}
|
|
5106
5707
|
} else {
|
|
@@ -5143,7 +5744,13 @@ var MIAMCoreUtils = class {
|
|
|
5143
5744
|
static VersionPduHandlerTable = {
|
|
5144
5745
|
[1 /* V1 */]: {
|
|
5145
5746
|
[0 /* Data */]: (hdr, body) => {
|
|
5146
|
-
return this.corePduDataHandler(
|
|
5747
|
+
return this.corePduDataHandler(
|
|
5748
|
+
1 /* V1 */,
|
|
5749
|
+
20,
|
|
5750
|
+
MIAMCoreV1CRCLength,
|
|
5751
|
+
hdr,
|
|
5752
|
+
body
|
|
5753
|
+
);
|
|
5147
5754
|
},
|
|
5148
5755
|
[1 /* Ack */]: () => {
|
|
5149
5756
|
return { decoded: false, error: "v1 Ack PDU not implemented" };
|
|
@@ -5157,7 +5764,13 @@ var MIAMCoreUtils = class {
|
|
|
5157
5764
|
},
|
|
5158
5765
|
[2 /* V2 */]: {
|
|
5159
5766
|
[0 /* Data */]: (hdr, body) => {
|
|
5160
|
-
return this.corePduDataHandler(
|
|
5767
|
+
return this.corePduDataHandler(
|
|
5768
|
+
2 /* V2 */,
|
|
5769
|
+
7,
|
|
5770
|
+
MIAMCoreV2CRCLength,
|
|
5771
|
+
hdr,
|
|
5772
|
+
body
|
|
5773
|
+
);
|
|
5161
5774
|
},
|
|
5162
5775
|
[1 /* Ack */]: () => {
|
|
5163
5776
|
return { decoded: false, error: "v2 Ack PDU not implemented" };
|
|
@@ -5187,35 +5800,44 @@ var Label_MA = class extends DecoderPlugin {
|
|
|
5187
5800
|
const miamResult = MIAMCoreUtils.parse(message.text);
|
|
5188
5801
|
if (miamResult.decoded && miamResult.message.data && miamResult.message.data.acars) {
|
|
5189
5802
|
decodeResult.decoded = true;
|
|
5190
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
5191
5803
|
ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
|
|
5192
5804
|
if (miamResult.message.data.acars.sublabel) {
|
|
5193
|
-
ResultFormatter.sublabel(
|
|
5805
|
+
ResultFormatter.sublabel(
|
|
5806
|
+
decodeResult,
|
|
5807
|
+
miamResult.message.data.acars.sublabel
|
|
5808
|
+
);
|
|
5194
5809
|
}
|
|
5195
5810
|
if (miamResult.message.data.acars.tail) {
|
|
5196
|
-
ResultFormatter.tail(
|
|
5811
|
+
ResultFormatter.tail(
|
|
5812
|
+
decodeResult,
|
|
5813
|
+
miamResult.message.data.acars.tail.replace(".", "")
|
|
5814
|
+
);
|
|
5197
5815
|
}
|
|
5198
5816
|
const messageText = miamResult.message.data.acars.text;
|
|
5199
5817
|
if (miamResult.message.data.crcOk && miamResult.message.data.complete && messageText) {
|
|
5200
|
-
|
|
5201
|
-
|
|
5202
|
-
|
|
5203
|
-
|
|
5204
|
-
|
|
5818
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
5819
|
+
const decoded = this.decoder.decode(
|
|
5820
|
+
{
|
|
5821
|
+
label: miamResult.message.data.acars.label,
|
|
5822
|
+
sublabel: miamResult.message.data.acars.sublabel,
|
|
5823
|
+
text: messageText
|
|
5824
|
+
},
|
|
5825
|
+
options
|
|
5826
|
+
);
|
|
5205
5827
|
if (decoded.decoded) {
|
|
5206
|
-
decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
|
|
5207
5828
|
decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
|
|
5208
5829
|
decodeResult.formatted.items.push(...decoded.formatted.items);
|
|
5830
|
+
decodeResult.remaining = decoded.remaining;
|
|
5209
5831
|
} else {
|
|
5210
5832
|
ResultFormatter.text(decodeResult, messageText);
|
|
5833
|
+
decodeResult.remaining = { text: messageText };
|
|
5211
5834
|
}
|
|
5212
|
-
message.text = messageText;
|
|
5213
5835
|
} else if (messageText) {
|
|
5214
|
-
|
|
5836
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5837
|
+
decodeResult.remaining = { text: messageText };
|
|
5838
|
+
} else {
|
|
5839
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
5215
5840
|
}
|
|
5216
|
-
message.label = miamResult.message.data.acars.label;
|
|
5217
|
-
message.sublabel = miamResult.message.data.acars.sublabel;
|
|
5218
|
-
return decodeResult;
|
|
5219
5841
|
}
|
|
5220
5842
|
return decodeResult;
|
|
5221
5843
|
}
|
|
@@ -5340,15 +5962,19 @@ var Label_QR = class extends DecoderPlugin {
|
|
|
5340
5962
|
const decodeResult = this.defaultResult();
|
|
5341
5963
|
decodeResult.decoder.name = this.name;
|
|
5342
5964
|
decodeResult.formatted.description = "ON Report";
|
|
5343
|
-
ResultFormatter.departureAirport(
|
|
5965
|
+
ResultFormatter.departureAirport(
|
|
5966
|
+
decodeResult,
|
|
5967
|
+
message.text.substring(0, 4)
|
|
5968
|
+
);
|
|
5344
5969
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5345
|
-
ResultFormatter.on(
|
|
5970
|
+
ResultFormatter.on(
|
|
5971
|
+
decodeResult,
|
|
5972
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
|
|
5973
|
+
);
|
|
5346
5974
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5347
5975
|
decodeResult.decoded = true;
|
|
5348
|
-
if (!decodeResult.remaining.text)
|
|
5349
|
-
|
|
5350
|
-
else
|
|
5351
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
5976
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
5977
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5352
5978
|
return decodeResult;
|
|
5353
5979
|
}
|
|
5354
5980
|
};
|
|
@@ -5365,15 +5991,19 @@ var Label_QP = class extends DecoderPlugin {
|
|
|
5365
5991
|
const decodeResult = this.defaultResult();
|
|
5366
5992
|
decodeResult.decoder.name = this.name;
|
|
5367
5993
|
decodeResult.formatted.description = "OUT Report";
|
|
5368
|
-
ResultFormatter.departureAirport(
|
|
5994
|
+
ResultFormatter.departureAirport(
|
|
5995
|
+
decodeResult,
|
|
5996
|
+
message.text.substring(0, 4)
|
|
5997
|
+
);
|
|
5369
5998
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5370
|
-
ResultFormatter.out(
|
|
5999
|
+
ResultFormatter.out(
|
|
6000
|
+
decodeResult,
|
|
6001
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
|
|
6002
|
+
);
|
|
5371
6003
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5372
6004
|
decodeResult.decoded = true;
|
|
5373
|
-
if (!decodeResult.remaining.text)
|
|
5374
|
-
|
|
5375
|
-
else
|
|
5376
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
6005
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
6006
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5377
6007
|
return decodeResult;
|
|
5378
6008
|
}
|
|
5379
6009
|
};
|
|
@@ -5390,15 +6020,19 @@ var Label_QS = class extends DecoderPlugin {
|
|
|
5390
6020
|
const decodeResult = this.defaultResult();
|
|
5391
6021
|
decodeResult.decoder.name = this.name;
|
|
5392
6022
|
decodeResult.formatted.description = "IN Report";
|
|
5393
|
-
ResultFormatter.departureAirport(
|
|
6023
|
+
ResultFormatter.departureAirport(
|
|
6024
|
+
decodeResult,
|
|
6025
|
+
message.text.substring(0, 4)
|
|
6026
|
+
);
|
|
5394
6027
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5395
|
-
ResultFormatter.in(
|
|
6028
|
+
ResultFormatter.in(
|
|
6029
|
+
decodeResult,
|
|
6030
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12))
|
|
6031
|
+
);
|
|
5396
6032
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5397
6033
|
decodeResult.decoded = true;
|
|
5398
|
-
if (!decodeResult.remaining.text)
|
|
5399
|
-
|
|
5400
|
-
else
|
|
5401
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
6034
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
6035
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5402
6036
|
return decodeResult;
|
|
5403
6037
|
}
|
|
5404
6038
|
};
|
|
@@ -5416,11 +6050,17 @@ var Label_QQ = class extends DecoderPlugin {
|
|
|
5416
6050
|
decodeResult.decoder.name = this.name;
|
|
5417
6051
|
decodeResult.message = message;
|
|
5418
6052
|
decodeResult.formatted.description = "OFF Report";
|
|
5419
|
-
ResultFormatter.departureAirport(
|
|
6053
|
+
ResultFormatter.departureAirport(
|
|
6054
|
+
decodeResult,
|
|
6055
|
+
message.text.substring(0, 4)
|
|
6056
|
+
);
|
|
5420
6057
|
ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
|
|
5421
6058
|
if (message.text.substring(12, 19) === "\r\n001FE") {
|
|
5422
6059
|
decodeResult.raw.day = message.text.substring(19, 21);
|
|
5423
|
-
ResultFormatter.off(
|
|
6060
|
+
ResultFormatter.off(
|
|
6061
|
+
decodeResult,
|
|
6062
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27))
|
|
6063
|
+
);
|
|
5424
6064
|
let latdir = message.text.substring(27, 28);
|
|
5425
6065
|
let latdeg = Number(message.text.substring(28, 30));
|
|
5426
6066
|
let latmin = Number(message.text.substring(30, 34));
|
|
@@ -5434,20 +6074,24 @@ var Label_QQ = class extends DecoderPlugin {
|
|
|
5434
6074
|
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
5435
6075
|
ResultFormatter.position(decodeResult, pos);
|
|
5436
6076
|
if (decodeResult.remaining.text !== "---") {
|
|
5437
|
-
ResultFormatter.groundspeed(
|
|
6077
|
+
ResultFormatter.groundspeed(
|
|
6078
|
+
decodeResult,
|
|
6079
|
+
Number(message.text.substring(45, 48))
|
|
6080
|
+
);
|
|
5438
6081
|
} else {
|
|
5439
6082
|
ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
|
|
5440
6083
|
}
|
|
5441
6084
|
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
5442
6085
|
} else {
|
|
5443
|
-
ResultFormatter.off(
|
|
6086
|
+
ResultFormatter.off(
|
|
6087
|
+
decodeResult,
|
|
6088
|
+
DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00")
|
|
6089
|
+
);
|
|
5444
6090
|
ResultFormatter.unknown(decodeResult, message.text.substring(12));
|
|
5445
6091
|
}
|
|
5446
6092
|
decodeResult.decoded = true;
|
|
5447
|
-
if (!decodeResult.remaining.text)
|
|
5448
|
-
|
|
5449
|
-
else
|
|
5450
|
-
decodeResult.decoder.decodeLevel = "partial";
|
|
6093
|
+
if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = "full";
|
|
6094
|
+
else decodeResult.decoder.decodeLevel = "partial";
|
|
5451
6095
|
return decodeResult;
|
|
5452
6096
|
}
|
|
5453
6097
|
};
|
|
@@ -5461,6 +6105,7 @@ var MessageDecoder = class {
|
|
|
5461
6105
|
this.name = "acars-decoder-typescript";
|
|
5462
6106
|
this.plugins = [];
|
|
5463
6107
|
this.debug = false;
|
|
6108
|
+
this.registerPlugin(new CBand(this));
|
|
5464
6109
|
this.registerPlugin(new Label_ColonComma(this));
|
|
5465
6110
|
this.registerPlugin(new Label_5Z_Slash(this));
|
|
5466
6111
|
this.registerPlugin(new Label_10_LDR(this));
|
|
@@ -5511,7 +6156,6 @@ var MessageDecoder = class {
|
|
|
5511
6156
|
this.registerPlugin(new Label_H1_OHMA(this));
|
|
5512
6157
|
this.registerPlugin(new Label_H1_WRN(this));
|
|
5513
6158
|
this.registerPlugin(new Label_H1(this));
|
|
5514
|
-
this.registerPlugin(new Label_H1_Slash(this));
|
|
5515
6159
|
this.registerPlugin(new Label_H1_StarPOS(this));
|
|
5516
6160
|
this.registerPlugin(new Label_HX(this));
|
|
5517
6161
|
this.registerPlugin(new Label_58(this));
|
|
@@ -5527,14 +6171,13 @@ var MessageDecoder = class {
|
|
|
5527
6171
|
this.registerPlugin(new Label_QS(this));
|
|
5528
6172
|
}
|
|
5529
6173
|
registerPlugin(plugin) {
|
|
5530
|
-
const pluginInstance = plugin;
|
|
5531
6174
|
this.plugins.push(plugin);
|
|
5532
6175
|
return true;
|
|
5533
6176
|
}
|
|
5534
6177
|
decode(message, options = {}) {
|
|
5535
6178
|
const usablePlugins = this.plugins.filter((plugin) => {
|
|
5536
6179
|
const qualifiers = plugin.qualifiers();
|
|
5537
|
-
if (qualifiers.labels.includes(message.label)) {
|
|
6180
|
+
if (qualifiers.labels.includes(message.label) || qualifiers.labels.length === 1 && qualifiers.labels[0] === "*") {
|
|
5538
6181
|
if (qualifiers.preambles && qualifiers.preambles.length > 0) {
|
|
5539
6182
|
const matching = qualifiers.preambles.filter((preamble) => {
|
|
5540
6183
|
return message.text.substring(0, preamble.length) === preamble;
|