@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.js CHANGED
@@ -75,10 +75,13 @@ var DateTimeUtils = class {
75
75
  }
76
76
  /**
77
77
  *
78
- * @param time HHMMSS
78
+ * @param time HHMMSS or HHMM
79
79
  * @returns seconds since midnight
80
80
  */
81
81
  static convertHHMMSSToTod(time) {
82
+ if (time.length === 4) {
83
+ time += "00";
84
+ }
82
85
  const h = Number(time.substring(0, 2));
83
86
  const m = Number(time.substring(2, 4));
84
87
  const s = Number(time.substring(4, 6));
@@ -566,14 +569,24 @@ var ResultFormatter = class {
566
569
  value: DateTimeUtils.timestampToString(time, "tod")
567
570
  });
568
571
  }
569
- static off(decodeResult, time) {
570
- decodeResult.raw.off_time = time;
571
- decodeResult.formatted.items.push({
572
- type: "time_of_day",
573
- code: "OFF",
574
- label: "Takeoff Time",
575
- value: DateTimeUtils.timestampToString(time, "tod")
576
- });
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
+ }
577
590
  }
578
591
  static on(decodeResult, time) {
579
592
  decodeResult.raw.on_time = time;
@@ -603,27 +616,36 @@ var ResultFormatter = class {
603
616
  });
604
617
  }
605
618
  static day(decodeResult, day) {
606
- decodeResult.raw.day_of_month = day;
619
+ decodeResult.raw.day = day;
607
620
  decodeResult.formatted.items.push({
608
- type: "day_of_month",
621
+ type: "day",
609
622
  code: "MSG_DAY",
610
623
  label: "Day of Month",
611
624
  value: `${day}`
612
625
  });
613
626
  }
627
+ static month(decodeResult, month) {
628
+ decodeResult.raw.month = month;
629
+ decodeResult.formatted.items.push({
630
+ type: "month",
631
+ code: "MSG_MON",
632
+ label: "Month of Year",
633
+ value: `${month}`
634
+ });
635
+ }
614
636
  static departureDay(decodeResult, day) {
615
- decodeResult.raw.departure_day_of_month = day;
637
+ decodeResult.raw.departure_day = day;
616
638
  decodeResult.formatted.items.push({
617
- type: "day_of_month",
639
+ type: "day",
618
640
  code: "DEP_DAY",
619
641
  label: "Departure Day",
620
642
  value: `${day}`
621
643
  });
622
644
  }
623
645
  static arrivalDay(decodeResult, day) {
624
- decodeResult.raw.arrival_day_of_month = day;
646
+ decodeResult.raw.arrival_day = day;
625
647
  decodeResult.formatted.items.push({
626
- type: "day_of_month",
648
+ type: "day",
627
649
  code: "ARR_DAY",
628
650
  label: "Arrival Day",
629
651
  value: `${day}`
@@ -718,14 +740,14 @@ var Label_5Z_Slash = class extends DecoderPlugin {
718
740
  const info = data[2].split(" ");
719
741
  ResultFormatter.departureAirport(decodeResult, info[1]);
720
742
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
721
- decodeResult.raw.day_of_month = Number(info[3]);
743
+ decodeResult.raw.day = Number(info[3]);
722
744
  ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
723
745
  ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));
724
746
  ResultFormatter.unknownArr(decodeResult, data.slice(3), "/");
725
747
  } else if (type === "B3") {
726
748
  ResultFormatter.departureAirport(decodeResult, header[1].substring(0, 3), "IATA");
727
749
  ResultFormatter.arrivalAirport(decodeResult, header[1].substring(3), "IATA");
728
- decodeResult.raw.day_of_month = Number(header[2]);
750
+ decodeResult.raw.day = Number(header[2]);
729
751
  ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));
730
752
  if (header.length > 4) {
731
753
  ResultFormatter.unknownArr(decodeResult, header.slice(4), "/");
@@ -734,7 +756,7 @@ var Label_5Z_Slash = class extends DecoderPlugin {
734
756
  const info = data[2].split(" ");
735
757
  ResultFormatter.departureAirport(decodeResult, info[1]);
736
758
  ResultFormatter.arrivalAirport(decodeResult, info[2]);
737
- decodeResult.raw.day_of_month = Number(info[3]);
759
+ decodeResult.raw.day = Number(info[3]);
738
760
  ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(info[4]));
739
761
  ResultFormatter.unknownArr(decodeResult, info.slice(5), " ");
740
762
  } else if (type === "C3") {
@@ -744,10 +766,10 @@ var Label_5Z_Slash = class extends DecoderPlugin {
744
766
  const airports = data[2].split(" ");
745
767
  ResultFormatter.departureAirport(decodeResult, airports[1]);
746
768
  ResultFormatter.arrivalAirport(decodeResult, airports[2]);
747
- decodeResult.raw.day_of_month = Number(airports[3]);
769
+ decodeResult.raw.day = Number(airports[3]);
748
770
  ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(airports[4]));
749
771
  const estimates = data[3].split(" ");
750
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1] + "00"));
772
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(estimates[1]));
751
773
  ResultFormatter.unknown(decodeResult, estimates[2]);
752
774
  } else {
753
775
  if (options.debug) {
@@ -891,16 +913,16 @@ var Label_10_Slash = class extends DecoderPlugin {
891
913
  ResultFormatter.heading(decodeResult, Number(parts[5]));
892
914
  ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));
893
915
  ResultFormatter.arrivalAirport(decodeResult, parts[7]);
894
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8] + "00"));
916
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[8]));
895
917
  const waypoints = [{
896
918
  name: parts[11]
897
919
  }, {
898
920
  name: parts[12],
899
- time: DateTimeUtils.convertHHMMSSToTod(parts[13] + "00"),
921
+ time: DateTimeUtils.convertHHMMSSToTod(parts[13]),
900
922
  timeFormat: "tod"
901
923
  }, {
902
924
  name: parts[14],
903
- time: DateTimeUtils.convertHHMMSSToTod(parts[15] + "00"),
925
+ time: DateTimeUtils.convertHHMMSSToTod(parts[15]),
904
926
  timeFormat: "tod"
905
927
  }];
906
928
  ResultFormatter.route(decodeResult, { waypoints });
@@ -920,7 +942,7 @@ var Label_12_N_Space = class extends DecoderPlugin {
920
942
  qualifiers() {
921
943
  return {
922
944
  labels: ["12"],
923
- preambles: ["N "]
945
+ preambles: ["N ", "S "]
924
946
  };
925
947
  }
926
948
  decode(message, options = {}) {
@@ -956,6 +978,51 @@ var Label_12_N_Space = class extends DecoderPlugin {
956
978
  }
957
979
  };
958
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
+
959
1026
  // lib/plugins/Label_13Through18_Slash.ts
960
1027
  var Label_13Through18_Slash = class extends DecoderPlugin {
961
1028
  // eslint-disable-line camelcase
@@ -986,7 +1053,7 @@ var Label_13Through18_Slash = class extends DecoderPlugin {
986
1053
  const data = parts[2].split(" ");
987
1054
  ResultFormatter.departureAirport(decodeResult, data[1]);
988
1055
  ResultFormatter.arrivalAirport(decodeResult, data[2]);
989
- decodeResult.raw.day_of_month = Number(data[3]);
1056
+ decodeResult.raw.day = Number(data[3]);
990
1057
  const time = DateTimeUtils.convertHHMMSSToTod(data[4]);
991
1058
  if (labelNumber === 13) {
992
1059
  ResultFormatter.out(decodeResult, time);
@@ -1046,7 +1113,7 @@ function getMsgType(labelNumber) {
1046
1113
 
1047
1114
  // lib/plugins/Label_15.ts
1048
1115
  var Label_15 = class extends DecoderPlugin {
1049
- name = "label-5z";
1116
+ name = "label-15";
1050
1117
  qualifiers() {
1051
1118
  return {
1052
1119
  labels: ["15"],
@@ -1057,10 +1124,38 @@ var Label_15 = class extends DecoderPlugin {
1057
1124
  const decodeResult = this.defaultResult();
1058
1125
  decodeResult.decoder.name = this.name;
1059
1126
  decodeResult.formatted.description = "Position Report";
1060
- const twoZeeRegex = /^\(2(?<between>.+)\(Z$/;
1061
- const results = message.text.match(twoZeeRegex);
1062
- if (results?.groups) {
1063
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.between.substr(0, 13)));
1127
+ decodeResult.message = message;
1128
+ if (message.text.startsWith("(2") && message.text.endsWith("(Z")) {
1129
+ const between = message.text.substring(2, message.text.length - 2);
1130
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(between.substring(0, 13)));
1131
+ if (between.length === 25) {
1132
+ ResultFormatter.unknown(decodeResult, between.substring(13, 19));
1133
+ const alt = between.substring(19, 22);
1134
+ if (alt != "---") {
1135
+ ResultFormatter.altitude(decodeResult, 100 * Number(alt));
1136
+ }
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));
1148
+ } else {
1149
+ ResultFormatter.unknown(decodeResult, between.substring(26));
1150
+ }
1151
+ } else {
1152
+ if (options.debug) {
1153
+ console.log(`Decoder: Unknown 15 message: ${message.text}`);
1154
+ }
1155
+ ResultFormatter.unknown(decodeResult, message.text);
1156
+ decodeResult.decoded = false;
1157
+ decodeResult.decoder.decodeLevel = "none";
1158
+ return decodeResult;
1064
1159
  }
1065
1160
  decodeResult.decoded = true;
1066
1161
  decodeResult.decoder.decodeLevel = "partial";
@@ -1113,7 +1208,7 @@ var Label_16_N_Space = class extends DecoderPlugin {
1113
1208
  qualifiers() {
1114
1209
  return {
1115
1210
  labels: ["16"],
1116
- preambles: ["N "]
1211
+ preambles: ["N ", "S "]
1117
1212
  };
1118
1213
  }
1119
1214
  decode(message, options = {}) {
@@ -1243,7 +1338,7 @@ var Label_1L_3Line = class extends DecoderPlugin {
1243
1338
  }
1244
1339
  const eta = data.get("ETA");
1245
1340
  if (eta) {
1246
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta + "00"));
1341
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));
1247
1342
  data.delete("ETA");
1248
1343
  }
1249
1344
  const alt = data.get("ALT");
@@ -1324,8 +1419,8 @@ var Label_1L_070 = class extends DecoderPlugin {
1324
1419
  }
1325
1420
  ResultFormatter.departureAirport(decodeResult, parts[0]);
1326
1421
  ResultFormatter.arrivalAirport(decodeResult, parts[1]);
1327
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2] + "00"));
1328
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3] + "00"));
1422
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));
1423
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
1329
1424
  ResultFormatter.position(decodeResult, {
1330
1425
  latitude: CoordinateUtils.getDirection(parts[4][0]) * Number(parts[4].substring(1)),
1331
1426
  longitude: CoordinateUtils.getDirection(parts[5][0]) * Number(parts[5].substring(1))
@@ -1420,7 +1515,6 @@ var Label_1L_Slash = class extends DecoderPlugin {
1420
1515
  const part = parts[i].split(" ");
1421
1516
  data.set(part[0], part.slice(1).join(" "));
1422
1517
  }
1423
- console.log(data);
1424
1518
  const position = {
1425
1519
  latitude: Number(data.get("LAT")),
1426
1520
  longitude: Number(data.get("LON"))
@@ -1445,7 +1539,7 @@ var Label_1L_Slash = class extends DecoderPlugin {
1445
1539
  }
1446
1540
  const eta = data.get("ETA");
1447
1541
  if (eta) {
1448
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta + "00"));
1542
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));
1449
1543
  data.delete("ETA");
1450
1544
  }
1451
1545
  let remaining = "";
@@ -1579,7 +1673,7 @@ var Label_22_OFF = class extends DecoderPlugin {
1579
1673
  ResultFormatter.flightNumber(decodeResult, fields[0]);
1580
1674
  ResultFormatter.departureDay(decodeResult, Number(fields[1].substring(0, 2)));
1581
1675
  ResultFormatter.arrivalDay(decodeResult, Number(fields[1].substring(2, 4)));
1582
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8) + "00"));
1676
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)));
1583
1677
  ResultFormatter.departureAirport(decodeResult, fields[1].substring(8, 12));
1584
1678
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));
1585
1679
  ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)));
@@ -1595,7 +1689,7 @@ var Label_22_OFF = class extends DecoderPlugin {
1595
1689
  }
1596
1690
  ResultFormatter.departureAirport(decodeResult, fields[0]);
1597
1691
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
1598
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + "00"));
1692
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2]));
1599
1693
  ResultFormatter.unknown(decodeResult, fields[3]);
1600
1694
  decodeResult.decoded = true;
1601
1695
  decodeResult.decoder.decodeLevel = "partial";
@@ -1612,12 +1706,12 @@ var Label_22_OFF = class extends DecoderPlugin {
1612
1706
  ResultFormatter.position(decodeResult, position);
1613
1707
  }
1614
1708
  ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));
1615
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20) + "00"));
1709
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)));
1616
1710
  ResultFormatter.departureAirport(decodeResult, fields[1].substring(20, 24));
1617
1711
  ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));
1618
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32) + "00"));
1712
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)));
1619
1713
  ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));
1620
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40) + "00"));
1714
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)));
1621
1715
  decodeResult.decoded = true;
1622
1716
  decodeResult.decoder.decodeLevel = "partial";
1623
1717
  } else {
@@ -1699,7 +1793,7 @@ var Label_24_Slash = class extends DecoderPlugin {
1699
1793
  longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
1700
1794
  };
1701
1795
  ResultFormatter.position(decodeResult, position);
1702
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8] + "00"));
1796
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));
1703
1797
  ResultFormatter.unknown(decodeResult, fields[7]);
1704
1798
  decodeResult.decoded = true;
1705
1799
  decodeResult.decoder.decodeLevel = "partial";
@@ -1735,7 +1829,7 @@ var Label_30_Slash_EA = class extends DecoderPlugin {
1735
1829
  console.log(results);
1736
1830
  }
1737
1831
  }
1738
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4) + "00"));
1832
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));
1739
1833
  if (results[1].substring(0, 2) === "DS") {
1740
1834
  ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
1741
1835
  ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
@@ -1762,22 +1856,35 @@ var Label_44_ETA = class extends DecoderPlugin {
1762
1856
  decodeResult.decoder.name = this.name;
1763
1857
  decodeResult.formatted.description = "ETA Report";
1764
1858
  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) {
1859
+ const data = message.text.split(",");
1860
+ if (data.length >= 9) {
1768
1861
  if (options.debug) {
1769
1862
  console.log(`Label 44 ETA Report: groups`);
1770
- console.log(results.groups);
1863
+ console.log(data);
1771
1864
  }
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
- ResultFormatter.remainingFuel(decodeResult, Number(results.groups.fuel_in_tons));
1865
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
1866
+ ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));
1867
+ ResultFormatter.departureAirport(decodeResult, data[3]);
1868
+ ResultFormatter.arrivalAirport(decodeResult, data[4]);
1869
+ ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));
1870
+ ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));
1871
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
1872
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[7]));
1873
+ const fuel = Number(data[8]);
1874
+ if (!isNaN(fuel)) {
1875
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
1876
+ }
1877
+ if (data.length > 9) {
1878
+ ResultFormatter.unknownArr(decodeResult, data.slice(9));
1780
1879
  }
1880
+ } else {
1881
+ if (options.debug) {
1882
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1883
+ }
1884
+ ResultFormatter.unknown(decodeResult, message.text);
1885
+ decodeResult.decoded = false;
1886
+ decodeResult.decoder.decodeLevel = "none";
1887
+ return decodeResult;
1781
1888
  }
1782
1889
  decodeResult.decoded = true;
1783
1890
  decodeResult.decoder.decodeLevel = "full";
@@ -1799,22 +1906,33 @@ var Label_44_IN = class extends DecoderPlugin {
1799
1906
  decodeResult.decoder.name = this.name;
1800
1907
  decodeResult.formatted.description = "In Air Report";
1801
1908
  decodeResult.message = message;
1802
- const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
1803
- const results = message.text.match(regex);
1804
- if (results?.groups) {
1909
+ const data = message.text.split(",");
1910
+ if (data.length >= 7) {
1805
1911
  if (options.debug) {
1806
1912
  console.log(`Label 44 In Air Report: groups`);
1807
- console.log(results.groups);
1913
+ console.log(data);
1808
1914
  }
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
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
1816
- decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
1915
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
1916
+ ResultFormatter.departureAirport(decodeResult, data[2]);
1917
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
1918
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
1919
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
1920
+ ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
1921
+ const fuel = Number(data[6]);
1922
+ if (!isNaN(fuel)) {
1923
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
1924
+ }
1925
+ if (data.length > 7) {
1926
+ ResultFormatter.unknownArr(decodeResult, data.slice(7));
1817
1927
  }
1928
+ } else {
1929
+ if (options.debug) {
1930
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1931
+ }
1932
+ ResultFormatter.unknown(decodeResult, message.text);
1933
+ decodeResult.decoded = false;
1934
+ decodeResult.decoder.decodeLevel = "none";
1935
+ return decodeResult;
1818
1936
  }
1819
1937
  decodeResult.decoded = true;
1820
1938
  decodeResult.decoder.decodeLevel = "full";
@@ -1836,25 +1954,34 @@ var Label_44_OFF = class extends DecoderPlugin {
1836
1954
  decodeResult.decoder.name = this.name;
1837
1955
  decodeResult.formatted.description = "Off Runway Report";
1838
1956
  decodeResult.message = message;
1839
- const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;
1840
- const results = message.text.match(regex);
1841
- if (results?.groups) {
1957
+ const data = message.text.split(",");
1958
+ if (data.length >= 8) {
1842
1959
  if (options.debug) {
1843
1960
  console.log(`Label 44 Off Runway Report: groups`);
1844
- console.log(results.groups);
1961
+ console.log(data);
1845
1962
  }
1846
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords));
1847
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
1848
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
1849
- decodeResult.raw.current_time = Date.parse(
1850
- (/* @__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"
1851
- );
1852
- decodeResult.raw.eta_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.eta_time.substr(0, 2) + ":" + results.groups.eta_time.substr(2, 2) + ":00Z"
1854
- );
1855
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
1856
- decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
1963
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
1964
+ ResultFormatter.departureAirport(decodeResult, data[2]);
1965
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
1966
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
1967
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
1968
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
1969
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
1970
+ const fuel = Number(data[7]);
1971
+ if (!isNaN(fuel)) {
1972
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
1973
+ }
1974
+ if (data.length > 8) {
1975
+ ResultFormatter.unknownArr(decodeResult, data.slice(8));
1857
1976
  }
1977
+ } else {
1978
+ if (options.debug) {
1979
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1980
+ }
1981
+ ResultFormatter.unknown(decodeResult, message.text);
1982
+ decodeResult.decoded = false;
1983
+ decodeResult.decoder.decodeLevel = "none";
1984
+ return decodeResult;
1858
1985
  }
1859
1986
  decodeResult.decoded = true;
1860
1987
  decodeResult.decoder.decodeLevel = "full";
@@ -1876,22 +2003,33 @@ var Label_44_ON = class extends DecoderPlugin {
1876
2003
  decodeResult.decoder.name = this.name;
1877
2004
  decodeResult.formatted.description = "On Runway Report";
1878
2005
  decodeResult.message = message;
1879
- const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
1880
- const results = message.text.match(regex);
1881
- if (results?.groups) {
2006
+ const data = message.text.split(",");
2007
+ if (data.length >= 7) {
1882
2008
  if (options.debug) {
1883
2009
  console.log(`Label 44 On Runway Report: groups`);
1884
- console.log(results.groups);
2010
+ console.log(data);
1885
2011
  }
1886
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords));
1887
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
1888
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
1889
- decodeResult.raw.current_time = Date.parse(
1890
- (/* @__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"
1891
- );
1892
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
1893
- ResultFormatter.remainingFuel(decodeResult, Number(results.groups.fuel_in_tons));
2012
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
2013
+ ResultFormatter.departureAirport(decodeResult, data[2]);
2014
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
2015
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2016
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2017
+ ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
2018
+ const fuel = Number(data[6]);
2019
+ if (!isNaN(fuel)) {
2020
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
2021
+ }
2022
+ if (data.length > 7) {
2023
+ ResultFormatter.unknownArr(decodeResult, data.slice(7));
2024
+ }
2025
+ } else {
2026
+ if (options.debug) {
2027
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
1894
2028
  }
2029
+ ResultFormatter.unknown(decodeResult, message.text);
2030
+ decodeResult.decoded = false;
2031
+ decodeResult.decoder.decodeLevel = "none";
2032
+ return decodeResult;
1895
2033
  }
1896
2034
  decodeResult.decoded = true;
1897
2035
  decodeResult.decoder.decodeLevel = "full";
@@ -2306,12 +2444,17 @@ function addCompanyRoute(decodeResult, value) {
2306
2444
  }
2307
2445
 
2308
2446
  // lib/utils/h1_helper.ts
2309
- var H1Helper = class {
2447
+ var H1Helper = class _H1Helper {
2310
2448
  static decodeH1Message(decodeResult, message) {
2311
2449
  const checksum = message.slice(-4);
2312
2450
  const data = message.slice(0, message.length - 4);
2313
2451
  const fields = data.split("/");
2314
- parseMessageType(decodeResult, fields[0]);
2452
+ const canDecode = parseMessageType(decodeResult, fields[0]);
2453
+ if (!canDecode) {
2454
+ decodeResult.decoded = false;
2455
+ decodeResult.decoder.decodeLevel = "none";
2456
+ return;
2457
+ }
2315
2458
  for (let i = 1; i < fields.length; ++i) {
2316
2459
  if (fields[i].startsWith("FN")) {
2317
2460
  decodeResult.raw.flight_number = fields[i].substring(2);
@@ -2320,16 +2463,9 @@ var H1Helper = class {
2320
2463
  } else if (fields[i].startsWith("DC")) {
2321
2464
  processDC(decodeResult, fields[i].substring(2).split(","));
2322
2465
  } else if (fields[i].startsWith("TS")) {
2323
- const ts = fields[i].substring(2).split(",");
2324
- let time = DateTimeUtils.convertDateTimeToEpoch(ts[0], ts[1]);
2325
- if (Number.isNaN(time)) {
2326
- const date = ts[1].substring(2, 4) + ts[1].substring(0, 2) + ts[1].substring(4, 6);
2327
- time = DateTimeUtils.convertDateTimeToEpoch(ts[0], date);
2328
- }
2329
- decodeResult.raw.message_date = ts[1];
2330
- decodeResult.raw.message_timestamp = time;
2466
+ _H1Helper.processTS(decodeResult, fields[i].substring(2).split(","));
2331
2467
  } else if (fields[i].startsWith("PS")) {
2332
- const pos = processPS(decodeResult, fields[i].substring(2).split(","));
2468
+ _H1Helper.processPS(decodeResult, fields[i].substring(2).split(","));
2333
2469
  } else if (fields[i].startsWith("DT")) {
2334
2470
  const data2 = fields[i].substring(2).split(",");
2335
2471
  processDT(decodeResult, data2);
@@ -2350,9 +2486,11 @@ var H1Helper = class {
2350
2486
  ResultFormatter.freetext(decodeResult, fields[i].substring(2));
2351
2487
  } else if (fields[i].startsWith("ET")) {
2352
2488
  if (fields[i].length === 7) {
2353
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(3) + "00"));
2489
+ ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 3)));
2490
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(3)));
2354
2491
  } else if (fields[i].length === 8) {
2355
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(4) + "00"));
2492
+ ResultFormatter.day(decodeResult, Number(fields[i].substring(2, 4)));
2493
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[i].substring(4)));
2356
2494
  } else {
2357
2495
  ResultFormatter.unknown(decodeResult, fields[i], "/");
2358
2496
  }
@@ -2365,6 +2503,56 @@ var H1Helper = class {
2365
2503
  }
2366
2504
  return true;
2367
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
+ }
2368
2556
  };
2369
2557
  function processAirField(decodeResult, data) {
2370
2558
  if (data.length === 2) {
@@ -2442,7 +2630,7 @@ function parseMessageType(decodeResult, messageType) {
2442
2630
  if (parts.length == 1) {
2443
2631
  const type = parts[0].substring(0, 3);
2444
2632
  if (type === "POS" && parts[0].length !== 3) {
2445
- processPosition2(decodeResult, parts[0].substring(3).split(","));
2633
+ H1Helper.processPosition(decodeResult, parts[0].substring(3).split(","));
2446
2634
  }
2447
2635
  return processMessageType(decodeResult, type);
2448
2636
  } else if (parts.length == 2) {
@@ -2453,11 +2641,12 @@ function parseMessageType(decodeResult, messageType) {
2453
2641
  }
2454
2642
  const type = parts[1].length == 5 ? parts[1].substring(2, 5) : parts[1].substring(3, 6);
2455
2643
  if (parts[1].substring(3, 6) === "POS" && parts[1].length > 6) {
2456
- processPosition2(decodeResult, parts[1].substring(6).split(","));
2644
+ H1Helper.processPosition(decodeResult, parts[1].substring(6).split(","));
2457
2645
  }
2458
- processMessageType(decodeResult, type);
2646
+ return processMessageType(decodeResult, type);
2459
2647
  } else {
2460
2648
  ResultFormatter.unknown(decodeResult, messageType);
2649
+ return false;
2461
2650
  }
2462
2651
  }
2463
2652
  function processMessageType(decodeResult, type) {
@@ -2473,7 +2662,9 @@ function processMessageType(decodeResult, type) {
2473
2662
  decodeResult.formatted.description = "Progress Report";
2474
2663
  } else {
2475
2664
  decodeResult.formatted.description = "Unknown H1 Message";
2665
+ return false;
2476
2666
  }
2667
+ return true;
2477
2668
  }
2478
2669
  function processDC(decodeResult, data) {
2479
2670
  decodeResult.raw.message_date = data[0];
@@ -2484,60 +2675,6 @@ function processDC(decodeResult, data) {
2484
2675
  decodeResult.raw.message_timestamp = time;
2485
2676
  }
2486
2677
  }
2487
- function processPS(decodeResult, data) {
2488
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2489
- if (position) {
2490
- decodeResult.raw.position = position;
2491
- decodeResult.formatted.items.push({
2492
- type: "aircraft_position",
2493
- code: "POS",
2494
- label: "Aircraft Position",
2495
- value: CoordinateUtils.coordinateString(position)
2496
- });
2497
- }
2498
- if (data.length === 9) {
2499
- processRoute(decodeResult, data[3], data[1], data[5], data[4], void 0);
2500
- ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);
2501
- ResultFormatter.temperature(decodeResult, data[6]);
2502
- ResultFormatter.unknown(decodeResult, data[7]);
2503
- ResultFormatter.unknown(decodeResult, data[8]);
2504
- }
2505
- if (data.length === 14) {
2506
- ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2507
- processRoute(decodeResult, data[4], data[2], data[6], data[5], void 0);
2508
- ResultFormatter.temperature(decodeResult, data[7]);
2509
- ResultFormatter.groundspeed(decodeResult, Number(data[10]));
2510
- ResultFormatter.unknown(decodeResult, data[1]);
2511
- ResultFormatter.unknown(decodeResult, data[8]);
2512
- ResultFormatter.unknown(decodeResult, data[9]);
2513
- ResultFormatter.unknown(decodeResult, data.slice(11).join(","));
2514
- }
2515
- }
2516
- function processPosition2(decodeResult, data) {
2517
- const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);
2518
- if (position) {
2519
- decodeResult.raw.position = position;
2520
- decodeResult.formatted.items.push({
2521
- type: "aircraft_position",
2522
- code: "POS",
2523
- label: "Aircraft Position",
2524
- value: CoordinateUtils.coordinateString(position)
2525
- });
2526
- }
2527
- if (data.length >= 10) {
2528
- ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);
2529
- processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);
2530
- ResultFormatter.temperature(decodeResult, data[7]);
2531
- ResultFormatter.unknown(decodeResult, data[8]);
2532
- ResultFormatter.unknown(decodeResult, data[9]);
2533
- }
2534
- if (data.length >= 14) {
2535
- ResultFormatter.groundspeed(decodeResult, Number(data[10]));
2536
- ResultFormatter.unknown(decodeResult, data[11]);
2537
- ResultFormatter.unknown(decodeResult, data[12]);
2538
- ResultFormatter.unknown(decodeResult, data[13]);
2539
- }
2540
- }
2541
2678
  function processRoute(decodeResult, last, time, next, eta, then, date) {
2542
2679
  const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);
2543
2680
  const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : DateTimeUtils.convertHHMMSSToTod(eta);
@@ -2612,7 +2749,7 @@ var Label_4N = class extends DecoderPlugin {
2612
2749
  decodeResult.decoded = true;
2613
2750
  const fields = text.split(",");
2614
2751
  if (text.length === 51) {
2615
- decodeResult.raw.day_of_month = text.substring(0, 2);
2752
+ decodeResult.raw.day = text.substring(0, 2);
2616
2753
  ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));
2617
2754
  ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));
2618
2755
  ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(30, 45).replace(/^(.)0/, "$1")));
@@ -2649,6 +2786,129 @@ var Label_4N = class extends DecoderPlugin {
2649
2786
  }
2650
2787
  };
2651
2788
 
2789
+ // lib/plugins/Label_4T_AGFSR.ts
2790
+ var Label_4T_AGFSR = class extends DecoderPlugin {
2791
+ name = "label-4t-agfsr";
2792
+ qualifiers() {
2793
+ return {
2794
+ labels: ["4T"],
2795
+ preambles: ["AGFSR"]
2796
+ };
2797
+ }
2798
+ decode(message, options = {}) {
2799
+ const decodeResult = this.defaultResult();
2800
+ decodeResult.decoder.name = this.name;
2801
+ decodeResult.formatted.description = "Position Report";
2802
+ decodeResult.message = message;
2803
+ const data = message.text.substring(5).split("/");
2804
+ if (!message.text.startsWith("AGFSR") || data.length !== 20) {
2805
+ if (options.debug) {
2806
+ console.log(`Decoder: Unknown 4T message: ${message.text}`);
2807
+ }
2808
+ ResultFormatter.unknown(decodeResult, message.text);
2809
+ decodeResult.decoded = false;
2810
+ decodeResult.decoder.decodeLevel = "none";
2811
+ return decodeResult;
2812
+ }
2813
+ ResultFormatter.flightNumber(decodeResult, data[0].trim());
2814
+ ResultFormatter.departureDay(decodeResult, Number(data[1]));
2815
+ ResultFormatter.arrivalDay(decodeResult, Number(data[2]));
2816
+ ResultFormatter.departureAirport(decodeResult, data[3].substring(0, 3), "IATA");
2817
+ ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), "IATA");
2818
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)));
2819
+ ResultFormatter.unknown(decodeResult, data[5], "/");
2820
+ const lat = data[6].substring(0, 7);
2821
+ const lon = data[6].substring(7, 15);
2822
+ ResultFormatter.position(decodeResult, {
2823
+ latitude: CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) + Number(lat.substring(2, 6)) / 60,
2824
+ longitude: CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) + Number(lon.substring(3, 7)) / 60
2825
+ });
2826
+ ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));
2827
+ ResultFormatter.unknownArr(decodeResult, data.slice(8), "/");
2828
+ decodeResult.decoded = true;
2829
+ decodeResult.decoder.decodeLevel = "partial";
2830
+ return decodeResult;
2831
+ }
2832
+ };
2833
+
2834
+ // lib/plugins/Label_58.ts
2835
+ var Label_58 = class extends DecoderPlugin {
2836
+ name = "label-58";
2837
+ qualifiers() {
2838
+ return {
2839
+ labels: ["58"]
2840
+ };
2841
+ }
2842
+ decode(message, options = {}) {
2843
+ const decodeResult = this.defaultResult();
2844
+ decodeResult.decoder.name = this.name;
2845
+ decodeResult.formatted.description = "Position Report";
2846
+ decodeResult.message = message;
2847
+ const data = message.text.split("/");
2848
+ if (data.length === 8) {
2849
+ ResultFormatter.flightNumber(decodeResult, data[0]);
2850
+ ResultFormatter.day(decodeResult, Number(data[1]));
2851
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
2852
+ const lat = data[3];
2853
+ const lon = data[4];
2854
+ ResultFormatter.position(decodeResult, {
2855
+ latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
2856
+ longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
2857
+ });
2858
+ ResultFormatter.altitude(decodeResult, Number(data[5]));
2859
+ ResultFormatter.unknown(decodeResult, data[6], "/");
2860
+ ResultFormatter.unknown(decodeResult, data[7], "/");
2861
+ } else {
2862
+ if (options.debug) {
2863
+ console.log(`Decoder: Unknown 58 message: ${message.text}`);
2864
+ }
2865
+ ResultFormatter.unknown(decodeResult, message.text);
2866
+ decodeResult.decoded = false;
2867
+ decodeResult.decoder.decodeLevel = "none";
2868
+ return decodeResult;
2869
+ }
2870
+ decodeResult.decoded = true;
2871
+ decodeResult.decoder.decodeLevel = "partial";
2872
+ return decodeResult;
2873
+ }
2874
+ };
2875
+
2876
+ // lib/plugins/Label_4T_ETA.ts
2877
+ var Label_4T_ETA = class extends DecoderPlugin {
2878
+ name = "label-4t-eta";
2879
+ qualifiers() {
2880
+ return {
2881
+ labels: ["4T"],
2882
+ preambles: ["ETA"]
2883
+ };
2884
+ }
2885
+ decode(message, options = {}) {
2886
+ const decodeResult = this.defaultResult();
2887
+ decodeResult.decoder.name = this.name;
2888
+ decodeResult.formatted.description = "ETA Report";
2889
+ decodeResult.message = message;
2890
+ const data = message.text.substring(3).split("/");
2891
+ if (!message.text.startsWith("ETA") || data.length !== 3) {
2892
+ if (options.debug) {
2893
+ console.log(`Decoder: Unknown 4T message: ${message.text}`);
2894
+ }
2895
+ ResultFormatter.unknown(decodeResult, message.text);
2896
+ decodeResult.decoded = false;
2897
+ decodeResult.decoder.decodeLevel = "none";
2898
+ return decodeResult;
2899
+ }
2900
+ ResultFormatter.flightNumber(decodeResult, data[0].trim());
2901
+ ResultFormatter.departureDay(decodeResult, Number(data[1]));
2902
+ const etaData = data[2].split(" ");
2903
+ ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));
2904
+ ResultFormatter.arrivalAirport(decodeResult, etaData[1], "IATA");
2905
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)));
2906
+ decodeResult.decoded = true;
2907
+ decodeResult.decoder.decodeLevel = "full";
2908
+ return decodeResult;
2909
+ }
2910
+ };
2911
+
2652
2912
  // lib/plugins/Label_80.ts
2653
2913
  var Label_80 = class extends DecoderPlugin {
2654
2914
  name = "label-80";
@@ -2826,7 +3086,7 @@ var Label_83 = class extends DecoderPlugin {
2826
3086
  if (text.substring(0, 10) === "4DH3 ETAT2") {
2827
3087
  const fields = text.split(/\s+/);
2828
3088
  if (fields[2].length > 5) {
2829
- decodeResult.raw.day_of_month = fields[2].substring(5);
3089
+ decodeResult.raw.day = fields[2].substring(5);
2830
3090
  }
2831
3091
  ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));
2832
3092
  const subfields = fields[3].split("/");
@@ -2835,7 +3095,7 @@ var Label_83 = class extends DecoderPlugin {
2835
3095
  ResultFormatter.tail(decodeResult, fields[4].replace(/\./g, ""));
2836
3096
  ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[6] + "00"));
2837
3097
  } else if (text.substring(0, 5) === "001PR") {
2838
- decodeResult.raw.day_of_month = text.substring(5, 7);
3098
+ decodeResult.raw.day = text.substring(5, 7);
2839
3099
  const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(13, 28).replace(/\./g, ""));
2840
3100
  if (position) {
2841
3101
  ResultFormatter.position(decodeResult, position);
@@ -2847,7 +3107,7 @@ var Label_83 = class extends DecoderPlugin {
2847
3107
  if (fields.length === 9) {
2848
3108
  ResultFormatter.departureAirport(decodeResult, fields[0]);
2849
3109
  ResultFormatter.arrivalAirport(decodeResult, fields[1]);
2850
- decodeResult.raw.day_of_month = fields[2].substring(0, 2);
3110
+ decodeResult.raw.day = fields[2].substring(0, 2);
2851
3111
  decodeResult.raw.time = fields[2].substring(2);
2852
3112
  ResultFormatter.position(
2853
3113
  decodeResult,
@@ -2897,7 +3157,7 @@ var Label_8E = class extends DecoderPlugin {
2897
3157
  console.log(`Label 8E ETA: groups`);
2898
3158
  console.log(results.groups);
2899
3159
  }
2900
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta + "00"));
3160
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta));
2901
3161
  ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
2902
3162
  }
2903
3163
  decodeResult.decoded = true;
@@ -3085,6 +3345,65 @@ var Label_H1_OHMA = class extends DecoderPlugin {
3085
3345
  }
3086
3346
  };
3087
3347
 
3348
+ // lib/plugins/Label_H1_Slash.ts
3349
+ var Label_H1_Slash = class extends DecoderPlugin {
3350
+ name = "label-h1-slash";
3351
+ qualifiers() {
3352
+ return {
3353
+ labels: ["H1"],
3354
+ preambles: ["/"]
3355
+ };
3356
+ }
3357
+ decode(message, options = {}) {
3358
+ let decodeResult = this.defaultResult();
3359
+ decodeResult.decoder.name = this.name;
3360
+ decodeResult.formatted.description = "Position Report";
3361
+ decodeResult.message = message;
3362
+ const checksum = message.text.slice(-4);
3363
+ const data = message.text.slice(0, message.text.length - 4);
3364
+ const fields = data.split("/");
3365
+ if (fields[0] !== "") {
3366
+ ResultFormatter.unknown(decodeResult, message.text);
3367
+ decodeResult.decoded = false;
3368
+ decodeResult.decoder.decodeLevel = "none";
3369
+ return decodeResult;
3370
+ }
3371
+ const headerData = fields[1].split(".");
3372
+ ResultFormatter.unknown(decodeResult, headerData[0]);
3373
+ if (headerData[1] === "POS" && fields[2].startsWith("TS") && fields[2].length > 15) {
3374
+ H1Helper.processPosition(decodeResult, fields[2].substring(15).split(","));
3375
+ } else if (headerData[1] === "POS") {
3376
+ } else if (headerData[1].startsWith("POS")) {
3377
+ H1Helper.processPosition(decodeResult, headerData[1].substring(3).split(","));
3378
+ } else {
3379
+ ResultFormatter.unknown(decodeResult, headerData[1], ".");
3380
+ }
3381
+ for (let i = 2; i < fields.length; i++) {
3382
+ const field = fields[i];
3383
+ if (field.startsWith("TS")) {
3384
+ H1Helper.processTS(decodeResult, field.substring(2, 15).split(","));
3385
+ } else if (field.startsWith("PS")) {
3386
+ H1Helper.processPS(decodeResult, field.substring(2).split(","));
3387
+ } else {
3388
+ ResultFormatter.unknown(decodeResult, field, "/");
3389
+ }
3390
+ }
3391
+ if (decodeResult.formatted.items.length === 0) {
3392
+ if (options.debug) {
3393
+ console.log(`Decoder: Unknown H1 message: ${message.text}`);
3394
+ }
3395
+ ResultFormatter.unknown(decodeResult, message.text);
3396
+ decodeResult.decoded = false;
3397
+ decodeResult.decoder.decodeLevel = "none";
3398
+ return decodeResult;
3399
+ }
3400
+ ResultFormatter.checksum(decodeResult, checksum);
3401
+ decodeResult.decoded = true;
3402
+ decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
3403
+ return decodeResult;
3404
+ }
3405
+ };
3406
+
3088
3407
  // lib/plugins/Label_H1_StarPOS.ts
3089
3408
  var Label_H1_StarPOS = class extends DecoderPlugin {
3090
3409
  name = "label-h1-star-pos";
@@ -3109,9 +3428,9 @@ var Label_H1_StarPOS = class extends DecoderPlugin {
3109
3428
  decodeResult.decoder.decodeLevel = "none";
3110
3429
  return decodeResult;
3111
3430
  }
3112
- decodeResult.raw.month = Number(msg.substring(4, 6));
3113
- decodeResult.raw.day_of_month = Number(msg.substring(6, 8));
3114
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12) + "00"));
3431
+ ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));
3432
+ ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));
3433
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)));
3115
3434
  ResultFormatter.position(decodeResult, {
3116
3435
  // Deg Min, no sec
3117
3436
  latitude: CoordinateUtils.getDirection(msg.substring(12, 13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),
@@ -3338,7 +3657,7 @@ var Label_QR = class extends DecoderPlugin {
3338
3657
  decodeResult.formatted.description = "ON Report";
3339
3658
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3340
3659
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3341
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
3660
+ ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
3342
3661
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
3343
3662
  decodeResult.decoded = true;
3344
3663
  if (!decodeResult.remaining.text)
@@ -3363,7 +3682,7 @@ var Label_QP = class extends DecoderPlugin {
3363
3682
  decodeResult.formatted.description = "OUT Report";
3364
3683
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3365
3684
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3366
- ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
3685
+ ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
3367
3686
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
3368
3687
  decodeResult.decoded = true;
3369
3688
  if (!decodeResult.remaining.text)
@@ -3388,7 +3707,7 @@ var Label_QS = class extends DecoderPlugin {
3388
3707
  decodeResult.formatted.description = "IN Report";
3389
3708
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3390
3709
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3391
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
3710
+ ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
3392
3711
  ResultFormatter.unknown(decodeResult, message.text.substring(12));
3393
3712
  decodeResult.decoded = true;
3394
3713
  if (!decodeResult.remaining.text)
@@ -3415,7 +3734,7 @@ var Label_QQ = class extends DecoderPlugin {
3415
3734
  ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
3416
3735
  ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
3417
3736
  if (message.text.substring(12, 19) === "\r\n001FE") {
3418
- decodeResult.raw.day_of_month = message.text.substring(19, 21);
3737
+ decodeResult.raw.day = message.text.substring(19, 21);
3419
3738
  ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
3420
3739
  let latdir = message.text.substring(27, 28);
3421
3740
  let latdeg = Number(message.text.substring(28, 30));
@@ -4265,6 +4584,7 @@ var MessageDecoder = class {
4265
4584
  this.registerPlugin(new Label_10_POS(this));
4266
4585
  this.registerPlugin(new Label_10_Slash(this));
4267
4586
  this.registerPlugin(new Label_12_N_Space(this));
4587
+ this.registerPlugin(new Label_12_POS(this));
4268
4588
  this.registerPlugin(new Label_13Through18_Slash(this));
4269
4589
  this.registerPlugin(new Label_15(this));
4270
4590
  this.registerPlugin(new Label_15_FST(this));
@@ -4291,13 +4611,17 @@ var MessageDecoder = class {
4291
4611
  this.registerPlugin(new Label_4A_Slash_01(this));
4292
4612
  this.registerPlugin(new Label_4J_POS(this));
4293
4613
  this.registerPlugin(new Label_4N(this));
4614
+ this.registerPlugin(new Label_4T_AGFSR(this));
4615
+ this.registerPlugin(new Label_4T_ETA(this));
4294
4616
  this.registerPlugin(new Label_B6_Forwardslash(this));
4295
4617
  this.registerPlugin(new Label_H1_FLR(this));
4296
4618
  this.registerPlugin(new Label_H1_OHMA(this));
4297
4619
  this.registerPlugin(new Label_H1_WRN(this));
4298
4620
  this.registerPlugin(new Label_H1(this));
4621
+ this.registerPlugin(new Label_H1_Slash(this));
4299
4622
  this.registerPlugin(new Label_H1_StarPOS(this));
4300
4623
  this.registerPlugin(new Label_HX(this));
4624
+ this.registerPlugin(new Label_58(this));
4301
4625
  this.registerPlugin(new Label_80(this));
4302
4626
  this.registerPlugin(new Label_83(this));
4303
4627
  this.registerPlugin(new Label_8E(this));