@airframes/acars-decoder 1.9.0 → 1.9.2
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 +187 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +187 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -222,6 +222,9 @@ var DateTimeUtils = class {
|
|
|
222
222
|
* @returns
|
|
223
223
|
*/
|
|
224
224
|
static timestampToString(time) {
|
|
225
|
+
if (isNaN(time)) {
|
|
226
|
+
return "";
|
|
227
|
+
}
|
|
225
228
|
const date = new Date(time * 1e3);
|
|
226
229
|
if (time < 86400) {
|
|
227
230
|
return date.toISOString().slice(11, 19);
|
|
@@ -469,6 +472,9 @@ var ResultFormatter = class {
|
|
|
469
472
|
});
|
|
470
473
|
}
|
|
471
474
|
static eta(decodeResult, time) {
|
|
475
|
+
if (isNaN(time)) {
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
472
478
|
decodeResult.raw.eta_time = time;
|
|
473
479
|
decodeResult.formatted.items.push({
|
|
474
480
|
type: "time",
|
|
@@ -576,10 +582,13 @@ var ResultFormatter = class {
|
|
|
576
582
|
type: "message_checksum",
|
|
577
583
|
code: "CHECKSUM",
|
|
578
584
|
label: "Message Checksum",
|
|
579
|
-
value: "0x" + (
|
|
585
|
+
value: "0x" + (decodeResult.raw.checksum >>> 0).toString(16).padStart(4, "0")
|
|
580
586
|
});
|
|
581
587
|
}
|
|
582
588
|
static groundspeed(decodeResult, value) {
|
|
589
|
+
if (isNaN(value)) {
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
583
592
|
decodeResult.raw.groundspeed = value;
|
|
584
593
|
decodeResult.formatted.items.push({
|
|
585
594
|
type: "aircraft_groundspeed",
|
|
@@ -589,6 +598,9 @@ var ResultFormatter = class {
|
|
|
589
598
|
});
|
|
590
599
|
}
|
|
591
600
|
static airspeed(decodeResult, value) {
|
|
601
|
+
if (isNaN(value)) {
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
592
604
|
decodeResult.raw.airspeed = value;
|
|
593
605
|
decodeResult.formatted.items.push({
|
|
594
606
|
type: "airspeed",
|
|
@@ -598,6 +610,9 @@ var ResultFormatter = class {
|
|
|
598
610
|
});
|
|
599
611
|
}
|
|
600
612
|
static mach(decodeResult, value) {
|
|
613
|
+
if (isNaN(value)) {
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
601
616
|
decodeResult.raw.mach = value;
|
|
602
617
|
decodeResult.formatted.items.push({
|
|
603
618
|
type: "mach",
|
|
@@ -635,6 +650,9 @@ var ResultFormatter = class {
|
|
|
635
650
|
});
|
|
636
651
|
}
|
|
637
652
|
static heading(decodeResult, value) {
|
|
653
|
+
if (isNaN(value)) {
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
638
656
|
decodeResult.raw.heading = value;
|
|
639
657
|
decodeResult.formatted.items.push({
|
|
640
658
|
type: "heading",
|
|
@@ -653,6 +671,9 @@ var ResultFormatter = class {
|
|
|
653
671
|
});
|
|
654
672
|
}
|
|
655
673
|
static out(decodeResult, time) {
|
|
674
|
+
if (isNaN(time)) {
|
|
675
|
+
return;
|
|
676
|
+
}
|
|
656
677
|
decodeResult.raw.out_time = time;
|
|
657
678
|
decodeResult.formatted.items.push({
|
|
658
679
|
type: "time",
|
|
@@ -662,6 +683,9 @@ var ResultFormatter = class {
|
|
|
662
683
|
});
|
|
663
684
|
}
|
|
664
685
|
static off(decodeResult, time) {
|
|
686
|
+
if (isNaN(time)) {
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
665
689
|
decodeResult.raw.off_time = time;
|
|
666
690
|
decodeResult.formatted.items.push({
|
|
667
691
|
type: "time",
|
|
@@ -671,6 +695,9 @@ var ResultFormatter = class {
|
|
|
671
695
|
});
|
|
672
696
|
}
|
|
673
697
|
static on(decodeResult, time) {
|
|
698
|
+
if (isNaN(time)) {
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
674
701
|
decodeResult.raw.on_time = time;
|
|
675
702
|
decodeResult.formatted.items.push({
|
|
676
703
|
type: "time",
|
|
@@ -680,6 +707,9 @@ var ResultFormatter = class {
|
|
|
680
707
|
});
|
|
681
708
|
}
|
|
682
709
|
static in(decodeResult, time) {
|
|
710
|
+
if (isNaN(time)) {
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
683
713
|
decodeResult.raw.in_time = time;
|
|
684
714
|
decodeResult.formatted.items.push({
|
|
685
715
|
type: "time",
|
|
@@ -689,6 +719,9 @@ var ResultFormatter = class {
|
|
|
689
719
|
});
|
|
690
720
|
}
|
|
691
721
|
static engineStart(decodeResult, time) {
|
|
722
|
+
if (isNaN(time)) {
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
692
725
|
decodeResult.raw.engine_start_time = time;
|
|
693
726
|
decodeResult.formatted.items.push({
|
|
694
727
|
type: "time",
|
|
@@ -698,6 +731,9 @@ var ResultFormatter = class {
|
|
|
698
731
|
});
|
|
699
732
|
}
|
|
700
733
|
static engineStop(decodeResult, time) {
|
|
734
|
+
if (isNaN(time)) {
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
701
737
|
decodeResult.raw.engine_stop_time = time;
|
|
702
738
|
decodeResult.formatted.items.push({
|
|
703
739
|
type: "time",
|
|
@@ -707,6 +743,9 @@ var ResultFormatter = class {
|
|
|
707
743
|
});
|
|
708
744
|
}
|
|
709
745
|
static day(decodeResult, day) {
|
|
746
|
+
if (isNaN(day)) {
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
710
749
|
decodeResult.raw.day = day;
|
|
711
750
|
decodeResult.formatted.items.push({
|
|
712
751
|
type: "day",
|
|
@@ -716,6 +755,9 @@ var ResultFormatter = class {
|
|
|
716
755
|
});
|
|
717
756
|
}
|
|
718
757
|
static month(decodeResult, month) {
|
|
758
|
+
if (isNaN(month)) {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
719
761
|
decodeResult.raw.month = month;
|
|
720
762
|
decodeResult.formatted.items.push({
|
|
721
763
|
type: "month",
|
|
@@ -725,6 +767,9 @@ var ResultFormatter = class {
|
|
|
725
767
|
});
|
|
726
768
|
}
|
|
727
769
|
static departureDay(decodeResult, day) {
|
|
770
|
+
if (isNaN(day)) {
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
728
773
|
decodeResult.raw.departure_day = day;
|
|
729
774
|
decodeResult.formatted.items.push({
|
|
730
775
|
type: "day",
|
|
@@ -734,6 +779,9 @@ var ResultFormatter = class {
|
|
|
734
779
|
});
|
|
735
780
|
}
|
|
736
781
|
static arrivalDay(decodeResult, day) {
|
|
782
|
+
if (isNaN(day)) {
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
737
785
|
decodeResult.raw.arrival_day = day;
|
|
738
786
|
decodeResult.formatted.items.push({
|
|
739
787
|
type: "day",
|
|
@@ -897,6 +945,9 @@ var ResultFormatter = class {
|
|
|
897
945
|
});
|
|
898
946
|
}
|
|
899
947
|
static timestamp(decodeResult, value) {
|
|
948
|
+
if (isNaN(value)) {
|
|
949
|
+
return;
|
|
950
|
+
}
|
|
900
951
|
decodeResult.raw.message_timestamp = value;
|
|
901
952
|
decodeResult.formatted.items.push({
|
|
902
953
|
type: "time",
|
|
@@ -1236,7 +1287,11 @@ function addCompanyRoute(decodeResult, value) {
|
|
|
1236
1287
|
name = segments[0];
|
|
1237
1288
|
} else {
|
|
1238
1289
|
name = segments[0].slice(0, parens_idx);
|
|
1239
|
-
|
|
1290
|
+
const close_paren_idx = segments[0].indexOf(")");
|
|
1291
|
+
runway = segments[0].slice(
|
|
1292
|
+
parens_idx + 1,
|
|
1293
|
+
close_paren_idx === -1 ? void 0 : close_paren_idx
|
|
1294
|
+
);
|
|
1240
1295
|
}
|
|
1241
1296
|
let waypoints;
|
|
1242
1297
|
if (segments.length > 1) {
|
|
@@ -1904,6 +1959,12 @@ var Arinc702 = class extends DecoderPlugin {
|
|
|
1904
1959
|
}
|
|
1905
1960
|
};
|
|
1906
1961
|
|
|
1962
|
+
// lib/utils/acars_free_text.ts
|
|
1963
|
+
function formatAcarsFreeText(text) {
|
|
1964
|
+
if (!text) return "";
|
|
1965
|
+
return text.trim().replace(/\s+/g, " ");
|
|
1966
|
+
}
|
|
1967
|
+
|
|
1907
1968
|
// lib/plugins/Label_5Z_Slash.ts
|
|
1908
1969
|
var Label_5Z_Slash = class extends DecoderPlugin {
|
|
1909
1970
|
name = "label-5z-slash";
|
|
@@ -1945,7 +2006,10 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
1945
2006
|
decodeResult.formatted.description = "Airline Designated Downlink";
|
|
1946
2007
|
const lines = message.text.split("\r\n");
|
|
1947
2008
|
if (lines[0] === "/TXT") {
|
|
1948
|
-
ResultFormatter.text(
|
|
2009
|
+
ResultFormatter.text(
|
|
2010
|
+
decodeResult,
|
|
2011
|
+
formatAcarsFreeText(lines.slice(1).join("\r\n"))
|
|
2012
|
+
);
|
|
1949
2013
|
decodeResult.decoded = true;
|
|
1950
2014
|
decodeResult.decoder.decodeLevel = "full";
|
|
1951
2015
|
return decodeResult;
|
|
@@ -2487,6 +2551,111 @@ var Label_15_FST = class extends DecoderPlugin {
|
|
|
2487
2551
|
}
|
|
2488
2552
|
};
|
|
2489
2553
|
|
|
2554
|
+
// lib/plugins/Label_16_AUTPOS.ts
|
|
2555
|
+
var Label_16_AUTPOS = class extends DecoderPlugin {
|
|
2556
|
+
name = "label-16-autpos";
|
|
2557
|
+
qualifiers() {
|
|
2558
|
+
return {
|
|
2559
|
+
labels: ["16"],
|
|
2560
|
+
preambles: [""]
|
|
2561
|
+
};
|
|
2562
|
+
}
|
|
2563
|
+
decode(message) {
|
|
2564
|
+
let decodeResult = this.defaultResult();
|
|
2565
|
+
decodeResult.decoder.name = this.name;
|
|
2566
|
+
decodeResult.message = message;
|
|
2567
|
+
const regex = /^(\d{6})\/AUTPOS\/LLD (N|S)(\d{2})(\d{2})(\d{2}) (E|W)(\d{3})(\d{2})(\d{2})\s*\r?\n\/ALT (\d+)\/SAT ([*\-\d]{4})\r?\n\/WND ([*\d]{3})([\*\d]{3})\/TAT ([*\-\d]{4})\/TAS ([*\d]{3,4})\/CRZ ([*\d]{3,4})\r?\n\/FOB (\d{6})\r?\n\/DAT (\d{6})\/TIM (\d{6})/;
|
|
2568
|
+
const match = regex.exec(message.text);
|
|
2569
|
+
if (!match) {
|
|
2570
|
+
decodeResult.decoded = false;
|
|
2571
|
+
return decodeResult;
|
|
2572
|
+
}
|
|
2573
|
+
decodeResult.decoded = true;
|
|
2574
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
2575
|
+
decodeResult.formatted.description = "Position Report";
|
|
2576
|
+
const [
|
|
2577
|
+
,
|
|
2578
|
+
flight,
|
|
2579
|
+
latHem,
|
|
2580
|
+
latDeg,
|
|
2581
|
+
latMin,
|
|
2582
|
+
latSec,
|
|
2583
|
+
lonHem,
|
|
2584
|
+
lonDeg,
|
|
2585
|
+
lonMin,
|
|
2586
|
+
lonSec,
|
|
2587
|
+
altitude,
|
|
2588
|
+
sat,
|
|
2589
|
+
windDir,
|
|
2590
|
+
windSpd,
|
|
2591
|
+
tat,
|
|
2592
|
+
tas,
|
|
2593
|
+
crz,
|
|
2594
|
+
fob,
|
|
2595
|
+
dat,
|
|
2596
|
+
tim
|
|
2597
|
+
] = match;
|
|
2598
|
+
ResultFormatter.day(decodeResult, parseInt(flight.slice(0, 2), 10));
|
|
2599
|
+
ResultFormatter.flightNumber(decodeResult, flight.slice(2));
|
|
2600
|
+
let latitude = CoordinateUtils.dmsToDecimalDegrees(
|
|
2601
|
+
parseInt(latDeg, 10),
|
|
2602
|
+
parseInt(latMin, 10),
|
|
2603
|
+
parseInt(latSec, 10)
|
|
2604
|
+
);
|
|
2605
|
+
if (latHem === "S") latitude = -latitude;
|
|
2606
|
+
let longitude = CoordinateUtils.dmsToDecimalDegrees(
|
|
2607
|
+
parseInt(lonDeg, 10),
|
|
2608
|
+
parseInt(lonMin, 10),
|
|
2609
|
+
parseInt(lonSec, 10)
|
|
2610
|
+
);
|
|
2611
|
+
if (lonHem === "W") longitude = -longitude;
|
|
2612
|
+
ResultFormatter.position(decodeResult, {
|
|
2613
|
+
latitude,
|
|
2614
|
+
longitude
|
|
2615
|
+
});
|
|
2616
|
+
const alt = parseInt(altitude, 10);
|
|
2617
|
+
ResultFormatter.altitude(decodeResult, alt);
|
|
2618
|
+
if (!windSpd.includes("*") && !windDir.includes("*")) {
|
|
2619
|
+
ResultFormatter.windData(decodeResult, [
|
|
2620
|
+
{
|
|
2621
|
+
waypoint: {
|
|
2622
|
+
name: "POSITION"
|
|
2623
|
+
},
|
|
2624
|
+
flightLevel: Math.round(alt / 100),
|
|
2625
|
+
windDirection: parseInt(windDir, 10),
|
|
2626
|
+
windSpeed: parseInt(windSpd, 10)
|
|
2627
|
+
}
|
|
2628
|
+
]);
|
|
2629
|
+
}
|
|
2630
|
+
if (!tat.includes("*")) {
|
|
2631
|
+
ResultFormatter.totalAirTemp(decodeResult, tat);
|
|
2632
|
+
}
|
|
2633
|
+
if (!tas.includes("*")) {
|
|
2634
|
+
ResultFormatter.airspeed(decodeResult, parseInt(tas, 10));
|
|
2635
|
+
}
|
|
2636
|
+
if (!sat.includes("*")) {
|
|
2637
|
+
ResultFormatter.temperature(decodeResult, sat);
|
|
2638
|
+
}
|
|
2639
|
+
if (!crz.includes("*")) {
|
|
2640
|
+
ResultFormatter.mach(decodeResult, parseInt(crz, 10) / 1e3);
|
|
2641
|
+
}
|
|
2642
|
+
if (!fob.includes("*")) {
|
|
2643
|
+
ResultFormatter.currentFuel(decodeResult, parseInt(fob, 10));
|
|
2644
|
+
}
|
|
2645
|
+
if (!dat.includes("*") && !tim.includes("*")) {
|
|
2646
|
+
const yy = dat.slice(0, 2);
|
|
2647
|
+
const mm = dat.slice(2, 4);
|
|
2648
|
+
const dd = dat.slice(4, 6);
|
|
2649
|
+
const ddmmyy = `${dd}${mm}${yy}`;
|
|
2650
|
+
ResultFormatter.timestamp(
|
|
2651
|
+
decodeResult,
|
|
2652
|
+
DateTimeUtils.convertDateTimeToEpoch(tim, ddmmyy)
|
|
2653
|
+
);
|
|
2654
|
+
}
|
|
2655
|
+
return decodeResult;
|
|
2656
|
+
}
|
|
2657
|
+
};
|
|
2658
|
+
|
|
2490
2659
|
// lib/plugins/Label_16_Honeywell.ts
|
|
2491
2660
|
var Label_16_Honeywell = class extends DecoderPlugin {
|
|
2492
2661
|
name = "label-16-honeywell";
|
|
@@ -3261,7 +3430,7 @@ var Label_2P_FM3 = class extends DecoderPlugin {
|
|
|
3261
3430
|
const parts = message.text.split(",");
|
|
3262
3431
|
if (parts.length === 7) {
|
|
3263
3432
|
const header = parts[0].split("FM3 ");
|
|
3264
|
-
if (header.length
|
|
3433
|
+
if (header.length < 2) {
|
|
3265
3434
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
3266
3435
|
decodeResult.decoded = false;
|
|
3267
3436
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -3332,7 +3501,7 @@ var Label_2P_FM4 = class extends DecoderPlugin {
|
|
|
3332
3501
|
const parts = message.text.split(",");
|
|
3333
3502
|
if (parts.length === 10) {
|
|
3334
3503
|
const header = parts[0].split("FM4");
|
|
3335
|
-
if (header.length
|
|
3504
|
+
if (header.length < 2) {
|
|
3336
3505
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
3337
3506
|
decodeResult.decoded = false;
|
|
3338
3507
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -3391,7 +3560,7 @@ var Label_2P_FM5 = class extends DecoderPlugin {
|
|
|
3391
3560
|
const parts = message.text.split(",");
|
|
3392
3561
|
if (parts.length === 12) {
|
|
3393
3562
|
const header = parts[0].split("FM5 ");
|
|
3394
|
-
if (header.length
|
|
3563
|
+
if (header.length < 2) {
|
|
3395
3564
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
3396
3565
|
decodeResult.decoded = false;
|
|
3397
3566
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -3909,8 +4078,13 @@ var Label_4A_DIS = class extends DecoderPlugin {
|
|
|
3909
4078
|
}
|
|
3910
4079
|
decode(message, options = {}) {
|
|
3911
4080
|
const decodeResult = this.initResult(message, "Latest New Format");
|
|
3912
|
-
decodeResult.decoded = true;
|
|
3913
4081
|
const fields = message.text.split(",");
|
|
4082
|
+
if (fields.length < 3 || !fields[1] || fields[1].length < 3 || !fields[2]) {
|
|
4083
|
+
decodeResult.decoded = false;
|
|
4084
|
+
this.setDecodeLevel(decodeResult, decodeResult.decoded);
|
|
4085
|
+
return decodeResult;
|
|
4086
|
+
}
|
|
4087
|
+
decodeResult.decoded = true;
|
|
3914
4088
|
ResultFormatter.timestamp(
|
|
3915
4089
|
decodeResult,
|
|
3916
4090
|
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
|
|
@@ -4648,6 +4822,7 @@ var Label_H1_ATIS = class extends DecoderPlugin {
|
|
|
4648
4822
|
const checksum = match[6];
|
|
4649
4823
|
ResultFormatter.flightNumber(decodeResult, flight);
|
|
4650
4824
|
ResultFormatter.arrivalAirport(decodeResult, facility);
|
|
4825
|
+
ResultFormatter.sequenceNumber(decodeResult, parseInt(seq, 10));
|
|
4651
4826
|
decodeResult.raw.atis_code = code;
|
|
4652
4827
|
decodeResult.formatted.items.push({
|
|
4653
4828
|
type: "atis",
|
|
@@ -6535,13 +6710,11 @@ var Label_QQ = class extends DecoderPlugin {
|
|
|
6535
6710
|
};
|
|
6536
6711
|
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
6537
6712
|
ResultFormatter.position(decodeResult, pos);
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
|
|
6541
|
-
Number(message.text.substring(45, 48))
|
|
6542
|
-
);
|
|
6713
|
+
const gsField = message.text.substring(45, 48);
|
|
6714
|
+
if (decodeResult.remaining.text !== "---" && gsField !== "---") {
|
|
6715
|
+
ResultFormatter.groundspeed(decodeResult, Number(gsField));
|
|
6543
6716
|
} else {
|
|
6544
|
-
ResultFormatter.unknown(decodeResult,
|
|
6717
|
+
ResultFormatter.unknown(decodeResult, gsField);
|
|
6545
6718
|
}
|
|
6546
6719
|
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
6547
6720
|
} else {
|
|
@@ -6572,6 +6745,7 @@ var pluginClasses = [
|
|
|
6572
6745
|
Label_13Through18_Slash,
|
|
6573
6746
|
Label_15,
|
|
6574
6747
|
Label_15_FST,
|
|
6748
|
+
Label_16_AUTPOS,
|
|
6575
6749
|
Label_16_Honeywell,
|
|
6576
6750
|
Label_16_N_Space,
|
|
6577
6751
|
Label_16_POSA1,
|