@airframes/acars-decoder 1.6.15 → 1.6.17

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/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  [![NPM Version](https://badge.fury.io/js/@airframes%2Facars-decoder.svg)](https://badge.fury.io/js/@airframes%2Facars-decoder)
4
4
  [![GitHub Actions Workflow Status](https://github.com/airframesio/acars-decoder-typescript/actions/workflows/yarn-test.yml/badge.svg)
5
5
  ](https://github.com/airframesio/acars-decoder-typescript/actions/workflows/yarn-test.yml)
6
+ ![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/airframesio/acars-decoder-typescript)
6
7
  [![Contributors](https://img.shields.io/github/contributors/airframesio/acars-decoder-typescript)](https://github.com/airframesio/acars-decoder-typescript/graphs/contributors)
7
8
  [![Activity](https://img.shields.io/github/commit-activity/m/airframesio/acars-decoder-typescript)](https://github.com/airframesio/acars-decoder-typescript/pulse)
8
9
  [![Discord](https://img.shields.io/discord/1067697487927853077?logo=discord)](https://discord.gg/8Ksch7zE)
package/dist/index.js CHANGED
@@ -569,14 +569,24 @@ var ResultFormatter = class {
569
569
  value: DateTimeUtils.timestampToString(time, "tod")
570
570
  });
571
571
  }
572
- static off(decodeResult, time) {
573
- decodeResult.raw.off_time = time;
574
- decodeResult.formatted.items.push({
575
- type: "time_of_day",
576
- code: "OFF",
577
- label: "Takeoff Time",
578
- value: DateTimeUtils.timestampToString(time, "tod")
579
- });
572
+ static off(decodeResult, time, type = "tod") {
573
+ if (type === "tod") {
574
+ decodeResult.raw.off_time = time;
575
+ decodeResult.formatted.items.push({
576
+ type: "time_of_day",
577
+ code: "OFF",
578
+ label: "Takeoff Time",
579
+ value: DateTimeUtils.timestampToString(time, "tod")
580
+ });
581
+ } else {
582
+ decodeResult.raw.off_date = time;
583
+ decodeResult.formatted.items.push({
584
+ type: "epoch",
585
+ code: "OFF",
586
+ label: "Takeoff Time",
587
+ value: DateTimeUtils.timestampToString(time, "epoch")
588
+ });
589
+ }
580
590
  }
581
591
  static on(decodeResult, time) {
582
592
  decodeResult.raw.on_time = time;
@@ -968,6 +978,51 @@ var Label_12_N_Space = class extends DecoderPlugin {
968
978
  }
969
979
  };
970
980
 
981
+ // lib/plugins/Label_12_POS.ts
982
+ var Label_12_POS = class extends DecoderPlugin {
983
+ name = "label-12-pos";
984
+ qualifiers() {
985
+ return {
986
+ labels: ["12"],
987
+ preambles: ["POS"]
988
+ };
989
+ }
990
+ decode(message, options = {}) {
991
+ const decodeResult = this.defaultResult();
992
+ decodeResult.decoder.name = this.name;
993
+ decodeResult.formatted.description = "Position Report";
994
+ decodeResult.message = message;
995
+ const data = message.text.substring(3).split(",");
996
+ if (!message.text.startsWith("POS") || data.length !== 12) {
997
+ if (options.debug) {
998
+ console.log(`Decoder: Unknown 12 message: ${message.text}`);
999
+ }
1000
+ ResultFormatter.unknown(decodeResult, message.text);
1001
+ decodeResult.decoded = false;
1002
+ decodeResult.decoder.decodeLevel = "none";
1003
+ return decodeResult;
1004
+ }
1005
+ const lat = data[0].substring(0, 8);
1006
+ const lon = data[0].substring(8);
1007
+ ResultFormatter.position(decodeResult, {
1008
+ latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),
1009
+ longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8)))
1010
+ });
1011
+ ResultFormatter.unknown(decodeResult, data[1]);
1012
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
1013
+ ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
1014
+ ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
1015
+ ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim()));
1016
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()));
1017
+ ResultFormatter.departureAirport(decodeResult, data[9]);
1018
+ ResultFormatter.arrivalAirport(decodeResult, data[10]);
1019
+ ResultFormatter.unknown(decodeResult, data[11]);
1020
+ decodeResult.decoded = true;
1021
+ decodeResult.decoder.decodeLevel = "partial";
1022
+ return decodeResult;
1023
+ }
1024
+ };
1025
+
971
1026
  // lib/plugins/Label_13Through18_Slash.ts
972
1027
  var Label_13Through18_Slash = class extends DecoderPlugin {
973
1028
  // eslint-disable-line camelcase
@@ -1079,9 +1134,19 @@ var Label_15 = class extends DecoderPlugin {
1079
1134
  if (alt != "---") {
1080
1135
  ResultFormatter.altitude(decodeResult, 100 * Number(alt));
1081
1136
  }
1082
- ResultFormatter.temperature(decodeResult, between.substring(22).replace(" ", "0"));
1137
+ ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(" ", "0"));
1138
+ } else if (between.substring(13, 16) === "OFF") {
1139
+ const ddmmyy = between.substring(16, 22);
1140
+ const hhmm = between.substring(22, 26);
1141
+ if (ddmmyy != "------") {
1142
+ const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
1143
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy), "epoch");
1144
+ } else {
1145
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), "tod");
1146
+ }
1147
+ ResultFormatter.unknown(decodeResult, between.substring(26));
1083
1148
  } else {
1084
- ResultFormatter.unknown(decodeResult, between.substring(13));
1149
+ ResultFormatter.unknown(decodeResult, between.substring(26));
1085
1150
  }
1086
1151
  } else {
1087
1152
  if (options.debug) {
@@ -1450,7 +1515,6 @@ var Label_1L_Slash = class extends DecoderPlugin {
1450
1515
  const part = parts[i].split(" ");
1451
1516
  data.set(part[0], part.slice(1).join(" "));
1452
1517
  }
1453
- console.log(data);
1454
1518
  const position = {
1455
1519
  latitude: Number(data.get("LAT")),
1456
1520
  longitude: Number(data.get("LON"))
@@ -1996,12 +2060,10 @@ var Label_44_POS = class extends DecoderPlugin {
1996
2060
  }
1997
2061
  ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));
1998
2062
  const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
1999
- decodeResult.raw.current_time = Date.parse(
2000
- (/* @__PURE__ */ new Date()).getFullYear() + "-" + results.groups.current_date.substr(0, 2) + "-" + results.groups.current_date.substr(2, 2) + "T" + results.groups.current_time.substr(0, 2) + ":" + results.groups.current_time.substr(2, 2) + ":00Z"
2001
- );
2002
- decodeResult.raw.eta_time = Date.parse(
2003
- (/* @__PURE__ */ new Date()).getFullYear() + "-" + results.groups.current_date.substr(0, 2) + "-" + results.groups.current_date.substr(2, 2) + "T" + results.groups.eta_time.substr(0, 2) + ":" + results.groups.eta_time.substr(2, 2) + ":00Z"
2004
- );
2063
+ ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));
2064
+ ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));
2065
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00"));
2066
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00"));
2005
2067
  if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
2006
2068
  decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
2007
2069
  }
@@ -2380,12 +2442,17 @@ function addCompanyRoute(decodeResult, value) {
2380
2442
  }
2381
2443
 
2382
2444
  // lib/utils/h1_helper.ts
2383
- var H1Helper = class {
2445
+ var H1Helper = class _H1Helper {
2384
2446
  static decodeH1Message(decodeResult, message) {
2385
2447
  const checksum = message.slice(-4);
2386
2448
  const data = message.slice(0, message.length - 4);
2387
2449
  const fields = data.split("/");
2388
- parseMessageType(decodeResult, fields[0]);
2450
+ const canDecode = parseMessageType(decodeResult, fields[0]);
2451
+ if (!canDecode) {
2452
+ decodeResult.decoded = false;
2453
+ decodeResult.decoder.decodeLevel = "none";
2454
+ return;
2455
+ }
2389
2456
  for (let i = 1; i < fields.length; ++i) {
2390
2457
  if (fields[i].startsWith("FN")) {
2391
2458
  decodeResult.raw.flight_number = fields[i].substring(2);
@@ -2394,16 +2461,9 @@ var H1Helper = class {
2394
2461
  } else if (fields[i].startsWith("DC")) {
2395
2462
  processDC(decodeResult, fields[i].substring(2).split(","));
2396
2463
  } else if (fields[i].startsWith("TS")) {
2397
- const ts = fields[i].substring(2).split(",");
2398
- let time = DateTimeUtils.convertDateTimeToEpoch(ts[0], ts[1]);
2399
- if (Number.isNaN(time)) {
2400
- const date = ts[1].substring(2, 4) + ts[1].substring(0, 2) + ts[1].substring(4, 6);
2401
- time = DateTimeUtils.convertDateTimeToEpoch(ts[0], date);
2402
- }
2403
- decodeResult.raw.message_date = ts[1];
2404
- decodeResult.raw.message_timestamp = time;
2464
+ _H1Helper.processTS(decodeResult, fields[i].substring(2).split(","));
2405
2465
  } else if (fields[i].startsWith("PS")) {
2406
- const pos = processPS(decodeResult, fields[i].substring(2).split(","));
2466
+ _H1Helper.processPS(decodeResult, fields[i].substring(2).split(","));
2407
2467
  } else if (fields[i].startsWith("DT")) {
2408
2468
  const data2 = fields[i].substring(2).split(",");
2409
2469
  processDT(decodeResult, data2);
@@ -2432,6 +2492,8 @@ var H1Helper = class {
2432
2492
  } else {
2433
2493
  ResultFormatter.unknown(decodeResult, fields[i], "/");
2434
2494
  }
2495
+ } else if (fields[i].startsWith("WD")) {
2496
+ processWindData(decodeResult, fields[i].substring(2));
2435
2497
  } else {
2436
2498
  ResultFormatter.unknown(decodeResult, fields[i], "/");
2437
2499
  }
@@ -2441,6 +2503,56 @@ var H1Helper = class {
2441
2503
  }
2442
2504
  return true;
2443
2505
  }
2506
+ static processPS(decodeResult, data) {
2507
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2508
+ if (position) {
2509
+ decodeResult.raw.position = position;
2510
+ decodeResult.formatted.items.push({
2511
+ type: "aircraft_position",
2512
+ code: "POS",
2513
+ label: "Aircraft Position",
2514
+ value: CoordinateUtils.coordinateString(position)
2515
+ });
2516
+ }
2517
+ if (data.length === 9) {
2518
+ processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
2519
+ ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
2520
+ ResultFormatter.temperature(decodeResult, data[6]);
2521
+ ResultFormatter.unknown(decodeResult, data[7]);
2522
+ ResultFormatter.unknown(decodeResult, data[8]);
2523
+ }
2524
+ if (data.length === 14) {
2525
+ ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2526
+ processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
2527
+ ResultFormatter.temperature(decodeResult, data[7]);
2528
+ ResultFormatter.unknownArr(decodeResult, data.slice(8));
2529
+ }
2530
+ }
2531
+ static processPosition(decodeResult, data) {
2532
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2533
+ if (position) {
2534
+ ResultFormatter.position(decodeResult, position);
2535
+ }
2536
+ if (data.length >= 10) {
2537
+ ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2538
+ processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
2539
+ ResultFormatter.temperature(decodeResult, data[7]);
2540
+ ResultFormatter.unknown(decodeResult, data[8]);
2541
+ ResultFormatter.unknown(decodeResult, data[9]);
2542
+ }
2543
+ if (data.length >= 14) {
2544
+ ResultFormatter.unknownArr(decodeResult, data.slice(10));
2545
+ }
2546
+ }
2547
+ static processTS(decodeResult, data) {
2548
+ let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);
2549
+ if (Number.isNaN(time)) {
2550
+ const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
2551
+ time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
2552
+ }
2553
+ decodeResult.raw.message_date = data[1];
2554
+ decodeResult.raw.message_timestamp = time;
2555
+ }
2444
2556
  };
2445
2557
  function processAirField(decodeResult, data) {
2446
2558
  if (data.length === 2) {
@@ -2518,7 +2630,7 @@ function parseMessageType(decodeResult, messageType) {
2518
2630
  if (parts.length == 1) {
2519
2631
  const type = parts[0].substring(0, 3);
2520
2632
  if (type === "POS" && parts[0].length !== 3) {
2521
- processPosition2(decodeResult, parts[0].substring(3).split(","));
2633
+ H1Helper.processPosition(decodeResult, parts[0].substring(3).split(","));
2522
2634
  }
2523
2635
  return processMessageType(decodeResult, type);
2524
2636
  } else if (parts.length == 2) {
@@ -2529,11 +2641,12 @@ function parseMessageType(decodeResult, messageType) {
2529
2641
  }
2530
2642
  const type = parts[1].length == 5 ? parts[1].substring(2, 5) : parts[1].substring(3, 6);
2531
2643
  if (parts[1].substring(3, 6) === "POS" && parts[1].length > 6) {
2532
- processPosition2(decodeResult, parts[1].substring(6).split(","));
2644
+ H1Helper.processPosition(decodeResult, parts[1].substring(6).split(","));
2533
2645
  }
2534
- processMessageType(decodeResult, type);
2646
+ return processMessageType(decodeResult, type);
2535
2647
  } else {
2536
2648
  ResultFormatter.unknown(decodeResult, messageType);
2649
+ return false;
2537
2650
  }
2538
2651
  }
2539
2652
  function processMessageType(decodeResult, type) {
@@ -2547,9 +2660,13 @@ function processMessageType(decodeResult, type) {
2547
2660
  decodeResult.formatted.description = "Position Report";
2548
2661
  } else if (type === "PRG") {
2549
2662
  decodeResult.formatted.description = "Progress Report";
2663
+ } else if (type === "PWI") {
2664
+ decodeResult.formatted.description = "Weather Report";
2550
2665
  } else {
2551
2666
  decodeResult.formatted.description = "Unknown H1 Message";
2667
+ return false;
2552
2668
  }
2669
+ return true;
2553
2670
  }
2554
2671
  function processDC(decodeResult, data) {
2555
2672
  decodeResult.raw.message_date = data[0];
@@ -2560,60 +2677,6 @@ function processDC(decodeResult, data) {
2560
2677
  decodeResult.raw.message_timestamp = time;
2561
2678
  }
2562
2679
  }
2563
- function processPS(decodeResult, data) {
2564
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2565
- if (position) {
2566
- decodeResult.raw.position = position;
2567
- decodeResult.formatted.items.push({
2568
- type: "aircraft_position",
2569
- code: "POS",
2570
- label: "Aircraft Position",
2571
- value: CoordinateUtils.coordinateString(position)
2572
- });
2573
- }
2574
- if (data.length === 9) {
2575
- processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
2576
- ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
2577
- ResultFormatter.temperature(decodeResult, data[6]);
2578
- ResultFormatter.unknown(decodeResult, data[7]);
2579
- ResultFormatter.unknown(decodeResult, data[8]);
2580
- }
2581
- if (data.length === 14) {
2582
- ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2583
- processRoute(decodeResult, data[4], data[2], data[6], data[5], void 0);
2584
- ResultFormatter.temperature(decodeResult, data[7]);
2585
- ResultFormatter.groundspeed(decodeResult, Number(data[10]));
2586
- ResultFormatter.unknown(decodeResult, data[1]);
2587
- ResultFormatter.unknown(decodeResult, data[8]);
2588
- ResultFormatter.unknown(decodeResult, data[9]);
2589
- ResultFormatter.unknown(decodeResult, data.slice(11).join(","));
2590
- }
2591
- }
2592
- function processPosition2(decodeResult, data) {
2593
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2594
- if (position) {
2595
- decodeResult.raw.position = position;
2596
- decodeResult.formatted.items.push({
2597
- type: "aircraft_position",
2598
- code: "POS",
2599
- label: "Aircraft Position",
2600
- value: CoordinateUtils.coordinateString(position)
2601
- });
2602
- }
2603
- if (data.length >= 10) {
2604
- ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2605
- processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
2606
- ResultFormatter.temperature(decodeResult, data[7]);
2607
- ResultFormatter.unknown(decodeResult, data[8]);
2608
- ResultFormatter.unknown(decodeResult, data[9]);
2609
- }
2610
- if (data.length >= 14) {
2611
- ResultFormatter.groundspeed(decodeResult, Number(data[10]));
2612
- ResultFormatter.unknown(decodeResult, data[11]);
2613
- ResultFormatter.unknown(decodeResult, data[12]);
2614
- ResultFormatter.unknown(decodeResult, data[13]);
2615
- }
2616
- }
2617
2680
  function processRoute(decodeResult, last, time, next, eta, then, date) {
2618
2681
  const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
2619
2682
  const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
@@ -2634,6 +2697,55 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
2634
2697
  value: RouteUtils.routeToString(decodeResult.raw.route)
2635
2698
  });
2636
2699
  }
2700
+ function processWindData(decodeResult, message) {
2701
+ if (decodeResult.raw.wind_data === void 0) {
2702
+ decodeResult.raw.wind_data = [];
2703
+ }
2704
+ const flightLevel = Number(message.slice(0, 3));
2705
+ const fields = message.slice(4).split(".");
2706
+ fields.forEach((field) => {
2707
+ const data = field.split(",");
2708
+ const waypoint = data[0];
2709
+ const windData = data[1];
2710
+ const windDirection = Number(windData.slice(0, 3));
2711
+ const windSpeed = Number(windData.slice(3));
2712
+ if (data.length === 3) {
2713
+ const tempData = data[2];
2714
+ const tempFlightLevel = Number(tempData.slice(0, 3));
2715
+ const tempString = tempData.slice(3);
2716
+ const tempDegrees = Number(tempString.substring(1)) * (tempString.charAt(0) === "M" ? -1 : 1);
2717
+ decodeResult.raw.wind_data.push({
2718
+ waypoint,
2719
+ flightLevel,
2720
+ windDirection,
2721
+ windSpeed,
2722
+ temperature: {
2723
+ flightLevel: tempFlightLevel,
2724
+ degreesC: tempDegrees
2725
+ }
2726
+ });
2727
+ decodeResult.formatted.items.push({
2728
+ type: "wind_data",
2729
+ code: "WIND",
2730
+ label: "Wind Data",
2731
+ value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt, ${tempDegrees}\xB0C at FL${tempFlightLevel}`
2732
+ });
2733
+ } else {
2734
+ decodeResult.raw.wind_data.push({
2735
+ waypoint,
2736
+ flightLevel,
2737
+ windDirection,
2738
+ windSpeed
2739
+ });
2740
+ decodeResult.formatted.items.push({
2741
+ type: "wind_data",
2742
+ code: "WIND",
2743
+ label: "Wind Data",
2744
+ value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt`
2745
+ });
2746
+ }
2747
+ });
2748
+ }
2637
2749
 
2638
2750
  // lib/plugins/Label_4J_POS.ts
2639
2751
  var Label_4J_POS = class extends DecoderPlugin {
@@ -2725,6 +2837,129 @@ var Label_4N = class extends DecoderPlugin {
2725
2837
  }
2726
2838
  };
2727
2839
 
2840
+ // lib/plugins/Label_4T_AGFSR.ts
2841
+ var Label_4T_AGFSR = class extends DecoderPlugin {
2842
+ name = "label-4t-agfsr";
2843
+ qualifiers() {
2844
+ return {
2845
+ labels: ["4T"],
2846
+ preambles: ["AGFSR"]
2847
+ };
2848
+ }
2849
+ decode(message, options = {}) {
2850
+ const decodeResult = this.defaultResult();
2851
+ decodeResult.decoder.name = this.name;
2852
+ decodeResult.formatted.description = "Position Report";
2853
+ decodeResult.message = message;
2854
+ const data = message.text.substring(5).split("/");
2855
+ if (!message.text.startsWith("AGFSR") || data.length !== 20) {
2856
+ if (options.debug) {
2857
+ console.log(`Decoder: Unknown 4T message: ${message.text}`);
2858
+ }
2859
+ ResultFormatter.unknown(decodeResult, message.text);
2860
+ decodeResult.decoded = false;
2861
+ decodeResult.decoder.decodeLevel = "none";
2862
+ return decodeResult;
2863
+ }
2864
+ ResultFormatter.flightNumber(decodeResult, data[0].trim());
2865
+ ResultFormatter.departureDay(decodeResult, Number(data[1]));
2866
+ ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
2867
+ ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
2868
+ ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
2869
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
2870
+ ResultFormatter.unknown(decodeResult, data[5], "/");
2871
+ const lat = data[6].substring(0, 7);
2872
+ const lon = data[6].substring(7, 15);
2873
+ ResultFormatter.position(decodeResult, {
2874
+ latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) + Number(lat.substring(2, 6)) / 60,
2875
+ longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) + Number(lon.substring(3, 7)) / 60
2876
+ });
2877
+ ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));
2878
+ ResultFormatter.unknownArr(decodeResult, data.slice(8), "/");
2879
+ decodeResult.decoded = true;
2880
+ decodeResult.decoder.decodeLevel = "partial";
2881
+ return decodeResult;
2882
+ }
2883
+ };
2884
+
2885
+ // lib/plugins/Label_58.ts
2886
+ var Label_58 = class extends DecoderPlugin {
2887
+ name = "label-58";
2888
+ qualifiers() {
2889
+ return {
2890
+ labels: ["58"]
2891
+ };
2892
+ }
2893
+ decode(message, options = {}) {
2894
+ const decodeResult = this.defaultResult();
2895
+ decodeResult.decoder.name = this.name;
2896
+ decodeResult.formatted.description = "Position Report";
2897
+ decodeResult.message = message;
2898
+ const data = message.text.split("/");
2899
+ if (data.length === 8) {
2900
+ ResultFormatter.flightNumber(decodeResult, data[0]);
2901
+ ResultFormatter.day(decodeResult, Number(data[1]));
2902
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
2903
+ const lat = data[3];
2904
+ const lon = data[4];
2905
+ ResultFormatter.position(decodeResult, {
2906
+ latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
2907
+ longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
2908
+ });
2909
+ ResultFormatter.altitude(decodeResult, Number(data[5]));
2910
+ ResultFormatter.unknown(decodeResult, data[6], "/");
2911
+ ResultFormatter.unknown(decodeResult, data[7], "/");
2912
+ } else {
2913
+ if (options.debug) {
2914
+ console.log(`Decoder: Unknown 58 message: ${message.text}`);
2915
+ }
2916
+ ResultFormatter.unknown(decodeResult, message.text);
2917
+ decodeResult.decoded = false;
2918
+ decodeResult.decoder.decodeLevel = "none";
2919
+ return decodeResult;
2920
+ }
2921
+ decodeResult.decoded = true;
2922
+ decodeResult.decoder.decodeLevel = "partial";
2923
+ return decodeResult;
2924
+ }
2925
+ };
2926
+
2927
+ // lib/plugins/Label_4T_ETA.ts
2928
+ var Label_4T_ETA = class extends DecoderPlugin {
2929
+ name = "label-4t-eta";
2930
+ qualifiers() {
2931
+ return {
2932
+ labels: ["4T"],
2933
+ preambles: ["ETA"]
2934
+ };
2935
+ }
2936
+ decode(message, options = {}) {
2937
+ const decodeResult = this.defaultResult();
2938
+ decodeResult.decoder.name = this.name;
2939
+ decodeResult.formatted.description = "ETA Report";
2940
+ decodeResult.message = message;
2941
+ const data = message.text.substring(3).split("/");
2942
+ if (!message.text.startsWith("ETA") || data.length !== 3) {
2943
+ if (options.debug) {
2944
+ console.log(`Decoder: Unknown 4T message: ${message.text}`);
2945
+ }
2946
+ ResultFormatter.unknown(decodeResult, message.text);
2947
+ decodeResult.decoded = false;
2948
+ decodeResult.decoder.decodeLevel = "none";
2949
+ return decodeResult;
2950
+ }
2951
+ ResultFormatter.flightNumber(decodeResult, data[0].trim());
2952
+ ResultFormatter.departureDay(decodeResult, Number(data[1]));
2953
+ const etaData = data[2].split(" ");
2954
+ ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
2955
+ ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
2956
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
2957
+ decodeResult.decoded = true;
2958
+ decodeResult.decoder.decodeLevel = "full";
2959
+ return decodeResult;
2960
+ }
2961
+ };
2962
+
2728
2963
  // lib/plugins/Label_80.ts
2729
2964
  var Label_80 = class extends DecoderPlugin {
2730
2965
  name = "label-80";
@@ -3161,6 +3396,65 @@ var Label_H1_OHMA = class extends DecoderPlugin {
3161
3396
  }
3162
3397
  };
3163
3398
 
3399
+ // lib/plugins/Label_H1_Slash.ts
3400
+ var Label_H1_Slash = class extends DecoderPlugin {
3401
+ name = "label-h1-slash";
3402
+ qualifiers() {
3403
+ return {
3404
+ labels: ["H1"],
3405
+ preambles: ["/"]
3406
+ };
3407
+ }
3408
+ decode(message, options = {}) {
3409
+ let decodeResult = this.defaultResult();
3410
+ decodeResult.decoder.name = this.name;
3411
+ decodeResult.formatted.description = "Position Report";
3412
+ decodeResult.message = message;
3413
+ const checksum = message.text.slice(-4);
3414
+ const data = message.text.slice(0, message.text.length - 4);
3415
+ const fields = data.split("/");
3416
+ if (fields[0] !== "") {
3417
+ ResultFormatter.unknown(decodeResult, message.text);
3418
+ decodeResult.decoded = false;
3419
+ decodeResult.decoder.decodeLevel = "none";
3420
+ return decodeResult;
3421
+ }
3422
+ const headerData = fields[1].split(".");
3423
+ ResultFormatter.unknown(decodeResult, headerData[0]);
3424
+ if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
3425
+ H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
3426
+ } else if (headerData[1] === "POS") {
3427
+ } else if (headerData[1].startsWith("POS")) {
3428
+ H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
3429
+ } else {
3430
+ ResultFormatter.unknown(decodeResult, headerData[1], ".");
3431
+ }
3432
+ for (let i = 2; i < fields.length; i++) {
3433
+ const field = fields[i];
3434
+ if (field.startsWith("TS")) {
3435
+ H1Helper.processTS(decodeResult, field.substring(2, 15).split(","));
3436
+ } else if (field.startsWith("PS")) {
3437
+ H1Helper.processPS(decodeResult, field.substring(2).split(","));
3438
+ } else {
3439
+ ResultFormatter.unknown(decodeResult, field, "/");
3440
+ }
3441
+ }
3442
+ if (decodeResult.formatted.items.length === 0) {
3443
+ if (options.debug) {
3444
+ console.log(`Decoder: Unknown H1 message: ${message.text}`);
3445
+ }
3446
+ ResultFormatter.unknown(decodeResult, message.text);
3447
+ decodeResult.decoded = false;
3448
+ decodeResult.decoder.decodeLevel = "none";
3449
+ return decodeResult;
3450
+ }
3451
+ ResultFormatter.checksum(decodeResult, checksum);
3452
+ decodeResult.decoded = true;
3453
+ decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
3454
+ return decodeResult;
3455
+ }
3456
+ };
3457
+
3164
3458
  // lib/plugins/Label_H1_StarPOS.ts
3165
3459
  var Label_H1_StarPOS = class extends DecoderPlugin {
3166
3460
  name = "label-h1-star-pos";
@@ -4341,6 +4635,7 @@ var MessageDecoder = class {
4341
4635
  this.registerPlugin(new Label_10_POS(this));
4342
4636
  this.registerPlugin(new Label_10_Slash(this));
4343
4637
  this.registerPlugin(new Label_12_N_Space(this));
4638
+ this.registerPlugin(new Label_12_POS(this));
4344
4639
  this.registerPlugin(new Label_13Through18_Slash(this));
4345
4640
  this.registerPlugin(new Label_15(this));
4346
4641
  this.registerPlugin(new Label_15_FST(this));
@@ -4367,13 +4662,17 @@ var MessageDecoder = class {
4367
4662
  this.registerPlugin(new Label_4A_Slash_01(this));
4368
4663
  this.registerPlugin(new Label_4J_POS(this));
4369
4664
  this.registerPlugin(new Label_4N(this));
4665
+ this.registerPlugin(new Label_4T_AGFSR(this));
4666
+ this.registerPlugin(new Label_4T_ETA(this));
4370
4667
  this.registerPlugin(new Label_B6_Forwardslash(this));
4371
4668
  this.registerPlugin(new Label_H1_FLR(this));
4372
4669
  this.registerPlugin(new Label_H1_OHMA(this));
4373
4670
  this.registerPlugin(new Label_H1_WRN(this));
4374
4671
  this.registerPlugin(new Label_H1(this));
4672
+ this.registerPlugin(new Label_H1_Slash(this));
4375
4673
  this.registerPlugin(new Label_H1_StarPOS(this));
4376
4674
  this.registerPlugin(new Label_HX(this));
4675
+ this.registerPlugin(new Label_58(this));
4377
4676
  this.registerPlugin(new Label_80(this));
4378
4677
  this.registerPlugin(new Label_83(this));
4379
4678
  this.registerPlugin(new Label_8E(this));