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