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