@airframes/acars-decoder 1.6.16 → 1.6.18

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
@@ -350,6 +350,9 @@ var ResultFormatter = class {
350
350
  });
351
351
  }
352
352
  static flightNumber(decodeResult, value) {
353
+ if (value.length === 0) {
354
+ return;
355
+ }
353
356
  decodeResult.raw.flight_number = value;
354
357
  decodeResult.formatted.items.push({
355
358
  type: "flight_number",
@@ -497,6 +500,9 @@ var ResultFormatter = class {
497
500
  });
498
501
  }
499
502
  static temperature(decodeResult, value) {
503
+ if (value.length === 0) {
504
+ return;
505
+ }
500
506
  decodeResult.raw.outside_air_temperature = Number(value.replace("M", "-").replace("P", "+"));
501
507
  decodeResult.formatted.items.push({
502
508
  type: "outside_air_temperature",
@@ -1728,524 +1734,158 @@ var Label_22_POS = class extends DecoderPlugin {
1728
1734
  }
1729
1735
  };
1730
1736
 
1731
- // lib/plugins/Label_24_Slash.ts
1732
- var Label_24_Slash = class extends DecoderPlugin {
1733
- name = "label-24-slash";
1734
- qualifiers() {
1735
- return {
1736
- labels: ["24"],
1737
- preambles: ["/"]
1738
- };
1739
- }
1740
- decode(message, options = {}) {
1741
- const decodeResult = this.defaultResult();
1742
- decodeResult.decoder.name = this.name;
1743
- decodeResult.formatted.description = "Position Report";
1744
- decodeResult.message = message;
1745
- const fields = message.text.split("/");
1746
- if (fields.length == 10 && fields[0] == "" && fields[9] == "") {
1747
- const mmddyy = fields[1].substring(4, 6) + fields[1].substring(2, 4) + fields[1].substring(0, 2);
1748
- const hhmmss = fields[2] + "00";
1749
- decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(hhmmss, mmddyy);
1750
- ResultFormatter.flightNumber(decodeResult, fields[3]);
1751
- ResultFormatter.altitude(decodeResult, Number(fields[4]));
1752
- const lat = fields[5];
1753
- const lon = fields[6];
1754
- const position = {
1755
- latitude: (lat[0] === "N" ? 1 : -1) * Number(lat.substring(1)),
1756
- longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
1757
- };
1758
- ResultFormatter.position(decodeResult, position);
1759
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));
1760
- ResultFormatter.unknown(decodeResult, fields[7]);
1761
- decodeResult.decoded = true;
1762
- decodeResult.decoder.decodeLevel = "partial";
1763
- } else {
1764
- if (options.debug) {
1765
- console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`);
1766
- }
1767
- decodeResult.decoded = false;
1768
- decodeResult.decoder.decodeLevel = "none";
1769
- }
1770
- return decodeResult;
1771
- }
1772
- };
1773
-
1774
- // lib/plugins/Label_30_Slash_EA.ts
1775
- var Label_30_Slash_EA = class extends DecoderPlugin {
1776
- name = "label-30-slash-ea";
1777
- qualifiers() {
1778
- return {
1779
- labels: ["30"],
1780
- preambles: ["/EA"]
1781
- };
1782
- }
1783
- decode(message, options = {}) {
1784
- const decodeResult = this.defaultResult();
1785
- decodeResult.decoder.name = this.name;
1786
- decodeResult.formatted.description = "ETA Report";
1787
- decodeResult.message = message;
1788
- const results = message.text.split(/\n|\//).slice(1);
1789
- if (results) {
1790
- if (options.debug) {
1791
- console.log(`Label 30 EA: results`);
1792
- console.log(results);
1793
- }
1794
- }
1795
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));
1796
- if (results[1].substring(0, 2) === "DS") {
1797
- ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
1798
- ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
1799
- } else {
1800
- ResultFormatter.unknown(decodeResult, "/".concat(results[1], "/", results[2]));
1801
- }
1802
- decodeResult.decoded = true;
1803
- decodeResult.decoder.decodeLevel = "partial";
1804
- return decodeResult;
1805
- }
1806
- };
1807
-
1808
- // lib/plugins/Label_44_ETA.ts
1809
- var Label_44_ETA = class extends DecoderPlugin {
1810
- name = "label-44-eta";
1737
+ // lib/plugins/Label_2P_FM3.ts
1738
+ var Label_2P_FM3 = class extends DecoderPlugin {
1739
+ name = "label-2p-fm3";
1811
1740
  qualifiers() {
1812
1741
  return {
1813
- labels: ["44"],
1814
- preambles: ["00ETA01", "00ETA02", "00ETA03", "ETA01", "ETA02", "ETA03"]
1742
+ labels: ["2P"]
1815
1743
  };
1816
1744
  }
1817
1745
  decode(message, options = {}) {
1818
- const decodeResult = this.defaultResult();
1746
+ let decodeResult = this.defaultResult();
1819
1747
  decodeResult.decoder.name = this.name;
1820
- decodeResult.formatted.description = "ETA Report";
1748
+ decodeResult.formatted.description = "Flight Report";
1821
1749
  decodeResult.message = message;
1822
- const data = message.text.split(",");
1823
- if (data.length >= 9) {
1824
- if (options.debug) {
1825
- console.log(`Label 44 ETA Report: groups`);
1826
- console.log(data);
1827
- }
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));
1842
- }
1843
- } else {
1844
- if (options.debug) {
1845
- console.log(`Decoder: Unknown 44 message: ${message.text}`);
1750
+ const parts = message.text.split(",");
1751
+ if (parts.length === 7) {
1752
+ const header = parts[0].split("FM3 ");
1753
+ if (header.length == 0) {
1754
+ ResultFormatter.unknown(decodeResult, message.text);
1755
+ decodeResult.decoded = false;
1756
+ decodeResult.decoder.decodeLevel = "none";
1757
+ return decodeResult;
1846
1758
  }
1847
- ResultFormatter.unknown(decodeResult, message.text);
1848
- decodeResult.decoded = false;
1849
- decodeResult.decoder.decodeLevel = "none";
1850
- return decodeResult;
1851
- }
1852
- decodeResult.decoded = true;
1853
- decodeResult.decoder.decodeLevel = "full";
1854
- return decodeResult;
1855
- }
1856
- };
1857
-
1858
- // lib/plugins/Label_44_IN.ts
1859
- var Label_44_IN = class extends DecoderPlugin {
1860
- name = "label-44-in";
1861
- qualifiers() {
1862
- return {
1863
- labels: ["44"],
1864
- preambles: ["00IN01", "00IN02", "00IN03", "IN01", "IN02", "IN03"]
1865
- };
1866
- }
1867
- decode(message, options = {}) {
1868
- const decodeResult = this.defaultResult();
1869
- decodeResult.decoder.name = this.name;
1870
- decodeResult.formatted.description = "In Air Report";
1871
- decodeResult.message = message;
1872
- const data = message.text.split(",");
1873
- if (data.length >= 7) {
1874
- if (options.debug) {
1875
- console.log(`Label 44 In Air Report: groups`);
1876
- console.log(data);
1759
+ if (header[0].length > 0) {
1760
+ ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));
1761
+ ResultFormatter.flightNumber(decodeResult, header[0].substring(4));
1877
1762
  }
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));
1763
+ console.log(header[1]);
1764
+ if (header[1].length === 4) {
1765
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));
1766
+ } else {
1767
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(header[1]));
1887
1768
  }
1888
- if (data.length > 7) {
1889
- ResultFormatter.unknownArr(decodeResult, data.slice(7));
1769
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[1]));
1770
+ const lat = parts[2].replaceAll(" ", "");
1771
+ const lon = parts[3].replaceAll(" ", "");
1772
+ if (lat[0] === "N" || lat[0] === "S") {
1773
+ ResultFormatter.position(decodeResult, {
1774
+ latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
1775
+ longitude: CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
1776
+ });
1777
+ } else {
1778
+ ResultFormatter.position(decodeResult, { latitude: Number(lat), longitude: Number(lon) });
1890
1779
  }
1780
+ ResultFormatter.altitude(decodeResult, Number(parts[4]));
1781
+ ResultFormatter.unknown(decodeResult, parts[5]);
1782
+ ResultFormatter.unknown(decodeResult, parts[6]);
1783
+ decodeResult.decoded = true;
1784
+ decodeResult.decoder.decodeLevel = "partial";
1891
1785
  } else {
1892
1786
  if (options.debug) {
1893
- console.log(`Decoder: Unknown 44 message: ${message.text}`);
1787
+ console.log(`Decoder: Unknown H1 message: ${message.text}`);
1894
1788
  }
1895
1789
  ResultFormatter.unknown(decodeResult, message.text);
1896
1790
  decodeResult.decoded = false;
1897
1791
  decodeResult.decoder.decodeLevel = "none";
1898
- return decodeResult;
1899
1792
  }
1900
- decodeResult.decoded = true;
1901
- decodeResult.decoder.decodeLevel = "full";
1902
1793
  return decodeResult;
1903
1794
  }
1904
1795
  };
1905
1796
 
1906
- // lib/plugins/Label_44_OFF.ts
1907
- var Label_44_OFF = class extends DecoderPlugin {
1908
- name = "label-44-off";
1797
+ // lib/plugins/Label_2P_FM4.ts
1798
+ var Label_2P_FM4 = class extends DecoderPlugin {
1799
+ name = "label-2p-fm4";
1909
1800
  qualifiers() {
1910
1801
  return {
1911
- labels: ["44"],
1912
- preambles: ["00OFF01", "00OFF02", "00OFF03", "OFF01", "OFF02", "OFF03"]
1802
+ labels: ["2P"]
1913
1803
  };
1914
1804
  }
1915
1805
  decode(message, options = {}) {
1916
- const decodeResult = this.defaultResult();
1806
+ let decodeResult = this.defaultResult();
1917
1807
  decodeResult.decoder.name = this.name;
1918
- decodeResult.formatted.description = "Off Runway Report";
1808
+ decodeResult.formatted.description = "Flight Report";
1919
1809
  decodeResult.message = message;
1920
- const data = message.text.split(",");
1921
- if (data.length >= 8) {
1922
- if (options.debug) {
1923
- console.log(`Label 44 Off Runway Report: groups`);
1924
- console.log(data);
1925
- }
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));
1810
+ const parts = message.text.split(",");
1811
+ if (parts.length === 10) {
1812
+ const header = parts[0].split("FM4");
1813
+ if (header.length == 0) {
1814
+ ResultFormatter.unknown(decodeResult, message.text);
1815
+ decodeResult.decoded = false;
1816
+ decodeResult.decoder.decodeLevel = "none";
1817
+ return decodeResult;
1936
1818
  }
1937
- if (data.length > 8) {
1938
- ResultFormatter.unknownArr(decodeResult, data.slice(8));
1819
+ if (header[0].length > 0) {
1820
+ ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));
1821
+ ResultFormatter.flightNumber(decodeResult, header[0].substring(4));
1939
1822
  }
1823
+ ResultFormatter.departureAirport(decodeResult, header[1]);
1824
+ ResultFormatter.arrivalAirport(decodeResult, parts[1]);
1825
+ ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));
1826
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)));
1827
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
1828
+ ResultFormatter.position(decodeResult, { latitude: Number(parts[4].replaceAll(" ", "")), longitude: Number(parts[5].replaceAll(" ", "")) });
1829
+ ResultFormatter.altitude(decodeResult, Number(parts[6]));
1830
+ ResultFormatter.heading(decodeResult, Number(parts[7]));
1831
+ ResultFormatter.unknown(decodeResult, parts[8]);
1832
+ ResultFormatter.unknown(decodeResult, parts[9]);
1833
+ decodeResult.decoded = true;
1834
+ decodeResult.decoder.decodeLevel = "partial";
1940
1835
  } else {
1941
1836
  if (options.debug) {
1942
- console.log(`Decoder: Unknown 44 message: ${message.text}`);
1837
+ console.log(`Decoder: Unknown H1 message: ${message.text}`);
1943
1838
  }
1944
1839
  ResultFormatter.unknown(decodeResult, message.text);
1945
1840
  decodeResult.decoded = false;
1946
1841
  decodeResult.decoder.decodeLevel = "none";
1947
- return decodeResult;
1948
1842
  }
1949
- decodeResult.decoded = true;
1950
- decodeResult.decoder.decodeLevel = "full";
1951
1843
  return decodeResult;
1952
1844
  }
1953
1845
  };
1954
1846
 
1955
- // lib/plugins/Label_44_ON.ts
1956
- var Label_44_ON = class extends DecoderPlugin {
1957
- name = "label-44-on";
1847
+ // lib/plugins/Label_2P_FM5.ts
1848
+ var Label_2P_FM5 = class extends DecoderPlugin {
1849
+ name = "label-2p-fm5";
1958
1850
  qualifiers() {
1959
1851
  return {
1960
- labels: ["44"],
1961
- preambles: ["00ON01", "00ON02", "00ON03", "ON01", "ON02", "ON03"]
1852
+ labels: ["2P"]
1962
1853
  };
1963
1854
  }
1964
1855
  decode(message, options = {}) {
1965
- const decodeResult = this.defaultResult();
1856
+ let decodeResult = this.defaultResult();
1966
1857
  decodeResult.decoder.name = this.name;
1967
- decodeResult.formatted.description = "On Runway Report";
1858
+ decodeResult.formatted.description = "Flight Report";
1968
1859
  decodeResult.message = message;
1969
- const data = message.text.split(",");
1970
- if (data.length >= 7) {
1971
- if (options.debug) {
1972
- console.log(`Label 44 On Runway Report: groups`);
1973
- console.log(data);
1974
- }
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));
1860
+ const parts = message.text.split(",");
1861
+ if (parts.length === 12) {
1862
+ const header = parts[0].split("FM5 ");
1863
+ if (header.length == 0) {
1864
+ ResultFormatter.unknown(decodeResult, message.text);
1865
+ decodeResult.decoded = false;
1866
+ decodeResult.decoder.decodeLevel = "none";
1867
+ return decodeResult;
1987
1868
  }
1869
+ ResultFormatter.departureAirport(decodeResult, header[1]);
1870
+ ResultFormatter.arrivalAirport(decodeResult, parts[1]);
1871
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[2]));
1872
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(parts[3]));
1873
+ ResultFormatter.position(decodeResult, { latitude: Number(parts[4].replaceAll(" ", "")), longitude: Number(parts[5].replaceAll(" ", "")) });
1874
+ ResultFormatter.altitude(decodeResult, Number(parts[6]));
1875
+ ResultFormatter.unknown(decodeResult, parts[7]);
1876
+ ResultFormatter.unknown(decodeResult, parts[8]);
1877
+ ResultFormatter.unknown(decodeResult, parts[9]);
1878
+ ResultFormatter.flightNumber(decodeResult, parts[10].trim());
1879
+ ResultFormatter.unknown(decodeResult, parts[11]);
1880
+ decodeResult.decoded = true;
1881
+ decodeResult.decoder.decodeLevel = "partial";
1988
1882
  } else {
1989
1883
  if (options.debug) {
1990
- console.log(`Decoder: Unknown 44 message: ${message.text}`);
1884
+ console.log(`Decoder: Unknown H1 message: ${message.text}`);
1991
1885
  }
1992
1886
  ResultFormatter.unknown(decodeResult, message.text);
1993
1887
  decodeResult.decoded = false;
1994
1888
  decodeResult.decoder.decodeLevel = "none";
1995
- return decodeResult;
1996
- }
1997
- decodeResult.decoded = true;
1998
- decodeResult.decoder.decodeLevel = "full";
1999
- return decodeResult;
2000
- }
2001
- };
2002
-
2003
- // lib/plugins/Label_44_POS.ts
2004
- var Label_44_POS = class extends DecoderPlugin {
2005
- name = "label-44-pos";
2006
- qualifiers() {
2007
- return {
2008
- labels: ["44"],
2009
- preambles: ["00POS01", "00POS02", "00POS03", "POS01", "POS02", "POS03"]
2010
- };
2011
- }
2012
- decode(message, options = {}) {
2013
- const decodeResult = this.defaultResult();
2014
- decodeResult.decoder.name = this.name;
2015
- decodeResult.formatted.description = "Position Report";
2016
- decodeResult.message = message;
2017
- const regex = /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;
2018
- const results = message.text.match(regex);
2019
- if (results?.groups) {
2020
- if (options.debug) {
2021
- console.log(`Label 44 Position Report: groups`);
2022
- console.log(results.groups);
2023
- }
2024
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));
2025
- const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
2026
- decodeResult.raw.current_time = Date.parse(
2027
- (/* @__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"
2028
- );
2029
- decodeResult.raw.eta_time = Date.parse(
2030
- (/* @__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"
2031
- );
2032
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
2033
- decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
2034
- }
2035
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
2036
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
2037
- ResultFormatter.altitude(decodeResult, flight_level * 100);
2038
- }
2039
- decodeResult.decoded = true;
2040
- decodeResult.decoder.decodeLevel = "full";
2041
- return decodeResult;
2042
- }
2043
- };
2044
-
2045
- // lib/plugins/Label_4A.ts
2046
- var Label_4A = class extends DecoderPlugin {
2047
- name = "label-4a";
2048
- qualifiers() {
2049
- return {
2050
- labels: ["4A"]
2051
- };
2052
- }
2053
- decode(message, options = {}) {
2054
- const decodeResult = this.defaultResult();
2055
- decodeResult.decoder.name = this.name;
2056
- decodeResult.message = message;
2057
- decodeResult.formatted.description = "Latest New Format";
2058
- let text = message.text;
2059
- if (text.match(/^M\d{2}A\w{6}/)) {
2060
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
2061
- text = text.substring(10);
2062
- }
2063
- decodeResult.decoded = true;
2064
- const fields = text.split(",");
2065
- if (fields.length === 11) {
2066
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
2067
- ResultFormatter.tail(decodeResult, fields[2].replace(".", ""));
2068
- if (fields[3])
2069
- ResultFormatter.callsign(decodeResult, fields[3]);
2070
- ResultFormatter.departureAirport(decodeResult, fields[4]);
2071
- ResultFormatter.arrivalAirport(decodeResult, fields[5]);
2072
- ResultFormatter.altitude(decodeResult, Number(text.substring(48, 51)) * 100);
2073
- ResultFormatter.unknownArr(decodeResult, fields.slice(8));
2074
- } else if (fields.length === 6) {
2075
- if (fields[0].match(/^[NS]/)) {
2076
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)));
2077
- let wp1 = {
2078
- name: fields[0].substring(13).trim(),
2079
- time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),
2080
- timeFormat: "tod"
2081
- };
2082
- ResultFormatter.altitude(decodeResult, Number(fields[1].substring(6, 9)) * 100);
2083
- let wp2 = {
2084
- name: fields[1].substring(9).trim(),
2085
- time: DateTimeUtils.convertHHMMSSToTod(fields[2]),
2086
- timeFormat: "tod"
2087
- };
2088
- ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });
2089
- ResultFormatter.temperature(decodeResult, fields[3]);
2090
- ResultFormatter.unknownArr(decodeResult, fields.slice(4));
2091
- } else {
2092
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
2093
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1]));
2094
- ResultFormatter.unknown(decodeResult, fields[2]);
2095
- ResultFormatter.altitude(decodeResult, Number(fields[3]));
2096
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates((fields[4] + fields[5]).replace(/[ \.]/g, "")));
2097
- }
2098
- } else {
2099
- decodeResult.decoded = false;
2100
- ResultFormatter.unknown(decodeResult, text);
2101
- }
2102
- if (decodeResult.decoded) {
2103
- if (!decodeResult.remaining.text)
2104
- decodeResult.decoder.decodeLevel = "full";
2105
- else
2106
- decodeResult.decoder.decodeLevel = "partial";
2107
- } else {
2108
- decodeResult.decoder.decodeLevel = "none";
2109
- }
2110
- return decodeResult;
2111
- }
2112
- };
2113
-
2114
- // lib/plugins/Label_4A_01.ts
2115
- var Label_4A_01 = class extends DecoderPlugin {
2116
- name = "label-4a-01";
2117
- qualifiers() {
2118
- return {
2119
- labels: ["4A"],
2120
- preambles: ["01"]
2121
- };
2122
- }
2123
- decode(message, options = {}) {
2124
- const decodeResult = this.defaultResult();
2125
- decodeResult.decoder.name = this.name;
2126
- decodeResult.message = message;
2127
- decodeResult.formatted.description = "Latest New Format";
2128
- decodeResult.decoded = true;
2129
- let rgx = message.text.match(/^01([A-Z]{2})([A-Z]{2})\s*(\w+)\/(\d{6})([A-Z]{4})([A-Z]{4})\r\n([+-]\s*\d+)(\d{3}\.\d)([+-]\s*\d+\.\d)/);
2130
- if (rgx) {
2131
- ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);
2132
- ResultFormatter.callsign(decodeResult, rgx[3]);
2133
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00"));
2134
- ResultFormatter.departureAirport(decodeResult, rgx[5]);
2135
- ResultFormatter.arrivalAirport(decodeResult, rgx[6]);
2136
- ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, "")));
2137
- ResultFormatter.unknown(decodeResult, rgx[8]);
2138
- ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ""));
2139
- } else {
2140
- decodeResult.decoded = false;
2141
- ResultFormatter.unknown(decodeResult, message.text);
2142
- }
2143
- if (decodeResult.decoded) {
2144
- if (!decodeResult.remaining.text)
2145
- decodeResult.decoder.decodeLevel = "full";
2146
- else
2147
- decodeResult.decoder.decodeLevel = "partial";
2148
- } else {
2149
- decodeResult.decoder.decodeLevel = "none";
2150
- }
2151
- return decodeResult;
2152
- }
2153
- };
2154
-
2155
- // lib/plugins/Label_4A_DIS.ts
2156
- var Label_4A_DIS = class extends DecoderPlugin {
2157
- name = "label-4a-dis";
2158
- qualifiers() {
2159
- return {
2160
- labels: ["4A"],
2161
- preambles: ["DIS"]
2162
- };
2163
- }
2164
- decode(message, options = {}) {
2165
- const decodeResult = this.defaultResult();
2166
- decodeResult.decoder.name = this.name;
2167
- decodeResult.message = message;
2168
- decodeResult.formatted.description = "Latest New Format";
2169
- decodeResult.decoded = true;
2170
- const fields = message.text.split(",");
2171
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00"));
2172
- ResultFormatter.callsign(decodeResult, fields[2]);
2173
- ResultFormatter.freetext(decodeResult, fields.slice(3).join(""));
2174
- if (decodeResult.decoded) {
2175
- if (!decodeResult.remaining.text)
2176
- decodeResult.decoder.decodeLevel = "full";
2177
- else
2178
- decodeResult.decoder.decodeLevel = "partial";
2179
- } else {
2180
- decodeResult.decoder.decodeLevel = "none";
2181
- }
2182
- return decodeResult;
2183
- }
2184
- };
2185
-
2186
- // lib/plugins/Label_4A_DOOR.ts
2187
- var Label_4A_DOOR = class extends DecoderPlugin {
2188
- name = "label-4a-door";
2189
- qualifiers() {
2190
- return {
2191
- labels: ["4A"],
2192
- preambles: ["DOOR"]
2193
- };
2194
- }
2195
- decode(message, options = {}) {
2196
- const decodeResult = this.defaultResult();
2197
- decodeResult.decoder.name = this.name;
2198
- decodeResult.message = message;
2199
- decodeResult.formatted.description = "Latest New Format";
2200
- decodeResult.decoded = true;
2201
- const fields = message.text.split(" ");
2202
- if (fields.length === 3) {
2203
- ResultFormatter.door_event(decodeResult, fields[0].split("/")[1], fields[1]);
2204
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + "00"));
2205
- } else {
2206
- decodeResult.decoded = false;
2207
- ResultFormatter.unknown(decodeResult, message.text);
2208
- }
2209
- if (decodeResult.decoded) {
2210
- if (!decodeResult.remaining.text)
2211
- decodeResult.decoder.decodeLevel = "full";
2212
- else
2213
- decodeResult.decoder.decodeLevel = "partial";
2214
- } else {
2215
- decodeResult.decoder.decodeLevel = "none";
2216
- }
2217
- return decodeResult;
2218
- }
2219
- };
2220
-
2221
- // lib/plugins/Label_4A_Slash_01.ts
2222
- var Label_4A_Slash_01 = class extends DecoderPlugin {
2223
- name = "label-4a-slash-01";
2224
- qualifiers() {
2225
- return {
2226
- labels: ["4A"],
2227
- preambles: ["/01"]
2228
- };
2229
- }
2230
- decode(message, options = {}) {
2231
- const decodeResult = this.defaultResult();
2232
- decodeResult.decoder.name = this.name;
2233
- decodeResult.message = message;
2234
- decodeResult.formatted.description = "Latest New Format";
2235
- decodeResult.decoded = true;
2236
- if (message.text.length === 5 && message.text.substring(0, 4) === "/01-") {
2237
- ResultFormatter.unknown(decodeResult, message.text.substring(4));
2238
- } else {
2239
- decodeResult.decoded = false;
2240
- ResultFormatter.unknown(decodeResult, message.text);
2241
- }
2242
- if (decodeResult.decoded) {
2243
- if (!decodeResult.remaining.text)
2244
- decodeResult.decoder.decodeLevel = "full";
2245
- else
2246
- decodeResult.decoder.decodeLevel = "partial";
2247
- } else {
2248
- decodeResult.decoder.decodeLevel = "none";
2249
1889
  }
2250
1890
  return decodeResult;
2251
1891
  }
@@ -2416,7 +2056,7 @@ var H1Helper = class _H1Helper {
2416
2056
  if (!canDecode) {
2417
2057
  decodeResult.decoded = false;
2418
2058
  decodeResult.decoder.decodeLevel = "none";
2419
- return;
2059
+ return false;
2420
2060
  }
2421
2061
  for (let i = 1; i < fields.length; ++i) {
2422
2062
  if (fields[i].startsWith("FN")) {
@@ -2457,6 +2097,8 @@ var H1Helper = class _H1Helper {
2457
2097
  } else {
2458
2098
  ResultFormatter.unknown(decodeResult, fields[i], "/");
2459
2099
  }
2100
+ } else if (fields[i].startsWith("WD")) {
2101
+ processWindData(decodeResult, fields[i].substring(2));
2460
2102
  } else {
2461
2103
  ResultFormatter.unknown(decodeResult, fields[i], "/");
2462
2104
  }
@@ -2548,7 +2190,7 @@ function processTimeOfDeparture(decodeResult, data) {
2548
2190
  function processIdentification(decodeResult, data) {
2549
2191
  ResultFormatter.tail(decodeResult, data[0]);
2550
2192
  if (data.length > 1) {
2551
- decodeResult.raw.flight_number = data[1];
2193
+ ResultFormatter.flightNumber(decodeResult, data[1]);
2552
2194
  }
2553
2195
  if (data.length > 2) {
2554
2196
  decodeResult.raw.mission_number = data[2];
@@ -2594,12 +2236,16 @@ function parseMessageType(decodeResult, messageType) {
2594
2236
  const type = parts[0].substring(0, 3);
2595
2237
  if (type === "POS" && parts[0].length !== 3) {
2596
2238
  H1Helper.processPosition(decodeResult, parts[0].substring(3).split(","));
2239
+ } else if (parts[0].length > 3 && parts[0].slice(-3) === "POS") {
2240
+ ResultFormatter.unknown(decodeResult, parts[0].substring(0, 4));
2241
+ ResultFormatter.flightNumber(decodeResult, parts[0].slice(4, -3));
2242
+ return processMessageType(decodeResult, "POS");
2597
2243
  }
2598
2244
  return processMessageType(decodeResult, type);
2599
2245
  } else if (parts.length == 2) {
2600
2246
  if (parts[0].length > 0) {
2601
- ResultFormatter.unknown(decodeResult, parts[0].substring(0, 3));
2602
- decodeResult.raw.flight_number = parts[0].substring(3);
2247
+ ResultFormatter.unknown(decodeResult, parts[0].substring(0, 4));
2248
+ ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));
2603
2249
  ResultFormatter.unknown(decodeResult, parts[1].length == 5 ? parts[1].substring(0, 2) : parts[1].substring(0, 3), "#");
2604
2250
  }
2605
2251
  const type = parts[1].length == 5 ? parts[1].substring(2, 5) : parts[1].substring(3, 6);
@@ -2623,6 +2269,8 @@ function processMessageType(decodeResult, type) {
2623
2269
  decodeResult.formatted.description = "Position Report";
2624
2270
  } else if (type === "PRG") {
2625
2271
  decodeResult.formatted.description = "Progress Report";
2272
+ } else if (type === "PWI") {
2273
+ decodeResult.formatted.description = "Weather Report";
2626
2274
  } else {
2627
2275
  decodeResult.formatted.description = "Unknown H1 Message";
2628
2276
  return false;
@@ -2658,6 +2306,604 @@ function processRoute(decodeResult, last, time, next, eta, then, date) {
2658
2306
  value: RouteUtils.routeToString(decodeResult.raw.route)
2659
2307
  });
2660
2308
  }
2309
+ function processWindData(decodeResult, message) {
2310
+ if (decodeResult.raw.wind_data === void 0) {
2311
+ decodeResult.raw.wind_data = [];
2312
+ }
2313
+ const flightLevel = Number(message.slice(0, 3));
2314
+ const fields = message.slice(4).split(".");
2315
+ fields.forEach((field) => {
2316
+ const data = field.split(",");
2317
+ const waypoint = data[0];
2318
+ const windData = data[1];
2319
+ const windDirection = Number(windData.slice(0, 3));
2320
+ const windSpeed = Number(windData.slice(3));
2321
+ if (data.length === 3) {
2322
+ const tempData = data[2];
2323
+ const tempFlightLevel = Number(tempData.slice(0, 3));
2324
+ const tempString = tempData.slice(3);
2325
+ const tempDegrees = Number(tempString.substring(1)) * (tempString.charAt(0) === "M" ? -1 : 1);
2326
+ decodeResult.raw.wind_data.push({
2327
+ waypoint,
2328
+ flightLevel,
2329
+ windDirection,
2330
+ windSpeed,
2331
+ temperature: {
2332
+ flightLevel: tempFlightLevel,
2333
+ degreesC: tempDegrees
2334
+ }
2335
+ });
2336
+ decodeResult.formatted.items.push({
2337
+ type: "wind_data",
2338
+ code: "WIND",
2339
+ label: "Wind Data",
2340
+ value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt, ${tempDegrees}\xB0C at FL${tempFlightLevel}`
2341
+ });
2342
+ } else {
2343
+ decodeResult.raw.wind_data.push({
2344
+ waypoint,
2345
+ flightLevel,
2346
+ windDirection,
2347
+ windSpeed
2348
+ });
2349
+ decodeResult.formatted.items.push({
2350
+ type: "wind_data",
2351
+ code: "WIND",
2352
+ label: "Wind Data",
2353
+ value: `${waypoint} at FL${flightLevel}: ${windDirection}\xB0 at ${windSpeed}kt`
2354
+ });
2355
+ }
2356
+ });
2357
+ }
2358
+
2359
+ // lib/plugins/Label_2P_POS.ts
2360
+ var Label_2P_POS = class extends DecoderPlugin {
2361
+ name = "label-2p-pos";
2362
+ qualifiers() {
2363
+ return {
2364
+ labels: ["2P"]
2365
+ };
2366
+ }
2367
+ decode(message, options = {}) {
2368
+ let decodeResult = this.defaultResult();
2369
+ decodeResult.decoder.name = this.name;
2370
+ decodeResult.message = message;
2371
+ const msg = message.text.replace(/\n|\r/g, "");
2372
+ const decoded = H1Helper.decodeH1Message(decodeResult, msg);
2373
+ decodeResult.decoded = decoded;
2374
+ decodeResult.decoder.decodeLevel = !decodeResult.remaining.text ? "full" : "partial";
2375
+ if (decodeResult.formatted.items.length === 0) {
2376
+ if (options.debug) {
2377
+ console.log(`Decoder: Unknown H1 message: ${message.text}`);
2378
+ }
2379
+ ResultFormatter.unknown(decodeResult, message.text);
2380
+ decodeResult.decoded = false;
2381
+ decodeResult.decoder.decodeLevel = "none";
2382
+ }
2383
+ return decodeResult;
2384
+ }
2385
+ };
2386
+
2387
+ // lib/plugins/Label_24_Slash.ts
2388
+ var Label_24_Slash = class extends DecoderPlugin {
2389
+ name = "label-24-slash";
2390
+ qualifiers() {
2391
+ return {
2392
+ labels: ["24"],
2393
+ preambles: ["/"]
2394
+ };
2395
+ }
2396
+ decode(message, options = {}) {
2397
+ const decodeResult = this.defaultResult();
2398
+ decodeResult.decoder.name = this.name;
2399
+ decodeResult.formatted.description = "Position Report";
2400
+ decodeResult.message = message;
2401
+ const fields = message.text.split("/");
2402
+ if (fields.length == 10 && fields[0] == "" && fields[9] == "") {
2403
+ const mmddyy = fields[1].substring(4, 6) + fields[1].substring(2, 4) + fields[1].substring(0, 2);
2404
+ const hhmmss = fields[2] + "00";
2405
+ decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(hhmmss, mmddyy);
2406
+ ResultFormatter.flightNumber(decodeResult, fields[3]);
2407
+ ResultFormatter.altitude(decodeResult, Number(fields[4]));
2408
+ const lat = fields[5];
2409
+ const lon = fields[6];
2410
+ const position = {
2411
+ latitude: (lat[0] === "N" ? 1 : -1) * Number(lat.substring(1)),
2412
+ longitude: (lon[0] === "E" ? 1 : -1) * Number(lon.substring(1))
2413
+ };
2414
+ ResultFormatter.position(decodeResult, position);
2415
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[8]));
2416
+ ResultFormatter.unknown(decodeResult, fields[7]);
2417
+ decodeResult.decoded = true;
2418
+ decodeResult.decoder.decodeLevel = "partial";
2419
+ } else {
2420
+ if (options.debug) {
2421
+ console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`);
2422
+ }
2423
+ decodeResult.decoded = false;
2424
+ decodeResult.decoder.decodeLevel = "none";
2425
+ }
2426
+ return decodeResult;
2427
+ }
2428
+ };
2429
+
2430
+ // lib/plugins/Label_30_Slash_EA.ts
2431
+ var Label_30_Slash_EA = class extends DecoderPlugin {
2432
+ name = "label-30-slash-ea";
2433
+ qualifiers() {
2434
+ return {
2435
+ labels: ["30"],
2436
+ preambles: ["/EA"]
2437
+ };
2438
+ }
2439
+ decode(message, options = {}) {
2440
+ const decodeResult = this.defaultResult();
2441
+ decodeResult.decoder.name = this.name;
2442
+ decodeResult.formatted.description = "ETA Report";
2443
+ decodeResult.message = message;
2444
+ const results = message.text.split(/\n|\//).slice(1);
2445
+ if (results) {
2446
+ if (options.debug) {
2447
+ console.log(`Label 30 EA: results`);
2448
+ console.log(results);
2449
+ }
2450
+ }
2451
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)));
2452
+ if (results[1].substring(0, 2) === "DS") {
2453
+ ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));
2454
+ ResultFormatter.unknown(decodeResult, "/".concat(results[2]));
2455
+ } else {
2456
+ ResultFormatter.unknown(decodeResult, "/".concat(results[1], "/", results[2]));
2457
+ }
2458
+ decodeResult.decoded = true;
2459
+ decodeResult.decoder.decodeLevel = "partial";
2460
+ return decodeResult;
2461
+ }
2462
+ };
2463
+
2464
+ // lib/plugins/Label_44_ETA.ts
2465
+ var Label_44_ETA = class extends DecoderPlugin {
2466
+ name = "label-44-eta";
2467
+ qualifiers() {
2468
+ return {
2469
+ labels: ["44"],
2470
+ preambles: ["00ETA01", "00ETA02", "00ETA03", "ETA01", "ETA02", "ETA03"]
2471
+ };
2472
+ }
2473
+ decode(message, options = {}) {
2474
+ const decodeResult = this.defaultResult();
2475
+ decodeResult.decoder.name = this.name;
2476
+ decodeResult.formatted.description = "ETA Report";
2477
+ decodeResult.message = message;
2478
+ const data = message.text.split(",");
2479
+ if (data.length >= 9) {
2480
+ if (options.debug) {
2481
+ console.log(`Label 44 ETA Report: groups`);
2482
+ console.log(data);
2483
+ }
2484
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
2485
+ ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));
2486
+ ResultFormatter.departureAirport(decodeResult, data[3]);
2487
+ ResultFormatter.arrivalAirport(decodeResult, data[4]);
2488
+ ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));
2489
+ ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));
2490
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
2491
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[7]));
2492
+ const fuel = Number(data[8]);
2493
+ if (!isNaN(fuel)) {
2494
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
2495
+ }
2496
+ if (data.length > 9) {
2497
+ ResultFormatter.unknownArr(decodeResult, data.slice(9));
2498
+ }
2499
+ } else {
2500
+ if (options.debug) {
2501
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
2502
+ }
2503
+ ResultFormatter.unknown(decodeResult, message.text);
2504
+ decodeResult.decoded = false;
2505
+ decodeResult.decoder.decodeLevel = "none";
2506
+ return decodeResult;
2507
+ }
2508
+ decodeResult.decoded = true;
2509
+ decodeResult.decoder.decodeLevel = "full";
2510
+ return decodeResult;
2511
+ }
2512
+ };
2513
+
2514
+ // lib/plugins/Label_44_IN.ts
2515
+ var Label_44_IN = class extends DecoderPlugin {
2516
+ name = "label-44-in";
2517
+ qualifiers() {
2518
+ return {
2519
+ labels: ["44"],
2520
+ preambles: ["00IN01", "00IN02", "00IN03", "IN01", "IN02", "IN03"]
2521
+ };
2522
+ }
2523
+ decode(message, options = {}) {
2524
+ const decodeResult = this.defaultResult();
2525
+ decodeResult.decoder.name = this.name;
2526
+ decodeResult.formatted.description = "In Air Report";
2527
+ decodeResult.message = message;
2528
+ const data = message.text.split(",");
2529
+ if (data.length >= 7) {
2530
+ if (options.debug) {
2531
+ console.log(`Label 44 In Air Report: groups`);
2532
+ console.log(data);
2533
+ }
2534
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
2535
+ ResultFormatter.departureAirport(decodeResult, data[2]);
2536
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
2537
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2538
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2539
+ ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
2540
+ const fuel = Number(data[6]);
2541
+ if (!isNaN(fuel)) {
2542
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
2543
+ }
2544
+ if (data.length > 7) {
2545
+ ResultFormatter.unknownArr(decodeResult, data.slice(7));
2546
+ }
2547
+ } else {
2548
+ if (options.debug) {
2549
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
2550
+ }
2551
+ ResultFormatter.unknown(decodeResult, message.text);
2552
+ decodeResult.decoded = false;
2553
+ decodeResult.decoder.decodeLevel = "none";
2554
+ return decodeResult;
2555
+ }
2556
+ decodeResult.decoded = true;
2557
+ decodeResult.decoder.decodeLevel = "full";
2558
+ return decodeResult;
2559
+ }
2560
+ };
2561
+
2562
+ // lib/plugins/Label_44_OFF.ts
2563
+ var Label_44_OFF = class extends DecoderPlugin {
2564
+ name = "label-44-off";
2565
+ qualifiers() {
2566
+ return {
2567
+ labels: ["44"],
2568
+ preambles: ["00OFF01", "00OFF02", "00OFF03", "OFF01", "OFF02", "OFF03"]
2569
+ };
2570
+ }
2571
+ decode(message, options = {}) {
2572
+ const decodeResult = this.defaultResult();
2573
+ decodeResult.decoder.name = this.name;
2574
+ decodeResult.formatted.description = "Off Runway Report";
2575
+ decodeResult.message = message;
2576
+ const data = message.text.split(",");
2577
+ if (data.length >= 8) {
2578
+ if (options.debug) {
2579
+ console.log(`Label 44 Off Runway Report: groups`);
2580
+ console.log(data);
2581
+ }
2582
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
2583
+ ResultFormatter.departureAirport(decodeResult, data[2]);
2584
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
2585
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2586
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2587
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
2588
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[6]));
2589
+ const fuel = Number(data[7]);
2590
+ if (!isNaN(fuel)) {
2591
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
2592
+ }
2593
+ if (data.length > 8) {
2594
+ ResultFormatter.unknownArr(decodeResult, data.slice(8));
2595
+ }
2596
+ } else {
2597
+ if (options.debug) {
2598
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
2599
+ }
2600
+ ResultFormatter.unknown(decodeResult, message.text);
2601
+ decodeResult.decoded = false;
2602
+ decodeResult.decoder.decodeLevel = "none";
2603
+ return decodeResult;
2604
+ }
2605
+ decodeResult.decoded = true;
2606
+ decodeResult.decoder.decodeLevel = "full";
2607
+ return decodeResult;
2608
+ }
2609
+ };
2610
+
2611
+ // lib/plugins/Label_44_ON.ts
2612
+ var Label_44_ON = class extends DecoderPlugin {
2613
+ name = "label-44-on";
2614
+ qualifiers() {
2615
+ return {
2616
+ labels: ["44"],
2617
+ preambles: ["00ON01", "00ON02", "00ON03", "ON01", "ON02", "ON03"]
2618
+ };
2619
+ }
2620
+ decode(message, options = {}) {
2621
+ const decodeResult = this.defaultResult();
2622
+ decodeResult.decoder.name = this.name;
2623
+ decodeResult.formatted.description = "On Runway Report";
2624
+ decodeResult.message = message;
2625
+ const data = message.text.split(",");
2626
+ if (data.length >= 7) {
2627
+ if (options.debug) {
2628
+ console.log(`Label 44 On Runway Report: groups`);
2629
+ console.log(data);
2630
+ }
2631
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]));
2632
+ ResultFormatter.departureAirport(decodeResult, data[2]);
2633
+ ResultFormatter.arrivalAirport(decodeResult, data[3]);
2634
+ ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));
2635
+ ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));
2636
+ ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[5]));
2637
+ const fuel = Number(data[6]);
2638
+ if (!isNaN(fuel)) {
2639
+ ResultFormatter.remainingFuel(decodeResult, Number(fuel));
2640
+ }
2641
+ if (data.length > 7) {
2642
+ ResultFormatter.unknownArr(decodeResult, data.slice(7));
2643
+ }
2644
+ } else {
2645
+ if (options.debug) {
2646
+ console.log(`Decoder: Unknown 44 message: ${message.text}`);
2647
+ }
2648
+ ResultFormatter.unknown(decodeResult, message.text);
2649
+ decodeResult.decoded = false;
2650
+ decodeResult.decoder.decodeLevel = "none";
2651
+ return decodeResult;
2652
+ }
2653
+ decodeResult.decoded = true;
2654
+ decodeResult.decoder.decodeLevel = "full";
2655
+ return decodeResult;
2656
+ }
2657
+ };
2658
+
2659
+ // lib/plugins/Label_44_POS.ts
2660
+ var Label_44_POS = class extends DecoderPlugin {
2661
+ name = "label-44-pos";
2662
+ qualifiers() {
2663
+ return {
2664
+ labels: ["44"],
2665
+ preambles: ["00POS01", "00POS02", "00POS03", "POS01", "POS02", "POS03"]
2666
+ };
2667
+ }
2668
+ decode(message, options = {}) {
2669
+ const decodeResult = this.defaultResult();
2670
+ decodeResult.decoder.name = this.name;
2671
+ decodeResult.formatted.description = "Position Report";
2672
+ decodeResult.message = message;
2673
+ const regex = /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;
2674
+ const results = message.text.match(regex);
2675
+ if (results?.groups) {
2676
+ if (options.debug) {
2677
+ console.log(`Label 44 Position Report: groups`);
2678
+ console.log(results.groups);
2679
+ }
2680
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords));
2681
+ const flight_level = results.groups.flight_level_or_ground == "GRD" || results.groups.flight_level_or_ground == "***" ? 0 : Number(results.groups.flight_level_or_ground);
2682
+ ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));
2683
+ ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));
2684
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00"));
2685
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00"));
2686
+ if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
2687
+ decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
2688
+ }
2689
+ ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
2690
+ ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
2691
+ ResultFormatter.altitude(decodeResult, flight_level * 100);
2692
+ }
2693
+ decodeResult.decoded = true;
2694
+ decodeResult.decoder.decodeLevel = "full";
2695
+ return decodeResult;
2696
+ }
2697
+ };
2698
+
2699
+ // lib/plugins/Label_4A.ts
2700
+ var Label_4A = class extends DecoderPlugin {
2701
+ name = "label-4a";
2702
+ qualifiers() {
2703
+ return {
2704
+ labels: ["4A"]
2705
+ };
2706
+ }
2707
+ decode(message, options = {}) {
2708
+ const decodeResult = this.defaultResult();
2709
+ decodeResult.decoder.name = this.name;
2710
+ decodeResult.message = message;
2711
+ decodeResult.formatted.description = "Latest New Format";
2712
+ let text = message.text;
2713
+ if (text.match(/^M\d{2}A\w{6}/)) {
2714
+ ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
2715
+ text = text.substring(10);
2716
+ }
2717
+ decodeResult.decoded = true;
2718
+ const fields = text.split(",");
2719
+ if (fields.length === 11) {
2720
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
2721
+ ResultFormatter.tail(decodeResult, fields[2].replace(".", ""));
2722
+ if (fields[3])
2723
+ ResultFormatter.callsign(decodeResult, fields[3]);
2724
+ ResultFormatter.departureAirport(decodeResult, fields[4]);
2725
+ ResultFormatter.arrivalAirport(decodeResult, fields[5]);
2726
+ ResultFormatter.altitude(decodeResult, Number(text.substring(48, 51)) * 100);
2727
+ ResultFormatter.unknownArr(decodeResult, fields.slice(8));
2728
+ } else if (fields.length === 6) {
2729
+ if (fields[0].match(/^[NS]/)) {
2730
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)));
2731
+ let wp1 = {
2732
+ name: fields[0].substring(13).trim(),
2733
+ time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),
2734
+ timeFormat: "tod"
2735
+ };
2736
+ ResultFormatter.altitude(decodeResult, Number(fields[1].substring(6, 9)) * 100);
2737
+ let wp2 = {
2738
+ name: fields[1].substring(9).trim(),
2739
+ time: DateTimeUtils.convertHHMMSSToTod(fields[2]),
2740
+ timeFormat: "tod"
2741
+ };
2742
+ ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });
2743
+ ResultFormatter.temperature(decodeResult, fields[3]);
2744
+ ResultFormatter.unknownArr(decodeResult, fields.slice(4));
2745
+ } else {
2746
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
2747
+ ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1]));
2748
+ ResultFormatter.unknown(decodeResult, fields[2]);
2749
+ ResultFormatter.altitude(decodeResult, Number(fields[3]));
2750
+ ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates((fields[4] + fields[5]).replace(/[ \.]/g, "")));
2751
+ }
2752
+ } else {
2753
+ decodeResult.decoded = false;
2754
+ ResultFormatter.unknown(decodeResult, text);
2755
+ }
2756
+ if (decodeResult.decoded) {
2757
+ if (!decodeResult.remaining.text)
2758
+ decodeResult.decoder.decodeLevel = "full";
2759
+ else
2760
+ decodeResult.decoder.decodeLevel = "partial";
2761
+ } else {
2762
+ decodeResult.decoder.decodeLevel = "none";
2763
+ }
2764
+ return decodeResult;
2765
+ }
2766
+ };
2767
+
2768
+ // lib/plugins/Label_4A_01.ts
2769
+ var Label_4A_01 = class extends DecoderPlugin {
2770
+ name = "label-4a-01";
2771
+ qualifiers() {
2772
+ return {
2773
+ labels: ["4A"],
2774
+ preambles: ["01"]
2775
+ };
2776
+ }
2777
+ decode(message, options = {}) {
2778
+ const decodeResult = this.defaultResult();
2779
+ decodeResult.decoder.name = this.name;
2780
+ decodeResult.message = message;
2781
+ decodeResult.formatted.description = "Latest New Format";
2782
+ decodeResult.decoded = true;
2783
+ let rgx = message.text.match(/^01([A-Z]{2})([A-Z]{2})\s*(\w+)\/(\d{6})([A-Z]{4})([A-Z]{4})\r\n([+-]\s*\d+)(\d{3}\.\d)([+-]\s*\d+\.\d)/);
2784
+ if (rgx) {
2785
+ ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);
2786
+ ResultFormatter.callsign(decodeResult, rgx[3]);
2787
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00"));
2788
+ ResultFormatter.departureAirport(decodeResult, rgx[5]);
2789
+ ResultFormatter.arrivalAirport(decodeResult, rgx[6]);
2790
+ ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, "")));
2791
+ ResultFormatter.unknown(decodeResult, rgx[8]);
2792
+ ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ""));
2793
+ } else {
2794
+ decodeResult.decoded = false;
2795
+ ResultFormatter.unknown(decodeResult, message.text);
2796
+ }
2797
+ if (decodeResult.decoded) {
2798
+ if (!decodeResult.remaining.text)
2799
+ decodeResult.decoder.decodeLevel = "full";
2800
+ else
2801
+ decodeResult.decoder.decodeLevel = "partial";
2802
+ } else {
2803
+ decodeResult.decoder.decodeLevel = "none";
2804
+ }
2805
+ return decodeResult;
2806
+ }
2807
+ };
2808
+
2809
+ // lib/plugins/Label_4A_DIS.ts
2810
+ var Label_4A_DIS = class extends DecoderPlugin {
2811
+ name = "label-4a-dis";
2812
+ qualifiers() {
2813
+ return {
2814
+ labels: ["4A"],
2815
+ preambles: ["DIS"]
2816
+ };
2817
+ }
2818
+ decode(message, options = {}) {
2819
+ const decodeResult = this.defaultResult();
2820
+ decodeResult.decoder.name = this.name;
2821
+ decodeResult.message = message;
2822
+ decodeResult.formatted.description = "Latest New Format";
2823
+ decodeResult.decoded = true;
2824
+ const fields = message.text.split(",");
2825
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00"));
2826
+ ResultFormatter.callsign(decodeResult, fields[2]);
2827
+ ResultFormatter.freetext(decodeResult, fields.slice(3).join(""));
2828
+ if (decodeResult.decoded) {
2829
+ if (!decodeResult.remaining.text)
2830
+ decodeResult.decoder.decodeLevel = "full";
2831
+ else
2832
+ decodeResult.decoder.decodeLevel = "partial";
2833
+ } else {
2834
+ decodeResult.decoder.decodeLevel = "none";
2835
+ }
2836
+ return decodeResult;
2837
+ }
2838
+ };
2839
+
2840
+ // lib/plugins/Label_4A_DOOR.ts
2841
+ var Label_4A_DOOR = class extends DecoderPlugin {
2842
+ name = "label-4a-door";
2843
+ qualifiers() {
2844
+ return {
2845
+ labels: ["4A"],
2846
+ preambles: ["DOOR"]
2847
+ };
2848
+ }
2849
+ decode(message, options = {}) {
2850
+ const decodeResult = this.defaultResult();
2851
+ decodeResult.decoder.name = this.name;
2852
+ decodeResult.message = message;
2853
+ decodeResult.formatted.description = "Latest New Format";
2854
+ decodeResult.decoded = true;
2855
+ const fields = message.text.split(" ");
2856
+ if (fields.length === 3) {
2857
+ ResultFormatter.door_event(decodeResult, fields[0].split("/")[1], fields[1]);
2858
+ ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + "00"));
2859
+ } else {
2860
+ decodeResult.decoded = false;
2861
+ ResultFormatter.unknown(decodeResult, message.text);
2862
+ }
2863
+ if (decodeResult.decoded) {
2864
+ if (!decodeResult.remaining.text)
2865
+ decodeResult.decoder.decodeLevel = "full";
2866
+ else
2867
+ decodeResult.decoder.decodeLevel = "partial";
2868
+ } else {
2869
+ decodeResult.decoder.decodeLevel = "none";
2870
+ }
2871
+ return decodeResult;
2872
+ }
2873
+ };
2874
+
2875
+ // lib/plugins/Label_4A_Slash_01.ts
2876
+ var Label_4A_Slash_01 = class extends DecoderPlugin {
2877
+ name = "label-4a-slash-01";
2878
+ qualifiers() {
2879
+ return {
2880
+ labels: ["4A"],
2881
+ preambles: ["/01"]
2882
+ };
2883
+ }
2884
+ decode(message, options = {}) {
2885
+ const decodeResult = this.defaultResult();
2886
+ decodeResult.decoder.name = this.name;
2887
+ decodeResult.message = message;
2888
+ decodeResult.formatted.description = "Latest New Format";
2889
+ decodeResult.decoded = true;
2890
+ if (message.text.length === 5 && message.text.substring(0, 4) === "/01-") {
2891
+ ResultFormatter.unknown(decodeResult, message.text.substring(4));
2892
+ } else {
2893
+ decodeResult.decoded = false;
2894
+ ResultFormatter.unknown(decodeResult, message.text);
2895
+ }
2896
+ if (decodeResult.decoded) {
2897
+ if (!decodeResult.remaining.text)
2898
+ decodeResult.decoder.decodeLevel = "full";
2899
+ else
2900
+ decodeResult.decoder.decodeLevel = "partial";
2901
+ } else {
2902
+ decodeResult.decoder.decodeLevel = "none";
2903
+ }
2904
+ return decodeResult;
2905
+ }
2906
+ };
2661
2907
 
2662
2908
  // lib/plugins/Label_4J_POS.ts
2663
2909
  var Label_4J_POS = class extends DecoderPlugin {
@@ -4561,6 +4807,10 @@ var MessageDecoder = class {
4561
4807
  this.registerPlugin(new Label_22_OFF(this));
4562
4808
  this.registerPlugin(new Label_22_POS(this));
4563
4809
  this.registerPlugin(new Label_24_Slash(this));
4810
+ this.registerPlugin(new Label_2P_FM3(this));
4811
+ this.registerPlugin(new Label_2P_FM4(this));
4812
+ this.registerPlugin(new Label_2P_FM5(this));
4813
+ this.registerPlugin(new Label_2P_POS(this));
4564
4814
  this.registerPlugin(new Label_30_Slash_EA(this));
4565
4815
  this.registerPlugin(new Label_44_ETA(this));
4566
4816
  this.registerPlugin(new Label_44_IN(this));