@airframes/acars-decoder 1.4.6 → 1.6.0
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/.github/FUNDING.yml +1 -1
- package/.github/workflows/yarn-test.yml +11 -4
- package/README.md +32 -0
- package/index.d.ts +17 -0
- package/index.ts +2 -0
- package/package.json +5 -13
- package/tsconfig.json +2 -2
- package/yarn-error.log +3354 -0
- package/coverage/clover.xml +0 -1799
- package/coverage/coverage-final.json +0 -24
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -131
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -2278
- package/dist/DateTimeUtils.d.ts +0 -8
- package/dist/DateTimeUtils.js +0 -27
- package/dist/DecoderPlugin.d.ts +0 -18
- package/dist/DecoderPlugin.js +0 -71
- package/dist/DecoderPluginInterface.d.ts +0 -7
- package/dist/DecoderPluginInterface.js +0 -3
- package/dist/IcaoDecoder.d.ts +0 -10
- package/dist/IcaoDecoder.js +0 -111
- package/dist/MessageDecoder.d.ts +0 -14
- package/dist/MessageDecoder.js +0 -129
- package/dist/bin/acars-decoder-test.d.ts +0 -2
- package/dist/bin/acars-decoder-test.js +0 -53
- package/dist/bin/acars-decoder.d.ts +0 -2
- package/dist/bin/acars-decoder.js +0 -20
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -20
- package/dist/plugins/Label_15.d.ts +0 -11
- package/dist/plugins/Label_15.js +0 -40
- package/dist/plugins/Label_16_N_Space.d.ts +0 -11
- package/dist/plugins/Label_16_N_Space.js +0 -80
- package/dist/plugins/Label_16_N_Space.test.d.ts +0 -1
- package/dist/plugins/Label_16_N_Space.test.js +0 -84
- package/dist/plugins/Label_1M_Slash.d.ts +0 -11
- package/dist/plugins/Label_1M_Slash.js +0 -61
- package/dist/plugins/Label_1M_Slash.test.d.ts +0 -1
- package/dist/plugins/Label_1M_Slash.test.js +0 -43
- package/dist/plugins/Label_20_CFB.01.d.ts +0 -11
- package/dist/plugins/Label_20_CFB.01.js +0 -69
- package/dist/plugins/Label_20_POS.d.ts +0 -11
- package/dist/plugins/Label_20_POS.js +0 -62
- package/dist/plugins/Label_30_Slash_EA.d.ts +0 -11
- package/dist/plugins/Label_30_Slash_EA.js +0 -54
- package/dist/plugins/Label_30_Slash_EA.test.d.ts +0 -1
- package/dist/plugins/Label_30_Slash_EA.test.js +0 -35
- package/dist/plugins/Label_44_ETA.d.ts +0 -11
- package/dist/plugins/Label_44_ETA.js +0 -69
- package/dist/plugins/Label_44_IN.d.ts +0 -11
- package/dist/plugins/Label_44_IN.js +0 -69
- package/dist/plugins/Label_44_OFF.d.ts +0 -11
- package/dist/plugins/Label_44_OFF.js +0 -74
- package/dist/plugins/Label_44_ON.d.ts +0 -11
- package/dist/plugins/Label_44_ON.js +0 -69
- package/dist/plugins/Label_44_POS.d.ts +0 -11
- package/dist/plugins/Label_44_POS.js +0 -81
- package/dist/plugins/Label_5Z.d.ts +0 -11
- package/dist/plugins/Label_5Z.js +0 -120
- package/dist/plugins/Label_80.d.ts +0 -12
- package/dist/plugins/Label_80.js +0 -203
- package/dist/plugins/Label_8E.d.ts +0 -10
- package/dist/plugins/Label_8E.js +0 -48
- package/dist/plugins/Label_8E.test.d.ts +0 -1
- package/dist/plugins/Label_8E.test.js +0 -32
- package/dist/plugins/Label_B6.d.ts +0 -11
- package/dist/plugins/Label_B6.js +0 -26
- package/dist/plugins/Label_ColonComma.d.ts +0 -10
- package/dist/plugins/Label_ColonComma.js +0 -28
- package/dist/plugins/Label_H1.d.ts +0 -9
- package/dist/plugins/Label_H1.js +0 -18
- package/dist/plugins/Label_H1_M1BPOS.d.ts +0 -11
- package/dist/plugins/Label_H1_M1BPOS.js +0 -54
- package/dist/plugins/Label_H1_M1BPRG.d.ts +0 -11
- package/dist/plugins/Label_H1_M1BPRG.js +0 -36
- package/dist/plugins/Label_QP.d.ts +0 -10
- package/dist/plugins/Label_QP.js +0 -49
- package/dist/plugins/Label_QQ.d.ts +0 -10
- package/dist/plugins/Label_QQ.js +0 -49
- package/dist/plugins/Label_QR.d.ts +0 -10
- package/dist/plugins/Label_QR.js +0 -49
- package/dist/plugins/Label_QS.d.ts +0 -10
- package/dist/plugins/Label_QS.js +0 -49
- package/dist/plugins/Label_SQ.d.ts +0 -10
- package/dist/plugins/Label_SQ.js +0 -104
- package/dist/plugins/official.d.ts +0 -22
- package/dist/plugins/official.js +0 -38
- package/src/DateTimeUtils.ts +0 -26
- package/src/DecoderPlugin.ts +0 -83
- package/src/DecoderPluginInterface.ts +0 -9
- package/src/IcaoDecoder.ts +0 -137
- package/src/MessageDecoder.ts +0 -117
- package/src/bin/acars-decoder-test.ts +0 -67
- package/src/bin/acars-decoder.ts +0 -23
- package/src/index.d.ts +0 -15
- package/src/index.ts +0 -4
- package/src/plugins/Label_15.ts +0 -45
- package/src/plugins/Label_16_N_Space.test.ts +0 -94
- package/src/plugins/Label_16_N_Space.ts +0 -91
- package/src/plugins/Label_1M_Slash.test.ts +0 -45
- package/src/plugins/Label_1M_Slash.ts +0 -69
- package/src/plugins/Label_20_CFB.01.ts +0 -81
- package/src/plugins/Label_20_POS.ts +0 -68
- package/src/plugins/Label_30_Slash_EA.test.ts +0 -37
- package/src/plugins/Label_30_Slash_EA.ts +0 -60
- package/src/plugins/Label_44_ETA.ts +0 -81
- package/src/plugins/Label_44_IN.ts +0 -81
- package/src/plugins/Label_44_OFF.ts +0 -88
- package/src/plugins/Label_44_ON.ts +0 -81
- package/src/plugins/Label_44_POS.ts +0 -96
- package/src/plugins/Label_5Z.ts +0 -125
- package/src/plugins/Label_80.ts +0 -215
- package/src/plugins/Label_8E.test.ts +0 -34
- package/src/plugins/Label_8E.ts +0 -55
- package/src/plugins/Label_B6.ts +0 -28
- package/src/plugins/Label_ColonComma.ts +0 -32
- package/src/plugins/Label_H1.ts +0 -18
- package/src/plugins/Label_H1_M1BPOS.ts +0 -60
- package/src/plugins/Label_H1_M1BPRG.ts +0 -40
- package/src/plugins/Label_QP.ts +0 -54
- package/src/plugins/Label_QQ.ts +0 -54
- package/src/plugins/Label_QR.ts +0 -54
- package/src/plugins/Label_QS.ts +0 -54
- package/src/plugins/Label_SQ.ts +0 -111
- package/src/plugins/official.ts +0 -22
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { DecoderPlugin } from '../DecoderPlugin';
|
|
2
|
-
|
|
3
|
-
export class Label_16_N_Space extends DecoderPlugin {
|
|
4
|
-
name = 'label-16-n-space';
|
|
5
|
-
|
|
6
|
-
qualifiers() { // eslint-disable-line class-methods-use-this
|
|
7
|
-
return {
|
|
8
|
-
labels: ["16"],
|
|
9
|
-
preambles: ['N '],
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
decode(message: any, options: any = {}) : any {
|
|
14
|
-
const decodeResult: any = this.defaultResult;
|
|
15
|
-
decodeResult.decoder.name = this.name;
|
|
16
|
-
decodeResult.formatted.description = 'Position Report';
|
|
17
|
-
decodeResult.message = message;
|
|
18
|
-
|
|
19
|
-
// Style: N 44.203,W 86.546,31965,6, 290
|
|
20
|
-
let variant1Regex = /^(?<lat>[NS])\s(?<lat_coord>.*),(?<long>[EW])\s(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\s(?<unkwn2>.*)$/;
|
|
21
|
-
|
|
22
|
-
// Style: N 28.177/W 96.055
|
|
23
|
-
let variant2Regex = /^(?<lat>[NS])\s(?<lat_coord>.*)\/(?<long>[EW])\s?(?<long_coord>.*)$/;
|
|
24
|
-
|
|
25
|
-
let results;
|
|
26
|
-
if (results = message.text.match(variant1Regex)) {
|
|
27
|
-
if (options.debug) {
|
|
28
|
-
console.log(`Label 16 N : results`);
|
|
29
|
-
console.log(results);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
decodeResult.raw.latitude_direction = results.groups.lat;
|
|
33
|
-
decodeResult.raw.latitude = Number(results.groups.lat_coord);
|
|
34
|
-
decodeResult.raw.longitude_direction = results.groups.long;
|
|
35
|
-
decodeResult.raw.longitude = Number(results.groups.long_coord);
|
|
36
|
-
decodeResult.raw.flight_level = results.groups.alt == 'GRD' || results.groups.alt == '***' ? '0' : Number(results.groups.alt);
|
|
37
|
-
|
|
38
|
-
decodeResult.formatted.items.push({
|
|
39
|
-
type: 'aircraft_position',
|
|
40
|
-
code: 'POS',
|
|
41
|
-
label: 'Aircraft Position',
|
|
42
|
-
value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
decodeResult.formatted.items.push({
|
|
46
|
-
type: 'flight_level',
|
|
47
|
-
code: 'FL',
|
|
48
|
-
label: 'Flight Level',
|
|
49
|
-
value: decodeResult.raw.flight_level,
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
decodeResult.remaining.text = `,${results.groups.unkwn1} ,${results.groups.unkwn2}`;
|
|
53
|
-
decodeResult.decoded = true;
|
|
54
|
-
decodeResult.decoder.decodeLevel = 'partial';
|
|
55
|
-
|
|
56
|
-
} else if (results = message.text.match(variant2Regex)) {
|
|
57
|
-
if (options.debug) {
|
|
58
|
-
console.log(`Label 16 N : results`);
|
|
59
|
-
console.log(results);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
decodeResult.raw.latitude_direction = results.groups.lat;
|
|
63
|
-
decodeResult.raw.latitude = Number(results.groups.lat_coord);
|
|
64
|
-
decodeResult.raw.longitude_direction = results.groups.long;
|
|
65
|
-
decodeResult.raw.longitude = Number(results.groups.long_coord);
|
|
66
|
-
|
|
67
|
-
decodeResult.formatted.items.push({
|
|
68
|
-
type: 'aircraft_position',
|
|
69
|
-
code: 'POS',
|
|
70
|
-
label: 'Aircraft Position',
|
|
71
|
-
value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
decodeResult.decoded = true;
|
|
75
|
-
decodeResult.decoder.decodeLevel = 'full';
|
|
76
|
-
|
|
77
|
-
} else {
|
|
78
|
-
// Unknown
|
|
79
|
-
if (options.debug) {
|
|
80
|
-
console.log(`Decoder: Unknown 16 message: ${message.text}`);
|
|
81
|
-
}
|
|
82
|
-
decodeResult.remaining.text = message.text;
|
|
83
|
-
decodeResult.decoded = false;
|
|
84
|
-
decodeResult.decoder.decodeLevel = 'none';
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return decodeResult;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export default {};
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { MessageDecoder } from '../MessageDecoder';
|
|
2
|
-
import { Label_1M_Slash } from './Label_1M_Slash';
|
|
3
|
-
|
|
4
|
-
test('decodes Label 8E sample 1', () => {
|
|
5
|
-
const decoder = new MessageDecoder();
|
|
6
|
-
const decoderPlugin = new Label_1M_Slash(decoder);
|
|
7
|
-
|
|
8
|
-
expect(decoderPlugin.decode).toBeDefined();
|
|
9
|
-
expect(decoderPlugin.name).toBe('label-1m-slash');
|
|
10
|
-
expect(decoderPlugin.qualifiers).toBeDefined();
|
|
11
|
-
expect(decoderPlugin.qualifiers()).toEqual({
|
|
12
|
-
labels: ['1M'],
|
|
13
|
-
preambles: ['/'],
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
const text = '/BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0\n1940/EGLL27L/10';
|
|
17
|
-
const decodeResult = decoderPlugin.decode({ text: text });
|
|
18
|
-
console.log(JSON.stringify(decodeResult, null, 2));
|
|
19
|
-
|
|
20
|
-
expect(decodeResult.decoded).toBe(true);
|
|
21
|
-
expect(decodeResult.decoder.decodeLevel).toBe('partial');
|
|
22
|
-
expect(decodeResult.decoder.name).toBe('label-1m-slash');
|
|
23
|
-
expect(decodeResult.formatted.description).toBe('ETA Report');
|
|
24
|
-
expect(decodeResult.message.text).toBe(text);
|
|
25
|
-
expect(decodeResult.raw.alternate_icao).toBe('EGSS');
|
|
26
|
-
expect(decodeResult.raw.arrival_icao).toBe('EGLL');
|
|
27
|
-
expect(decodeResult.raw.arrival_runway).toBe('27L');
|
|
28
|
-
expect(decodeResult.raw.departure_icao).toBe('LDSP');
|
|
29
|
-
expect(decodeResult.raw.flight_number).toBe('BA0843');
|
|
30
|
-
expect(decodeResult.formatted.items.length).toBe(3);
|
|
31
|
-
expect(decodeResult.formatted.items[0].type).toBe('eta');
|
|
32
|
-
expect(decodeResult.formatted.items[0].code).toBe('ETA');
|
|
33
|
-
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
|
|
34
|
-
// Check for the minutes as typescript doesn't have a UTC time string method
|
|
35
|
-
// so the hour will depend on the test host timezone.
|
|
36
|
-
expect((decodeResult.formatted.items[0].value as string).includes('40')).toBe(true);
|
|
37
|
-
expect(decodeResult.formatted.items[1].type).toBe('destination');
|
|
38
|
-
expect(decodeResult.formatted.items[1].code).toBe('DST');
|
|
39
|
-
expect(decodeResult.formatted.items[1].label).toBe('Destination');
|
|
40
|
-
expect(decodeResult.formatted.items[1].value).toBe('EGLL');
|
|
41
|
-
expect(decodeResult.formatted.items[2].type).toBe('origin');
|
|
42
|
-
expect(decodeResult.formatted.items[2].code).toBe('ORG');
|
|
43
|
-
expect(decodeResult.formatted.items[2].label).toBe('Origin');
|
|
44
|
-
expect(decodeResult.formatted.items[2].value).toBe('LDSP');
|
|
45
|
-
});
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { DateTimeUtils } from '../DateTimeUtils';
|
|
2
|
-
import { DecoderPlugin } from '../DecoderPlugin';
|
|
3
|
-
|
|
4
|
-
export class Label_1M_Slash extends DecoderPlugin {
|
|
5
|
-
name = 'label-1m-slash';
|
|
6
|
-
|
|
7
|
-
qualifiers() { // eslint-disable-line class-methods-use-this
|
|
8
|
-
return {
|
|
9
|
-
labels: ["1M"],
|
|
10
|
-
preambles: ['/'],
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
decode(message: any, options: any = {}) : any {
|
|
15
|
-
const decodeResult: any = this.defaultResult;
|
|
16
|
-
decodeResult.decoder.name = this.name;
|
|
17
|
-
decodeResult.formatted.description = 'ETA Report';
|
|
18
|
-
decodeResult.message = message;
|
|
19
|
-
|
|
20
|
-
// Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10
|
|
21
|
-
const results = message.text.split(/\n|\//).slice(1); // Split by / and new line
|
|
22
|
-
|
|
23
|
-
if (results) {
|
|
24
|
-
if (options.debug) {
|
|
25
|
-
console.log(`Label 1M ETA: results`);
|
|
26
|
-
console.log(results);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
decodeResult.raw.flight_number = results[0];
|
|
30
|
-
// results[1]: ETA01 (???)
|
|
31
|
-
// results[2]: 230822 - UTC date of eta
|
|
32
|
-
decodeResult.raw.departure_icao = results[3];
|
|
33
|
-
decodeResult.raw.arrival_icao = results[4];
|
|
34
|
-
decodeResult.raw.alternate_icao = results[5];
|
|
35
|
-
// results[6]: 2JK0 (???)
|
|
36
|
-
// results[7] 1940 - UTC eta
|
|
37
|
-
decodeResult.raw.arrival_runway = results[8].replace(decodeResult.raw.arrival_icao, ""); // results[8] EGLL27L
|
|
38
|
-
// results[9]: 10(space) (???)
|
|
39
|
-
|
|
40
|
-
decodeResult.formatted.items.push({
|
|
41
|
-
type: 'eta',
|
|
42
|
-
code: 'ETA',
|
|
43
|
-
label: 'Estimated Time of Arrival',
|
|
44
|
-
value: DateTimeUtils.UTCDateTimeToString(results[2], results[7]),
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
decodeResult.formatted.items.push({
|
|
48
|
-
type: 'destination',
|
|
49
|
-
code: 'DST',
|
|
50
|
-
label: 'Destination',
|
|
51
|
-
value: decodeResult.raw.arrival_icao,
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
decodeResult.formatted.items.push({
|
|
55
|
-
type: 'origin',
|
|
56
|
-
code: 'ORG',
|
|
57
|
-
label: 'Origin',
|
|
58
|
-
value: decodeResult.raw.departure_icao,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
decodeResult.decoded = true;
|
|
63
|
-
decodeResult.decoder.decodeLevel = 'partial';
|
|
64
|
-
|
|
65
|
-
return decodeResult;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export default {};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { DecoderPlugin } from '../DecoderPlugin';
|
|
2
|
-
|
|
3
|
-
// In Air Report
|
|
4
|
-
export class Label_20_CFB01 extends DecoderPlugin {
|
|
5
|
-
name = 'label-20-cfb01';
|
|
6
|
-
|
|
7
|
-
qualifiers() { // eslint-disable-line class-methods-use-this
|
|
8
|
-
return {
|
|
9
|
-
labels: ['20'],
|
|
10
|
-
preambles: ['#CFB.01'],
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
decode(message: any, options: any = {}) : any {
|
|
15
|
-
const decodeResult: any = this.defaultResult;
|
|
16
|
-
decodeResult.decoder.name = this.name;
|
|
17
|
-
decodeResult.formatted.description = 'Crew Flight Bag Message';
|
|
18
|
-
decodeResult.message = message;
|
|
19
|
-
|
|
20
|
-
// Style: IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1
|
|
21
|
-
// Match: IN02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons
|
|
22
|
-
const regex = /^IN02,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
|
|
23
|
-
const results = message.text.match(regex);
|
|
24
|
-
if (results) {
|
|
25
|
-
if (options.debug) {
|
|
26
|
-
console.log(`Label 44 ETA Report: groups`);
|
|
27
|
-
console.log(results.groups);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const coordsRegex = /(?<lac>[NS])(?<la>.+)\s*(?<lnc>[EW])(?<ln>.+)/;
|
|
31
|
-
const coordsResults = results.groups.unsplit_coords.match(coordsRegex);
|
|
32
|
-
|
|
33
|
-
decodeResult.raw.latitude_direction = coordsResults.groups.lac;
|
|
34
|
-
decodeResult.raw.latitude = Number(coordsResults.groups.la) / 1000;
|
|
35
|
-
decodeResult.raw.longitude_direction = coordsResults.groups.lnc;
|
|
36
|
-
decodeResult.raw.longitude = Number(coordsResults.groups.ln) / 1000;
|
|
37
|
-
decodeResult.raw.departure_icao = results.groups.departure_icao;
|
|
38
|
-
decodeResult.raw.arrival_icao = results.groups.arrival_icao;
|
|
39
|
-
decodeResult.raw.current_time = Date.parse(
|
|
40
|
-
new Date().getFullYear() + "-" +
|
|
41
|
-
results.groups.current_date.substr(0, 2) + "-" +
|
|
42
|
-
results.groups.current_date.substr(2, 2) + "T" +
|
|
43
|
-
results.groups.current_time.substr(0, 2) + ":" +
|
|
44
|
-
results.groups.current_time.substr(2, 2) + ":00Z"
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {
|
|
48
|
-
decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
decodeResult.formatted.items.push({
|
|
52
|
-
type: 'aircraft_position',
|
|
53
|
-
code: 'POS',
|
|
54
|
-
label: 'Aircraft Position',
|
|
55
|
-
value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
decodeResult.formatted.items.push({
|
|
59
|
-
type: 'origin',
|
|
60
|
-
code: 'ORG',
|
|
61
|
-
label: 'Origin',
|
|
62
|
-
value: decodeResult.raw.departure_icao,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
decodeResult.formatted.items.push({
|
|
66
|
-
type: 'destination',
|
|
67
|
-
code: 'DST',
|
|
68
|
-
label: 'Destination',
|
|
69
|
-
value: decodeResult.raw.arrival_icao,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
decodeResult.decoded = true;
|
|
75
|
-
decodeResult.decoder.decodeLevel = 'full';
|
|
76
|
-
|
|
77
|
-
return decodeResult;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export default {};
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { DecoderPlugin } from '../DecoderPlugin';
|
|
2
|
-
|
|
3
|
-
// Position Report
|
|
4
|
-
export class Label_20_POS extends DecoderPlugin {
|
|
5
|
-
name = 'label-20-pos';
|
|
6
|
-
|
|
7
|
-
qualifiers() { // eslint-disable-line class-methods-use-this
|
|
8
|
-
return {
|
|
9
|
-
labels: ['20'],
|
|
10
|
-
preambles: ['POS'],
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
decode(message: any, options: any = {}) : any {
|
|
15
|
-
const decodeResult: any = this.defaultResult;
|
|
16
|
-
decodeResult.decoder.name = this.name;
|
|
17
|
-
decodeResult.formatted.description = 'Position Report';
|
|
18
|
-
decodeResult.message = message;
|
|
19
|
-
|
|
20
|
-
decodeResult.raw.preamble = message.text.substring(0, 3);
|
|
21
|
-
|
|
22
|
-
const content = message.text.substring(3);
|
|
23
|
-
console.log('Content: ' + content);
|
|
24
|
-
|
|
25
|
-
const fields = content.split(',');
|
|
26
|
-
console.log('Field Count: ' + fields.length);
|
|
27
|
-
|
|
28
|
-
if (fields.length == 11) {
|
|
29
|
-
// N38160W077075,,211733,360,OTT,212041,,N42,19689,40,544
|
|
30
|
-
console.log(`DEBUG: ${this.name}: Variation 1 detected`);
|
|
31
|
-
|
|
32
|
-
// Field 1: Coordinates
|
|
33
|
-
const rawCoords = fields[0];
|
|
34
|
-
decodeResult.raw.position = this.decodeStringCoordinates(rawCoords);
|
|
35
|
-
decodeResult.formatted.items.push({
|
|
36
|
-
type: 'position',
|
|
37
|
-
label: 'Position',
|
|
38
|
-
value: this.coordinateString(decodeResult.raw.position),
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
decodeResult.decoded = true;
|
|
42
|
-
decodeResult.decoder.decodeLevel = 'full';
|
|
43
|
-
} else if (fields.length == 5) {
|
|
44
|
-
// N38160W077075,,211733,360,OTT
|
|
45
|
-
console.log(`DEBUG: ${this.name}: Variation 2 detected`);
|
|
46
|
-
|
|
47
|
-
// Field 1: Coordinates
|
|
48
|
-
const rawCoords = fields[0];
|
|
49
|
-
decodeResult.raw.position = this.decodeStringCoordinates(rawCoords);
|
|
50
|
-
decodeResult.formatted.items.push({
|
|
51
|
-
type: 'position',
|
|
52
|
-
label: 'Position',
|
|
53
|
-
value: this.coordinateString(decodeResult.raw.position),
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
decodeResult.decoded = true;
|
|
57
|
-
decodeResult.decoder.decodeLevel = 'full';
|
|
58
|
-
} else {
|
|
59
|
-
// Unknown!
|
|
60
|
-
console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);
|
|
61
|
-
decodeResult.decoded = false;
|
|
62
|
-
decodeResult.decoder.decodeLevel = 'none';
|
|
63
|
-
}
|
|
64
|
-
return decodeResult;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export default {};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { MessageDecoder } from '../MessageDecoder';
|
|
2
|
-
import { Label_30_Slash_EA } from './Label_30_Slash_EA';
|
|
3
|
-
|
|
4
|
-
test('decodes Label 30 sample 1', () => {
|
|
5
|
-
const decoder = new MessageDecoder();
|
|
6
|
-
const decoderPlugin = new Label_30_Slash_EA(decoder);
|
|
7
|
-
|
|
8
|
-
expect(decoderPlugin.decode).toBeDefined();
|
|
9
|
-
expect(decoderPlugin.name).toBe('label-30-slash-ea');
|
|
10
|
-
expect(decoderPlugin.qualifiers).toBeDefined();
|
|
11
|
-
expect(decoderPlugin.qualifiers()).toEqual({
|
|
12
|
-
labels: ['30'],
|
|
13
|
-
preambles: ['/EA'],
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
const text = '/EA1719/DSKSFO/SK23';
|
|
17
|
-
const decodeResult = decoderPlugin.decode({ text: text });
|
|
18
|
-
console.log(JSON.stringify(decodeResult, null, 2));
|
|
19
|
-
|
|
20
|
-
expect(decodeResult.decoded).toBe(true);
|
|
21
|
-
expect(decodeResult.decoder.decodeLevel).toBe('partial');
|
|
22
|
-
expect(decodeResult.decoder.name).toBe('label-30-slash-ea');
|
|
23
|
-
expect(decodeResult.formatted.description).toBe('ETA Report');
|
|
24
|
-
expect(decodeResult.message.text).toBe(text);
|
|
25
|
-
expect(decodeResult.raw.arrival_icao).toBe('KSFO');
|
|
26
|
-
expect(decodeResult.formatted.items.length).toBe(2);
|
|
27
|
-
expect(decodeResult.formatted.items[0].type).toBe('eta');
|
|
28
|
-
expect(decodeResult.formatted.items[0].code).toBe('ETA');
|
|
29
|
-
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
|
|
30
|
-
// This test is a bit rough as typescript doesn't have a UTC time string
|
|
31
|
-
// method so the hour will be depend on the test host timezone.
|
|
32
|
-
expect((decodeResult.formatted.items[0].value as string).includes('19')).toBe(true);
|
|
33
|
-
expect(decodeResult.formatted.items[1].type).toBe('destination');
|
|
34
|
-
expect(decodeResult.formatted.items[1].code).toBe('DST');
|
|
35
|
-
expect(decodeResult.formatted.items[1].label).toBe('Destination');
|
|
36
|
-
expect(decodeResult.formatted.items[1].value).toBe('KSFO');
|
|
37
|
-
});
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { DateTimeUtils } from '../DateTimeUtils';
|
|
2
|
-
import { DecoderPlugin } from '../DecoderPlugin';
|
|
3
|
-
|
|
4
|
-
export class Label_30_Slash_EA extends DecoderPlugin {
|
|
5
|
-
name = 'label-30-slash-ea';
|
|
6
|
-
|
|
7
|
-
qualifiers() { // eslint-disable-line class-methods-use-this
|
|
8
|
-
return {
|
|
9
|
-
labels: ["30"],
|
|
10
|
-
preambles: ['/EA'],
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
decode(message: any, options: any = {}) : any {
|
|
15
|
-
const decodeResult: any = this.defaultResult;
|
|
16
|
-
decodeResult.decoder.name = this.name;
|
|
17
|
-
decodeResult.formatted.description = 'ETA Report';
|
|
18
|
-
decodeResult.message = message;
|
|
19
|
-
|
|
20
|
-
// Style: /EA1830/DSKSFO/SK24
|
|
21
|
-
const results = message.text.split(/\n|\//).slice(1); // Split by / and new line
|
|
22
|
-
|
|
23
|
-
if (results) {
|
|
24
|
-
if (options.debug) {
|
|
25
|
-
console.log(`Label 30 EA: results`);
|
|
26
|
-
console.log(results);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
decodeResult.formatted.items.push({
|
|
31
|
-
type: 'eta',
|
|
32
|
-
code: 'ETA',
|
|
33
|
-
label: 'Estimated Time of Arrival',
|
|
34
|
-
value: DateTimeUtils.UTCToString(results[0].substr(2, 4)),
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
if (results[1].substr(0, 2) === "DS") {
|
|
38
|
-
decodeResult.raw.arrival_icao = results[1].substr(2, 4);
|
|
39
|
-
decodeResult.formatted.items.push({
|
|
40
|
-
type: 'destination',
|
|
41
|
-
code: 'DST',
|
|
42
|
-
label: 'Destination',
|
|
43
|
-
value: decodeResult.raw.arrival_icao,
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// We don't know what the /SK section means. We have seen various numbers
|
|
47
|
-
// after the /SK.
|
|
48
|
-
decodeResult.remaining.text = "/".concat(results[2]);
|
|
49
|
-
} else {
|
|
50
|
-
decodeResult.remaining.text = "/".concat(results[1], "/", results[2])
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
decodeResult.decoded = true;
|
|
54
|
-
decodeResult.decoder.decodeLevel = 'partial';
|
|
55
|
-
|
|
56
|
-
return decodeResult;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export default {};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { DecoderPlugin } from '../DecoderPlugin';
|
|
2
|
-
|
|
3
|
-
// In Air Report
|
|
4
|
-
export class Label_44_ETA extends DecoderPlugin {
|
|
5
|
-
name = 'label-44-eta';
|
|
6
|
-
|
|
7
|
-
qualifiers() { // eslint-disable-line class-methods-use-this
|
|
8
|
-
return {
|
|
9
|
-
labels: ['44'],
|
|
10
|
-
preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
decode(message: any, options: any = {}) : any {
|
|
15
|
-
const decodeResult: any = this.defaultResult;
|
|
16
|
-
decodeResult.decoder.name = this.name;
|
|
17
|
-
decodeResult.formatted.description = 'ETA Report';
|
|
18
|
-
decodeResult.message = message;
|
|
19
|
-
|
|
20
|
-
// Style: IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1
|
|
21
|
-
// Match: IN02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons
|
|
22
|
-
const regex = /^IN02,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
|
|
23
|
-
const results = message.text.match(regex);
|
|
24
|
-
if (results) {
|
|
25
|
-
if (options.debug) {
|
|
26
|
-
console.log(`Label 44 ETA Report: groups`);
|
|
27
|
-
console.log(results.groups);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const coordsRegex = /(?<lac>[NS])(?<la>.+)\s*(?<lnc>[EW])(?<ln>.+)/;
|
|
31
|
-
const coordsResults = results.groups.unsplit_coords.match(coordsRegex);
|
|
32
|
-
|
|
33
|
-
decodeResult.raw.latitude_direction = coordsResults.groups.lac;
|
|
34
|
-
decodeResult.raw.latitude = Number(coordsResults.groups.la) / 1000;
|
|
35
|
-
decodeResult.raw.longitude_direction = coordsResults.groups.lnc;
|
|
36
|
-
decodeResult.raw.longitude = Number(coordsResults.groups.ln) / 1000;
|
|
37
|
-
decodeResult.raw.departure_icao = results.groups.departure_icao;
|
|
38
|
-
decodeResult.raw.arrival_icao = results.groups.arrival_icao;
|
|
39
|
-
decodeResult.raw.current_time = Date.parse(
|
|
40
|
-
new Date().getFullYear() + "-" +
|
|
41
|
-
results.groups.current_date.substr(0, 2) + "-" +
|
|
42
|
-
results.groups.current_date.substr(2, 2) + "T" +
|
|
43
|
-
results.groups.current_time.substr(0, 2) + ":" +
|
|
44
|
-
results.groups.current_time.substr(2, 2) + ":00Z"
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {
|
|
48
|
-
decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
decodeResult.formatted.items.push({
|
|
52
|
-
type: 'aircraft_position',
|
|
53
|
-
code: 'POS',
|
|
54
|
-
label: 'Aircraft Position',
|
|
55
|
-
value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
decodeResult.formatted.items.push({
|
|
59
|
-
type: 'origin',
|
|
60
|
-
code: 'ORG',
|
|
61
|
-
label: 'Origin',
|
|
62
|
-
value: decodeResult.raw.departure_icao,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
decodeResult.formatted.items.push({
|
|
66
|
-
type: 'destination',
|
|
67
|
-
code: 'DST',
|
|
68
|
-
label: 'Destination',
|
|
69
|
-
value: decodeResult.raw.arrival_icao,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
decodeResult.decoded = true;
|
|
75
|
-
decodeResult.decoder.decodeLevel = 'full';
|
|
76
|
-
|
|
77
|
-
return decodeResult;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export default {};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { DecoderPlugin } from '../DecoderPlugin';
|
|
2
|
-
|
|
3
|
-
// In Air Report
|
|
4
|
-
export class Label_44_IN extends DecoderPlugin {
|
|
5
|
-
name = 'label-44-in';
|
|
6
|
-
|
|
7
|
-
qualifiers() { // eslint-disable-line class-methods-use-this
|
|
8
|
-
return {
|
|
9
|
-
labels: ['44'],
|
|
10
|
-
preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
decode(message: any, options: any = {}) : any {
|
|
15
|
-
const decodeResult: any = this.defaultResult;
|
|
16
|
-
decodeResult.decoder.name = this.name;
|
|
17
|
-
decodeResult.formatted.description = 'In Air Report';
|
|
18
|
-
decodeResult.message = message;
|
|
19
|
-
|
|
20
|
-
// Style: IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1
|
|
21
|
-
// Match: IN02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons
|
|
22
|
-
const regex = /^IN02,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;
|
|
23
|
-
const results = message.text.match(regex);
|
|
24
|
-
if (results) {
|
|
25
|
-
if (options.debug) {
|
|
26
|
-
console.log(`Label 44 In Air Report: groups`);
|
|
27
|
-
console.log(results.groups);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const coordsRegex = /(?<lac>[NS])(?<la>.+)\s*(?<lnc>[EW])(?<ln>.+)/;
|
|
31
|
-
const coordsResults = results.groups.unsplit_coords.match(coordsRegex);
|
|
32
|
-
|
|
33
|
-
decodeResult.raw.latitude_direction = coordsResults.groups.lac;
|
|
34
|
-
decodeResult.raw.latitude = Number(coordsResults.groups.la) / 1000;
|
|
35
|
-
decodeResult.raw.longitude_direction = coordsResults.groups.lnc;
|
|
36
|
-
decodeResult.raw.longitude = Number(coordsResults.groups.ln) / 1000;
|
|
37
|
-
decodeResult.raw.departure_icao = results.groups.departure_icao;
|
|
38
|
-
decodeResult.raw.arrival_icao = results.groups.arrival_icao;
|
|
39
|
-
decodeResult.raw.current_time = Date.parse(
|
|
40
|
-
new Date().getFullYear() + "-" +
|
|
41
|
-
results.groups.current_date.substr(0, 2) + "-" +
|
|
42
|
-
results.groups.current_date.substr(2, 2) + "T" +
|
|
43
|
-
results.groups.current_time.substr(0, 2) + ":" +
|
|
44
|
-
results.groups.current_time.substr(2, 2) + ":00Z"
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {
|
|
48
|
-
decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
decodeResult.formatted.items.push({
|
|
52
|
-
type: 'aircraft_position',
|
|
53
|
-
code: 'POS',
|
|
54
|
-
label: 'Aircraft Position',
|
|
55
|
-
value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
decodeResult.formatted.items.push({
|
|
59
|
-
type: 'origin',
|
|
60
|
-
code: 'ORG',
|
|
61
|
-
label: 'Origin',
|
|
62
|
-
value: decodeResult.raw.departure_icao,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
decodeResult.formatted.items.push({
|
|
66
|
-
type: 'destination',
|
|
67
|
-
code: 'DST',
|
|
68
|
-
label: 'Destination',
|
|
69
|
-
value: decodeResult.raw.arrival_icao,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
decodeResult.decoded = true;
|
|
75
|
-
decodeResult.decoder.decodeLevel = 'full';
|
|
76
|
-
|
|
77
|
-
return decodeResult;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export default {};
|