@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/dist/index.mjs
CHANGED
|
@@ -532,14 +532,24 @@ var ResultFormatter = class {
|
|
|
532
532
|
value: DateTimeUtils.timestampToString(time, "tod")
|
|
533
533
|
});
|
|
534
534
|
}
|
|
535
|
-
static off(decodeResult, time) {
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
535
|
+
static off(decodeResult, time, type = "tod") {
|
|
536
|
+
if (type === "tod") {
|
|
537
|
+
decodeResult.raw.off_time = time;
|
|
538
|
+
decodeResult.formatted.items.push({
|
|
539
|
+
type: "time_of_day",
|
|
540
|
+
code: "OFF",
|
|
541
|
+
label: "Takeoff Time",
|
|
542
|
+
value: DateTimeUtils.timestampToString(time, "tod")
|
|
543
|
+
});
|
|
544
|
+
} else {
|
|
545
|
+
decodeResult.raw.off_date = time;
|
|
546
|
+
decodeResult.formatted.items.push({
|
|
547
|
+
type: "epoch",
|
|
548
|
+
code: "OFF",
|
|
549
|
+
label: "Takeoff Time",
|
|
550
|
+
value: DateTimeUtils.timestampToString(time, "epoch")
|
|
551
|
+
});
|
|
552
|
+
}
|
|
543
553
|
}
|
|
544
554
|
static on(decodeResult, time) {
|
|
545
555
|
decodeResult.raw.on_time = time;
|
|
@@ -931,6 +941,51 @@ var Label_12_N_Space = class extends DecoderPlugin {
|
|
|
931
941
|
}
|
|
932
942
|
};
|
|
933
943
|
|
|
944
|
+
// lib/plugins/Label_12_POS.ts
|
|
945
|
+
var Label_12_POS = class extends DecoderPlugin {
|
|
946
|
+
name = "label-12-pos";
|
|
947
|
+
qualifiers() {
|
|
948
|
+
return {
|
|
949
|
+
labels: ["12"],
|
|
950
|
+
preambles: ["POS"]
|
|
951
|
+
};
|
|
952
|
+
}
|
|
953
|
+
decode(message, options = {}) {
|
|
954
|
+
const decodeResult = this.defaultResult();
|
|
955
|
+
decodeResult.decoder.name = this.name;
|
|
956
|
+
decodeResult.formatted.description = "Position Report";
|
|
957
|
+
decodeResult.message = message;
|
|
958
|
+
const data = message.text.substring(3).split(",");
|
|
959
|
+
if (!message.text.startsWith("POS") || data.length !== 12) {
|
|
960
|
+
if (options.debug) {
|
|
961
|
+
console.log(`Decoder: Unknown 12 message: ${message.text}`);
|
|
962
|
+
}
|
|
963
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
964
|
+
decodeResult.decoded = false;
|
|
965
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
966
|
+
return decodeResult;
|
|
967
|
+
}
|
|
968
|
+
const lat = data[0].substring(0, 8);
|
|
969
|
+
const lon = data[0].substring(8);
|
|
970
|
+
ResultFormatter.position(decodeResult, {
|
|
971
|
+
latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),
|
|
972
|
+
longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8)))
|
|
973
|
+
});
|
|
974
|
+
ResultFormatter.unknown(decodeResult, data[1]);
|
|
975
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
|
|
976
|
+
ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
|
|
977
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
|
|
978
|
+
ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim()));
|
|
979
|
+
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()));
|
|
980
|
+
ResultFormatter.departureAirport(decodeResult, data[9]);
|
|
981
|
+
ResultFormatter.arrivalAirport(decodeResult, data[10]);
|
|
982
|
+
ResultFormatter.unknown(decodeResult, data[11]);
|
|
983
|
+
decodeResult.decoded = true;
|
|
984
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
985
|
+
return decodeResult;
|
|
986
|
+
}
|
|
987
|
+
};
|
|
988
|
+
|
|
934
989
|
// lib/plugins/Label_13Through18_Slash.ts
|
|
935
990
|
var Label_13Through18_Slash = class extends DecoderPlugin {
|
|
936
991
|
// eslint-disable-line camelcase
|
|
@@ -1042,9 +1097,19 @@ var Label_15 = class extends DecoderPlugin {
|
|
|
1042
1097
|
if (alt != "---") {
|
|
1043
1098
|
ResultFormatter.altitude(decodeResult, 100 * Number(alt));
|
|
1044
1099
|
}
|
|
1045
|
-
ResultFormatter.temperature(decodeResult, between.substring(22).
|
|
1100
|
+
ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(" ", "0"));
|
|
1101
|
+
} else if (between.substring(13, 16) === "OFF") {
|
|
1102
|
+
const ddmmyy = between.substring(16, 22);
|
|
1103
|
+
const hhmm = between.substring(22, 26);
|
|
1104
|
+
if (ddmmyy != "------") {
|
|
1105
|
+
const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
|
|
1106
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy), "epoch");
|
|
1107
|
+
} else {
|
|
1108
|
+
ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), "tod");
|
|
1109
|
+
}
|
|
1110
|
+
ResultFormatter.unknown(decodeResult, between.substring(26));
|
|
1046
1111
|
} else {
|
|
1047
|
-
ResultFormatter.unknown(decodeResult, between.substring(
|
|
1112
|
+
ResultFormatter.unknown(decodeResult, between.substring(26));
|
|
1048
1113
|
}
|
|
1049
1114
|
} else {
|
|
1050
1115
|
if (options.debug) {
|
|
@@ -1413,7 +1478,6 @@ var Label_1L_Slash = class extends DecoderPlugin {
|
|
|
1413
1478
|
const part = parts[i].split(" ");
|
|
1414
1479
|
data.set(part[0], part.slice(1).join(" "));
|
|
1415
1480
|
}
|
|
1416
|
-
console.log(data);
|
|
1417
1481
|
const position = {
|
|
1418
1482
|
latitude: Number(data.get("LAT")),
|
|
1419
1483
|
longitude: Number(data.get("LON"))
|
|
@@ -1959,12 +2023,10 @@ var Label_44_POS = class extends DecoderPlugin {
|
|
|
1959
2023
|
}
|
|
1960
2024
|
ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));
|
|
1961
2025
|
const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
|
|
1962
|
-
decodeResult.
|
|
1963
|
-
|
|
1964
|
-
);
|
|
1965
|
-
decodeResult.
|
|
1966
|
-
(/* @__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"
|
|
1967
|
-
);
|
|
2026
|
+
ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));
|
|
2027
|
+
ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));
|
|
2028
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00"));
|
|
2029
|
+
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00"));
|
|
1968
2030
|
if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
|
|
1969
2031
|
decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
|
|
1970
2032
|
}
|
|
@@ -2343,12 +2405,17 @@ function addCompanyRoute(decodeResult, value) {
|
|
|
2343
2405
|
}
|
|
2344
2406
|
|
|
2345
2407
|
// lib/utils/h1_helper.ts
|
|
2346
|
-
var H1Helper = class {
|
|
2408
|
+
var H1Helper = class _H1Helper {
|
|
2347
2409
|
static decodeH1Message(decodeResult, message) {
|
|
2348
2410
|
const checksum = message.slice(-4);
|
|
2349
2411
|
const data = message.slice(0, message.length - 4);
|
|
2350
2412
|
const fields = data.split("/");
|
|
2351
|
-
parseMessageType(decodeResult, fields[0]);
|
|
2413
|
+
const canDecode = parseMessageType(decodeResult, fields[0]);
|
|
2414
|
+
if (!canDecode) {
|
|
2415
|
+
decodeResult.decoded = false;
|
|
2416
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2417
|
+
return;
|
|
2418
|
+
}
|
|
2352
2419
|
for (let i = 1; i < fields.length; ++i) {
|
|
2353
2420
|
if (fields[i].startsWith("FN")) {
|
|
2354
2421
|
decodeResult.raw.flight_number = fields[i].substring(2);
|
|
@@ -2357,16 +2424,9 @@ var H1Helper = class {
|
|
|
2357
2424
|
} else if (fields[i].startsWith("DC")) {
|
|
2358
2425
|
processDC(decodeResult, fields[i].substring(2).split(","));
|
|
2359
2426
|
} else if (fields[i].startsWith("TS")) {
|
|
2360
|
-
|
|
2361
|
-
let time = DateTimeUtils.convertDateTimeToEpoch(ts[0], ts[1]);
|
|
2362
|
-
if (Number.isNaN(time)) {
|
|
2363
|
-
const date = ts[1].substring(2, 4) + ts[1].substring(0, 2) + ts[1].substring(4, 6);
|
|
2364
|
-
time = DateTimeUtils.convertDateTimeToEpoch(ts[0], date);
|
|
2365
|
-
}
|
|
2366
|
-
decodeResult.raw.message_date = ts[1];
|
|
2367
|
-
decodeResult.raw.message_timestamp = time;
|
|
2427
|
+
_H1Helper.processTS(decodeResult, fields[i].substring(2).split(","));
|
|
2368
2428
|
} else if (fields[i].startsWith("PS")) {
|
|
2369
|
-
|
|
2429
|
+
_H1Helper.processPS(decodeResult, fields[i].substring(2).split(","));
|
|
2370
2430
|
} else if (fields[i].startsWith("DT")) {
|
|
2371
2431
|
const data2 = fields[i].substring(2).split(",");
|
|
2372
2432
|
processDT(decodeResult, data2);
|
|
@@ -2395,6 +2455,8 @@ var H1Helper = class {
|
|
|
2395
2455
|
} else {
|
|
2396
2456
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2397
2457
|
}
|
|
2458
|
+
} else if (fields[i].startsWith("WD")) {
|
|
2459
|
+
processWindData(decodeResult, fields[i].substring(2));
|
|
2398
2460
|
} else {
|
|
2399
2461
|
ResultFormatter.unknown(decodeResult, fields[i], "/");
|
|
2400
2462
|
}
|
|
@@ -2404,6 +2466,56 @@ var H1Helper = class {
|
|
|
2404
2466
|
}
|
|
2405
2467
|
return true;
|
|
2406
2468
|
}
|
|
2469
|
+
static processPS(decodeResult, data) {
|
|
2470
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2471
|
+
if (position) {
|
|
2472
|
+
decodeResult.raw.position = position;
|
|
2473
|
+
decodeResult.formatted.items.push({
|
|
2474
|
+
type: "aircraft_position",
|
|
2475
|
+
code: "POS",
|
|
2476
|
+
label: "Aircraft Position",
|
|
2477
|
+
value: CoordinateUtils.coordinateString(position)
|
|
2478
|
+
});
|
|
2479
|
+
}
|
|
2480
|
+
if (data.length === 9) {
|
|
2481
|
+
processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
|
|
2482
|
+
ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
|
|
2483
|
+
ResultFormatter.temperature(decodeResult, data[6]);
|
|
2484
|
+
ResultFormatter.unknown(decodeResult, data[7]);
|
|
2485
|
+
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2486
|
+
}
|
|
2487
|
+
if (data.length === 14) {
|
|
2488
|
+
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2489
|
+
processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
|
|
2490
|
+
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2491
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(8));
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
static processPosition(decodeResult, data) {
|
|
2495
|
+
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2496
|
+
if (position) {
|
|
2497
|
+
ResultFormatter.position(decodeResult, position);
|
|
2498
|
+
}
|
|
2499
|
+
if (data.length >= 10) {
|
|
2500
|
+
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2501
|
+
processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
|
|
2502
|
+
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2503
|
+
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2504
|
+
ResultFormatter.unknown(decodeResult, data[9]);
|
|
2505
|
+
}
|
|
2506
|
+
if (data.length >= 14) {
|
|
2507
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(10));
|
|
2508
|
+
}
|
|
2509
|
+
}
|
|
2510
|
+
static processTS(decodeResult, data) {
|
|
2511
|
+
let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);
|
|
2512
|
+
if (Number.isNaN(time)) {
|
|
2513
|
+
const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
|
|
2514
|
+
time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
|
|
2515
|
+
}
|
|
2516
|
+
decodeResult.raw.message_date = data[1];
|
|
2517
|
+
decodeResult.raw.message_timestamp = time;
|
|
2518
|
+
}
|
|
2407
2519
|
};
|
|
2408
2520
|
function processAirField(decodeResult, data) {
|
|
2409
2521
|
if (data.length === 2) {
|
|
@@ -2481,7 +2593,7 @@ function parseMessageType(decodeResult, messageType) {
|
|
|
2481
2593
|
if (parts.length == 1) {
|
|
2482
2594
|
const type = parts[0].substring(0, 3);
|
|
2483
2595
|
if (type === "POS" && parts[0].length !== 3) {
|
|
2484
|
-
|
|
2596
|
+
H1Helper.processPosition(decodeResult, parts[0].substring(3).split(","));
|
|
2485
2597
|
}
|
|
2486
2598
|
return processMessageType(decodeResult, type);
|
|
2487
2599
|
} else if (parts.length == 2) {
|
|
@@ -2492,11 +2604,12 @@ function parseMessageType(decodeResult, messageType) {
|
|
|
2492
2604
|
}
|
|
2493
2605
|
const type = parts[1].length == 5 ? parts[1].substring(2, 5) : parts[1].substring(3, 6);
|
|
2494
2606
|
if (parts[1].substring(3, 6) === "POS" && parts[1].length > 6) {
|
|
2495
|
-
|
|
2607
|
+
H1Helper.processPosition(decodeResult, parts[1].substring(6).split(","));
|
|
2496
2608
|
}
|
|
2497
|
-
processMessageType(decodeResult, type);
|
|
2609
|
+
return processMessageType(decodeResult, type);
|
|
2498
2610
|
} else {
|
|
2499
2611
|
ResultFormatter.unknown(decodeResult, messageType);
|
|
2612
|
+
return false;
|
|
2500
2613
|
}
|
|
2501
2614
|
}
|
|
2502
2615
|
function processMessageType(decodeResult, type) {
|
|
@@ -2510,9 +2623,13 @@ function processMessageType(decodeResult, type) {
|
|
|
2510
2623
|
decodeResult.formatted.description = "Position Report";
|
|
2511
2624
|
} else if (type === "PRG") {
|
|
2512
2625
|
decodeResult.formatted.description = "Progress Report";
|
|
2626
|
+
} else if (type === "PWI") {
|
|
2627
|
+
decodeResult.formatted.description = "Weather Report";
|
|
2513
2628
|
} else {
|
|
2514
2629
|
decodeResult.formatted.description = "Unknown H1 Message";
|
|
2630
|
+
return false;
|
|
2515
2631
|
}
|
|
2632
|
+
return true;
|
|
2516
2633
|
}
|
|
2517
2634
|
function processDC(decodeResult, data) {
|
|
2518
2635
|
decodeResult.raw.message_date = data[0];
|
|
@@ -2523,60 +2640,6 @@ function processDC(decodeResult, data) {
|
|
|
2523
2640
|
decodeResult.raw.message_timestamp = time;
|
|
2524
2641
|
}
|
|
2525
2642
|
}
|
|
2526
|
-
function processPS(decodeResult, data) {
|
|
2527
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2528
|
-
if (position) {
|
|
2529
|
-
decodeResult.raw.position = position;
|
|
2530
|
-
decodeResult.formatted.items.push({
|
|
2531
|
-
type: "aircraft_position",
|
|
2532
|
-
code: "POS",
|
|
2533
|
-
label: "Aircraft Position",
|
|
2534
|
-
value: CoordinateUtils.coordinateString(position)
|
|
2535
|
-
});
|
|
2536
|
-
}
|
|
2537
|
-
if (data.length === 9) {
|
|
2538
|
-
processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
|
|
2539
|
-
ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
|
|
2540
|
-
ResultFormatter.temperature(decodeResult, data[6]);
|
|
2541
|
-
ResultFormatter.unknown(decodeResult, data[7]);
|
|
2542
|
-
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2543
|
-
}
|
|
2544
|
-
if (data.length === 14) {
|
|
2545
|
-
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2546
|
-
processRoute(decodeResult, data[4], data[2], data[6], data[5], void 0);
|
|
2547
|
-
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2548
|
-
ResultFormatter.groundspeed(decodeResult, Number(data[10]));
|
|
2549
|
-
ResultFormatter.unknown(decodeResult, data[1]);
|
|
2550
|
-
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2551
|
-
ResultFormatter.unknown(decodeResult, data[9]);
|
|
2552
|
-
ResultFormatter.unknown(decodeResult, data.slice(11).join(","));
|
|
2553
|
-
}
|
|
2554
|
-
}
|
|
2555
|
-
function processPosition2(decodeResult, data) {
|
|
2556
|
-
const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
|
|
2557
|
-
if (position) {
|
|
2558
|
-
decodeResult.raw.position = position;
|
|
2559
|
-
decodeResult.formatted.items.push({
|
|
2560
|
-
type: "aircraft_position",
|
|
2561
|
-
code: "POS",
|
|
2562
|
-
label: "Aircraft Position",
|
|
2563
|
-
value: CoordinateUtils.coordinateString(position)
|
|
2564
|
-
});
|
|
2565
|
-
}
|
|
2566
|
-
if (data.length >= 10) {
|
|
2567
|
-
ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
|
|
2568
|
-
processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
|
|
2569
|
-
ResultFormatter.temperature(decodeResult, data[7]);
|
|
2570
|
-
ResultFormatter.unknown(decodeResult, data[8]);
|
|
2571
|
-
ResultFormatter.unknown(decodeResult, data[9]);
|
|
2572
|
-
}
|
|
2573
|
-
if (data.length >= 14) {
|
|
2574
|
-
ResultFormatter.groundspeed(decodeResult, Number(data[10]));
|
|
2575
|
-
ResultFormatter.unknown(decodeResult, data[11]);
|
|
2576
|
-
ResultFormatter.unknown(decodeResult, data[12]);
|
|
2577
|
-
ResultFormatter.unknown(decodeResult, data[13]);
|
|
2578
|
-
}
|
|
2579
|
-
}
|
|
2580
2643
|
function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
2581
2644
|
const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
|
|
2582
2645
|
const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
|
|
@@ -2597,6 +2660,55 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
|
|
|
2597
2660
|
value: RouteUtils.routeToString(decodeResult.raw.route)
|
|
2598
2661
|
});
|
|
2599
2662
|
}
|
|
2663
|
+
function processWindData(decodeResult, message) {
|
|
2664
|
+
if (decodeResult.raw.wind_data === void 0) {
|
|
2665
|
+
decodeResult.raw.wind_data = [];
|
|
2666
|
+
}
|
|
2667
|
+
const flightLevel = Number(message.slice(0, 3));
|
|
2668
|
+
const fields = message.slice(4).split(".");
|
|
2669
|
+
fields.forEach((field) => {
|
|
2670
|
+
const data = field.split(",");
|
|
2671
|
+
const waypoint = data[0];
|
|
2672
|
+
const windData = data[1];
|
|
2673
|
+
const windDirection = Number(windData.slice(0, 3));
|
|
2674
|
+
const windSpeed = Number(windData.slice(3));
|
|
2675
|
+
if (data.length === 3) {
|
|
2676
|
+
const tempData = data[2];
|
|
2677
|
+
const tempFlightLevel = Number(tempData.slice(0, 3));
|
|
2678
|
+
const tempString = tempData.slice(3);
|
|
2679
|
+
const tempDegrees = Number(tempString.substring(1)) * (tempString.charAt(0) === "M" ? -1 : 1);
|
|
2680
|
+
decodeResult.raw.wind_data.push({
|
|
2681
|
+
waypoint,
|
|
2682
|
+
flightLevel,
|
|
2683
|
+
windDirection,
|
|
2684
|
+
windSpeed,
|
|
2685
|
+
temperature: {
|
|
2686
|
+
flightLevel: tempFlightLevel,
|
|
2687
|
+
degreesC: tempDegrees
|
|
2688
|
+
}
|
|
2689
|
+
});
|
|
2690
|
+
decodeResult.formatted.items.push({
|
|
2691
|
+
type: "wind_data",
|
|
2692
|
+
code: "WIND",
|
|
2693
|
+
label: "Wind Data",
|
|
2694
|
+
value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt, ${tempDegrees}\xB0C at FL${tempFlightLevel}`
|
|
2695
|
+
});
|
|
2696
|
+
} else {
|
|
2697
|
+
decodeResult.raw.wind_data.push({
|
|
2698
|
+
waypoint,
|
|
2699
|
+
flightLevel,
|
|
2700
|
+
windDirection,
|
|
2701
|
+
windSpeed
|
|
2702
|
+
});
|
|
2703
|
+
decodeResult.formatted.items.push({
|
|
2704
|
+
type: "wind_data",
|
|
2705
|
+
code: "WIND",
|
|
2706
|
+
label: "Wind Data",
|
|
2707
|
+
value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt`
|
|
2708
|
+
});
|
|
2709
|
+
}
|
|
2710
|
+
});
|
|
2711
|
+
}
|
|
2600
2712
|
|
|
2601
2713
|
// lib/plugins/Label_4J_POS.ts
|
|
2602
2714
|
var Label_4J_POS = class extends DecoderPlugin {
|
|
@@ -2688,6 +2800,129 @@ var Label_4N = class extends DecoderPlugin {
|
|
|
2688
2800
|
}
|
|
2689
2801
|
};
|
|
2690
2802
|
|
|
2803
|
+
// lib/plugins/Label_4T_AGFSR.ts
|
|
2804
|
+
var Label_4T_AGFSR = class extends DecoderPlugin {
|
|
2805
|
+
name = "label-4t-agfsr";
|
|
2806
|
+
qualifiers() {
|
|
2807
|
+
return {
|
|
2808
|
+
labels: ["4T"],
|
|
2809
|
+
preambles: ["AGFSR"]
|
|
2810
|
+
};
|
|
2811
|
+
}
|
|
2812
|
+
decode(message, options = {}) {
|
|
2813
|
+
const decodeResult = this.defaultResult();
|
|
2814
|
+
decodeResult.decoder.name = this.name;
|
|
2815
|
+
decodeResult.formatted.description = "Position Report";
|
|
2816
|
+
decodeResult.message = message;
|
|
2817
|
+
const data = message.text.substring(5).split("/");
|
|
2818
|
+
if (!message.text.startsWith("AGFSR") || data.length !== 20) {
|
|
2819
|
+
if (options.debug) {
|
|
2820
|
+
console.log(`Decoder: Unknown 4T message: ${message.text}`);
|
|
2821
|
+
}
|
|
2822
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2823
|
+
decodeResult.decoded = false;
|
|
2824
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2825
|
+
return decodeResult;
|
|
2826
|
+
}
|
|
2827
|
+
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
2828
|
+
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
2829
|
+
ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
|
|
2830
|
+
ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
|
|
2831
|
+
ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
|
|
2832
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
|
|
2833
|
+
ResultFormatter.unknown(decodeResult, data[5], "/");
|
|
2834
|
+
const lat = data[6].substring(0, 7);
|
|
2835
|
+
const lon = data[6].substring(7, 15);
|
|
2836
|
+
ResultFormatter.position(decodeResult, {
|
|
2837
|
+
latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) + Number(lat.substring(2, 6)) / 60,
|
|
2838
|
+
longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) + Number(lon.substring(3, 7)) / 60
|
|
2839
|
+
});
|
|
2840
|
+
ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));
|
|
2841
|
+
ResultFormatter.unknownArr(decodeResult, data.slice(8), "/");
|
|
2842
|
+
decodeResult.decoded = true;
|
|
2843
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
2844
|
+
return decodeResult;
|
|
2845
|
+
}
|
|
2846
|
+
};
|
|
2847
|
+
|
|
2848
|
+
// lib/plugins/Label_58.ts
|
|
2849
|
+
var Label_58 = class extends DecoderPlugin {
|
|
2850
|
+
name = "label-58";
|
|
2851
|
+
qualifiers() {
|
|
2852
|
+
return {
|
|
2853
|
+
labels: ["58"]
|
|
2854
|
+
};
|
|
2855
|
+
}
|
|
2856
|
+
decode(message, options = {}) {
|
|
2857
|
+
const decodeResult = this.defaultResult();
|
|
2858
|
+
decodeResult.decoder.name = this.name;
|
|
2859
|
+
decodeResult.formatted.description = "Position Report";
|
|
2860
|
+
decodeResult.message = message;
|
|
2861
|
+
const data = message.text.split("/");
|
|
2862
|
+
if (data.length === 8) {
|
|
2863
|
+
ResultFormatter.flightNumber(decodeResult, data[0]);
|
|
2864
|
+
ResultFormatter.day(decodeResult, Number(data[1]));
|
|
2865
|
+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
|
|
2866
|
+
const lat = data[3];
|
|
2867
|
+
const lon = data[4];
|
|
2868
|
+
ResultFormatter.position(decodeResult, {
|
|
2869
|
+
latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
|
|
2870
|
+
longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
|
|
2871
|
+
});
|
|
2872
|
+
ResultFormatter.altitude(decodeResult, Number(data[5]));
|
|
2873
|
+
ResultFormatter.unknown(decodeResult, data[6], "/");
|
|
2874
|
+
ResultFormatter.unknown(decodeResult, data[7], "/");
|
|
2875
|
+
} else {
|
|
2876
|
+
if (options.debug) {
|
|
2877
|
+
console.log(`Decoder: Unknown 58 message: ${message.text}`);
|
|
2878
|
+
}
|
|
2879
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2880
|
+
decodeResult.decoded = false;
|
|
2881
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2882
|
+
return decodeResult;
|
|
2883
|
+
}
|
|
2884
|
+
decodeResult.decoded = true;
|
|
2885
|
+
decodeResult.decoder.decodeLevel = "partial";
|
|
2886
|
+
return decodeResult;
|
|
2887
|
+
}
|
|
2888
|
+
};
|
|
2889
|
+
|
|
2890
|
+
// lib/plugins/Label_4T_ETA.ts
|
|
2891
|
+
var Label_4T_ETA = class extends DecoderPlugin {
|
|
2892
|
+
name = "label-4t-eta";
|
|
2893
|
+
qualifiers() {
|
|
2894
|
+
return {
|
|
2895
|
+
labels: ["4T"],
|
|
2896
|
+
preambles: ["ETA"]
|
|
2897
|
+
};
|
|
2898
|
+
}
|
|
2899
|
+
decode(message, options = {}) {
|
|
2900
|
+
const decodeResult = this.defaultResult();
|
|
2901
|
+
decodeResult.decoder.name = this.name;
|
|
2902
|
+
decodeResult.formatted.description = "ETA Report";
|
|
2903
|
+
decodeResult.message = message;
|
|
2904
|
+
const data = message.text.substring(3).split("/");
|
|
2905
|
+
if (!message.text.startsWith("ETA") || data.length !== 3) {
|
|
2906
|
+
if (options.debug) {
|
|
2907
|
+
console.log(`Decoder: Unknown 4T message: ${message.text}`);
|
|
2908
|
+
}
|
|
2909
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
2910
|
+
decodeResult.decoded = false;
|
|
2911
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
2912
|
+
return decodeResult;
|
|
2913
|
+
}
|
|
2914
|
+
ResultFormatter.flightNumber(decodeResult, data[0].trim());
|
|
2915
|
+
ResultFormatter.departureDay(decodeResult, Number(data[1]));
|
|
2916
|
+
const etaData = data[2].split(" ");
|
|
2917
|
+
ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
|
|
2918
|
+
ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
|
|
2919
|
+
ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
|
|
2920
|
+
decodeResult.decoded = true;
|
|
2921
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
2922
|
+
return decodeResult;
|
|
2923
|
+
}
|
|
2924
|
+
};
|
|
2925
|
+
|
|
2691
2926
|
// lib/plugins/Label_80.ts
|
|
2692
2927
|
var Label_80 = class extends DecoderPlugin {
|
|
2693
2928
|
name = "label-80";
|
|
@@ -3124,6 +3359,65 @@ var Label_H1_OHMA = class extends DecoderPlugin {
|
|
|
3124
3359
|
}
|
|
3125
3360
|
};
|
|
3126
3361
|
|
|
3362
|
+
// lib/plugins/Label_H1_Slash.ts
|
|
3363
|
+
var Label_H1_Slash = class extends DecoderPlugin {
|
|
3364
|
+
name = "label-h1-slash";
|
|
3365
|
+
qualifiers() {
|
|
3366
|
+
return {
|
|
3367
|
+
labels: ["H1"],
|
|
3368
|
+
preambles: ["/"]
|
|
3369
|
+
};
|
|
3370
|
+
}
|
|
3371
|
+
decode(message, options = {}) {
|
|
3372
|
+
let decodeResult = this.defaultResult();
|
|
3373
|
+
decodeResult.decoder.name = this.name;
|
|
3374
|
+
decodeResult.formatted.description = "Position Report";
|
|
3375
|
+
decodeResult.message = message;
|
|
3376
|
+
const checksum = message.text.slice(-4);
|
|
3377
|
+
const data = message.text.slice(0, message.text.length - 4);
|
|
3378
|
+
const fields = data.split("/");
|
|
3379
|
+
if (fields[0] !== "") {
|
|
3380
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3381
|
+
decodeResult.decoded = false;
|
|
3382
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
3383
|
+
return decodeResult;
|
|
3384
|
+
}
|
|
3385
|
+
const headerData = fields[1].split(".");
|
|
3386
|
+
ResultFormatter.unknown(decodeResult, headerData[0]);
|
|
3387
|
+
if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
|
|
3388
|
+
H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
|
|
3389
|
+
} else if (headerData[1] === "POS") {
|
|
3390
|
+
} else if (headerData[1].startsWith("POS")) {
|
|
3391
|
+
H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
|
|
3392
|
+
} else {
|
|
3393
|
+
ResultFormatter.unknown(decodeResult, headerData[1], ".");
|
|
3394
|
+
}
|
|
3395
|
+
for (let i = 2; i < fields.length; i++) {
|
|
3396
|
+
const field = fields[i];
|
|
3397
|
+
if (field.startsWith("TS")) {
|
|
3398
|
+
H1Helper.processTS(decodeResult, field.substring(2, 15).split(","));
|
|
3399
|
+
} else if (field.startsWith("PS")) {
|
|
3400
|
+
H1Helper.processPS(decodeResult, field.substring(2).split(","));
|
|
3401
|
+
} else {
|
|
3402
|
+
ResultFormatter.unknown(decodeResult, field, "/");
|
|
3403
|
+
}
|
|
3404
|
+
}
|
|
3405
|
+
if (decodeResult.formatted.items.length === 0) {
|
|
3406
|
+
if (options.debug) {
|
|
3407
|
+
console.log(`Decoder: Unknown H1 message: ${message.text}`);
|
|
3408
|
+
}
|
|
3409
|
+
ResultFormatter.unknown(decodeResult, message.text);
|
|
3410
|
+
decodeResult.decoded = false;
|
|
3411
|
+
decodeResult.decoder.decodeLevel = "none";
|
|
3412
|
+
return decodeResult;
|
|
3413
|
+
}
|
|
3414
|
+
ResultFormatter.checksum(decodeResult, checksum);
|
|
3415
|
+
decodeResult.decoded = true;
|
|
3416
|
+
decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
|
|
3417
|
+
return decodeResult;
|
|
3418
|
+
}
|
|
3419
|
+
};
|
|
3420
|
+
|
|
3127
3421
|
// lib/plugins/Label_H1_StarPOS.ts
|
|
3128
3422
|
var Label_H1_StarPOS = class extends DecoderPlugin {
|
|
3129
3423
|
name = "label-h1-star-pos";
|
|
@@ -4304,6 +4598,7 @@ var MessageDecoder = class {
|
|
|
4304
4598
|
this.registerPlugin(new Label_10_POS(this));
|
|
4305
4599
|
this.registerPlugin(new Label_10_Slash(this));
|
|
4306
4600
|
this.registerPlugin(new Label_12_N_Space(this));
|
|
4601
|
+
this.registerPlugin(new Label_12_POS(this));
|
|
4307
4602
|
this.registerPlugin(new Label_13Through18_Slash(this));
|
|
4308
4603
|
this.registerPlugin(new Label_15(this));
|
|
4309
4604
|
this.registerPlugin(new Label_15_FST(this));
|
|
@@ -4330,13 +4625,17 @@ var MessageDecoder = class {
|
|
|
4330
4625
|
this.registerPlugin(new Label_4A_Slash_01(this));
|
|
4331
4626
|
this.registerPlugin(new Label_4J_POS(this));
|
|
4332
4627
|
this.registerPlugin(new Label_4N(this));
|
|
4628
|
+
this.registerPlugin(new Label_4T_AGFSR(this));
|
|
4629
|
+
this.registerPlugin(new Label_4T_ETA(this));
|
|
4333
4630
|
this.registerPlugin(new Label_B6_Forwardslash(this));
|
|
4334
4631
|
this.registerPlugin(new Label_H1_FLR(this));
|
|
4335
4632
|
this.registerPlugin(new Label_H1_OHMA(this));
|
|
4336
4633
|
this.registerPlugin(new Label_H1_WRN(this));
|
|
4337
4634
|
this.registerPlugin(new Label_H1(this));
|
|
4635
|
+
this.registerPlugin(new Label_H1_Slash(this));
|
|
4338
4636
|
this.registerPlugin(new Label_H1_StarPOS(this));
|
|
4339
4637
|
this.registerPlugin(new Label_HX(this));
|
|
4638
|
+
this.registerPlugin(new Label_58(this));
|
|
4340
4639
|
this.registerPlugin(new Label_80(this));
|
|
4341
4640
|
this.registerPlugin(new Label_83(this));
|
|
4342
4641
|
this.registerPlugin(new Label_8E(this));
|