@airframes/acars-decoder 1.6.15 → 1.6.17
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 +1 -0
- package/dist/index.js +384 -85
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +384 -85
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -6
package/README.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
[](https://badge.fury.io/js/@airframes%2Facars-decoder)
|
|
4
4
|
[
|
|
5
5
|
](https://github.com/airframesio/acars-decoder-typescript/actions/workflows/yarn-test.yml)
|
|
6
|
+

|
|
6
7
|
[](https://github.com/airframesio/acars-decoder-typescript/graphs/contributors)
|
|
7
8
|
[](https://github.com/airframesio/acars-decoder-typescript/pulse)
|
|
8
9
|
[](https://discord.gg/8Ksch7zE)
|
package/dist/index.js
CHANGED
|
@@ -569,14 +569,24 @@ var ResultFormatter = class {
|
|
|
569
569
|
value: DateTimeUtils.timestampToString(time, "tod")
|
|
570
570
|
});
|
|
571
571
|
}
|
|
572
|
-
static off(decodeResult, time) {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
572
|
+
static off(decodeResult, time, type = "tod") {
|
|
573
|
+
if (type === "tod") {
|
|
574
|
+
decodeResult.raw.off_time = time;
|
|
575
|
+
decodeResult.formatted.items.push({
|
|
576
|
+
type: "time_of_day",
|
|
577
|
+
code: "OFF",
|
|
578
|
+
label: "Takeoff Time",
|
|
579
|
+
value: DateTimeUtils.timestampToString(time, "tod")
|
|
580
|
+
});
|
|
581
|
+
} else {
|
|
582
|
+
decodeResult.raw.off_date = time;
|
|
583
|
+
decodeResult.formatted.items.push({
|
|
584
|
+
type: "epoch",
|
|
585
|
+
code: "OFF",
|
|
586
|
+
label: "Takeoff Time",
|
|
587
|
+
value: DateTimeUtils.timestampToString(time, "epoch")
|
|
588
|
+
});
|
|
589
|
+
}
|
|
580
590
|
}
|
|
581
591
|
static on(decodeResult, time) {
|
|
582
592
|
decodeResult.raw.on_time = time;
|
|
@@ -968,6 +978,51 @@ var Label_12_N_Space = class extends DecoderPlugin {
|
|
|
968
978
|
}
|
|
969
979
|
};
|
|
970
980
|
|
|
981
|
+
// lib/plugins/Label_12_POS.ts
|
|
982
|
+
var Label_12_POS = class extends DecoderPlugin {
|
|
983
|
+
name = "label-12-pos";
|
|
984
|
+
qualifiers() {
|
|
985
|
+
return {
|
|
986
|
+
labels: ["12"],
|
|
987
|
+
preambles: ["POS"]
|
|
988
|
+
};
|
|
989
|
+
}
|
|
990
|
+
decode(message, options = {}) {
|
|
991
|
+
const decodeResult = this.defaultResult();
|
|
992
|
+
decodeResult.decoder.name = this.name;
|
|
993
|
+
decodeResult.formatted.description = "Position Report";
|
|
994
|
+
decodeResult.message = message;
|
|
995
|
+
const data = message.text.substring(3).split(",");
|
|
996
|
+
if (!message.text.startsWith("POS") || data.length !== 12) {
|
|
997
|
+
if (options.debug) {
|
|
998
|
+
console.log(`Decoder: Unknown 12 message: ${message.text}`);
|
|
999
|
+
}
|
|
1000
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
1001
|
+
decodeResult.decoded = false;
|
|
1002
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
1003
|
+
return decodeResult;
|
|
1004
|
+
}
|
|
1005
|
+
const lat = data[0].substring(0, 8);
|
|
1006
|
+
const lon = data[0].substring(8);
|
|
1007
|
+
ResultFormatter.position(decodeResult, {
|
|
1008
|
+
latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),
|
|
1009
|
+
longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8)))
|
|
1010
|
+
});
|
|
1011
|
+
ResultFormatter.unknown(decodeResult, data[1]);
|
|
1012
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
|
|
1013
|
+
ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
|
|
1014
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
|
|
1015
|
+
ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim()));
|
|
1016
|
+
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()));
|
|
1017
|
+
ResultFormatter.departureAirport(decodeResult, data[9]);
|
|
1018
|
+
ResultFormatter.arrivalAirport(decodeResult, data[10]);
|
|
1019
|
+
ResultFormatter.unknown(decodeResult, data[11]);
|
|
1020
|
+
decodeResult.decoded = true;
|
|
1021
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
1022
|
+
return decodeResult;
|
|
1023
|
+
}
|
|
1024
|
+
};
|
|
1025
|
+
|
|
971
1026
|
// lib/plugins/Label_13Through18_Slash.ts
|
|
972
1027
|
var Label_13Through18_Slash = class extends DecoderPlugin {
|
|
973
1028
|
// eslint-disable-line camelcase
|
|
@@ -1079,9 +1134,19 @@ var Label_15 = class extends DecoderPlugin {
|
|
|
1079
1134
|
if (alt != "---") {
|
|
1080
1135
|
ResultFormatter.altitude(decodeResult, 100 * Number(alt));
|
|
1081
1136
|
}
|
|
1082
|
-
ResultFormatter.temperature(decodeResult, between.substring(22).
|
|
1137
|
+
ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(" ", "0"));
|
|
1138
|
+
} else if (between.substring(13, 16) === "OFF") {
|
|
1139
|
+
const ddmmyy = between.substring(16, 22);
|
|
1140
|
+
const hhmm = between.substring(22, 26);
|
|
1141
|
+
if (ddmmyy != "------") {
|
|
1142
|
+
const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
|
|
1143
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy), "epoch");
|
|
1144
|
+
} else {
|
|
1145
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), "tod");
|
|
1146
|
+
}
|
|
1147
|
+
ResultFormatter.unknown(decodeResult, between.substring(26));
|
|
1083
1148
|
} else {
|
|
1084
|
-
ResultFormatter.unknown(decodeResult, between.substring(
|
|
1149
|
+
ResultFormatter.unknown(decodeResult, between.substring(26));
|
|
1085
1150
|
}
|
|
1086
1151
|
} else {
|
|
1087
1152
|
if (options.debug) {
|
|
@@ -1450,7 +1515,6 @@ var Label_1L_Slash = class extends DecoderPlugin {
|
|
|
1450
1515
|
const part = parts[i].split(" ");
|
|
1451
1516
|
data.set(part[0], part.slice(1).join(" "));
|
|
1452
1517
|
}
|
|
1453
|
-
console.log(data);
|
|
1454
1518
|
const position = {
|
|
1455
1519
|
latitude: Number(data.get("LAT")),
|
|
1456
1520
|
longitude: Number(data.get("LON"))
|
|
@@ -1996,12 +2060,10 @@ var Label_44_POS = class extends DecoderPlugin {
|
|
|
1996
2060
|
}
|
|
1997
2061
|
ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));
|
|
1998
2062
|
const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
|
|
1999
|
-
decodeResult.
|
|
2000
|
-
|
|
2001
|
-
);
|
|
2002
|
-
decodeResult.
|
|
2003
|
-
(/* @__PURE__ */ new Date()).getFullYear() + "-" + results.groups.current_date.substr(0, 2) + "-" + results.groups.current_date.substr(2, 2) + "T" + results.groups.eta_time.substr(0, 2) + ":" + results.groups.eta_time.substr(2, 2) + ":00Z"
|
|
2004
|
-
);
|
|
2063
|
+
ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));
|
|
2064
|
+
ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));
|
|
2065
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00"));
|
|
2066
|
+
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00"));
|
|
2005
2067
|
if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
|
|
2006
2068
|
decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
|
|
2007
2069
|
}
|
|
@@ -2380,12 +2442,17 @@ function addCompanyRoute(decodeResult, value) {
|
|
|
2380
2442
|
}
|
|
2381
2443
|
|
|
2382
2444
|
// lib/utils/h1_helper.ts
|
|
2383
|
-
var H1Helper = class {
|
|
2445
|
+
var H1Helper = class _H1Helper {
|
|
2384
2446
|
static decodeH1Message(decodeResult, message) {
|
|
2385
2447
|
const checksum = message.slice(-4);
|
|
2386
2448
|
const data = message.slice(0, message.length - 4);
|
|
2387
2449
|
const fields = data.split("/");
|
|
2388
|
-
parseMessageType(decodeResult, fields[0]);
|
|
2450
|
+
const canDecode = parseMessageType(decodeResult, fields[0]);
|
|
2451
|
+
if (!canDecode) {
|
|
2452
|
+
decodeResult.decoded = false;
|
|
2453
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2454
|
+
return;
|
|
2455
|
+
}
|
|
2389
2456
|
for (let i = 1; i < fields.length; ++i) {
|
|
2390
2457
|
if (fields[i].startsWith("FN")) {
|
|
2391
2458
|
decodeResult.raw.flight_number = fields[i].substring(2);
|
|
@@ -2394,16 +2461,9 @@ var H1Helper = class {
|
|
|
2394
2461
|
} else if (fields[i].startsWith("DC")) {
|
|
2395
2462
|
processDC(decodeResult, fields[i].substring(2).split(","));
|
|
2396
2463
|
} else if (fields[i].startsWith("TS")) {
|
|
2397
|
-
|
|
2398
|
-
let time = DateTimeUtils.convertDateTimeToEpoch(ts[0], ts[1]);
|
|
2399
|
-
if (Number.isNaN(time)) {
|
|
2400
|
-
const date = ts[1].substring(2, 4) + ts[1].substring(0, 2) + ts[1].substring(4, 6);
|
|
2401
|
-
time = DateTimeUtils.convertDateTimeToEpoch(ts[0], date);
|
|
2402
|
-
}
|
|
2403
|
-
decodeResult.raw.message_date = ts[1];
|
|
2404
|
-
decodeResult.raw.message_timestamp = time;
|
|
2464
|
+
_H1Helper.processTS(decodeResult, fields[i].substring(2).split(","));
|
|
2405
2465
|
} else if (fields[i].startsWith("PS")) {
|
|
2406
|
-
|
|
2466
|
+
_H1Helper.processPS(decodeResult, fields[i].substring(2).split(","));
|
|
2407
2467
|
} else if (fields[i].startsWith("DT")) {
|
|
2408
2468
|
const data2 = fields[i].substring(2).split(",");
|
|
2409
2469
|
processDT(decodeResult, data2);
|
|
@@ -2432,6 +2492,8 @@ var H1Helper = class {
|
|
|
2432
2492
|
} else {
|
|
2433
2493
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2434
2494
|
}
|
|
2495
|
+
} else if (fields[i].startsWith("WD")) {
|
|
2496
|
+
processWindData(decodeResult, fields[i].substring(2));
|
|
2435
2497
|
} else {
|
|
2436
2498
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2437
2499
|
}
|
|
@@ -2441,6 +2503,56 @@ var H1Helper = class {
|
|
|
2441
2503
|
}
|
|
2442
2504
|
return true;
|
|
2443
2505
|
}
|
|
2506
|
+
static processPS(decodeResult, data) {
|
|
2507
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2508
|
+
if (position) {
|
|
2509
|
+
decodeResult.raw.position = position;
|
|
2510
|
+
decodeResult.formatted.items.push({
|
|
2511
|
+
type: "aircraft_position",
|
|
2512
|
+
code: "POS",
|
|
2513
|
+
label: "Aircraft Position",
|
|
2514
|
+
value: CoordinateUtils.coordinateString(position)
|
|
2515
|
+
});
|
|
2516
|
+
}
|
|
2517
|
+
if (data.length === 9) {
|
|
2518
|
+
processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
|
|
2519
|
+
ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
|
|
2520
|
+
ResultFormatter.temperature(decodeResult, data[6]);
|
|
2521
|
+
ResultFormatter.unknown(decodeResult, data[7]);
|
|
2522
|
+
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2523
|
+
}
|
|
2524
|
+
if (data.length === 14) {
|
|
2525
|
+
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2526
|
+
processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
|
|
2527
|
+
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2528
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(8));
|
|
2529
|
+
}
|
|
2530
|
+
}
|
|
2531
|
+
static processPosition(decodeResult, data) {
|
|
2532
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2533
|
+
if (position) {
|
|
2534
|
+
ResultFormatter.position(decodeResult, position);
|
|
2535
|
+
}
|
|
2536
|
+
if (data.length >= 10) {
|
|
2537
|
+
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2538
|
+
processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
|
|
2539
|
+
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2540
|
+
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2541
|
+
ResultFormatter.unknown(decodeResult, data[9]);
|
|
2542
|
+
}
|
|
2543
|
+
if (data.length >= 14) {
|
|
2544
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(10));
|
|
2545
|
+
}
|
|
2546
|
+
}
|
|
2547
|
+
static processTS(decodeResult, data) {
|
|
2548
|
+
let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);
|
|
2549
|
+
if (Number.isNaN(time)) {
|
|
2550
|
+
const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
|
|
2551
|
+
time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
|
|
2552
|
+
}
|
|
2553
|
+
decodeResult.raw.message_date = data[1];
|
|
2554
|
+
decodeResult.raw.message_timestamp = time;
|
|
2555
|
+
}
|
|
2444
2556
|
};
|
|
2445
2557
|
function processAirField(decodeResult, data) {
|
|
2446
2558
|
if (data.length === 2) {
|
|
@@ -2518,7 +2630,7 @@ function parseMessageType(decodeResult, messageType) {
|
|
|
2518
2630
|
if (parts.length == 1) {
|
|
2519
2631
|
const type = parts[0].substring(0, 3);
|
|
2520
2632
|
if (type === "POS" && parts[0].length !== 3) {
|
|
2521
|
-
|
|
2633
|
+
H1Helper.processPosition(decodeResult, parts[0].substring(3).split(","));
|
|
2522
2634
|
}
|
|
2523
2635
|
return processMessageType(decodeResult, type);
|
|
2524
2636
|
} else if (parts.length == 2) {
|
|
@@ -2529,11 +2641,12 @@ function parseMessageType(decodeResult, messageType) {
|
|
|
2529
2641
|
}
|
|
2530
2642
|
const type = parts[1].length == 5 ? parts[1].substring(2, 5) : parts[1].substring(3, 6);
|
|
2531
2643
|
if (parts[1].substring(3, 6) === "POS" && parts[1].length > 6) {
|
|
2532
|
-
|
|
2644
|
+
H1Helper.processPosition(decodeResult, parts[1].substring(6).split(","));
|
|
2533
2645
|
}
|
|
2534
|
-
processMessageType(decodeResult, type);
|
|
2646
|
+
return processMessageType(decodeResult, type);
|
|
2535
2647
|
} else {
|
|
2536
2648
|
ResultFormatter.unknown(decodeResult, messageType);
|
|
2649
|
+
return false;
|
|
2537
2650
|
}
|
|
2538
2651
|
}
|
|
2539
2652
|
function processMessageType(decodeResult, type) {
|
|
@@ -2547,9 +2660,13 @@ function processMessageType(decodeResult, type) {
|
|
|
2547
2660
|
decodeResult.formatted.description = "Position Report";
|
|
2548
2661
|
} else if (type === "PRG") {
|
|
2549
2662
|
decodeResult.formatted.description = "Progress Report";
|
|
2663
|
+
} else if (type === "PWI") {
|
|
2664
|
+
decodeResult.formatted.description = "Weather Report";
|
|
2550
2665
|
} else {
|
|
2551
2666
|
decodeResult.formatted.description = "Unknown H1 Message";
|
|
2667
|
+
return false;
|
|
2552
2668
|
}
|
|
2669
|
+
return true;
|
|
2553
2670
|
}
|
|
2554
2671
|
function processDC(decodeResult, data) {
|
|
2555
2672
|
decodeResult.raw.message_date = data[0];
|
|
@@ -2560,60 +2677,6 @@ function processDC(decodeResult, data) {
|
|
|
2560
2677
|
decodeResult.raw.message_timestamp = time;
|
|
2561
2678
|
}
|
|
2562
2679
|
}
|
|
2563
|
-
function processPS(decodeResult, data) {
|
|
2564
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2565
|
-
if (position) {
|
|
2566
|
-
decodeResult.raw.position = position;
|
|
2567
|
-
decodeResult.formatted.items.push({
|
|
2568
|
-
type: "aircraft_position",
|
|
2569
|
-
code: "POS",
|
|
2570
|
-
label: "Aircraft Position",
|
|
2571
|
-
value: CoordinateUtils.coordinateString(position)
|
|
2572
|
-
});
|
|
2573
|
-
}
|
|
2574
|
-
if (data.length === 9) {
|
|
2575
|
-
processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
|
|
2576
|
-
ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
|
|
2577
|
-
ResultFormatter.temperature(decodeResult, data[6]);
|
|
2578
|
-
ResultFormatter.unknown(decodeResult, data[7]);
|
|
2579
|
-
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2580
|
-
}
|
|
2581
|
-
if (data.length === 14) {
|
|
2582
|
-
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2583
|
-
processRoute(decodeResult, data[4], data[2], data[6], data[5], void 0);
|
|
2584
|
-
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2585
|
-
ResultFormatter.groundspeed(decodeResult, Number(data[10]));
|
|
2586
|
-
ResultFormatter.unknown(decodeResult, data[1]);
|
|
2587
|
-
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2588
|
-
ResultFormatter.unknown(decodeResult, data[9]);
|
|
2589
|
-
ResultFormatter.unknown(decodeResult, data.slice(11).join(","));
|
|
2590
|
-
}
|
|
2591
|
-
}
|
|
2592
|
-
function processPosition2(decodeResult, data) {
|
|
2593
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2594
|
-
if (position) {
|
|
2595
|
-
decodeResult.raw.position = position;
|
|
2596
|
-
decodeResult.formatted.items.push({
|
|
2597
|
-
type: "aircraft_position",
|
|
2598
|
-
code: "POS",
|
|
2599
|
-
label: "Aircraft Position",
|
|
2600
|
-
value: CoordinateUtils.coordinateString(position)
|
|
2601
|
-
});
|
|
2602
|
-
}
|
|
2603
|
-
if (data.length >= 10) {
|
|
2604
|
-
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2605
|
-
processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
|
|
2606
|
-
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2607
|
-
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2608
|
-
ResultFormatter.unknown(decodeResult, data[9]);
|
|
2609
|
-
}
|
|
2610
|
-
if (data.length >= 14) {
|
|
2611
|
-
ResultFormatter.groundspeed(decodeResult, Number(data[10]));
|
|
2612
|
-
ResultFormatter.unknown(decodeResult, data[11]);
|
|
2613
|
-
ResultFormatter.unknown(decodeResult, data[12]);
|
|
2614
|
-
ResultFormatter.unknown(decodeResult, data[13]);
|
|
2615
|
-
}
|
|
2616
|
-
}
|
|
2617
2680
|
function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
2618
2681
|
const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
|
|
2619
2682
|
const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
|
|
@@ -2634,6 +2697,55 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
|
2634
2697
|
value: RouteUtils.routeToString(decodeResult.raw.route)
|
|
2635
2698
|
});
|
|
2636
2699
|
}
|
|
2700
|
+
function processWindData(decodeResult, message) {
|
|
2701
|
+
if (decodeResult.raw.wind_data === void 0) {
|
|
2702
|
+
decodeResult.raw.wind_data = [];
|
|
2703
|
+
}
|
|
2704
|
+
const flightLevel = Number(message.slice(0, 3));
|
|
2705
|
+
const fields = message.slice(4).split(".");
|
|
2706
|
+
fields.forEach((field) => {
|
|
2707
|
+
const data = field.split(",");
|
|
2708
|
+
const waypoint = data[0];
|
|
2709
|
+
const windData = data[1];
|
|
2710
|
+
const windDirection = Number(windData.slice(0, 3));
|
|
2711
|
+
const windSpeed = Number(windData.slice(3));
|
|
2712
|
+
if (data.length === 3) {
|
|
2713
|
+
const tempData = data[2];
|
|
2714
|
+
const tempFlightLevel = Number(tempData.slice(0, 3));
|
|
2715
|
+
const tempString = tempData.slice(3);
|
|
2716
|
+
const tempDegrees = Number(tempString.substring(1)) * (tempString.charAt(0) === "M" ? -1 : 1);
|
|
2717
|
+
decodeResult.raw.wind_data.push({
|
|
2718
|
+
waypoint,
|
|
2719
|
+
flightLevel,
|
|
2720
|
+
windDirection,
|
|
2721
|
+
windSpeed,
|
|
2722
|
+
temperature: {
|
|
2723
|
+
flightLevel: tempFlightLevel,
|
|
2724
|
+
degreesC: tempDegrees
|
|
2725
|
+
}
|
|
2726
|
+
});
|
|
2727
|
+
decodeResult.formatted.items.push({
|
|
2728
|
+
type: "wind_data",
|
|
2729
|
+
code: "WIND",
|
|
2730
|
+
label: "Wind Data",
|
|
2731
|
+
value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt, ${tempDegrees}\xB0C at FL${tempFlightLevel}`
|
|
2732
|
+
});
|
|
2733
|
+
} else {
|
|
2734
|
+
decodeResult.raw.wind_data.push({
|
|
2735
|
+
waypoint,
|
|
2736
|
+
flightLevel,
|
|
2737
|
+
windDirection,
|
|
2738
|
+
windSpeed
|
|
2739
|
+
});
|
|
2740
|
+
decodeResult.formatted.items.push({
|
|
2741
|
+
type: "wind_data",
|
|
2742
|
+
code: "WIND",
|
|
2743
|
+
label: "Wind Data",
|
|
2744
|
+
value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt`
|
|
2745
|
+
});
|
|
2746
|
+
}
|
|
2747
|
+
});
|
|
2748
|
+
}
|
|
2637
2749
|
|
|
2638
2750
|
// lib/plugins/Label_4J_POS.ts
|
|
2639
2751
|
var Label_4J_POS = class extends DecoderPlugin {
|
|
@@ -2725,6 +2837,129 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
2725
2837
|
}
|
|
2726
2838
|
};
|
|
2727
2839
|
|
|
2840
|
+
// lib/plugins/Label_4T_AGFSR.ts
|
|
2841
|
+
var Label_4T_AGFSR = class extends DecoderPlugin {
|
|
2842
|
+
name = "label-4t-agfsr";
|
|
2843
|
+
qualifiers() {
|
|
2844
|
+
return {
|
|
2845
|
+
labels: ["4T"],
|
|
2846
|
+
preambles: ["AGFSR"]
|
|
2847
|
+
};
|
|
2848
|
+
}
|
|
2849
|
+
decode(message, options = {}) {
|
|
2850
|
+
const decodeResult = this.defaultResult();
|
|
2851
|
+
decodeResult.decoder.name = this.name;
|
|
2852
|
+
decodeResult.formatted.description = "Position Report";
|
|
2853
|
+
decodeResult.message = message;
|
|
2854
|
+
const data = message.text.substring(5).split("/");
|
|
2855
|
+
if (!message.text.startsWith("AGFSR") || data.length !== 20) {
|
|
2856
|
+
if (options.debug) {
|
|
2857
|
+
console.log(`Decoder: Unknown 4T message: ${message.text}`);
|
|
2858
|
+
}
|
|
2859
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2860
|
+
decodeResult.decoded = false;
|
|
2861
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2862
|
+
return decodeResult;
|
|
2863
|
+
}
|
|
2864
|
+
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
2865
|
+
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
2866
|
+
ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
|
|
2867
|
+
ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
|
|
2868
|
+
ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
|
|
2869
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
|
|
2870
|
+
ResultFormatter.unknown(decodeResult, data[5], "/");
|
|
2871
|
+
const lat = data[6].substring(0, 7);
|
|
2872
|
+
const lon = data[6].substring(7, 15);
|
|
2873
|
+
ResultFormatter.position(decodeResult, {
|
|
2874
|
+
latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) + Number(lat.substring(2, 6)) / 60,
|
|
2875
|
+
longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) + Number(lon.substring(3, 7)) / 60
|
|
2876
|
+
});
|
|
2877
|
+
ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));
|
|
2878
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(8), "/");
|
|
2879
|
+
decodeResult.decoded = true;
|
|
2880
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
2881
|
+
return decodeResult;
|
|
2882
|
+
}
|
|
2883
|
+
};
|
|
2884
|
+
|
|
2885
|
+
// lib/plugins/Label_58.ts
|
|
2886
|
+
var Label_58 = class extends DecoderPlugin {
|
|
2887
|
+
name = "label-58";
|
|
2888
|
+
qualifiers() {
|
|
2889
|
+
return {
|
|
2890
|
+
labels: ["58"]
|
|
2891
|
+
};
|
|
2892
|
+
}
|
|
2893
|
+
decode(message, options = {}) {
|
|
2894
|
+
const decodeResult = this.defaultResult();
|
|
2895
|
+
decodeResult.decoder.name = this.name;
|
|
2896
|
+
decodeResult.formatted.description = "Position Report";
|
|
2897
|
+
decodeResult.message = message;
|
|
2898
|
+
const data = message.text.split("/");
|
|
2899
|
+
if (data.length === 8) {
|
|
2900
|
+
ResultFormatter.flightNumber(decodeResult, data[0]);
|
|
2901
|
+
ResultFormatter.day(decodeResult, Number(data[1]));
|
|
2902
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
|
|
2903
|
+
const lat = data[3];
|
|
2904
|
+
const lon = data[4];
|
|
2905
|
+
ResultFormatter.position(decodeResult, {
|
|
2906
|
+
latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
|
|
2907
|
+
longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
|
|
2908
|
+
});
|
|
2909
|
+
ResultFormatter.altitude(decodeResult, Number(data[5]));
|
|
2910
|
+
ResultFormatter.unknown(decodeResult, data[6], "/");
|
|
2911
|
+
ResultFormatter.unknown(decodeResult, data[7], "/");
|
|
2912
|
+
} else {
|
|
2913
|
+
if (options.debug) {
|
|
2914
|
+
console.log(`Decoder: Unknown 58 message: ${message.text}`);
|
|
2915
|
+
}
|
|
2916
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2917
|
+
decodeResult.decoded = false;
|
|
2918
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2919
|
+
return decodeResult;
|
|
2920
|
+
}
|
|
2921
|
+
decodeResult.decoded = true;
|
|
2922
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
2923
|
+
return decodeResult;
|
|
2924
|
+
}
|
|
2925
|
+
};
|
|
2926
|
+
|
|
2927
|
+
// lib/plugins/Label_4T_ETA.ts
|
|
2928
|
+
var Label_4T_ETA = class extends DecoderPlugin {
|
|
2929
|
+
name = "label-4t-eta";
|
|
2930
|
+
qualifiers() {
|
|
2931
|
+
return {
|
|
2932
|
+
labels: ["4T"],
|
|
2933
|
+
preambles: ["ETA"]
|
|
2934
|
+
};
|
|
2935
|
+
}
|
|
2936
|
+
decode(message, options = {}) {
|
|
2937
|
+
const decodeResult = this.defaultResult();
|
|
2938
|
+
decodeResult.decoder.name = this.name;
|
|
2939
|
+
decodeResult.formatted.description = "ETA Report";
|
|
2940
|
+
decodeResult.message = message;
|
|
2941
|
+
const data = message.text.substring(3).split("/");
|
|
2942
|
+
if (!message.text.startsWith("ETA") || data.length !== 3) {
|
|
2943
|
+
if (options.debug) {
|
|
2944
|
+
console.log(`Decoder: Unknown 4T message: ${message.text}`);
|
|
2945
|
+
}
|
|
2946
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2947
|
+
decodeResult.decoded = false;
|
|
2948
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2949
|
+
return decodeResult;
|
|
2950
|
+
}
|
|
2951
|
+
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
2952
|
+
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
2953
|
+
const etaData = data[2].split(" ");
|
|
2954
|
+
ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
|
|
2955
|
+
ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
|
|
2956
|
+
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
|
|
2957
|
+
decodeResult.decoded = true;
|
|
2958
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
2959
|
+
return decodeResult;
|
|
2960
|
+
}
|
|
2961
|
+
};
|
|
2962
|
+
|
|
2728
2963
|
// lib/plugins/Label_80.ts
|
|
2729
2964
|
var Label_80 = class extends DecoderPlugin {
|
|
2730
2965
|
name = "label-80";
|
|
@@ -3161,6 +3396,65 @@ var Label_H1_OHMA = class extends DecoderPlugin {
|
|
|
3161
3396
|
}
|
|
3162
3397
|
};
|
|
3163
3398
|
|
|
3399
|
+
// lib/plugins/Label_H1_Slash.ts
|
|
3400
|
+
var Label_H1_Slash = class extends DecoderPlugin {
|
|
3401
|
+
name = "label-h1-slash";
|
|
3402
|
+
qualifiers() {
|
|
3403
|
+
return {
|
|
3404
|
+
labels: ["H1"],
|
|
3405
|
+
preambles: ["/"]
|
|
3406
|
+
};
|
|
3407
|
+
}
|
|
3408
|
+
decode(message, options = {}) {
|
|
3409
|
+
let decodeResult = this.defaultResult();
|
|
3410
|
+
decodeResult.decoder.name = this.name;
|
|
3411
|
+
decodeResult.formatted.description = "Position Report";
|
|
3412
|
+
decodeResult.message = message;
|
|
3413
|
+
const checksum = message.text.slice(-4);
|
|
3414
|
+
const data = message.text.slice(0, message.text.length - 4);
|
|
3415
|
+
const fields = data.split("/");
|
|
3416
|
+
if (fields[0] !== "") {
|
|
3417
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3418
|
+
decodeResult.decoded = false;
|
|
3419
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
3420
|
+
return decodeResult;
|
|
3421
|
+
}
|
|
3422
|
+
const headerData = fields[1].split(".");
|
|
3423
|
+
ResultFormatter.unknown(decodeResult, headerData[0]);
|
|
3424
|
+
if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
|
|
3425
|
+
H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
|
|
3426
|
+
} else if (headerData[1] === "POS") {
|
|
3427
|
+
} else if (headerData[1].startsWith("POS")) {
|
|
3428
|
+
H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
|
|
3429
|
+
} else {
|
|
3430
|
+
ResultFormatter.unknown(decodeResult, headerData[1], ".");
|
|
3431
|
+
}
|
|
3432
|
+
for (let i = 2; i < fields.length; i++) {
|
|
3433
|
+
const field = fields[i];
|
|
3434
|
+
if (field.startsWith("TS")) {
|
|
3435
|
+
H1Helper.processTS(decodeResult, field.substring(2, 15).split(","));
|
|
3436
|
+
} else if (field.startsWith("PS")) {
|
|
3437
|
+
H1Helper.processPS(decodeResult, field.substring(2).split(","));
|
|
3438
|
+
} else {
|
|
3439
|
+
ResultFormatter.unknown(decodeResult, field, "/");
|
|
3440
|
+
}
|
|
3441
|
+
}
|
|
3442
|
+
if (decodeResult.formatted.items.length === 0) {
|
|
3443
|
+
if (options.debug) {
|
|
3444
|
+
console.log(`Decoder: Unknown H1 message: ${message.text}`);
|
|
3445
|
+
}
|
|
3446
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3447
|
+
decodeResult.decoded = false;
|
|
3448
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
3449
|
+
return decodeResult;
|
|
3450
|
+
}
|
|
3451
|
+
ResultFormatter.checksum(decodeResult, checksum);
|
|
3452
|
+
decodeResult.decoded = true;
|
|
3453
|
+
decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
|
|
3454
|
+
return decodeResult;
|
|
3455
|
+
}
|
|
3456
|
+
};
|
|
3457
|
+
|
|
3164
3458
|
// lib/plugins/Label_H1_StarPOS.ts
|
|
3165
3459
|
var Label_H1_StarPOS = class extends DecoderPlugin {
|
|
3166
3460
|
name = "label-h1-star-pos";
|
|
@@ -4341,6 +4635,7 @@ var MessageDecoder = class {
|
|
|
4341
4635
|
this.registerPlugin(new Label_10_POS(this));
|
|
4342
4636
|
this.registerPlugin(new Label_10_Slash(this));
|
|
4343
4637
|
this.registerPlugin(new Label_12_N_Space(this));
|
|
4638
|
+
this.registerPlugin(new Label_12_POS(this));
|
|
4344
4639
|
this.registerPlugin(new Label_13Through18_Slash(this));
|
|
4345
4640
|
this.registerPlugin(new Label_15(this));
|
|
4346
4641
|
this.registerPlugin(new Label_15_FST(this));
|
|
@@ -4367,13 +4662,17 @@ var MessageDecoder = class {
|
|
|
4367
4662
|
this.registerPlugin(new Label_4A_Slash_01(this));
|
|
4368
4663
|
this.registerPlugin(new Label_4J_POS(this));
|
|
4369
4664
|
this.registerPlugin(new Label_4N(this));
|
|
4665
|
+
this.registerPlugin(new Label_4T_AGFSR(this));
|
|
4666
|
+
this.registerPlugin(new Label_4T_ETA(this));
|
|
4370
4667
|
this.registerPlugin(new Label_B6_Forwardslash(this));
|
|
4371
4668
|
this.registerPlugin(new Label_H1_FLR(this));
|
|
4372
4669
|
this.registerPlugin(new Label_H1_OHMA(this));
|
|
4373
4670
|
this.registerPlugin(new Label_H1_WRN(this));
|
|
4374
4671
|
this.registerPlugin(new Label_H1(this));
|
|
4672
|
+
this.registerPlugin(new Label_H1_Slash(this));
|
|
4375
4673
|
this.registerPlugin(new Label_H1_StarPOS(this));
|
|
4376
4674
|
this.registerPlugin(new Label_HX(this));
|
|
4675
|
+
this.registerPlugin(new Label_58(this));
|
|
4377
4676
|
this.registerPlugin(new Label_80(this));
|
|
4378
4677
|
this.registerPlugin(new Label_83(this));
|
|
4379
4678
|
this.registerPlugin(new Label_8E(this));
|