@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/README.md +1 -0
- package/dist/index.js +716 -466
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +716 -466
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -13
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/
|
|
1769
|
-
var
|
|
1770
|
-
name = "label-
|
|
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: ["
|
|
1851
|
-
preambles: ["00ETA01", "00ETA02", "00ETA03", "ETA01", "ETA02", "ETA03"]
|
|
1779
|
+
labels: ["2P"]
|
|
1852
1780
|
};
|
|
1853
1781
|
}
|
|
1854
1782
|
decode(message, options = {}) {
|
|
1855
|
-
|
|
1783
|
+
let decodeResult = this.defaultResult();
|
|
1856
1784
|
decodeResult.decoder.name = this.name;
|
|
1857
|
-
decodeResult.formatted.description = "
|
|
1785
|
+
decodeResult.formatted.description = "Flight Report";
|
|
1858
1786
|
decodeResult.message = message;
|
|
1859
|
-
const
|
|
1860
|
-
if (
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
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
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
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
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
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
|
-
|
|
1926
|
-
|
|
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
|
|
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/
|
|
1944
|
-
var
|
|
1945
|
-
name = "label-
|
|
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: ["
|
|
1949
|
-
preambles: ["00OFF01", "00OFF02", "00OFF03", "OFF01", "OFF02", "OFF03"]
|
|
1839
|
+
labels: ["2P"]
|
|
1950
1840
|
};
|
|
1951
1841
|
}
|
|
1952
1842
|
decode(message, options = {}) {
|
|
1953
|
-
|
|
1843
|
+
let decodeResult = this.defaultResult();
|
|
1954
1844
|
decodeResult.decoder.name = this.name;
|
|
1955
|
-
decodeResult.formatted.description = "
|
|
1845
|
+
decodeResult.formatted.description = "Flight Report";
|
|
1956
1846
|
decodeResult.message = message;
|
|
1957
|
-
const
|
|
1958
|
-
if (
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
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 (
|
|
1975
|
-
ResultFormatter.
|
|
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
|
|
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/
|
|
1993
|
-
var
|
|
1994
|
-
name = "label-
|
|
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: ["
|
|
1998
|
-
preambles: ["00ON01", "00ON02", "00ON03", "ON01", "ON02", "ON03"]
|
|
1889
|
+
labels: ["2P"]
|
|
1999
1890
|
};
|
|
2000
1891
|
}
|
|
2001
1892
|
decode(message, options = {}) {
|
|
2002
|
-
|
|
1893
|
+
let decodeResult = this.defaultResult();
|
|
2003
1894
|
decodeResult.decoder.name = this.name;
|
|
2004
|
-
decodeResult.formatted.description = "
|
|
1895
|
+
decodeResult.formatted.description = "Flight Report";
|
|
2005
1896
|
decodeResult.message = message;
|
|
2006
|
-
const
|
|
2007
|
-
if (
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
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
|
|
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
|
|
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,
|
|
2639
|
-
decodeResult
|
|
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));
|