@airframes/acars-decoder 1.6.14 → 1.6.16

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
@@ -38,10 +38,13 @@ var DateTimeUtils = class {
38
38
  }
39
39
  /**
40
40
  *
41
- * @param time HHMMSS
41
+ * @param time HHMMSS or HHMM
42
42
  * @returns seconds since midnight
43
43
  */
44
44
  static convertHHMMSSToTod(time) {
45
+ if (time.length === 4) {
46
+ time += "00";
47
+ }
45
48
  const h = Number(time.substring(0, 2));
46
49
  const m = Number(time.substring(2, 4));
47
50
  const s = Number(time.substring(4, 6));
@@ -529,14 +532,24 @@ var ResultFormatter = class {
529
532
  value: DateTimeUtils.timestampToString(time, "tod")
530
533
  });
531
534
  }
532
- static off(decodeResult, time) {
533
- decodeResult.raw.off_time = time;
534
- decodeResult.formatted.items.push({
535
- type: "time_of_day",
536
- code: "OFF",
537
- label: "Takeoff Time",
538
- value: DateTimeUtils.timestampToString(time, "tod")
539
- });
535
+ static off(decodeResult, time, type = "tod") {
536
+ if (type === "tod") {
537
+ decodeResult.raw.off_time = time;
538
+ decodeResult.formatted.items.push({
539
+ type: "time_of_day",
540
+ code: "OFF",
541
+ label: "Takeoff Time",
542
+ value: DateTimeUtils.timestampToString(time, "tod")
543
+ });
544
+ } else {
545
+ decodeResult.raw.off_date = time;
546
+ decodeResult.formatted.items.push({
547
+ type: "epoch",
548
+ code: "OFF",
549
+ label: "Takeoff Time",
550
+ value: DateTimeUtils.timestampToString(time, "epoch")
551
+ });
552
+ }
540
553
  }
541
554
  static on(decodeResult, time) {
542
555
  decodeResult.raw.on_time = time;
@@ -566,27 +579,36 @@ var ResultFormatter = class {
566
579
  });
567
580
  }
568
581
  static day(decodeResult, day) {
569
- decodeResult.raw.day_of_month = day;
582
+ decodeResult.raw.day = day;
570
583
  decodeResult.formatted.items.push({
571
- type: "day_of_month",
584
+ type: "day",
572
585
  code: "MSG_DAY",
573
586
  label: "Day of Month",
574
587
  value: `${day}`
575
588
  });
576
589
  }
590
+ static month(decodeResult, month) {
591
+ decodeResult.raw.month = month;
592
+ decodeResult.formatted.items.push({
593
+ type: "month",
594
+ code: "MSG_MON",
595
+ label: "Month of Year",
596
+ value: `${month}`
597
+ });
598
+ }
577
599
  static departureDay(decodeResult, day) {
578
- decodeResult.raw.departure_day_of_month = day;
600
+ decodeResult.raw.departure_day = day;
579
601
  decodeResult.formatted.items.push({
580
- type: "day_of_month",
602
+ type: "day",
581
603
  code: "DEP_DAY",
582
604
  label: "Departure Day",
583
605
  value: `${day}`
584
606
  });
585
607
  }
586
608
  static arrivalDay(decodeResult, day) {
587
- decodeResult.raw.arrival_day_of_month = day;
609
+ decodeResult.raw.arrival_day = day;
588
610
  decodeResult.formatted.items.push({
589
- type: "day_of_month",
611
+ type: "day",
590
612
  code: "ARR_DAY",
591
613
  label: "Arrival Day",
592
614
  value: `${day}`
@@ -681,14 +703,14 @@ var Label_5Z_Slash = class extends DecoderPlugin {
681
703
  const info = data[2].split(" ");
682
704
  ResultFormatter.departureAirport(decodeResult, info[1]);
683
705
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
684
- decodeResult.raw.day_of_month = Number(info[3]);
706
+ decodeResult.raw.day = Number(info[3]);
685
707
  ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
686
708
  ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));
687
709
  ResultFormatter.unknownArr(decodeResult, data.slice(3), "/");
688
710
  } else if (type === "B3") {
689
711
  ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), "IATA");
690
712
  ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), "IATA");
691
- decodeResult.raw.day_of_month = Number(header[2]);
713
+ decodeResult.raw.day = Number(header[2]);
692
714
  ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));
693
715
  if (header.length > 4) {
694
716
  ResultFormatter.unknownArr(decodeResult, header.slice(4), "/");
@@ -697,7 +719,7 @@ var Label_5Z_Slash = class extends DecoderPlugin {
697
719
  const info = data[2].split(" ");
698
720
  ResultFormatter.departureAirport(decodeResult, info[1]);
699
721
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
700
- decodeResult.raw.day_of_month = Number(info[3]);
722
+ decodeResult.raw.day = Number(info[3]);
701
723
  ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
702
724
  ResultFormatter.unknownArr(decodeResult, info.slice(5), " ");
703
725
  } else if (type === "C3") {
@@ -707,10 +729,10 @@ var Label_5Z_Slash = class extends DecoderPlugin {
707
729
  const airports = data[2].split(" ");
708
730
  ResultFormatter.departureAirport(decodeResult, airports[1]);
709
731
  ResultFormatter.arrivalAirport(decodeResult, airports[2]);
710
- decodeResult.raw.day_of_month = Number(airports[3]);
732
+ decodeResult.raw.day = Number(airports[3]);
711
733
  ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(airports[4]));
712
734
  const estimates = data[3].split(" ");
713
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1] + "00"));
735
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1]));
714
736
  ResultFormatter.unknown(decodeResult, estimates[2]);
715
737
  } else {
716
738
  if (options.debug) {
@@ -854,16 +876,16 @@ var Label_10_Slash = class extends DecoderPlugin {
854
876
  ResultFormatter.heading(decodeResult, Number(parts[5]));
855
877
  ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));
856
878
  ResultFormatter.arrivalAirport(decodeResult, parts[7]);
857
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8] + "00"));
879
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8]));
858
880
  const waypoints = [{
859
881
  name: parts[11]
860
882
  }, {
861
883
  name: parts[12],
862
- time: DateTimeUtils.convertHHMMSSToTod(parts[13] + "00"),
884
+ time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
863
885
  timeFormat: "tod"
864
886
  }, {
865
887
  name: parts[14],
866
- time: DateTimeUtils.convertHHMMSSToTod(parts[15] + "00"),
888
+ time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
867
889
  timeFormat: "tod"
868
890
  }];
869
891
  ResultFormatter.route(decodeResult, { waypoints });
@@ -883,7 +905,7 @@ var Label_12_N_Space = class extends DecoderPlugin {
883
905
  qualifiers() {
884
906
  return {
885
907
  labels: ["12"],
886
- preambles: ["N "]
908
+ preambles: ["N ", "S "]
887
909
  };
888
910
  }
889
911
  decode(message, options = {}) {
@@ -919,6 +941,51 @@ var Label_12_N_Space = class extends DecoderPlugin {
919
941
  }
920
942
  };
921
943
 
944
+ // lib/plugins/Label_12_POS.ts
945
+ var Label_12_POS = class extends DecoderPlugin {
946
+ name = "label-12-pos";
947
+ qualifiers() {
948
+ return {
949
+ labels: ["12"],
950
+ preambles: ["POS"]
951
+ };
952
+ }
953
+ decode(message, options = {}) {
954
+ const decodeResult = this.defaultResult();
955
+ decodeResult.decoder.name = this.name;
956
+ decodeResult.formatted.description = "Position Report";
957
+ decodeResult.message = message;
958
+ const data = message.text.substring(3).split(",");
959
+ if (!message.text.startsWith("POS") || data.length !== 12) {
960
+ if (options.debug) {
961
+ console.log(`Decoder: Unknown 12 message: ${message.text}`);
962
+ }
963
+ ResultFormatter.unknown(decodeResult, message.text);
964
+ decodeResult.decoded = false;
965
+ decodeResult.decoder.decodeLevel = "none";
966
+ return decodeResult;
967
+ }
968
+ const lat = data[0].substring(0, 8);
969
+ const lon = data[0].substring(8);
970
+ ResultFormatter.position(decodeResult, {
971
+ latitude: CoordinateUtils.getDirection(lat[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lat.substring(1, 4)), Number(lat.substring(4, 6)), Number(lat.substring(6, 8))),
972
+ longitude: CoordinateUtils.getDirection(lon[0]) * CoordinateUtils.dmsToDecimalDegrees(Number(lon.substring(1, 4)), Number(lon.substring(4, 6)), Number(lon.substring(6, 8)))
973
+ });
974
+ ResultFormatter.unknown(decodeResult, data[1]);
975
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
976
+ ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));
977
+ ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));
978
+ ResultFormatter.currentFuel(decodeResult, Number(data[7].substring(3).trim()));
979
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()));
980
+ ResultFormatter.departureAirport(decodeResult, data[9]);
981
+ ResultFormatter.arrivalAirport(decodeResult, data[10]);
982
+ ResultFormatter.unknown(decodeResult, data[11]);
983
+ decodeResult.decoded = true;
984
+ decodeResult.decoder.decodeLevel = "partial";
985
+ return decodeResult;
986
+ }
987
+ };
988
+
922
989
  // lib/plugins/Label_13Through18_Slash.ts
923
990
  var Label_13Through18_Slash = class extends DecoderPlugin {
924
991
  // eslint-disable-line camelcase
@@ -949,7 +1016,7 @@ var Label_13Through18_Slash = class extends DecoderPlugin {
949
1016
  const data = parts[2].split(" ");
950
1017
  ResultFormatter.departureAirport(decodeResult, data[1]);
951
1018
  ResultFormatter.arrivalAirport(decodeResult, data[2]);
952
- decodeResult.raw.day_of_month = Number(data[3]);
1019
+ decodeResult.raw.day = Number(data[3]);
953
1020
  const time = DateTimeUtils.convertHHMMSSToTod(data[4]);
954
1021
  if (labelNumber === 13) {
955
1022
  ResultFormatter.out(decodeResult, time);
@@ -1009,7 +1076,7 @@ function getMsgType(labelNumber) {
1009
1076
 
1010
1077
  // lib/plugins/Label_15.ts
1011
1078
  var Label_15 = class extends DecoderPlugin {
1012
- name = "label-5z";
1079
+ name = "label-15";
1013
1080
  qualifiers() {
1014
1081
  return {
1015
1082
  labels: ["15"],
@@ -1020,10 +1087,38 @@ var Label_15 = class extends DecoderPlugin {
1020
1087
  const decodeResult = this.defaultResult();
1021
1088
  decodeResult.decoder.name = this.name;
1022
1089
  decodeResult.formatted.description = "Position Report";
1023
- const twoZeeRegex = /^\(2(?<between>.+)\(Z$/;
1024
- const results = message.text.match(twoZeeRegex);
1025
- if (results?.groups) {
1026
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.between.substr(0, 13)));
1090
+ decodeResult.message = message;
1091
+ if (message.text.startsWith("(2") && message.text.endsWith("(Z")) {
1092
+ const between = message.text.substring(2, message.text.length - 2);
1093
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0, 13)));
1094
+ if (between.length === 25) {
1095
+ ResultFormatter.unknown(decodeResult, between.substring(13, 19));
1096
+ const alt = between.substring(19, 22);
1097
+ if (alt != "---") {
1098
+ ResultFormatter.altitude(decodeResult, 100 * Number(alt));
1099
+ }
1100
+ ResultFormatter.temperature(decodeResult, between.substring(22).replaceAll(" ", "0"));
1101
+ } else if (between.substring(13, 16) === "OFF") {
1102
+ const ddmmyy = between.substring(16, 22);
1103
+ const hhmm = between.substring(22, 26);
1104
+ if (ddmmyy != "------") {
1105
+ const mmddyy = ddmmyy.substring(2, 4) + ddmmyy.substring(0, 2) + ddmmyy.substring(4);
1106
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertDateTimeToEpoch(hhmm + "00", mmddyy), "epoch");
1107
+ } else {
1108
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(hhmm), "tod");
1109
+ }
1110
+ ResultFormatter.unknown(decodeResult, between.substring(26));
1111
+ } else {
1112
+ ResultFormatter.unknown(decodeResult, between.substring(26));
1113
+ }
1114
+ } else {
1115
+ if (options.debug) {
1116
+ console.log(`Decoder: Unknown 15 message: ${message.text}`);
1117
+ }
1118
+ ResultFormatter.unknown(decodeResult, message.text);
1119
+ decodeResult.decoded = false;
1120
+ decodeResult.decoder.decodeLevel = "none";
1121
+ return decodeResult;
1027
1122
  }
1028
1123
  decodeResult.decoded = true;
1029
1124
  decodeResult.decoder.decodeLevel = "partial";
@@ -1076,7 +1171,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
1076
1171
  qualifiers() {
1077
1172
  return {
1078
1173
  labels: ["16"],
1079
- preambles: ["N "]
1174
+ preambles: ["N ", "S "]
1080
1175
  };
1081
1176
  }
1082
1177
  decode(message, options = {}) {
@@ -1206,7 +1301,7 @@ var Label_1L_3Line = class extends DecoderPlugin {
1206
1301
  }
1207
1302
  const eta = data.get("ETA");
1208
1303
  if (eta) {
1209
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta + "00"));
1304
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));
1210
1305
  data.delete("ETA");
1211
1306
  }
1212
1307
  const alt = data.get("ALT");
@@ -1287,8 +1382,8 @@ var Label_1L_070 = class extends DecoderPlugin {
1287
1382
  }
1288
1383
  ResultFormatter.departureAirport(decodeResult, parts[0]);
1289
1384
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
1290
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2] + "00"));
1291
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3] + "00"));
1385
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));
1386
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
1292
1387
  ResultFormatter.position(decodeResult, {
1293
1388
  latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),
1294
1389
  longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1))
@@ -1383,7 +1478,6 @@ var Label_1L_Slash = class extends DecoderPlugin {
1383
1478
  const part = parts[i].split(" ");
1384
1479
  data.set(part[0], part.slice(1).join(" "));
1385
1480
  }
1386
- console.log(data);
1387
1481
  const position = {
1388
1482
  latitude: Number(data.get("LAT")),
1389
1483
  longitude: Number(data.get("LON"))
@@ -1408,7 +1502,7 @@ var Label_1L_Slash = class extends DecoderPlugin {
1408
1502
  }
1409
1503
  const eta = data.get("ETA");
1410
1504
  if (eta) {
1411
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta + "00"));
1505
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));
1412
1506
  data.delete("ETA");
1413
1507
  }
1414
1508
  let remaining = "";
@@ -1542,7 +1636,7 @@ var Label_22_OFF = class extends DecoderPlugin {
1542
1636
  ResultFormatter.flightNumber(decodeResult, fields[0]);
1543
1637
  ResultFormatter.departureDay(decodeResult, Number(fields[1].substring(0, 2)));
1544
1638
  ResultFormatter.arrivalDay(decodeResult, Number(fields[1].substring(2, 4)));
1545
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8) + "00"));
1639
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)));
1546
1640
  ResultFormatter.departureAirport(decodeResult, fields[1].substring(8, 12));
1547
1641
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));
1548
1642
  ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)));
@@ -1558,7 +1652,7 @@ var Label_22_OFF = class extends DecoderPlugin {
1558
1652
  }
1559
1653
  ResultFormatter.departureAirport(decodeResult, fields[0]);
1560
1654
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
1561
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + "00"));
1655
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
1562
1656
  ResultFormatter.unknown(decodeResult, fields[3]);
1563
1657
  decodeResult.decoded = true;
1564
1658
  decodeResult.decoder.decodeLevel = "partial";
@@ -1575,12 +1669,12 @@ var Label_22_OFF = class extends DecoderPlugin {
1575
1669
  ResultFormatter.position(decodeResult, position);
1576
1670
  }
1577
1671
  ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));
1578
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20) + "00"));
1672
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)));
1579
1673
  ResultFormatter.departureAirport(decodeResult, fields[1].substring(20, 24));
1580
1674
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));
1581
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32) + "00"));
1675
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)));
1582
1676
  ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));
1583
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40) + "00"));
1677
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)));
1584
1678
  decodeResult.decoded = true;
1585
1679
  decodeResult.decoder.decodeLevel = "partial";
1586
1680
  } else {
@@ -1662,7 +1756,7 @@ var Label_24_Slash = class extends DecoderPlugin {
1662
1756
  longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
1663
1757
  };
1664
1758
  ResultFormatter.position(decodeResult, position);
1665
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8] + "00"));
1759
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));
1666
1760
  ResultFormatter.unknown(decodeResult, fields[7]);
1667
1761
  decodeResult.decoded = true;
1668
1762
  decodeResult.decoder.decodeLevel = "partial";
@@ -1698,7 +1792,7 @@ var Label_30_Slash_EA = class extends DecoderPlugin {
1698
1792
  console.log(results);
1699
1793
  }
1700
1794
  }
1701
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4) + "00"));
1795
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));
1702
1796
  if (results[1].substring(0, 2) === "DS") {
1703
1797
  ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
1704
1798
  ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
@@ -1725,22 +1819,35 @@ var Label_44_ETA = class extends DecoderPlugin {
1725
1819
  decodeResult.decoder.name = this.name;
1726
1820
  decodeResult.formatted.description = "ETA Report";
1727
1821
  decodeResult.message = message;
1728
- const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
1729
- const results = message.text.match(regex);
1730
- if (results?.groups) {
1822
+ const data = message.text.split(",");
1823
+ if (data.length >= 9) {
1731
1824
  if (options.debug) {
1732
1825
  console.log(`Label 44 ETA Report: groups`);
1733
- console.log(results.groups);
1826
+ console.log(data);
1734
1827
  }
1735
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords));
1736
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
1737
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
1738
- decodeResult.raw.current_time = Date.parse(
1739
- (/* @__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"
1740
- );
1741
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
1742
- ResultFormatter.remainingFuel(decodeResult, Number(results.groups.fuel_in_tons));
1828
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
1829
+ ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));
1830
+ ResultFormatter.departureAirport(decodeResult, data[3]);
1831
+ ResultFormatter.arrivalAirport(decodeResult, data[4]);
1832
+ ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));
1833
+ ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));
1834
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
1835
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[7]));
1836
+ const fuel = Number(data[8]);
1837
+ if (!isNaN(fuel)) {
1838
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
1839
+ }
1840
+ if (data.length > 9) {
1841
+ ResultFormatter.unknownArr(decodeResult, data.slice(9));
1743
1842
  }
1843
+ } else {
1844
+ if (options.debug) {
1845
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1846
+ }
1847
+ ResultFormatter.unknown(decodeResult, message.text);
1848
+ decodeResult.decoded = false;
1849
+ decodeResult.decoder.decodeLevel = "none";
1850
+ return decodeResult;
1744
1851
  }
1745
1852
  decodeResult.decoded = true;
1746
1853
  decodeResult.decoder.decodeLevel = "full";
@@ -1762,22 +1869,33 @@ var Label_44_IN = class extends DecoderPlugin {
1762
1869
  decodeResult.decoder.name = this.name;
1763
1870
  decodeResult.formatted.description = "In Air Report";
1764
1871
  decodeResult.message = message;
1765
- const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
1766
- const results = message.text.match(regex);
1767
- if (results?.groups) {
1872
+ const data = message.text.split(",");
1873
+ if (data.length >= 7) {
1768
1874
  if (options.debug) {
1769
1875
  console.log(`Label 44 In Air Report: groups`);
1770
- console.log(results.groups);
1876
+ console.log(data);
1771
1877
  }
1772
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords));
1773
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
1774
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
1775
- decodeResult.raw.current_time = Date.parse(
1776
- (/* @__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"
1777
- );
1778
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
1779
- decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
1878
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
1879
+ ResultFormatter.departureAirport(decodeResult, data[2]);
1880
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
1881
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
1882
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
1883
+ ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
1884
+ const fuel = Number(data[6]);
1885
+ if (!isNaN(fuel)) {
1886
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
1887
+ }
1888
+ if (data.length > 7) {
1889
+ ResultFormatter.unknownArr(decodeResult, data.slice(7));
1780
1890
  }
1891
+ } else {
1892
+ if (options.debug) {
1893
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1894
+ }
1895
+ ResultFormatter.unknown(decodeResult, message.text);
1896
+ decodeResult.decoded = false;
1897
+ decodeResult.decoder.decodeLevel = "none";
1898
+ return decodeResult;
1781
1899
  }
1782
1900
  decodeResult.decoded = true;
1783
1901
  decodeResult.decoder.decodeLevel = "full";
@@ -1799,25 +1917,34 @@ var Label_44_OFF = class extends DecoderPlugin {
1799
1917
  decodeResult.decoder.name = this.name;
1800
1918
  decodeResult.formatted.description = "Off Runway Report";
1801
1919
  decodeResult.message = message;
1802
- const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;
1803
- const results = message.text.match(regex);
1804
- if (results?.groups) {
1920
+ const data = message.text.split(",");
1921
+ if (data.length >= 8) {
1805
1922
  if (options.debug) {
1806
1923
  console.log(`Label 44 Off Runway Report: groups`);
1807
- console.log(results.groups);
1924
+ console.log(data);
1808
1925
  }
1809
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords));
1810
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
1811
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
1812
- decodeResult.raw.current_time = Date.parse(
1813
- (/* @__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"
1814
- );
1815
- decodeResult.raw.eta_time = Date.parse(
1816
- (/* @__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"
1817
- );
1818
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
1819
- decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
1926
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
1927
+ ResultFormatter.departureAirport(decodeResult, data[2]);
1928
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
1929
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
1930
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
1931
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
1932
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
1933
+ const fuel = Number(data[7]);
1934
+ if (!isNaN(fuel)) {
1935
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
1936
+ }
1937
+ if (data.length > 8) {
1938
+ ResultFormatter.unknownArr(decodeResult, data.slice(8));
1820
1939
  }
1940
+ } else {
1941
+ if (options.debug) {
1942
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1943
+ }
1944
+ ResultFormatter.unknown(decodeResult, message.text);
1945
+ decodeResult.decoded = false;
1946
+ decodeResult.decoder.decodeLevel = "none";
1947
+ return decodeResult;
1821
1948
  }
1822
1949
  decodeResult.decoded = true;
1823
1950
  decodeResult.decoder.decodeLevel = "full";
@@ -1839,22 +1966,33 @@ var Label_44_ON = class extends DecoderPlugin {
1839
1966
  decodeResult.decoder.name = this.name;
1840
1967
  decodeResult.formatted.description = "On Runway Report";
1841
1968
  decodeResult.message = message;
1842
- const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
1843
- const results = message.text.match(regex);
1844
- if (results?.groups) {
1969
+ const data = message.text.split(",");
1970
+ if (data.length >= 7) {
1845
1971
  if (options.debug) {
1846
1972
  console.log(`Label 44 On Runway Report: groups`);
1847
- console.log(results.groups);
1973
+ console.log(data);
1848
1974
  }
1849
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords));
1850
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
1851
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
1852
- decodeResult.raw.current_time = Date.parse(
1853
- (/* @__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"
1854
- );
1855
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
1856
- ResultFormatter.remainingFuel(decodeResult, Number(results.groups.fuel_in_tons));
1975
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
1976
+ ResultFormatter.departureAirport(decodeResult, data[2]);
1977
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
1978
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
1979
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
1980
+ ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
1981
+ const fuel = Number(data[6]);
1982
+ if (!isNaN(fuel)) {
1983
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
1984
+ }
1985
+ if (data.length > 7) {
1986
+ ResultFormatter.unknownArr(decodeResult, data.slice(7));
1987
+ }
1988
+ } else {
1989
+ if (options.debug) {
1990
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1857
1991
  }
1992
+ ResultFormatter.unknown(decodeResult, message.text);
1993
+ decodeResult.decoded = false;
1994
+ decodeResult.decoder.decodeLevel = "none";
1995
+ return decodeResult;
1858
1996
  }
1859
1997
  decodeResult.decoded = true;
1860
1998
  decodeResult.decoder.decodeLevel = "full";
@@ -2269,12 +2407,17 @@ function addCompanyRoute(decodeResult, value) {
2269
2407
  }
2270
2408
 
2271
2409
  // lib/utils/h1_helper.ts
2272
- var H1Helper = class {
2410
+ var H1Helper = class _H1Helper {
2273
2411
  static decodeH1Message(decodeResult, message) {
2274
2412
  const checksum = message.slice(-4);
2275
2413
  const data = message.slice(0, message.length - 4);
2276
2414
  const fields = data.split("/");
2277
- parseMessageType(decodeResult, fields[0]);
2415
+ const canDecode = parseMessageType(decodeResult, fields[0]);
2416
+ if (!canDecode) {
2417
+ decodeResult.decoded = false;
2418
+ decodeResult.decoder.decodeLevel = "none";
2419
+ return;
2420
+ }
2278
2421
  for (let i = 1; i < fields.length; ++i) {
2279
2422
  if (fields[i].startsWith("FN")) {
2280
2423
  decodeResult.raw.flight_number = fields[i].substring(2);
@@ -2283,16 +2426,9 @@ var H1Helper = class {
2283
2426
  } else if (fields[i].startsWith("DC")) {
2284
2427
  processDC(decodeResult, fields[i].substring(2).split(","));
2285
2428
  } else if (fields[i].startsWith("TS")) {
2286
- const ts = fields[i].substring(2).split(",");
2287
- let time = DateTimeUtils.convertDateTimeToEpoch(ts[0], ts[1]);
2288
- if (Number.isNaN(time)) {
2289
- const date = ts[1].substring(2, 4) + ts[1].substring(0, 2) + ts[1].substring(4, 6);
2290
- time = DateTimeUtils.convertDateTimeToEpoch(ts[0], date);
2291
- }
2292
- decodeResult.raw.message_date = ts[1];
2293
- decodeResult.raw.message_timestamp = time;
2429
+ _H1Helper.processTS(decodeResult, fields[i].substring(2).split(","));
2294
2430
  } else if (fields[i].startsWith("PS")) {
2295
- const pos = processPS(decodeResult, fields[i].substring(2).split(","));
2431
+ _H1Helper.processPS(decodeResult, fields[i].substring(2).split(","));
2296
2432
  } else if (fields[i].startsWith("DT")) {
2297
2433
  const data2 = fields[i].substring(2).split(",");
2298
2434
  processDT(decodeResult, data2);
@@ -2313,9 +2449,11 @@ var H1Helper = class {
2313
2449
  ResultFormatter.freetext(decodeResult, fields[i].substring(2));
2314
2450
  } else if (fields[i].startsWith("ET")) {
2315
2451
  if (fields[i].length === 7) {
2316
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(3) + "00"));
2452
+ ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 3)));
2453
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(3)));
2317
2454
  } else if (fields[i].length === 8) {
2318
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(4) + "00"));
2455
+ ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 4)));
2456
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(4)));
2319
2457
  } else {
2320
2458
  ResultFormatter.unknown(decodeResult, fields[i], "/");
2321
2459
  }
@@ -2328,6 +2466,56 @@ var H1Helper = class {
2328
2466
  }
2329
2467
  return true;
2330
2468
  }
2469
+ static processPS(decodeResult, data) {
2470
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2471
+ if (position) {
2472
+ decodeResult.raw.position = position;
2473
+ decodeResult.formatted.items.push({
2474
+ type: "aircraft_position",
2475
+ code: "POS",
2476
+ label: "Aircraft Position",
2477
+ value: CoordinateUtils.coordinateString(position)
2478
+ });
2479
+ }
2480
+ if (data.length === 9) {
2481
+ processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
2482
+ ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
2483
+ ResultFormatter.temperature(decodeResult, data[6]);
2484
+ ResultFormatter.unknown(decodeResult, data[7]);
2485
+ ResultFormatter.unknown(decodeResult, data[8]);
2486
+ }
2487
+ if (data.length === 14) {
2488
+ ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2489
+ processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
2490
+ ResultFormatter.temperature(decodeResult, data[7]);
2491
+ ResultFormatter.unknownArr(decodeResult, data.slice(8));
2492
+ }
2493
+ }
2494
+ static processPosition(decodeResult, data) {
2495
+ const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2496
+ if (position) {
2497
+ ResultFormatter.position(decodeResult, position);
2498
+ }
2499
+ if (data.length >= 10) {
2500
+ ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2501
+ processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
2502
+ ResultFormatter.temperature(decodeResult, data[7]);
2503
+ ResultFormatter.unknown(decodeResult, data[8]);
2504
+ ResultFormatter.unknown(decodeResult, data[9]);
2505
+ }
2506
+ if (data.length >= 14) {
2507
+ ResultFormatter.unknownArr(decodeResult, data.slice(10));
2508
+ }
2509
+ }
2510
+ static processTS(decodeResult, data) {
2511
+ let time = DateTimeUtils.convertDateTimeToEpoch(data[0], data[1]);
2512
+ if (Number.isNaN(time)) {
2513
+ const date = data[1].substring(2, 4) + data[1].substring(0, 2) + data[1].substring(4, 6);
2514
+ time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);
2515
+ }
2516
+ decodeResult.raw.message_date = data[1];
2517
+ decodeResult.raw.message_timestamp = time;
2518
+ }
2331
2519
  };
2332
2520
  function processAirField(decodeResult, data) {
2333
2521
  if (data.length === 2) {
@@ -2405,7 +2593,7 @@ function parseMessageType(decodeResult, messageType) {
2405
2593
  if (parts.length == 1) {
2406
2594
  const type = parts[0].substring(0, 3);
2407
2595
  if (type === "POS" && parts[0].length !== 3) {
2408
- processPosition2(decodeResult, parts[0].substring(3).split(","));
2596
+ H1Helper.processPosition(decodeResult, parts[0].substring(3).split(","));
2409
2597
  }
2410
2598
  return processMessageType(decodeResult, type);
2411
2599
  } else if (parts.length == 2) {
@@ -2416,11 +2604,12 @@ function parseMessageType(decodeResult, messageType) {
2416
2604
  }
2417
2605
  const type = parts[1].length == 5 ? parts[1].substring(2, 5) : parts[1].substring(3, 6);
2418
2606
  if (parts[1].substring(3, 6) === "POS" && parts[1].length > 6) {
2419
- processPosition2(decodeResult, parts[1].substring(6).split(","));
2607
+ H1Helper.processPosition(decodeResult, parts[1].substring(6).split(","));
2420
2608
  }
2421
- processMessageType(decodeResult, type);
2609
+ return processMessageType(decodeResult, type);
2422
2610
  } else {
2423
2611
  ResultFormatter.unknown(decodeResult, messageType);
2612
+ return false;
2424
2613
  }
2425
2614
  }
2426
2615
  function processMessageType(decodeResult, type) {
@@ -2436,7 +2625,9 @@ function processMessageType(decodeResult, type) {
2436
2625
  decodeResult.formatted.description = "Progress Report";
2437
2626
  } else {
2438
2627
  decodeResult.formatted.description = "Unknown H1 Message";
2628
+ return false;
2439
2629
  }
2630
+ return true;
2440
2631
  }
2441
2632
  function processDC(decodeResult, data) {
2442
2633
  decodeResult.raw.message_date = data[0];
@@ -2447,60 +2638,6 @@ function processDC(decodeResult, data) {
2447
2638
  decodeResult.raw.message_timestamp = time;
2448
2639
  }
2449
2640
  }
2450
- function processPS(decodeResult, data) {
2451
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2452
- if (position) {
2453
- decodeResult.raw.position = position;
2454
- decodeResult.formatted.items.push({
2455
- type: "aircraft_position",
2456
- code: "POS",
2457
- label: "Aircraft Position",
2458
- value: CoordinateUtils.coordinateString(position)
2459
- });
2460
- }
2461
- if (data.length === 9) {
2462
- processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
2463
- ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
2464
- ResultFormatter.temperature(decodeResult, data[6]);
2465
- ResultFormatter.unknown(decodeResult, data[7]);
2466
- ResultFormatter.unknown(decodeResult, data[8]);
2467
- }
2468
- if (data.length === 14) {
2469
- ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2470
- processRoute(decodeResult, data[4], data[2], data[6], data[5], void 0);
2471
- ResultFormatter.temperature(decodeResult, data[7]);
2472
- ResultFormatter.groundspeed(decodeResult, Number(data[10]));
2473
- ResultFormatter.unknown(decodeResult, data[1]);
2474
- ResultFormatter.unknown(decodeResult, data[8]);
2475
- ResultFormatter.unknown(decodeResult, data[9]);
2476
- ResultFormatter.unknown(decodeResult, data.slice(11).join(","));
2477
- }
2478
- }
2479
- function processPosition2(decodeResult, data) {
2480
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2481
- if (position) {
2482
- decodeResult.raw.position = position;
2483
- decodeResult.formatted.items.push({
2484
- type: "aircraft_position",
2485
- code: "POS",
2486
- label: "Aircraft Position",
2487
- value: CoordinateUtils.coordinateString(position)
2488
- });
2489
- }
2490
- if (data.length >= 10) {
2491
- ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2492
- processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
2493
- ResultFormatter.temperature(decodeResult, data[7]);
2494
- ResultFormatter.unknown(decodeResult, data[8]);
2495
- ResultFormatter.unknown(decodeResult, data[9]);
2496
- }
2497
- if (data.length >= 14) {
2498
- ResultFormatter.groundspeed(decodeResult, Number(data[10]));
2499
- ResultFormatter.unknown(decodeResult, data[11]);
2500
- ResultFormatter.unknown(decodeResult, data[12]);
2501
- ResultFormatter.unknown(decodeResult, data[13]);
2502
- }
2503
- }
2504
2641
  function processRoute(decodeResult, last, time, next, eta, then, date) {
2505
2642
  const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
2506
2643
  const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
@@ -2575,7 +2712,7 @@ var Label_4N = class extends DecoderPlugin {
2575
2712
  decodeResult.decoded = true;
2576
2713
  const fields = text.split(",");
2577
2714
  if (text.length === 51) {
2578
- decodeResult.raw.day_of_month = text.substring(0, 2);
2715
+ decodeResult.raw.day = text.substring(0, 2);
2579
2716
  ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));
2580
2717
  ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));
2581
2718
  ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(30, 45).replace(/^(.)0/, "$1")));
@@ -2612,6 +2749,129 @@ var Label_4N = class extends DecoderPlugin {
2612
2749
  }
2613
2750
  };
2614
2751
 
2752
+ // lib/plugins/Label_4T_AGFSR.ts
2753
+ var Label_4T_AGFSR = class extends DecoderPlugin {
2754
+ name = "label-4t-agfsr";
2755
+ qualifiers() {
2756
+ return {
2757
+ labels: ["4T"],
2758
+ preambles: ["AGFSR"]
2759
+ };
2760
+ }
2761
+ decode(message, options = {}) {
2762
+ const decodeResult = this.defaultResult();
2763
+ decodeResult.decoder.name = this.name;
2764
+ decodeResult.formatted.description = "Position Report";
2765
+ decodeResult.message = message;
2766
+ const data = message.text.substring(5).split("/");
2767
+ if (!message.text.startsWith("AGFSR") || data.length !== 20) {
2768
+ if (options.debug) {
2769
+ console.log(`Decoder: Unknown 4T message: ${message.text}`);
2770
+ }
2771
+ ResultFormatter.unknown(decodeResult, message.text);
2772
+ decodeResult.decoded = false;
2773
+ decodeResult.decoder.decodeLevel = "none";
2774
+ return decodeResult;
2775
+ }
2776
+ ResultFormatter.flightNumber(decodeResult, data[0].trim());
2777
+ ResultFormatter.departureDay(decodeResult, Number(data[1]));
2778
+ ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
2779
+ ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
2780
+ ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
2781
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
2782
+ ResultFormatter.unknown(decodeResult, data[5], "/");
2783
+ const lat = data[6].substring(0, 7);
2784
+ const lon = data[6].substring(7, 15);
2785
+ ResultFormatter.position(decodeResult, {
2786
+ latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) + Number(lat.substring(2, 6)) / 60,
2787
+ longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) + Number(lon.substring(3, 7)) / 60
2788
+ });
2789
+ ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));
2790
+ ResultFormatter.unknownArr(decodeResult, data.slice(8), "/");
2791
+ decodeResult.decoded = true;
2792
+ decodeResult.decoder.decodeLevel = "partial";
2793
+ return decodeResult;
2794
+ }
2795
+ };
2796
+
2797
+ // lib/plugins/Label_58.ts
2798
+ var Label_58 = class extends DecoderPlugin {
2799
+ name = "label-58";
2800
+ qualifiers() {
2801
+ return {
2802
+ labels: ["58"]
2803
+ };
2804
+ }
2805
+ decode(message, options = {}) {
2806
+ const decodeResult = this.defaultResult();
2807
+ decodeResult.decoder.name = this.name;
2808
+ decodeResult.formatted.description = "Position Report";
2809
+ decodeResult.message = message;
2810
+ const data = message.text.split("/");
2811
+ if (data.length === 8) {
2812
+ ResultFormatter.flightNumber(decodeResult, data[0]);
2813
+ ResultFormatter.day(decodeResult, Number(data[1]));
2814
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
2815
+ const lat = data[3];
2816
+ const lon = data[4];
2817
+ ResultFormatter.position(decodeResult, {
2818
+ latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
2819
+ longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
2820
+ });
2821
+ ResultFormatter.altitude(decodeResult, Number(data[5]));
2822
+ ResultFormatter.unknown(decodeResult, data[6], "/");
2823
+ ResultFormatter.unknown(decodeResult, data[7], "/");
2824
+ } else {
2825
+ if (options.debug) {
2826
+ console.log(`Decoder: Unknown 58 message: ${message.text}`);
2827
+ }
2828
+ ResultFormatter.unknown(decodeResult, message.text);
2829
+ decodeResult.decoded = false;
2830
+ decodeResult.decoder.decodeLevel = "none";
2831
+ return decodeResult;
2832
+ }
2833
+ decodeResult.decoded = true;
2834
+ decodeResult.decoder.decodeLevel = "partial";
2835
+ return decodeResult;
2836
+ }
2837
+ };
2838
+
2839
+ // lib/plugins/Label_4T_ETA.ts
2840
+ var Label_4T_ETA = class extends DecoderPlugin {
2841
+ name = "label-4t-eta";
2842
+ qualifiers() {
2843
+ return {
2844
+ labels: ["4T"],
2845
+ preambles: ["ETA"]
2846
+ };
2847
+ }
2848
+ decode(message, options = {}) {
2849
+ const decodeResult = this.defaultResult();
2850
+ decodeResult.decoder.name = this.name;
2851
+ decodeResult.formatted.description = "ETA Report";
2852
+ decodeResult.message = message;
2853
+ const data = message.text.substring(3).split("/");
2854
+ if (!message.text.startsWith("ETA") || data.length !== 3) {
2855
+ if (options.debug) {
2856
+ console.log(`Decoder: Unknown 4T message: ${message.text}`);
2857
+ }
2858
+ ResultFormatter.unknown(decodeResult, message.text);
2859
+ decodeResult.decoded = false;
2860
+ decodeResult.decoder.decodeLevel = "none";
2861
+ return decodeResult;
2862
+ }
2863
+ ResultFormatter.flightNumber(decodeResult, data[0].trim());
2864
+ ResultFormatter.departureDay(decodeResult, Number(data[1]));
2865
+ const etaData = data[2].split(" ");
2866
+ ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
2867
+ ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
2868
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
2869
+ decodeResult.decoded = true;
2870
+ decodeResult.decoder.decodeLevel = "full";
2871
+ return decodeResult;
2872
+ }
2873
+ };
2874
+
2615
2875
  // lib/plugins/Label_80.ts
2616
2876
  var Label_80 = class extends DecoderPlugin {
2617
2877
  name = "label-80";
@@ -2789,7 +3049,7 @@ var Label_83 = class extends DecoderPlugin {
2789
3049
  if (text.substring(0, 10) === "4DH3 ETAT2") {
2790
3050
  const fields = text.split(/\s+/);
2791
3051
  if (fields[2].length > 5) {
2792
- decodeResult.raw.day_of_month = fields[2].substring(5);
3052
+ decodeResult.raw.day = fields[2].substring(5);
2793
3053
  }
2794
3054
  ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));
2795
3055
  const subfields = fields[3].split("/");
@@ -2798,7 +3058,7 @@ var Label_83 = class extends DecoderPlugin {
2798
3058
  ResultFormatter.tail(decodeResult, fields[4].replace(/\./g, ""));
2799
3059
  ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[6] + "00"));
2800
3060
  } else if (text.substring(0, 5) === "001PR") {
2801
- decodeResult.raw.day_of_month = text.substring(5, 7);
3061
+ decodeResult.raw.day = text.substring(5, 7);
2802
3062
  const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(13, 28).replace(/\./g, ""));
2803
3063
  if (position) {
2804
3064
  ResultFormatter.position(decodeResult, position);
@@ -2810,7 +3070,7 @@ var Label_83 = class extends DecoderPlugin {
2810
3070
  if (fields.length === 9) {
2811
3071
  ResultFormatter.departureAirport(decodeResult, fields[0]);
2812
3072
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
2813
- decodeResult.raw.day_of_month = fields[2].substring(0, 2);
3073
+ decodeResult.raw.day = fields[2].substring(0, 2);
2814
3074
  decodeResult.raw.time = fields[2].substring(2);
2815
3075
  ResultFormatter.position(
2816
3076
  decodeResult,
@@ -2860,7 +3120,7 @@ var Label_8E = class extends DecoderPlugin {
2860
3120
  console.log(`Label 8E ETA: groups`);
2861
3121
  console.log(results.groups);
2862
3122
  }
2863
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta + "00"));
3123
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta));
2864
3124
  ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
2865
3125
  }
2866
3126
  decodeResult.decoded = true;
@@ -3048,6 +3308,65 @@ var Label_H1_OHMA = class extends DecoderPlugin {
3048
3308
  }
3049
3309
  };
3050
3310
 
3311
+ // lib/plugins/Label_H1_Slash.ts
3312
+ var Label_H1_Slash = class extends DecoderPlugin {
3313
+ name = "label-h1-slash";
3314
+ qualifiers() {
3315
+ return {
3316
+ labels: ["H1"],
3317
+ preambles: ["/"]
3318
+ };
3319
+ }
3320
+ decode(message, options = {}) {
3321
+ let decodeResult = this.defaultResult();
3322
+ decodeResult.decoder.name = this.name;
3323
+ decodeResult.formatted.description = "Position Report";
3324
+ decodeResult.message = message;
3325
+ const checksum = message.text.slice(-4);
3326
+ const data = message.text.slice(0, message.text.length - 4);
3327
+ const fields = data.split("/");
3328
+ if (fields[0] !== "") {
3329
+ ResultFormatter.unknown(decodeResult, message.text);
3330
+ decodeResult.decoded = false;
3331
+ decodeResult.decoder.decodeLevel = "none";
3332
+ return decodeResult;
3333
+ }
3334
+ const headerData = fields[1].split(".");
3335
+ ResultFormatter.unknown(decodeResult, headerData[0]);
3336
+ if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
3337
+ H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
3338
+ } else if (headerData[1] === "POS") {
3339
+ } else if (headerData[1].startsWith("POS")) {
3340
+ H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
3341
+ } else {
3342
+ ResultFormatter.unknown(decodeResult, headerData[1], ".");
3343
+ }
3344
+ for (let i = 2; i < fields.length; i++) {
3345
+ const field = fields[i];
3346
+ if (field.startsWith("TS")) {
3347
+ H1Helper.processTS(decodeResult, field.substring(2, 15).split(","));
3348
+ } else if (field.startsWith("PS")) {
3349
+ H1Helper.processPS(decodeResult, field.substring(2).split(","));
3350
+ } else {
3351
+ ResultFormatter.unknown(decodeResult, field, "/");
3352
+ }
3353
+ }
3354
+ if (decodeResult.formatted.items.length === 0) {
3355
+ if (options.debug) {
3356
+ console.log(`Decoder: Unknown H1 message: ${message.text}`);
3357
+ }
3358
+ ResultFormatter.unknown(decodeResult, message.text);
3359
+ decodeResult.decoded = false;
3360
+ decodeResult.decoder.decodeLevel = "none";
3361
+ return decodeResult;
3362
+ }
3363
+ ResultFormatter.checksum(decodeResult, checksum);
3364
+ decodeResult.decoded = true;
3365
+ decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
3366
+ return decodeResult;
3367
+ }
3368
+ };
3369
+
3051
3370
  // lib/plugins/Label_H1_StarPOS.ts
3052
3371
  var Label_H1_StarPOS = class extends DecoderPlugin {
3053
3372
  name = "label-h1-star-pos";
@@ -3072,9 +3391,9 @@ var Label_H1_StarPOS = class extends DecoderPlugin {
3072
3391
  decodeResult.decoder.decodeLevel = "none";
3073
3392
  return decodeResult;
3074
3393
  }
3075
- decodeResult.raw.month = Number(msg.substring(4, 6));
3076
- decodeResult.raw.day_of_month = Number(msg.substring(6, 8));
3077
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12) + "00"));
3394
+ ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));
3395
+ ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));
3396
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)));
3078
3397
  ResultFormatter.position(decodeResult, {
3079
3398
  // Deg Min, no sec
3080
3399
  latitude: CoordinateUtils.getDirection(msg.substring(12, 13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),
@@ -3301,7 +3620,7 @@ var Label_QR = class extends DecoderPlugin {
3301
3620
  decodeResult.formatted.description = "ON Report";
3302
3621
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3303
3622
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3304
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
3623
+ ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
3305
3624
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
3306
3625
  decodeResult.decoded = true;
3307
3626
  if (!decodeResult.remaining.text)
@@ -3326,7 +3645,7 @@ var Label_QP = class extends DecoderPlugin {
3326
3645
  decodeResult.formatted.description = "OUT Report";
3327
3646
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3328
3647
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3329
- ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
3648
+ ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
3330
3649
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
3331
3650
  decodeResult.decoded = true;
3332
3651
  if (!decodeResult.remaining.text)
@@ -3351,7 +3670,7 @@ var Label_QS = class extends DecoderPlugin {
3351
3670
  decodeResult.formatted.description = "IN Report";
3352
3671
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3353
3672
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3354
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
3673
+ ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
3355
3674
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
3356
3675
  decodeResult.decoded = true;
3357
3676
  if (!decodeResult.remaining.text)
@@ -3378,7 +3697,7 @@ var Label_QQ = class extends DecoderPlugin {
3378
3697
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3379
3698
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3380
3699
  if (message.text.substring(12, 19) === "\r\n001FE") {
3381
- decodeResult.raw.day_of_month = message.text.substring(19, 21);
3700
+ decodeResult.raw.day = message.text.substring(19, 21);
3382
3701
  ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
3383
3702
  let latdir = message.text.substring(27, 28);
3384
3703
  let latdeg = Number(message.text.substring(28, 30));
@@ -4228,6 +4547,7 @@ var MessageDecoder = class {
4228
4547
  this.registerPlugin(new Label_10_POS(this));
4229
4548
  this.registerPlugin(new Label_10_Slash(this));
4230
4549
  this.registerPlugin(new Label_12_N_Space(this));
4550
+ this.registerPlugin(new Label_12_POS(this));
4231
4551
  this.registerPlugin(new Label_13Through18_Slash(this));
4232
4552
  this.registerPlugin(new Label_15(this));
4233
4553
  this.registerPlugin(new Label_15_FST(this));
@@ -4254,13 +4574,17 @@ var MessageDecoder = class {
4254
4574
  this.registerPlugin(new Label_4A_Slash_01(this));
4255
4575
  this.registerPlugin(new Label_4J_POS(this));
4256
4576
  this.registerPlugin(new Label_4N(this));
4577
+ this.registerPlugin(new Label_4T_AGFSR(this));
4578
+ this.registerPlugin(new Label_4T_ETA(this));
4257
4579
  this.registerPlugin(new Label_B6_Forwardslash(this));
4258
4580
  this.registerPlugin(new Label_H1_FLR(this));
4259
4581
  this.registerPlugin(new Label_H1_OHMA(this));
4260
4582
  this.registerPlugin(new Label_H1_WRN(this));
4261
4583
  this.registerPlugin(new Label_H1(this));
4584
+ this.registerPlugin(new Label_H1_Slash(this));
4262
4585
  this.registerPlugin(new Label_H1_StarPOS(this));
4263
4586
  this.registerPlugin(new Label_HX(this));
4587
+ this.registerPlugin(new Label_58(this));
4264
4588
  this.registerPlugin(new Label_80(this));
4265
4589
  this.registerPlugin(new Label_83(this));
4266
4590
  this.registerPlugin(new Label_8E(this));