@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 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" + ("0000" + decodeResult.raw.checksum.toString(16)).slice(-4)
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
- runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(")"));
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(decodeResult, lines.slice(1).join("\r\n"));
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 == 0) {
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 == 0) {
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 == 0) {
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
- if (decodeResult.remaining.text !== "---") {
6576
- ResultFormatter.groundspeed(
6577
- decodeResult,
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, message.text.substring(45, 48));
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,