@airframes/acars-decoder 1.6.17 → 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,522 +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
- ResultFormatter.month(decodeResult, Number(results.groups.current_date.substring(0, 2)));
2027
- ResultFormatter.day(decodeResult, Number(results.groups.current_date.substring(2, 4)));
2028
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + "00"));
2029
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + "00"));
2030
- if (results.groups.fuel_in_tons != "***" && results.groups.fuel_in_tons != "****") {
2031
- decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
2032
- }
2033
- ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);
2034
- ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);
2035
- ResultFormatter.altitude(decodeResult, flight_level * 100);
2036
- }
2037
- decodeResult.decoded = true;
2038
- decodeResult.decoder.decodeLevel = "full";
2039
- return decodeResult;
2040
- }
2041
- };
2042
-
2043
- // lib/plugins/Label_4A.ts
2044
- var Label_4A = class extends DecoderPlugin {
2045
- name = "label-4a";
2046
- qualifiers() {
2047
- return {
2048
- labels: ["4A"]
2049
- };
2050
- }
2051
- decode(message, options = {}) {
2052
- const decodeResult = this.defaultResult();
2053
- decodeResult.decoder.name = this.name;
2054
- decodeResult.message = message;
2055
- decodeResult.formatted.description = "Latest New Format";
2056
- let text = message.text;
2057
- if (text.match(/^M\d{2}A\w{6}/)) {
2058
- ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, "$1"));
2059
- text = text.substring(10);
2060
- }
2061
- decodeResult.decoded = true;
2062
- const fields = text.split(",");
2063
- if (fields.length === 11) {
2064
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
2065
- ResultFormatter.tail(decodeResult, fields[2].replace(".", ""));
2066
- if (fields[3])
2067
- ResultFormatter.callsign(decodeResult, fields[3]);
2068
- ResultFormatter.departureAirport(decodeResult, fields[4]);
2069
- ResultFormatter.arrivalAirport(decodeResult, fields[5]);
2070
- ResultFormatter.altitude(decodeResult, Number(text.substring(48, 51)) * 100);
2071
- ResultFormatter.unknownArr(decodeResult, fields.slice(8));
2072
- } else if (fields.length === 6) {
2073
- if (fields[0].match(/^[NS]/)) {
2074
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)));
2075
- let wp1 = {
2076
- name: fields[0].substring(13).trim(),
2077
- time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),
2078
- timeFormat: "tod"
2079
- };
2080
- ResultFormatter.altitude(decodeResult, Number(fields[1].substring(6, 9)) * 100);
2081
- let wp2 = {
2082
- name: fields[1].substring(9).trim(),
2083
- time: DateTimeUtils.convertHHMMSSToTod(fields[2]),
2084
- timeFormat: "tod"
2085
- };
2086
- ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });
2087
- ResultFormatter.temperature(decodeResult, fields[3]);
2088
- ResultFormatter.unknownArr(decodeResult, fields.slice(4));
2089
- } else {
2090
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[0]));
2091
- ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1]));
2092
- ResultFormatter.unknown(decodeResult, fields[2]);
2093
- ResultFormatter.altitude(decodeResult, Number(fields[3]));
2094
- ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinates((fields[4] + fields[5]).replace(/[ \.]/g, "")));
2095
- }
2096
- } else {
2097
- decodeResult.decoded = false;
2098
- ResultFormatter.unknown(decodeResult, text);
2099
- }
2100
- if (decodeResult.decoded) {
2101
- if (!decodeResult.remaining.text)
2102
- decodeResult.decoder.decodeLevel = "full";
2103
- else
2104
- decodeResult.decoder.decodeLevel = "partial";
2105
- } else {
2106
- decodeResult.decoder.decodeLevel = "none";
2107
- }
2108
- return decodeResult;
2109
- }
2110
- };
2111
-
2112
- // lib/plugins/Label_4A_01.ts
2113
- var Label_4A_01 = class extends DecoderPlugin {
2114
- name = "label-4a-01";
2115
- qualifiers() {
2116
- return {
2117
- labels: ["4A"],
2118
- preambles: ["01"]
2119
- };
2120
- }
2121
- decode(message, options = {}) {
2122
- const decodeResult = this.defaultResult();
2123
- decodeResult.decoder.name = this.name;
2124
- decodeResult.message = message;
2125
- decodeResult.formatted.description = "Latest New Format";
2126
- decodeResult.decoded = true;
2127
- 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)/);
2128
- if (rgx) {
2129
- ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);
2130
- ResultFormatter.callsign(decodeResult, rgx[3]);
2131
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(rgx[4] + "00"));
2132
- ResultFormatter.departureAirport(decodeResult, rgx[5]);
2133
- ResultFormatter.arrivalAirport(decodeResult, rgx[6]);
2134
- ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, "")));
2135
- ResultFormatter.unknown(decodeResult, rgx[8]);
2136
- ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ""));
2137
- } else {
2138
- decodeResult.decoded = false;
2139
- ResultFormatter.unknown(decodeResult, message.text);
2140
- }
2141
- if (decodeResult.decoded) {
2142
- if (!decodeResult.remaining.text)
2143
- decodeResult.decoder.decodeLevel = "full";
2144
- else
2145
- decodeResult.decoder.decodeLevel = "partial";
2146
- } else {
2147
- decodeResult.decoder.decodeLevel = "none";
2148
- }
2149
- return decodeResult;
2150
- }
2151
- };
2152
-
2153
- // lib/plugins/Label_4A_DIS.ts
2154
- var Label_4A_DIS = class extends DecoderPlugin {
2155
- name = "label-4a-dis";
2156
- qualifiers() {
2157
- return {
2158
- labels: ["4A"],
2159
- preambles: ["DIS"]
2160
- };
2161
- }
2162
- decode(message, options = {}) {
2163
- const decodeResult = this.defaultResult();
2164
- decodeResult.decoder.name = this.name;
2165
- decodeResult.message = message;
2166
- decodeResult.formatted.description = "Latest New Format";
2167
- decodeResult.decoded = true;
2168
- const fields = message.text.split(",");
2169
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + "00"));
2170
- ResultFormatter.callsign(decodeResult, fields[2]);
2171
- ResultFormatter.freetext(decodeResult, fields.slice(3).join(""));
2172
- if (decodeResult.decoded) {
2173
- if (!decodeResult.remaining.text)
2174
- decodeResult.decoder.decodeLevel = "full";
2175
- else
2176
- decodeResult.decoder.decodeLevel = "partial";
2177
- } else {
2178
- decodeResult.decoder.decodeLevel = "none";
2179
- }
2180
- return decodeResult;
2181
- }
2182
- };
2183
-
2184
- // lib/plugins/Label_4A_DOOR.ts
2185
- var Label_4A_DOOR = class extends DecoderPlugin {
2186
- name = "label-4a-door";
2187
- qualifiers() {
2188
- return {
2189
- labels: ["4A"],
2190
- preambles: ["DOOR"]
2191
- };
2192
- }
2193
- decode(message, options = {}) {
2194
- const decodeResult = this.defaultResult();
2195
- decodeResult.decoder.name = this.name;
2196
- decodeResult.message = message;
2197
- decodeResult.formatted.description = "Latest New Format";
2198
- decodeResult.decoded = true;
2199
- const fields = message.text.split(" ");
2200
- if (fields.length === 3) {
2201
- ResultFormatter.door_event(decodeResult, fields[0].split("/")[1], fields[1]);
2202
- ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(fields[2] + "00"));
2203
- } else {
2204
- decodeResult.decoded = false;
2205
- ResultFormatter.unknown(decodeResult, message.text);
2206
- }
2207
- if (decodeResult.decoded) {
2208
- if (!decodeResult.remaining.text)
2209
- decodeResult.decoder.decodeLevel = "full";
2210
- else
2211
- decodeResult.decoder.decodeLevel = "partial";
2212
- } else {
2213
- decodeResult.decoder.decodeLevel = "none";
2214
- }
2215
- return decodeResult;
2216
- }
2217
- };
2218
-
2219
- // lib/plugins/Label_4A_Slash_01.ts
2220
- var Label_4A_Slash_01 = class extends DecoderPlugin {
2221
- name = "label-4a-slash-01";
2222
- qualifiers() {
2223
- return {
2224
- labels: ["4A"],
2225
- preambles: ["/01"]
2226
- };
2227
- }
2228
- decode(message, options = {}) {
2229
- const decodeResult = this.defaultResult();
2230
- decodeResult.decoder.name = this.name;
2231
- decodeResult.message = message;
2232
- decodeResult.formatted.description = "Latest New Format";
2233
- decodeResult.decoded = true;
2234
- if (message.text.length === 5 && message.text.substring(0, 4) === "/01-") {
2235
- ResultFormatter.unknown(decodeResult, message.text.substring(4));
2236
- } else {
2237
- decodeResult.decoded = false;
2238
- ResultFormatter.unknown(decodeResult, message.text);
2239
- }
2240
- if (decodeResult.decoded) {
2241
- if (!decodeResult.remaining.text)
2242
- decodeResult.decoder.decodeLevel = "full";
2243
- else
2244
- decodeResult.decoder.decodeLevel = "partial";
2245
- } else {
2246
- decodeResult.decoder.decodeLevel = "none";
2247
1889
  }
2248
1890
  return decodeResult;
2249
1891
  }
@@ -2414,7 +2056,7 @@ var H1Helper = class _H1Helper {
2414
2056
  if (!canDecode) {
2415
2057
  decodeResult.decoded = false;
2416
2058
  decodeResult.decoder.decodeLevel = "none";
2417
- return;
2059
+ return false;
2418
2060
  }
2419
2061
  for (let i = 1; i < fields.length; ++i) {
2420
2062
  if (fields[i].startsWith("FN")) {
@@ -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);
@@ -2710,6 +2356,555 @@ function processWindData(decodeResult, message) {
2710
2356
  });
2711
2357
  }
2712
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
+ };
2907
+
2713
2908
  // lib/plugins/Label_4J_POS.ts
2714
2909
  var Label_4J_POS = class extends DecoderPlugin {
2715
2910
  name = "label-4j-pos";
@@ -4612,6 +4807,10 @@ var MessageDecoder = class {
4612
4807
  this.registerPlugin(new Label_22_OFF(this));
4613
4808
  this.registerPlugin(new Label_22_POS(this));
4614
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));
4615
4814
  this.registerPlugin(new Label_30_Slash_EA(this));
4616
4815
  this.registerPlugin(new Label_44_ETA(this));
4617
4816
  this.registerPlugin(new Label_44_IN(this));