@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.js
CHANGED
|
@@ -259,6 +259,9 @@ var DateTimeUtils = class {
|
|
|
259
259
|
* @returns
|
|
260
260
|
*/
|
|
261
261
|
static timestampToString(time) {
|
|
262
|
+
if (isNaN(time)) {
|
|
263
|
+
return "";
|
|
264
|
+
}
|
|
262
265
|
const date = new Date(time * 1e3);
|
|
263
266
|
if (time < 86400) {
|
|
264
267
|
return date.toISOString().slice(11, 19);
|
|
@@ -506,6 +509,9 @@ var ResultFormatter = class {
|
|
|
506
509
|
});
|
|
507
510
|
}
|
|
508
511
|
static eta(decodeResult, time) {
|
|
512
|
+
if (isNaN(time)) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
509
515
|
decodeResult.raw.eta_time = time;
|
|
510
516
|
decodeResult.formatted.items.push({
|
|
511
517
|
type: "time",
|
|
@@ -613,10 +619,13 @@ var ResultFormatter = class {
|
|
|
613
619
|
type: "message_checksum",
|
|
614
620
|
code: "CHECKSUM",
|
|
615
621
|
label: "Message Checksum",
|
|
616
|
-
value: "0x" + (
|
|
622
|
+
value: "0x" + (decodeResult.raw.checksum >>> 0).toString(16).padStart(4, "0")
|
|
617
623
|
});
|
|
618
624
|
}
|
|
619
625
|
static groundspeed(decodeResult, value) {
|
|
626
|
+
if (isNaN(value)) {
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
620
629
|
decodeResult.raw.groundspeed = value;
|
|
621
630
|
decodeResult.formatted.items.push({
|
|
622
631
|
type: "aircraft_groundspeed",
|
|
@@ -626,6 +635,9 @@ var ResultFormatter = class {
|
|
|
626
635
|
});
|
|
627
636
|
}
|
|
628
637
|
static airspeed(decodeResult, value) {
|
|
638
|
+
if (isNaN(value)) {
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
629
641
|
decodeResult.raw.airspeed = value;
|
|
630
642
|
decodeResult.formatted.items.push({
|
|
631
643
|
type: "airspeed",
|
|
@@ -635,6 +647,9 @@ var ResultFormatter = class {
|
|
|
635
647
|
});
|
|
636
648
|
}
|
|
637
649
|
static mach(decodeResult, value) {
|
|
650
|
+
if (isNaN(value)) {
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
638
653
|
decodeResult.raw.mach = value;
|
|
639
654
|
decodeResult.formatted.items.push({
|
|
640
655
|
type: "mach",
|
|
@@ -672,6 +687,9 @@ var ResultFormatter = class {
|
|
|
672
687
|
});
|
|
673
688
|
}
|
|
674
689
|
static heading(decodeResult, value) {
|
|
690
|
+
if (isNaN(value)) {
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
675
693
|
decodeResult.raw.heading = value;
|
|
676
694
|
decodeResult.formatted.items.push({
|
|
677
695
|
type: "heading",
|
|
@@ -690,6 +708,9 @@ var ResultFormatter = class {
|
|
|
690
708
|
});
|
|
691
709
|
}
|
|
692
710
|
static out(decodeResult, time) {
|
|
711
|
+
if (isNaN(time)) {
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
693
714
|
decodeResult.raw.out_time = time;
|
|
694
715
|
decodeResult.formatted.items.push({
|
|
695
716
|
type: "time",
|
|
@@ -699,6 +720,9 @@ var ResultFormatter = class {
|
|
|
699
720
|
});
|
|
700
721
|
}
|
|
701
722
|
static off(decodeResult, time) {
|
|
723
|
+
if (isNaN(time)) {
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
702
726
|
decodeResult.raw.off_time = time;
|
|
703
727
|
decodeResult.formatted.items.push({
|
|
704
728
|
type: "time",
|
|
@@ -708,6 +732,9 @@ var ResultFormatter = class {
|
|
|
708
732
|
});
|
|
709
733
|
}
|
|
710
734
|
static on(decodeResult, time) {
|
|
735
|
+
if (isNaN(time)) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
711
738
|
decodeResult.raw.on_time = time;
|
|
712
739
|
decodeResult.formatted.items.push({
|
|
713
740
|
type: "time",
|
|
@@ -717,6 +744,9 @@ var ResultFormatter = class {
|
|
|
717
744
|
});
|
|
718
745
|
}
|
|
719
746
|
static in(decodeResult, time) {
|
|
747
|
+
if (isNaN(time)) {
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
720
750
|
decodeResult.raw.in_time = time;
|
|
721
751
|
decodeResult.formatted.items.push({
|
|
722
752
|
type: "time",
|
|
@@ -726,6 +756,9 @@ var ResultFormatter = class {
|
|
|
726
756
|
});
|
|
727
757
|
}
|
|
728
758
|
static engineStart(decodeResult, time) {
|
|
759
|
+
if (isNaN(time)) {
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
729
762
|
decodeResult.raw.engine_start_time = time;
|
|
730
763
|
decodeResult.formatted.items.push({
|
|
731
764
|
type: "time",
|
|
@@ -735,6 +768,9 @@ var ResultFormatter = class {
|
|
|
735
768
|
});
|
|
736
769
|
}
|
|
737
770
|
static engineStop(decodeResult, time) {
|
|
771
|
+
if (isNaN(time)) {
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
738
774
|
decodeResult.raw.engine_stop_time = time;
|
|
739
775
|
decodeResult.formatted.items.push({
|
|
740
776
|
type: "time",
|
|
@@ -744,6 +780,9 @@ var ResultFormatter = class {
|
|
|
744
780
|
});
|
|
745
781
|
}
|
|
746
782
|
static day(decodeResult, day) {
|
|
783
|
+
if (isNaN(day)) {
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
747
786
|
decodeResult.raw.day = day;
|
|
748
787
|
decodeResult.formatted.items.push({
|
|
749
788
|
type: "day",
|
|
@@ -753,6 +792,9 @@ var ResultFormatter = class {
|
|
|
753
792
|
});
|
|
754
793
|
}
|
|
755
794
|
static month(decodeResult, month) {
|
|
795
|
+
if (isNaN(month)) {
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
756
798
|
decodeResult.raw.month = month;
|
|
757
799
|
decodeResult.formatted.items.push({
|
|
758
800
|
type: "month",
|
|
@@ -762,6 +804,9 @@ var ResultFormatter = class {
|
|
|
762
804
|
});
|
|
763
805
|
}
|
|
764
806
|
static departureDay(decodeResult, day) {
|
|
807
|
+
if (isNaN(day)) {
|
|
808
|
+
return;
|
|
809
|
+
}
|
|
765
810
|
decodeResult.raw.departure_day = day;
|
|
766
811
|
decodeResult.formatted.items.push({
|
|
767
812
|
type: "day",
|
|
@@ -771,6 +816,9 @@ var ResultFormatter = class {
|
|
|
771
816
|
});
|
|
772
817
|
}
|
|
773
818
|
static arrivalDay(decodeResult, day) {
|
|
819
|
+
if (isNaN(day)) {
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
774
822
|
decodeResult.raw.arrival_day = day;
|
|
775
823
|
decodeResult.formatted.items.push({
|
|
776
824
|
type: "day",
|
|
@@ -934,6 +982,9 @@ var ResultFormatter = class {
|
|
|
934
982
|
});
|
|
935
983
|
}
|
|
936
984
|
static timestamp(decodeResult, value) {
|
|
985
|
+
if (isNaN(value)) {
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
937
988
|
decodeResult.raw.message_timestamp = value;
|
|
938
989
|
decodeResult.formatted.items.push({
|
|
939
990
|
type: "time",
|
|
@@ -1273,7 +1324,11 @@ function addCompanyRoute(decodeResult, value) {
|
|
|
1273
1324
|
name = segments[0];
|
|
1274
1325
|
} else {
|
|
1275
1326
|
name = segments[0].slice(0, parens_idx);
|
|
1276
|
-
|
|
1327
|
+
const close_paren_idx = segments[0].indexOf(")");
|
|
1328
|
+
runway = segments[0].slice(
|
|
1329
|
+
parens_idx + 1,
|
|
1330
|
+
close_paren_idx === -1 ? void 0 : close_paren_idx
|
|
1331
|
+
);
|
|
1277
1332
|
}
|
|
1278
1333
|
let waypoints;
|
|
1279
1334
|
if (segments.length > 1) {
|
|
@@ -1941,6 +1996,12 @@ var Arinc702 = class extends DecoderPlugin {
|
|
|
1941
1996
|
}
|
|
1942
1997
|
};
|
|
1943
1998
|
|
|
1999
|
+
// lib/utils/acars_free_text.ts
|
|
2000
|
+
function formatAcarsFreeText(text) {
|
|
2001
|
+
if (!text) return "";
|
|
2002
|
+
return text.trim().replace(/\s+/g, " ");
|
|
2003
|
+
}
|
|
2004
|
+
|
|
1944
2005
|
// lib/plugins/Label_5Z_Slash.ts
|
|
1945
2006
|
var Label_5Z_Slash = class extends DecoderPlugin {
|
|
1946
2007
|
name = "label-5z-slash";
|
|
@@ -1982,7 +2043,10 @@ var Label_5Z_Slash = class extends DecoderPlugin {
|
|
|
1982
2043
|
decodeResult.formatted.description = "Airline Designated Downlink";
|
|
1983
2044
|
const lines = message.text.split("\r\n");
|
|
1984
2045
|
if (lines[0] === "/TXT") {
|
|
1985
|
-
ResultFormatter.text(
|
|
2046
|
+
ResultFormatter.text(
|
|
2047
|
+
decodeResult,
|
|
2048
|
+
formatAcarsFreeText(lines.slice(1).join("\r\n"))
|
|
2049
|
+
);
|
|
1986
2050
|
decodeResult.decoded = true;
|
|
1987
2051
|
decodeResult.decoder.decodeLevel = "full";
|
|
1988
2052
|
return decodeResult;
|
|
@@ -2524,6 +2588,111 @@ var Label_15_FST = class extends DecoderPlugin {
|
|
|
2524
2588
|
}
|
|
2525
2589
|
};
|
|
2526
2590
|
|
|
2591
|
+
// lib/plugins/Label_16_AUTPOS.ts
|
|
2592
|
+
var Label_16_AUTPOS = class extends DecoderPlugin {
|
|
2593
|
+
name = "label-16-autpos";
|
|
2594
|
+
qualifiers() {
|
|
2595
|
+
return {
|
|
2596
|
+
labels: ["16"],
|
|
2597
|
+
preambles: [""]
|
|
2598
|
+
};
|
|
2599
|
+
}
|
|
2600
|
+
decode(message) {
|
|
2601
|
+
let decodeResult = this.defaultResult();
|
|
2602
|
+
decodeResult.decoder.name = this.name;
|
|
2603
|
+
decodeResult.message = message;
|
|
2604
|
+
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})/;
|
|
2605
|
+
const match = regex.exec(message.text);
|
|
2606
|
+
if (!match) {
|
|
2607
|
+
decodeResult.decoded = false;
|
|
2608
|
+
return decodeResult;
|
|
2609
|
+
}
|
|
2610
|
+
decodeResult.decoded = true;
|
|
2611
|
+
decodeResult.decoder.decodeLevel = "full";
|
|
2612
|
+
decodeResult.formatted.description = "Position Report";
|
|
2613
|
+
const [
|
|
2614
|
+
,
|
|
2615
|
+
flight,
|
|
2616
|
+
latHem,
|
|
2617
|
+
latDeg,
|
|
2618
|
+
latMin,
|
|
2619
|
+
latSec,
|
|
2620
|
+
lonHem,
|
|
2621
|
+
lonDeg,
|
|
2622
|
+
lonMin,
|
|
2623
|
+
lonSec,
|
|
2624
|
+
altitude,
|
|
2625
|
+
sat,
|
|
2626
|
+
windDir,
|
|
2627
|
+
windSpd,
|
|
2628
|
+
tat,
|
|
2629
|
+
tas,
|
|
2630
|
+
crz,
|
|
2631
|
+
fob,
|
|
2632
|
+
dat,
|
|
2633
|
+
tim
|
|
2634
|
+
] = match;
|
|
2635
|
+
ResultFormatter.day(decodeResult, parseInt(flight.slice(0, 2), 10));
|
|
2636
|
+
ResultFormatter.flightNumber(decodeResult, flight.slice(2));
|
|
2637
|
+
let latitude = CoordinateUtils.dmsToDecimalDegrees(
|
|
2638
|
+
parseInt(latDeg, 10),
|
|
2639
|
+
parseInt(latMin, 10),
|
|
2640
|
+
parseInt(latSec, 10)
|
|
2641
|
+
);
|
|
2642
|
+
if (latHem === "S") latitude = -latitude;
|
|
2643
|
+
let longitude = CoordinateUtils.dmsToDecimalDegrees(
|
|
2644
|
+
parseInt(lonDeg, 10),
|
|
2645
|
+
parseInt(lonMin, 10),
|
|
2646
|
+
parseInt(lonSec, 10)
|
|
2647
|
+
);
|
|
2648
|
+
if (lonHem === "W") longitude = -longitude;
|
|
2649
|
+
ResultFormatter.position(decodeResult, {
|
|
2650
|
+
latitude,
|
|
2651
|
+
longitude
|
|
2652
|
+
});
|
|
2653
|
+
const alt = parseInt(altitude, 10);
|
|
2654
|
+
ResultFormatter.altitude(decodeResult, alt);
|
|
2655
|
+
if (!windSpd.includes("*") && !windDir.includes("*")) {
|
|
2656
|
+
ResultFormatter.windData(decodeResult, [
|
|
2657
|
+
{
|
|
2658
|
+
waypoint: {
|
|
2659
|
+
name: "POSITION"
|
|
2660
|
+
},
|
|
2661
|
+
flightLevel: Math.round(alt / 100),
|
|
2662
|
+
windDirection: parseInt(windDir, 10),
|
|
2663
|
+
windSpeed: parseInt(windSpd, 10)
|
|
2664
|
+
}
|
|
2665
|
+
]);
|
|
2666
|
+
}
|
|
2667
|
+
if (!tat.includes("*")) {
|
|
2668
|
+
ResultFormatter.totalAirTemp(decodeResult, tat);
|
|
2669
|
+
}
|
|
2670
|
+
if (!tas.includes("*")) {
|
|
2671
|
+
ResultFormatter.airspeed(decodeResult, parseInt(tas, 10));
|
|
2672
|
+
}
|
|
2673
|
+
if (!sat.includes("*")) {
|
|
2674
|
+
ResultFormatter.temperature(decodeResult, sat);
|
|
2675
|
+
}
|
|
2676
|
+
if (!crz.includes("*")) {
|
|
2677
|
+
ResultFormatter.mach(decodeResult, parseInt(crz, 10) / 1e3);
|
|
2678
|
+
}
|
|
2679
|
+
if (!fob.includes("*")) {
|
|
2680
|
+
ResultFormatter.currentFuel(decodeResult, parseInt(fob, 10));
|
|
2681
|
+
}
|
|
2682
|
+
if (!dat.includes("*") && !tim.includes("*")) {
|
|
2683
|
+
const yy = dat.slice(0, 2);
|
|
2684
|
+
const mm = dat.slice(2, 4);
|
|
2685
|
+
const dd = dat.slice(4, 6);
|
|
2686
|
+
const ddmmyy = `${dd}${mm}${yy}`;
|
|
2687
|
+
ResultFormatter.timestamp(
|
|
2688
|
+
decodeResult,
|
|
2689
|
+
DateTimeUtils.convertDateTimeToEpoch(tim, ddmmyy)
|
|
2690
|
+
);
|
|
2691
|
+
}
|
|
2692
|
+
return decodeResult;
|
|
2693
|
+
}
|
|
2694
|
+
};
|
|
2695
|
+
|
|
2527
2696
|
// lib/plugins/Label_16_Honeywell.ts
|
|
2528
2697
|
var Label_16_Honeywell = class extends DecoderPlugin {
|
|
2529
2698
|
name = "label-16-honeywell";
|
|
@@ -3298,7 +3467,7 @@ var Label_2P_FM3 = class extends DecoderPlugin {
|
|
|
3298
3467
|
const parts = message.text.split(",");
|
|
3299
3468
|
if (parts.length === 7) {
|
|
3300
3469
|
const header = parts[0].split("FM3 ");
|
|
3301
|
-
if (header.length
|
|
3470
|
+
if (header.length < 2) {
|
|
3302
3471
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
3303
3472
|
decodeResult.decoded = false;
|
|
3304
3473
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -3369,7 +3538,7 @@ var Label_2P_FM4 = class extends DecoderPlugin {
|
|
|
3369
3538
|
const parts = message.text.split(",");
|
|
3370
3539
|
if (parts.length === 10) {
|
|
3371
3540
|
const header = parts[0].split("FM4");
|
|
3372
|
-
if (header.length
|
|
3541
|
+
if (header.length < 2) {
|
|
3373
3542
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
3374
3543
|
decodeResult.decoded = false;
|
|
3375
3544
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -3428,7 +3597,7 @@ var Label_2P_FM5 = class extends DecoderPlugin {
|
|
|
3428
3597
|
const parts = message.text.split(",");
|
|
3429
3598
|
if (parts.length === 12) {
|
|
3430
3599
|
const header = parts[0].split("FM5 ");
|
|
3431
|
-
if (header.length
|
|
3600
|
+
if (header.length < 2) {
|
|
3432
3601
|
ResultFormatter.unknown(decodeResult, message.text);
|
|
3433
3602
|
decodeResult.decoded = false;
|
|
3434
3603
|
decodeResult.decoder.decodeLevel = "none";
|
|
@@ -3946,8 +4115,13 @@ var Label_4A_DIS = class extends DecoderPlugin {
|
|
|
3946
4115
|
}
|
|
3947
4116
|
decode(message, options = {}) {
|
|
3948
4117
|
const decodeResult = this.initResult(message, "Latest New Format");
|
|
3949
|
-
decodeResult.decoded = true;
|
|
3950
4118
|
const fields = message.text.split(",");
|
|
4119
|
+
if (fields.length < 3 || !fields[1] || fields[1].length < 3 || !fields[2]) {
|
|
4120
|
+
decodeResult.decoded = false;
|
|
4121
|
+
this.setDecodeLevel(decodeResult, decodeResult.decoded);
|
|
4122
|
+
return decodeResult;
|
|
4123
|
+
}
|
|
4124
|
+
decodeResult.decoded = true;
|
|
3951
4125
|
ResultFormatter.timestamp(
|
|
3952
4126
|
decodeResult,
|
|
3953
4127
|
DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00")
|
|
@@ -4685,6 +4859,7 @@ var Label_H1_ATIS = class extends DecoderPlugin {
|
|
|
4685
4859
|
const checksum = match[6];
|
|
4686
4860
|
ResultFormatter.flightNumber(decodeResult, flight);
|
|
4687
4861
|
ResultFormatter.arrivalAirport(decodeResult, facility);
|
|
4862
|
+
ResultFormatter.sequenceNumber(decodeResult, parseInt(seq, 10));
|
|
4688
4863
|
decodeResult.raw.atis_code = code;
|
|
4689
4864
|
decodeResult.formatted.items.push({
|
|
4690
4865
|
type: "atis",
|
|
@@ -6572,13 +6747,11 @@ var Label_QQ = class extends DecoderPlugin {
|
|
|
6572
6747
|
};
|
|
6573
6748
|
ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
|
|
6574
6749
|
ResultFormatter.position(decodeResult, pos);
|
|
6575
|
-
|
|
6576
|
-
|
|
6577
|
-
|
|
6578
|
-
Number(message.text.substring(45, 48))
|
|
6579
|
-
);
|
|
6750
|
+
const gsField = message.text.substring(45, 48);
|
|
6751
|
+
if (decodeResult.remaining.text !== "---" && gsField !== "---") {
|
|
6752
|
+
ResultFormatter.groundspeed(decodeResult, Number(gsField));
|
|
6580
6753
|
} else {
|
|
6581
|
-
ResultFormatter.unknown(decodeResult,
|
|
6754
|
+
ResultFormatter.unknown(decodeResult, gsField);
|
|
6582
6755
|
}
|
|
6583
6756
|
ResultFormatter.unknown(decodeResult, message.text.substring(48));
|
|
6584
6757
|
} else {
|
|
@@ -6609,6 +6782,7 @@ var pluginClasses = [
|
|
|
6609
6782
|
Label_13Through18_Slash,
|
|
6610
6783
|
Label_15,
|
|
6611
6784
|
Label_15_FST,
|
|
6785
|
+
Label_16_AUTPOS,
|
|
6612
6786
|
Label_16_Honeywell,
|
|
6613
6787
|
Label_16_N_Space,
|
|
6614
6788
|
Label_16_POSA1,
|