@airframes/acars-decoder 1.6.15 → 1.6.16
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/dist/index.js +327 -79
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +327 -79
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -4
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"))
|
|
@@ -2380,12 +2444,17 @@ function addCompanyRoute(decodeResult, value) {
|
|
|
2380
2444
|
}
|
|
2381
2445
|
|
|
2382
2446
|
// lib/utils/h1_helper.ts
|
|
2383
|
-
var H1Helper = class {
|
|
2447
|
+
var H1Helper = class _H1Helper {
|
|
2384
2448
|
static decodeH1Message(decodeResult, message) {
|
|
2385
2449
|
const checksum = message.slice(-4);
|
|
2386
2450
|
const data = message.slice(0, message.length - 4);
|
|
2387
2451
|
const fields = data.split("/");
|
|
2388
|
-
parseMessageType(decodeResult, fields[0]);
|
|
2452
|
+
const canDecode = parseMessageType(decodeResult, fields[0]);
|
|
2453
|
+
if (!canDecode) {
|
|
2454
|
+
decodeResult.decoded = false;
|
|
2455
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2456
|
+
return;
|
|
2457
|
+
}
|
|
2389
2458
|
for (let i = 1; i < fields.length; ++i) {
|
|
2390
2459
|
if (fields[i].startsWith("FN")) {
|
|
2391
2460
|
decodeResult.raw.flight_number = fields[i].substring(2);
|
|
@@ -2394,16 +2463,9 @@ var H1Helper = class {
|
|
|
2394
2463
|
} else if (fields[i].startsWith("DC")) {
|
|
2395
2464
|
processDC(decodeResult, fields[i].substring(2).split(","));
|
|
2396
2465
|
} 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;
|
|
2466
|
+
_H1Helper.processTS(decodeResult, fields[i].substring(2).split(","));
|
|
2405
2467
|
} else if (fields[i].startsWith("PS")) {
|
|
2406
|
-
|
|
2468
|
+
_H1Helper.processPS(decodeResult, fields[i].substring(2).split(","));
|
|
2407
2469
|
} else if (fields[i].startsWith("DT")) {
|
|
2408
2470
|
const data2 = fields[i].substring(2).split(",");
|
|
2409
2471
|
processDT(decodeResult, data2);
|
|
@@ -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) {
|
|
@@ -2549,7 +2662,9 @@ function processMessageType(decodeResult, type) {
|
|
|
2549
2662
|
decodeResult.formatted.description = "Progress Report";
|
|
2550
2663
|
} else {
|
|
2551
2664
|
decodeResult.formatted.description = "Unknown H1 Message";
|
|
2665
|
+
return false;
|
|
2552
2666
|
}
|
|
2667
|
+
return true;
|
|
2553
2668
|
}
|
|
2554
2669
|
function processDC(decodeResult, data) {
|
|
2555
2670
|
decodeResult.raw.message_date = data[0];
|
|
@@ -2560,60 +2675,6 @@ function processDC(decodeResult, data) {
|
|
|
2560
2675
|
decodeResult.raw.message_timestamp = time;
|
|
2561
2676
|
}
|
|
2562
2677
|
}
|
|
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
2678
|
function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
2618
2679
|
const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
|
|
2619
2680
|
const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
|
|
@@ -2725,6 +2786,129 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
2725
2786
|
}
|
|
2726
2787
|
};
|
|
2727
2788
|
|
|
2789
|
+
// lib/plugins/Label_4T_AGFSR.ts
|
|
2790
|
+
var Label_4T_AGFSR = class extends DecoderPlugin {
|
|
2791
|
+
name = "label-4t-agfsr";
|
|
2792
|
+
qualifiers() {
|
|
2793
|
+
return {
|
|
2794
|
+
labels: ["4T"],
|
|
2795
|
+
preambles: ["AGFSR"]
|
|
2796
|
+
};
|
|
2797
|
+
}
|
|
2798
|
+
decode(message, options = {}) {
|
|
2799
|
+
const decodeResult = this.defaultResult();
|
|
2800
|
+
decodeResult.decoder.name = this.name;
|
|
2801
|
+
decodeResult.formatted.description = "Position Report";
|
|
2802
|
+
decodeResult.message = message;
|
|
2803
|
+
const data = message.text.substring(5).split("/");
|
|
2804
|
+
if (!message.text.startsWith("AGFSR") || data.length !== 20) {
|
|
2805
|
+
if (options.debug) {
|
|
2806
|
+
console.log(`Decoder: Unknown 4T message: ${message.text}`);
|
|
2807
|
+
}
|
|
2808
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2809
|
+
decodeResult.decoded = false;
|
|
2810
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2811
|
+
return decodeResult;
|
|
2812
|
+
}
|
|
2813
|
+
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
2814
|
+
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
2815
|
+
ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
|
|
2816
|
+
ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
|
|
2817
|
+
ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
|
|
2818
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
|
|
2819
|
+
ResultFormatter.unknown(decodeResult, data[5], "/");
|
|
2820
|
+
const lat = data[6].substring(0, 7);
|
|
2821
|
+
const lon = data[6].substring(7, 15);
|
|
2822
|
+
ResultFormatter.position(decodeResult, {
|
|
2823
|
+
latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) + Number(lat.substring(2, 6)) / 60,
|
|
2824
|
+
longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) + Number(lon.substring(3, 7)) / 60
|
|
2825
|
+
});
|
|
2826
|
+
ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));
|
|
2827
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(8), "/");
|
|
2828
|
+
decodeResult.decoded = true;
|
|
2829
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
2830
|
+
return decodeResult;
|
|
2831
|
+
}
|
|
2832
|
+
};
|
|
2833
|
+
|
|
2834
|
+
// lib/plugins/Label_58.ts
|
|
2835
|
+
var Label_58 = class extends DecoderPlugin {
|
|
2836
|
+
name = "label-58";
|
|
2837
|
+
qualifiers() {
|
|
2838
|
+
return {
|
|
2839
|
+
labels: ["58"]
|
|
2840
|
+
};
|
|
2841
|
+
}
|
|
2842
|
+
decode(message, options = {}) {
|
|
2843
|
+
const decodeResult = this.defaultResult();
|
|
2844
|
+
decodeResult.decoder.name = this.name;
|
|
2845
|
+
decodeResult.formatted.description = "Position Report";
|
|
2846
|
+
decodeResult.message = message;
|
|
2847
|
+
const data = message.text.split("/");
|
|
2848
|
+
if (data.length === 8) {
|
|
2849
|
+
ResultFormatter.flightNumber(decodeResult, data[0]);
|
|
2850
|
+
ResultFormatter.day(decodeResult, Number(data[1]));
|
|
2851
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
|
|
2852
|
+
const lat = data[3];
|
|
2853
|
+
const lon = data[4];
|
|
2854
|
+
ResultFormatter.position(decodeResult, {
|
|
2855
|
+
latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
|
|
2856
|
+
longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
|
|
2857
|
+
});
|
|
2858
|
+
ResultFormatter.altitude(decodeResult, Number(data[5]));
|
|
2859
|
+
ResultFormatter.unknown(decodeResult, data[6], "/");
|
|
2860
|
+
ResultFormatter.unknown(decodeResult, data[7], "/");
|
|
2861
|
+
} else {
|
|
2862
|
+
if (options.debug) {
|
|
2863
|
+
console.log(`Decoder: Unknown 58 message: ${message.text}`);
|
|
2864
|
+
}
|
|
2865
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2866
|
+
decodeResult.decoded = false;
|
|
2867
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2868
|
+
return decodeResult;
|
|
2869
|
+
}
|
|
2870
|
+
decodeResult.decoded = true;
|
|
2871
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
2872
|
+
return decodeResult;
|
|
2873
|
+
}
|
|
2874
|
+
};
|
|
2875
|
+
|
|
2876
|
+
// lib/plugins/Label_4T_ETA.ts
|
|
2877
|
+
var Label_4T_ETA = class extends DecoderPlugin {
|
|
2878
|
+
name = "label-4t-eta";
|
|
2879
|
+
qualifiers() {
|
|
2880
|
+
return {
|
|
2881
|
+
labels: ["4T"],
|
|
2882
|
+
preambles: ["ETA"]
|
|
2883
|
+
};
|
|
2884
|
+
}
|
|
2885
|
+
decode(message, options = {}) {
|
|
2886
|
+
const decodeResult = this.defaultResult();
|
|
2887
|
+
decodeResult.decoder.name = this.name;
|
|
2888
|
+
decodeResult.formatted.description = "ETA Report";
|
|
2889
|
+
decodeResult.message = message;
|
|
2890
|
+
const data = message.text.substring(3).split("/");
|
|
2891
|
+
if (!message.text.startsWith("ETA") || data.length !== 3) {
|
|
2892
|
+
if (options.debug) {
|
|
2893
|
+
console.log(`Decoder: Unknown 4T message: ${message.text}`);
|
|
2894
|
+
}
|
|
2895
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2896
|
+
decodeResult.decoded = false;
|
|
2897
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2898
|
+
return decodeResult;
|
|
2899
|
+
}
|
|
2900
|
+
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
2901
|
+
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
2902
|
+
const etaData = data[2].split(" ");
|
|
2903
|
+
ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
|
|
2904
|
+
ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
|
|
2905
|
+
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
|
|
2906
|
+
decodeResult.decoded = true;
|
|
2907
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
2908
|
+
return decodeResult;
|
|
2909
|
+
}
|
|
2910
|
+
};
|
|
2911
|
+
|
|
2728
2912
|
// lib/plugins/Label_80.ts
|
|
2729
2913
|
var Label_80 = class extends DecoderPlugin {
|
|
2730
2914
|
name = "label-80";
|
|
@@ -3161,6 +3345,65 @@ var Label_H1_OHMA = class extends DecoderPlugin {
|
|
|
3161
3345
|
}
|
|
3162
3346
|
};
|
|
3163
3347
|
|
|
3348
|
+
// lib/plugins/Label_H1_Slash.ts
|
|
3349
|
+
var Label_H1_Slash = class extends DecoderPlugin {
|
|
3350
|
+
name = "label-h1-slash";
|
|
3351
|
+
qualifiers() {
|
|
3352
|
+
return {
|
|
3353
|
+
labels: ["H1"],
|
|
3354
|
+
preambles: ["/"]
|
|
3355
|
+
};
|
|
3356
|
+
}
|
|
3357
|
+
decode(message, options = {}) {
|
|
3358
|
+
let decodeResult = this.defaultResult();
|
|
3359
|
+
decodeResult.decoder.name = this.name;
|
|
3360
|
+
decodeResult.formatted.description = "Position Report";
|
|
3361
|
+
decodeResult.message = message;
|
|
3362
|
+
const checksum = message.text.slice(-4);
|
|
3363
|
+
const data = message.text.slice(0, message.text.length - 4);
|
|
3364
|
+
const fields = data.split("/");
|
|
3365
|
+
if (fields[0] !== "") {
|
|
3366
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3367
|
+
decodeResult.decoded = false;
|
|
3368
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
3369
|
+
return decodeResult;
|
|
3370
|
+
}
|
|
3371
|
+
const headerData = fields[1].split(".");
|
|
3372
|
+
ResultFormatter.unknown(decodeResult, headerData[0]);
|
|
3373
|
+
if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
|
|
3374
|
+
H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
|
|
3375
|
+
} else if (headerData[1] === "POS") {
|
|
3376
|
+
} else if (headerData[1].startsWith("POS")) {
|
|
3377
|
+
H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
|
|
3378
|
+
} else {
|
|
3379
|
+
ResultFormatter.unknown(decodeResult, headerData[1], ".");
|
|
3380
|
+
}
|
|
3381
|
+
for (let i = 2; i < fields.length; i++) {
|
|
3382
|
+
const field = fields[i];
|
|
3383
|
+
if (field.startsWith("TS")) {
|
|
3384
|
+
H1Helper.processTS(decodeResult, field.substring(2, 15).split(","));
|
|
3385
|
+
} else if (field.startsWith("PS")) {
|
|
3386
|
+
H1Helper.processPS(decodeResult, field.substring(2).split(","));
|
|
3387
|
+
} else {
|
|
3388
|
+
ResultFormatter.unknown(decodeResult, field, "/");
|
|
3389
|
+
}
|
|
3390
|
+
}
|
|
3391
|
+
if (decodeResult.formatted.items.length === 0) {
|
|
3392
|
+
if (options.debug) {
|
|
3393
|
+
console.log(`Decoder: Unknown H1 message: ${message.text}`);
|
|
3394
|
+
}
|
|
3395
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3396
|
+
decodeResult.decoded = false;
|
|
3397
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
3398
|
+
return decodeResult;
|
|
3399
|
+
}
|
|
3400
|
+
ResultFormatter.checksum(decodeResult, checksum);
|
|
3401
|
+
decodeResult.decoded = true;
|
|
3402
|
+
decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
|
|
3403
|
+
return decodeResult;
|
|
3404
|
+
}
|
|
3405
|
+
};
|
|
3406
|
+
|
|
3164
3407
|
// lib/plugins/Label_H1_StarPOS.ts
|
|
3165
3408
|
var Label_H1_StarPOS = class extends DecoderPlugin {
|
|
3166
3409
|
name = "label-h1-star-pos";
|
|
@@ -4341,6 +4584,7 @@ var MessageDecoder = class {
|
|
|
4341
4584
|
this.registerPlugin(new Label_10_POS(this));
|
|
4342
4585
|
this.registerPlugin(new Label_10_Slash(this));
|
|
4343
4586
|
this.registerPlugin(new Label_12_N_Space(this));
|
|
4587
|
+
this.registerPlugin(new Label_12_POS(this));
|
|
4344
4588
|
this.registerPlugin(new Label_13Through18_Slash(this));
|
|
4345
4589
|
this.registerPlugin(new Label_15(this));
|
|
4346
4590
|
this.registerPlugin(new Label_15_FST(this));
|
|
@@ -4367,13 +4611,17 @@ var MessageDecoder = class {
|
|
|
4367
4611
|
this.registerPlugin(new Label_4A_Slash_01(this));
|
|
4368
4612
|
this.registerPlugin(new Label_4J_POS(this));
|
|
4369
4613
|
this.registerPlugin(new Label_4N(this));
|
|
4614
|
+
this.registerPlugin(new Label_4T_AGFSR(this));
|
|
4615
|
+
this.registerPlugin(new Label_4T_ETA(this));
|
|
4370
4616
|
this.registerPlugin(new Label_B6_Forwardslash(this));
|
|
4371
4617
|
this.registerPlugin(new Label_H1_FLR(this));
|
|
4372
4618
|
this.registerPlugin(new Label_H1_OHMA(this));
|
|
4373
4619
|
this.registerPlugin(new Label_H1_WRN(this));
|
|
4374
4620
|
this.registerPlugin(new Label_H1(this));
|
|
4621
|
+
this.registerPlugin(new Label_H1_Slash(this));
|
|
4375
4622
|
this.registerPlugin(new Label_H1_StarPOS(this));
|
|
4376
4623
|
this.registerPlugin(new Label_HX(this));
|
|
4624
|
+
this.registerPlugin(new Label_58(this));
|
|
4377
4625
|
this.registerPlugin(new Label_80(this));
|
|
4378
4626
|
this.registerPlugin(new Label_83(this));
|
|
4379
4627
|
this.registerPlugin(new Label_8E(this));
|