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