@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.mjs CHANGED
@@ -576,7 +576,7 @@ var ResultFormatter = class {
576
576
  type: "message_checksum",
577
577
  code: "CHECKSUM",
578
578
  label: "Message Checksum",
579
- value: "0x" + ("0000" + decodeResult.raw.checksum.toString(16)).slice(-4)
579
+ value: "0x" + (decodeResult.raw.checksum >>> 0).toString(16).padStart(4, "0")
580
580
  });
581
581
  }
582
582
  static groundspeed(decodeResult, value) {
@@ -1236,7 +1236,11 @@ function addCompanyRoute(decodeResult, value) {
1236
1236
  name = segments[0];
1237
1237
  } else {
1238
1238
  name = segments[0].slice(0, parens_idx);
1239
- runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(")"));
1239
+ const close_paren_idx = segments[0].indexOf(")");
1240
+ runway = segments[0].slice(
1241
+ parens_idx + 1,
1242
+ close_paren_idx === -1 ? void 0 : close_paren_idx
1243
+ );
1240
1244
  }
1241
1245
  let waypoints;
1242
1246
  if (segments.length > 1) {
@@ -1904,6 +1908,12 @@ var Arinc702 = class extends DecoderPlugin {
1904
1908
  }
1905
1909
  };
1906
1910
 
1911
+ // lib/utils/acars_free_text.ts
1912
+ function formatAcarsFreeText(text) {
1913
+ if (!text) return "";
1914
+ return text.trim().replace(/\s+/g, " ");
1915
+ }
1916
+
1907
1917
  // lib/plugins/Label_5Z_Slash.ts
1908
1918
  var Label_5Z_Slash = class extends DecoderPlugin {
1909
1919
  name = "label-5z-slash";
@@ -1945,7 +1955,10 @@ var Label_5Z_Slash = class extends DecoderPlugin {
1945
1955
  decodeResult.formatted.description = "Airline Designated Downlink";
1946
1956
  const lines = message.text.split("\r\n");
1947
1957
  if (lines[0] === "/TXT") {
1948
- ResultFormatter.text(decodeResult, lines.slice(1).join("\r\n"));
1958
+ ResultFormatter.text(
1959
+ decodeResult,
1960
+ formatAcarsFreeText(lines.slice(1).join("\r\n"))
1961
+ );
1949
1962
  decodeResult.decoded = true;
1950
1963
  decodeResult.decoder.decodeLevel = "full";
1951
1964
  return decodeResult;
@@ -2487,6 +2500,111 @@ var Label_15_FST = class extends DecoderPlugin {
2487
2500
  }
2488
2501
  };
2489
2502
 
2503
+ // lib/plugins/Label_16_AUTPOS.ts
2504
+ var Label_16_AUTPOS = class extends DecoderPlugin {
2505
+ name = "label-16-autpos";
2506
+ qualifiers() {
2507
+ return {
2508
+ labels: ["16"],
2509
+ preambles: [""]
2510
+ };
2511
+ }
2512
+ decode(message) {
2513
+ let decodeResult = this.defaultResult();
2514
+ decodeResult.decoder.name = this.name;
2515
+ decodeResult.message = message;
2516
+ 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})/;
2517
+ const match = regex.exec(message.text);
2518
+ if (!match) {
2519
+ decodeResult.decoded = false;
2520
+ return decodeResult;
2521
+ }
2522
+ decodeResult.decoded = true;
2523
+ decodeResult.decoder.decodeLevel = "full";
2524
+ decodeResult.formatted.description = "Position Report";
2525
+ const [
2526
+ ,
2527
+ flight,
2528
+ latHem,
2529
+ latDeg,
2530
+ latMin,
2531
+ latSec,
2532
+ lonHem,
2533
+ lonDeg,
2534
+ lonMin,
2535
+ lonSec,
2536
+ altitude,
2537
+ sat,
2538
+ windDir,
2539
+ windSpd,
2540
+ tat,
2541
+ tas,
2542
+ crz,
2543
+ fob,
2544
+ dat,
2545
+ tim
2546
+ ] = match;
2547
+ ResultFormatter.day(decodeResult, parseInt(flight.slice(0, 2), 10));
2548
+ ResultFormatter.flightNumber(decodeResult, flight.slice(2));
2549
+ let latitude = CoordinateUtils.dmsToDecimalDegrees(
2550
+ parseInt(latDeg, 10),
2551
+ parseInt(latMin, 10),
2552
+ parseInt(latSec, 10)
2553
+ );
2554
+ if (latHem === "S") latitude = -latitude;
2555
+ let longitude = CoordinateUtils.dmsToDecimalDegrees(
2556
+ parseInt(lonDeg, 10),
2557
+ parseInt(lonMin, 10),
2558
+ parseInt(lonSec, 10)
2559
+ );
2560
+ if (lonHem === "W") longitude = -longitude;
2561
+ ResultFormatter.position(decodeResult, {
2562
+ latitude,
2563
+ longitude
2564
+ });
2565
+ const alt = parseInt(altitude, 10);
2566
+ ResultFormatter.altitude(decodeResult, alt);
2567
+ if (!windSpd.includes("*") && !windDir.includes("*")) {
2568
+ ResultFormatter.windData(decodeResult, [
2569
+ {
2570
+ waypoint: {
2571
+ name: "POSITION"
2572
+ },
2573
+ flightLevel: Math.round(alt / 100),
2574
+ windDirection: parseInt(windDir, 10),
2575
+ windSpeed: parseInt(windSpd, 10)
2576
+ }
2577
+ ]);
2578
+ }
2579
+ if (!tat.includes("*")) {
2580
+ ResultFormatter.totalAirTemp(decodeResult, tat);
2581
+ }
2582
+ if (!tas.includes("*")) {
2583
+ ResultFormatter.airspeed(decodeResult, parseInt(tas, 10));
2584
+ }
2585
+ if (!sat.includes("*")) {
2586
+ ResultFormatter.temperature(decodeResult, sat);
2587
+ }
2588
+ if (!crz.includes("*")) {
2589
+ ResultFormatter.mach(decodeResult, parseInt(crz, 10) / 1e3);
2590
+ }
2591
+ if (!fob.includes("*")) {
2592
+ ResultFormatter.currentFuel(decodeResult, parseInt(fob, 10));
2593
+ }
2594
+ if (!dat.includes("*") && !tim.includes("*")) {
2595
+ const yy = dat.slice(0, 2);
2596
+ const mm = dat.slice(2, 4);
2597
+ const dd = dat.slice(4, 6);
2598
+ const ddmmyy = `${dd}${mm}${yy}`;
2599
+ ResultFormatter.timestamp(
2600
+ decodeResult,
2601
+ DateTimeUtils.convertDateTimeToEpoch(tim, ddmmyy)
2602
+ );
2603
+ }
2604
+ return decodeResult;
2605
+ }
2606
+ };
2607
+
2490
2608
  // lib/plugins/Label_16_Honeywell.ts
2491
2609
  var Label_16_Honeywell = class extends DecoderPlugin {
2492
2610
  name = "label-16-honeywell";
@@ -3261,7 +3379,7 @@ var Label_2P_FM3 = class extends DecoderPlugin {
3261
3379
  const parts = message.text.split(",");
3262
3380
  if (parts.length === 7) {
3263
3381
  const header = parts[0].split("FM3 ");
3264
- if (header.length == 0) {
3382
+ if (header.length < 2) {
3265
3383
  ResultFormatter.unknown(decodeResult, message.text);
3266
3384
  decodeResult.decoded = false;
3267
3385
  decodeResult.decoder.decodeLevel = "none";
@@ -3332,7 +3450,7 @@ var Label_2P_FM4 = class extends DecoderPlugin {
3332
3450
  const parts = message.text.split(",");
3333
3451
  if (parts.length === 10) {
3334
3452
  const header = parts[0].split("FM4");
3335
- if (header.length == 0) {
3453
+ if (header.length < 2) {
3336
3454
  ResultFormatter.unknown(decodeResult, message.text);
3337
3455
  decodeResult.decoded = false;
3338
3456
  decodeResult.decoder.decodeLevel = "none";
@@ -3391,7 +3509,7 @@ var Label_2P_FM5 = class extends DecoderPlugin {
3391
3509
  const parts = message.text.split(",");
3392
3510
  if (parts.length === 12) {
3393
3511
  const header = parts[0].split("FM5 ");
3394
- if (header.length == 0) {
3512
+ if (header.length < 2) {
3395
3513
  ResultFormatter.unknown(decodeResult, message.text);
3396
3514
  decodeResult.decoded = false;
3397
3515
  decodeResult.decoder.decodeLevel = "none";
@@ -4648,6 +4766,7 @@ var Label_H1_ATIS = class extends DecoderPlugin {
4648
4766
  const checksum = match[6];
4649
4767
  ResultFormatter.flightNumber(decodeResult, flight);
4650
4768
  ResultFormatter.arrivalAirport(decodeResult, facility);
4769
+ ResultFormatter.sequenceNumber(decodeResult, parseInt(seq, 10));
4651
4770
  decodeResult.raw.atis_code = code;
4652
4771
  decodeResult.formatted.items.push({
4653
4772
  type: "atis",
@@ -6572,6 +6691,7 @@ var pluginClasses = [
6572
6691
  Label_13Through18_Slash,
6573
6692
  Label_15,
6574
6693
  Label_15_FST,
6694
+ Label_16_AUTPOS,
6575
6695
  Label_16_Honeywell,
6576
6696
  Label_16_N_Space,
6577
6697
  Label_16_POSA1,