@airframes/acars-decoder 1.9.0 → 1.9.1

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
@@ -613,7 +613,7 @@ var ResultFormatter = class {
613
613
  type: "message_checksum",
614
614
  code: "CHECKSUM",
615
615
  label: "Message Checksum",
616
- value: "0x" + ("0000" + decodeResult.raw.checksum.toString(16)).slice(-4)
616
+ value: "0x" + (decodeResult.raw.checksum >>> 0).toString(16).padStart(4, "0")
617
617
  });
618
618
  }
619
619
  static groundspeed(decodeResult, value) {
@@ -1273,7 +1273,11 @@ function addCompanyRoute(decodeResult, value) {
1273
1273
  name = segments[0];
1274
1274
  } else {
1275
1275
  name = segments[0].slice(0, parens_idx);
1276
- runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(")"));
1276
+ const close_paren_idx = segments[0].indexOf(")");
1277
+ runway = segments[0].slice(
1278
+ parens_idx + 1,
1279
+ close_paren_idx === -1 ? void 0 : close_paren_idx
1280
+ );
1277
1281
  }
1278
1282
  let waypoints;
1279
1283
  if (segments.length > 1) {
@@ -1941,6 +1945,12 @@ var Arinc702 = class extends DecoderPlugin {
1941
1945
  }
1942
1946
  };
1943
1947
 
1948
+ // lib/utils/acars_free_text.ts
1949
+ function formatAcarsFreeText(text) {
1950
+ if (!text) return "";
1951
+ return text.trim().replace(/\s+/g, " ");
1952
+ }
1953
+
1944
1954
  // lib/plugins/Label_5Z_Slash.ts
1945
1955
  var Label_5Z_Slash = class extends DecoderPlugin {
1946
1956
  name = "label-5z-slash";
@@ -1982,7 +1992,10 @@ var Label_5Z_Slash = class extends DecoderPlugin {
1982
1992
  decodeResult.formatted.description = "Airline Designated Downlink";
1983
1993
  const lines = message.text.split("\r\n");
1984
1994
  if (lines[0] === "/TXT") {
1985
- ResultFormatter.text(decodeResult, lines.slice(1).join("\r\n"));
1995
+ ResultFormatter.text(
1996
+ decodeResult,
1997
+ formatAcarsFreeText(lines.slice(1).join("\r\n"))
1998
+ );
1986
1999
  decodeResult.decoded = true;
1987
2000
  decodeResult.decoder.decodeLevel = "full";
1988
2001
  return decodeResult;
@@ -2524,6 +2537,111 @@ var Label_15_FST = class extends DecoderPlugin {
2524
2537
  }
2525
2538
  };
2526
2539
 
2540
+ // lib/plugins/Label_16_AUTPOS.ts
2541
+ var Label_16_AUTPOS = class extends DecoderPlugin {
2542
+ name = "label-16-autpos";
2543
+ qualifiers() {
2544
+ return {
2545
+ labels: ["16"],
2546
+ preambles: [""]
2547
+ };
2548
+ }
2549
+ decode(message) {
2550
+ let decodeResult = this.defaultResult();
2551
+ decodeResult.decoder.name = this.name;
2552
+ decodeResult.message = message;
2553
+ 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})/;
2554
+ const match = regex.exec(message.text);
2555
+ if (!match) {
2556
+ decodeResult.decoded = false;
2557
+ return decodeResult;
2558
+ }
2559
+ decodeResult.decoded = true;
2560
+ decodeResult.decoder.decodeLevel = "full";
2561
+ decodeResult.formatted.description = "Position Report";
2562
+ const [
2563
+ ,
2564
+ flight,
2565
+ latHem,
2566
+ latDeg,
2567
+ latMin,
2568
+ latSec,
2569
+ lonHem,
2570
+ lonDeg,
2571
+ lonMin,
2572
+ lonSec,
2573
+ altitude,
2574
+ sat,
2575
+ windDir,
2576
+ windSpd,
2577
+ tat,
2578
+ tas,
2579
+ crz,
2580
+ fob,
2581
+ dat,
2582
+ tim
2583
+ ] = match;
2584
+ ResultFormatter.day(decodeResult, parseInt(flight.slice(0, 2), 10));
2585
+ ResultFormatter.flightNumber(decodeResult, flight.slice(2));
2586
+ let latitude = CoordinateUtils.dmsToDecimalDegrees(
2587
+ parseInt(latDeg, 10),
2588
+ parseInt(latMin, 10),
2589
+ parseInt(latSec, 10)
2590
+ );
2591
+ if (latHem === "S") latitude = -latitude;
2592
+ let longitude = CoordinateUtils.dmsToDecimalDegrees(
2593
+ parseInt(lonDeg, 10),
2594
+ parseInt(lonMin, 10),
2595
+ parseInt(lonSec, 10)
2596
+ );
2597
+ if (lonHem === "W") longitude = -longitude;
2598
+ ResultFormatter.position(decodeResult, {
2599
+ latitude,
2600
+ longitude
2601
+ });
2602
+ const alt = parseInt(altitude, 10);
2603
+ ResultFormatter.altitude(decodeResult, alt);
2604
+ if (!windSpd.includes("*") && !windDir.includes("*")) {
2605
+ ResultFormatter.windData(decodeResult, [
2606
+ {
2607
+ waypoint: {
2608
+ name: "POSITION"
2609
+ },
2610
+ flightLevel: Math.round(alt / 100),
2611
+ windDirection: parseInt(windDir, 10),
2612
+ windSpeed: parseInt(windSpd, 10)
2613
+ }
2614
+ ]);
2615
+ }
2616
+ if (!tat.includes("*")) {
2617
+ ResultFormatter.totalAirTemp(decodeResult, tat);
2618
+ }
2619
+ if (!tas.includes("*")) {
2620
+ ResultFormatter.airspeed(decodeResult, parseInt(tas, 10));
2621
+ }
2622
+ if (!sat.includes("*")) {
2623
+ ResultFormatter.temperature(decodeResult, sat);
2624
+ }
2625
+ if (!crz.includes("*")) {
2626
+ ResultFormatter.mach(decodeResult, parseInt(crz, 10) / 1e3);
2627
+ }
2628
+ if (!fob.includes("*")) {
2629
+ ResultFormatter.currentFuel(decodeResult, parseInt(fob, 10));
2630
+ }
2631
+ if (!dat.includes("*") && !tim.includes("*")) {
2632
+ const yy = dat.slice(0, 2);
2633
+ const mm = dat.slice(2, 4);
2634
+ const dd = dat.slice(4, 6);
2635
+ const ddmmyy = `${dd}${mm}${yy}`;
2636
+ ResultFormatter.timestamp(
2637
+ decodeResult,
2638
+ DateTimeUtils.convertDateTimeToEpoch(tim, ddmmyy)
2639
+ );
2640
+ }
2641
+ return decodeResult;
2642
+ }
2643
+ };
2644
+
2527
2645
  // lib/plugins/Label_16_Honeywell.ts
2528
2646
  var Label_16_Honeywell = class extends DecoderPlugin {
2529
2647
  name = "label-16-honeywell";
@@ -3298,7 +3416,7 @@ var Label_2P_FM3 = class extends DecoderPlugin {
3298
3416
  const parts = message.text.split(",");
3299
3417
  if (parts.length === 7) {
3300
3418
  const header = parts[0].split("FM3 ");
3301
- if (header.length == 0) {
3419
+ if (header.length < 2) {
3302
3420
  ResultFormatter.unknown(decodeResult, message.text);
3303
3421
  decodeResult.decoded = false;
3304
3422
  decodeResult.decoder.decodeLevel = "none";
@@ -3369,7 +3487,7 @@ var Label_2P_FM4 = class extends DecoderPlugin {
3369
3487
  const parts = message.text.split(",");
3370
3488
  if (parts.length === 10) {
3371
3489
  const header = parts[0].split("FM4");
3372
- if (header.length == 0) {
3490
+ if (header.length < 2) {
3373
3491
  ResultFormatter.unknown(decodeResult, message.text);
3374
3492
  decodeResult.decoded = false;
3375
3493
  decodeResult.decoder.decodeLevel = "none";
@@ -3428,7 +3546,7 @@ var Label_2P_FM5 = class extends DecoderPlugin {
3428
3546
  const parts = message.text.split(",");
3429
3547
  if (parts.length === 12) {
3430
3548
  const header = parts[0].split("FM5 ");
3431
- if (header.length == 0) {
3549
+ if (header.length < 2) {
3432
3550
  ResultFormatter.unknown(decodeResult, message.text);
3433
3551
  decodeResult.decoded = false;
3434
3552
  decodeResult.decoder.decodeLevel = "none";
@@ -4685,6 +4803,7 @@ var Label_H1_ATIS = class extends DecoderPlugin {
4685
4803
  const checksum = match[6];
4686
4804
  ResultFormatter.flightNumber(decodeResult, flight);
4687
4805
  ResultFormatter.arrivalAirport(decodeResult, facility);
4806
+ ResultFormatter.sequenceNumber(decodeResult, parseInt(seq, 10));
4688
4807
  decodeResult.raw.atis_code = code;
4689
4808
  decodeResult.formatted.items.push({
4690
4809
  type: "atis",
@@ -6609,6 +6728,7 @@ var pluginClasses = [
6609
6728
  Label_13Through18_Slash,
6610
6729
  Label_15,
6611
6730
  Label_15_FST,
6731
+ Label_16_AUTPOS,
6612
6732
  Label_16_Honeywell,
6613
6733
  Label_16_N_Space,
6614
6734
  Label_16_POSA1,