@airframes/acars-decoder 1.4.3 → 1.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DateTimeUtils.d.ts +8 -0
- package/dist/DateTimeUtils.js +27 -0
- package/dist/DecoderPlugin.d.ts +3 -1
- package/dist/DecoderPlugin.js +3 -1
- package/dist/IcaoDecoder.d.ts +3 -1
- package/dist/IcaoDecoder.js +3 -1
- package/dist/MessageDecoder.d.ts +3 -1
- package/dist/MessageDecoder.js +5 -1
- package/dist/bin/acars-decoder-test.js +9 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +20 -0
- package/dist/plugins/Label_16_N_Space.d.ts +11 -0
- package/dist/plugins/Label_16_N_Space.js +80 -0
- package/dist/plugins/Label_16_N_Space.test.d.ts +1 -0
- package/dist/plugins/Label_16_N_Space.test.js +84 -0
- package/dist/plugins/Label_1M_Slash.js +2 -4
- package/dist/plugins/Label_1M_Slash.test.js +3 -3
- package/dist/plugins/Label_30_Slash_EA.d.ts +11 -0
- package/dist/plugins/Label_30_Slash_EA.js +54 -0
- package/dist/plugins/Label_30_Slash_EA.test.d.ts +1 -0
- package/dist/plugins/Label_30_Slash_EA.test.js +35 -0
- package/dist/plugins/Label_8E.js +2 -9
- package/dist/plugins/Label_8E.test.js +3 -3
- package/dist/plugins/official.d.ts +2 -0
- package/dist/plugins/official.js +2 -0
- package/package.json +12 -3
- package/src/DateTimeUtils.ts +26 -0
- package/src/DecoderPlugin.ts +83 -0
- package/src/DecoderPluginInterface.ts +9 -0
- package/src/IcaoDecoder.ts +137 -0
- package/src/MessageDecoder.ts +117 -0
- package/src/bin/acars-decoder-test.ts +67 -0
- package/src/bin/acars-decoder.ts +23 -0
- package/src/index.d.ts +15 -0
- package/src/index.ts +4 -0
- package/src/plugins/Label_15.ts +45 -0
- package/src/plugins/Label_16_N_Space.test.ts +94 -0
- package/src/plugins/Label_16_N_Space.ts +91 -0
- package/src/plugins/Label_1M_Slash.test.ts +45 -0
- package/src/plugins/Label_1M_Slash.ts +69 -0
- package/src/plugins/Label_20_CFB.01.ts +81 -0
- package/src/plugins/Label_20_POS.ts +68 -0
- package/src/plugins/Label_30_Slash_EA.test.ts +37 -0
- package/src/plugins/Label_30_Slash_EA.ts +60 -0
- package/src/plugins/Label_44_ETA.ts +81 -0
- package/src/plugins/Label_44_IN.ts +81 -0
- package/src/plugins/Label_44_OFF.ts +88 -0
- package/src/plugins/Label_44_ON.ts +81 -0
- package/src/plugins/Label_44_POS.ts +96 -0
- package/src/plugins/Label_5Z.ts +125 -0
- package/src/plugins/Label_80.ts +215 -0
- package/src/plugins/Label_8E.test.ts +34 -0
- package/src/plugins/Label_8E.ts +55 -0
- package/src/plugins/Label_B6.ts +28 -0
- package/src/plugins/Label_ColonComma.ts +32 -0
- package/src/plugins/Label_H1.ts +18 -0
- package/src/plugins/Label_H1_M1BPOS.ts +60 -0
- package/src/plugins/Label_H1_M1BPRG.ts +40 -0
- package/src/plugins/Label_QP.ts +54 -0
- package/src/plugins/Label_QQ.ts +54 -0
- package/src/plugins/Label_QR.ts +54 -0
- package/src/plugins/Label_QS.ts +54 -0
- package/src/plugins/Label_SQ.ts +111 -0
- package/src/plugins/official.ts +22 -0
- package/tsconfig.json +2 -3
- package/index.d.ts +0 -17
- package/index.ts +0 -4
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class DateTimeUtils {
|
|
2
|
+
static UTCToString(UTCString: string): string;
|
|
3
|
+
static UTCDateTimeToString(dateString: string, timeString: string): string;
|
|
4
|
+
}
|
|
5
|
+
declare const _default: {
|
|
6
|
+
DateTimeUtils: typeof DateTimeUtils;
|
|
7
|
+
};
|
|
8
|
+
export default _default;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DateTimeUtils = void 0;
|
|
4
|
+
class DateTimeUtils {
|
|
5
|
+
// Expects a four digit UTC time string (HHMM)
|
|
6
|
+
static UTCToString(UTCString) {
|
|
7
|
+
let utcDate = new Date();
|
|
8
|
+
utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
|
|
9
|
+
return utcDate.toTimeString();
|
|
10
|
+
}
|
|
11
|
+
// Expects a six digit date string and a four digit UTC time string
|
|
12
|
+
// (DDMMYY) (HHMM)
|
|
13
|
+
static UTCDateTimeToString(dateString, timeString) {
|
|
14
|
+
let utcDate = new Date();
|
|
15
|
+
utcDate.setUTCDate(+dateString.substr(0, 2));
|
|
16
|
+
utcDate.setUTCMonth(+dateString.substr(2, 2));
|
|
17
|
+
if (dateString.length === 6) {
|
|
18
|
+
utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));
|
|
19
|
+
}
|
|
20
|
+
utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
|
|
21
|
+
return utcDate.toUTCString();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.DateTimeUtils = DateTimeUtils;
|
|
25
|
+
exports.default = {
|
|
26
|
+
DateTimeUtils,
|
|
27
|
+
};
|
package/dist/DecoderPlugin.d.ts
CHANGED
|
@@ -12,5 +12,7 @@ export declare abstract class DecoderPlugin implements DecoderPluginInterface {
|
|
|
12
12
|
decodeStringCoordinates(stringCoords: String): any;
|
|
13
13
|
coordinateString(coords: any): String;
|
|
14
14
|
}
|
|
15
|
-
declare const _default: {
|
|
15
|
+
declare const _default: {
|
|
16
|
+
DecoderPlugin: typeof DecoderPlugin;
|
|
17
|
+
};
|
|
16
18
|
export default _default;
|
package/dist/DecoderPlugin.js
CHANGED
package/dist/IcaoDecoder.d.ts
CHANGED
package/dist/IcaoDecoder.js
CHANGED
package/dist/MessageDecoder.d.ts
CHANGED
package/dist/MessageDecoder.js
CHANGED
|
@@ -13,7 +13,9 @@ class MessageDecoder {
|
|
|
13
13
|
this.registerPlugin(new Plugins.Label_ColonComma(this));
|
|
14
14
|
this.registerPlugin(new Plugins.Label_5Z(this));
|
|
15
15
|
this.registerPlugin(new Plugins.Label_15(this));
|
|
16
|
+
this.registerPlugin(new Plugins.Label_16_N_Space(this));
|
|
16
17
|
this.registerPlugin(new Plugins.Label_20_POS(this));
|
|
18
|
+
this.registerPlugin(new Plugins.Label_30_Slash_EA(this));
|
|
17
19
|
this.registerPlugin(new Plugins.Label_44_ETA(this));
|
|
18
20
|
this.registerPlugin(new Plugins.Label_44_IN(this));
|
|
19
21
|
this.registerPlugin(new Plugins.Label_44_OFF(this));
|
|
@@ -99,4 +101,6 @@ class MessageDecoder {
|
|
|
99
101
|
}
|
|
100
102
|
}
|
|
101
103
|
exports.MessageDecoder = MessageDecoder;
|
|
102
|
-
exports.default = {
|
|
104
|
+
exports.default = {
|
|
105
|
+
MessageDecoder,
|
|
106
|
+
};
|
|
@@ -25,6 +25,15 @@ function decode(label, text) {
|
|
|
25
25
|
const decoding = decoder.decode(message);
|
|
26
26
|
debugMessage(message, decoding);
|
|
27
27
|
}
|
|
28
|
+
// Label 16 with N space
|
|
29
|
+
decode('16', 'N 44.203,W 86.546,31965,6, 290');
|
|
30
|
+
decode('16', 'N 42.777,W 85.477,35004,6, 132');
|
|
31
|
+
decode('16', 'N 28.177/W 96.055');
|
|
32
|
+
decode('16', 'N 44.640/W119.729');
|
|
33
|
+
// Label 30 with slash EA
|
|
34
|
+
decode('30', '/EA1830/DSKSFO/SK24');
|
|
35
|
+
decode('30', '/EA1611/DSMMSD/SK24');
|
|
36
|
+
decode('30', '/EA1719/DSKSFO/SK23');
|
|
28
37
|
// Label 5Z
|
|
29
38
|
decode('5Z', '/R3 SNAORD 2205-14 SNA');
|
|
30
39
|
// Label 80 + 3N01 POSRPT
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./DateTimeUtils"), exports);
|
|
18
|
+
__exportStar(require("./DecoderPlugin"), exports);
|
|
19
|
+
__exportStar(require("./IcaoDecoder"), exports);
|
|
20
|
+
__exportStar(require("./MessageDecoder"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DecoderPlugin } from '../DecoderPlugin';
|
|
2
|
+
export declare class Label_16_N_Space extends DecoderPlugin {
|
|
3
|
+
name: string;
|
|
4
|
+
qualifiers(): {
|
|
5
|
+
labels: string[];
|
|
6
|
+
preambles: string[];
|
|
7
|
+
};
|
|
8
|
+
decode(message: any, options?: any): any;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: {};
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Label_16_N_Space = void 0;
|
|
4
|
+
const DecoderPlugin_1 = require("../DecoderPlugin");
|
|
5
|
+
class Label_16_N_Space extends DecoderPlugin_1.DecoderPlugin {
|
|
6
|
+
name = 'label-16-n-space';
|
|
7
|
+
qualifiers() {
|
|
8
|
+
return {
|
|
9
|
+
labels: ["16"],
|
|
10
|
+
preambles: ['N '],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
decode(message, options = {}) {
|
|
14
|
+
const decodeResult = this.defaultResult;
|
|
15
|
+
decodeResult.decoder.name = this.name;
|
|
16
|
+
decodeResult.formatted.description = 'Position Report';
|
|
17
|
+
decodeResult.message = message;
|
|
18
|
+
// Style: N 44.203,W 86.546,31965,6, 290
|
|
19
|
+
let variant1Regex = /^(?<lat>[NS])\s(?<lat_coord>.*),(?<long>[EW])\s(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\s(?<unkwn2>.*)$/;
|
|
20
|
+
// Style: N 28.177/W 96.055
|
|
21
|
+
let variant2Regex = /^(?<lat>[NS])\s(?<lat_coord>.*)\/(?<long>[EW])\s?(?<long_coord>.*)$/;
|
|
22
|
+
let results;
|
|
23
|
+
if (results = message.text.match(variant1Regex)) {
|
|
24
|
+
if (options.debug) {
|
|
25
|
+
console.log(`Label 16 N : results`);
|
|
26
|
+
console.log(results);
|
|
27
|
+
}
|
|
28
|
+
decodeResult.raw.latitude_direction = results.groups.lat;
|
|
29
|
+
decodeResult.raw.latitude = Number(results.groups.lat_coord);
|
|
30
|
+
decodeResult.raw.longitude_direction = results.groups.long;
|
|
31
|
+
decodeResult.raw.longitude = Number(results.groups.long_coord);
|
|
32
|
+
decodeResult.raw.flight_level = results.groups.alt == 'GRD' || results.groups.alt == '***' ? '0' : Number(results.groups.alt);
|
|
33
|
+
decodeResult.formatted.items.push({
|
|
34
|
+
type: 'aircraft_position',
|
|
35
|
+
code: 'POS',
|
|
36
|
+
label: 'Aircraft Position',
|
|
37
|
+
value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
|
|
38
|
+
});
|
|
39
|
+
decodeResult.formatted.items.push({
|
|
40
|
+
type: 'flight_level',
|
|
41
|
+
code: 'FL',
|
|
42
|
+
label: 'Flight Level',
|
|
43
|
+
value: decodeResult.raw.flight_level,
|
|
44
|
+
});
|
|
45
|
+
decodeResult.remaining.text = `,${results.groups.unkwn1} ,${results.groups.unkwn2}`;
|
|
46
|
+
decodeResult.decoded = true;
|
|
47
|
+
decodeResult.decoder.decodeLevel = 'partial';
|
|
48
|
+
}
|
|
49
|
+
else if (results = message.text.match(variant2Regex)) {
|
|
50
|
+
if (options.debug) {
|
|
51
|
+
console.log(`Label 16 N : results`);
|
|
52
|
+
console.log(results);
|
|
53
|
+
}
|
|
54
|
+
decodeResult.raw.latitude_direction = results.groups.lat;
|
|
55
|
+
decodeResult.raw.latitude = Number(results.groups.lat_coord);
|
|
56
|
+
decodeResult.raw.longitude_direction = results.groups.long;
|
|
57
|
+
decodeResult.raw.longitude = Number(results.groups.long_coord);
|
|
58
|
+
decodeResult.formatted.items.push({
|
|
59
|
+
type: 'aircraft_position',
|
|
60
|
+
code: 'POS',
|
|
61
|
+
label: 'Aircraft Position',
|
|
62
|
+
value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
|
|
63
|
+
});
|
|
64
|
+
decodeResult.decoded = true;
|
|
65
|
+
decodeResult.decoder.decodeLevel = 'full';
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Unknown
|
|
69
|
+
if (options.debug) {
|
|
70
|
+
console.log(`Decoder: Unknown 16 message: ${message.text}`);
|
|
71
|
+
}
|
|
72
|
+
decodeResult.remaining.text = message.text;
|
|
73
|
+
decodeResult.decoded = false;
|
|
74
|
+
decodeResult.decoder.decodeLevel = 'none';
|
|
75
|
+
}
|
|
76
|
+
return decodeResult;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.Label_16_N_Space = Label_16_N_Space;
|
|
80
|
+
exports.default = {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const MessageDecoder_1 = require("../MessageDecoder");
|
|
4
|
+
const Label_16_N_Space_1 = require("./Label_16_N_Space");
|
|
5
|
+
test('decodes Label 16 variant 1', () => {
|
|
6
|
+
const decoder = new MessageDecoder_1.MessageDecoder();
|
|
7
|
+
const decoderPlugin = new Label_16_N_Space_1.Label_16_N_Space(decoder);
|
|
8
|
+
expect(decoderPlugin.decode).toBeDefined();
|
|
9
|
+
expect(decoderPlugin.name).toBe('label-16-n-space');
|
|
10
|
+
expect(decoderPlugin.qualifiers).toBeDefined();
|
|
11
|
+
expect(decoderPlugin.qualifiers()).toEqual({
|
|
12
|
+
labels: ['16'],
|
|
13
|
+
preambles: ['N '],
|
|
14
|
+
});
|
|
15
|
+
const text = 'N 44.203,W 86.546,31965,6, 290';
|
|
16
|
+
const decodeResult = decoderPlugin.decode({ text: text });
|
|
17
|
+
console.log(JSON.stringify(decodeResult, null, 2));
|
|
18
|
+
expect(decodeResult.decoded).toBe(true);
|
|
19
|
+
expect(decodeResult.decoder.decodeLevel).toBe('partial');
|
|
20
|
+
expect(decodeResult.decoder.name).toBe('label-16-n-space');
|
|
21
|
+
expect(decodeResult.formatted.description).toBe('Position Report');
|
|
22
|
+
expect(decodeResult.message.text).toBe(text);
|
|
23
|
+
expect(decodeResult.raw.latitude_direction).toBe('N');
|
|
24
|
+
expect(decodeResult.raw.latitude).toBe(44.203);
|
|
25
|
+
expect(decodeResult.raw.longitude_direction).toBe('W');
|
|
26
|
+
expect(decodeResult.raw.longitude).toBe(86.546);
|
|
27
|
+
expect(decodeResult.raw.flight_level).toBe(31965);
|
|
28
|
+
expect(decodeResult.formatted.items.length).toBe(2);
|
|
29
|
+
expect(decodeResult.formatted.items[0].type).toBe('aircraft_position');
|
|
30
|
+
expect(decodeResult.formatted.items[0].code).toBe('POS');
|
|
31
|
+
expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
|
|
32
|
+
expect(decodeResult.formatted.items[0].value).toBe('44.203 N, 86.546 W');
|
|
33
|
+
expect(decodeResult.formatted.items[1].type).toBe('flight_level');
|
|
34
|
+
expect(decodeResult.formatted.items[1].code).toBe('FL');
|
|
35
|
+
expect(decodeResult.formatted.items[1].label).toBe('Flight Level');
|
|
36
|
+
expect(decodeResult.formatted.items[1].value).toBe(31965);
|
|
37
|
+
});
|
|
38
|
+
test('decodes Label 16 variant 2', () => {
|
|
39
|
+
const decoder = new MessageDecoder_1.MessageDecoder();
|
|
40
|
+
const decoderPlugin = new Label_16_N_Space_1.Label_16_N_Space(decoder);
|
|
41
|
+
expect(decoderPlugin.decode).toBeDefined();
|
|
42
|
+
expect(decoderPlugin.name).toBe('label-16-n-space');
|
|
43
|
+
expect(decoderPlugin.qualifiers).toBeDefined();
|
|
44
|
+
expect(decoderPlugin.qualifiers()).toEqual({
|
|
45
|
+
labels: ['16'],
|
|
46
|
+
preambles: ['N '],
|
|
47
|
+
});
|
|
48
|
+
const text = 'N 28.177/W 96.055';
|
|
49
|
+
const decodeResult = decoderPlugin.decode({ text: text });
|
|
50
|
+
console.log(JSON.stringify(decodeResult, null, 2));
|
|
51
|
+
expect(decodeResult.decoded).toBe(true);
|
|
52
|
+
expect(decodeResult.decoder.decodeLevel).toBe('full');
|
|
53
|
+
expect(decodeResult.decoder.name).toBe('label-16-n-space');
|
|
54
|
+
expect(decodeResult.formatted.description).toBe('Position Report');
|
|
55
|
+
expect(decodeResult.message.text).toBe(text);
|
|
56
|
+
expect(decodeResult.raw.latitude_direction).toBe('N');
|
|
57
|
+
expect(decodeResult.raw.latitude).toBe(28.177);
|
|
58
|
+
expect(decodeResult.raw.longitude_direction).toBe('W');
|
|
59
|
+
expect(decodeResult.raw.longitude).toBe(96.055);
|
|
60
|
+
expect(decodeResult.formatted.items.length).toBe(1);
|
|
61
|
+
expect(decodeResult.formatted.items[0].type).toBe('aircraft_position');
|
|
62
|
+
expect(decodeResult.formatted.items[0].code).toBe('POS');
|
|
63
|
+
expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
|
|
64
|
+
expect(decodeResult.formatted.items[0].value).toBe('28.177 N, 96.055 W');
|
|
65
|
+
});
|
|
66
|
+
test('decodes Label 16 variant <invalid>', () => {
|
|
67
|
+
const decoder = new MessageDecoder_1.MessageDecoder();
|
|
68
|
+
const decoderPlugin = new Label_16_N_Space_1.Label_16_N_Space(decoder);
|
|
69
|
+
expect(decoderPlugin.decode).toBeDefined();
|
|
70
|
+
expect(decoderPlugin.name).toBe('label-16-n-space');
|
|
71
|
+
expect(decoderPlugin.qualifiers).toBeDefined();
|
|
72
|
+
expect(decoderPlugin.qualifiers()).toEqual({
|
|
73
|
+
labels: ['16'],
|
|
74
|
+
preambles: ['N '],
|
|
75
|
+
});
|
|
76
|
+
const text = 'N Bogus message';
|
|
77
|
+
const decodeResult = decoderPlugin.decode({ text: text });
|
|
78
|
+
console.log(JSON.stringify(decodeResult, null, 2));
|
|
79
|
+
expect(decodeResult.decoded).toBe(false);
|
|
80
|
+
expect(decodeResult.decoder.decodeLevel).toBe('none');
|
|
81
|
+
expect(decodeResult.decoder.name).toBe('label-16-n-space');
|
|
82
|
+
expect(decodeResult.formatted.description).toBe('Position Report');
|
|
83
|
+
expect(decodeResult.message.text).toBe(text);
|
|
84
|
+
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Label_1M_Slash = void 0;
|
|
4
|
+
const DateTimeUtils_1 = require("../DateTimeUtils");
|
|
4
5
|
const DecoderPlugin_1 = require("../DecoderPlugin");
|
|
5
6
|
class Label_1M_Slash extends DecoderPlugin_1.DecoderPlugin {
|
|
6
7
|
name = 'label-1m-slash';
|
|
@@ -32,14 +33,11 @@ class Label_1M_Slash extends DecoderPlugin_1.DecoderPlugin {
|
|
|
32
33
|
// results[7] 1940 - UTC eta
|
|
33
34
|
decodeResult.raw.arrival_runway = results[8].replace(decodeResult.raw.arrival_icao, ""); // results[8] EGLL27L
|
|
34
35
|
// results[9]: 10(space) (???)
|
|
35
|
-
decodeResult.raw.arrival_eta = new Date();
|
|
36
|
-
decodeResult.raw.arrival_eta.setUTCDate(results[2].substring(0, 2), results[2].substring(2, 2), results[2].substring(4, 2));
|
|
37
|
-
decodeResult.raw.arrival_eta.setUTCHours(results[7].substr(0, 2), results[7].substr(2, 2), 0);
|
|
38
36
|
decodeResult.formatted.items.push({
|
|
39
37
|
type: 'eta',
|
|
40
38
|
code: 'ETA',
|
|
41
39
|
label: 'Estimated Time of Arrival',
|
|
42
|
-
value:
|
|
40
|
+
value: DateTimeUtils_1.DateTimeUtils.UTCDateTimeToString(results[2], results[7]),
|
|
43
41
|
});
|
|
44
42
|
decodeResult.formatted.items.push({
|
|
45
43
|
type: 'destination',
|
|
@@ -21,8 +21,6 @@ test('decodes Label 8E sample 1', () => {
|
|
|
21
21
|
expect(decodeResult.formatted.description).toBe('ETA Report');
|
|
22
22
|
expect(decodeResult.message.text).toBe(text);
|
|
23
23
|
expect(decodeResult.raw.alternate_icao).toBe('EGSS');
|
|
24
|
-
expect(decodeResult.raw.arrival_eta.getUTCHours()).toBe(19);
|
|
25
|
-
expect(decodeResult.raw.arrival_eta.getUTCMinutes()).toBe(40);
|
|
26
24
|
expect(decodeResult.raw.arrival_icao).toBe('EGLL');
|
|
27
25
|
expect(decodeResult.raw.arrival_runway).toBe('27L');
|
|
28
26
|
expect(decodeResult.raw.departure_icao).toBe('LDSP');
|
|
@@ -31,7 +29,9 @@ test('decodes Label 8E sample 1', () => {
|
|
|
31
29
|
expect(decodeResult.formatted.items[0].type).toBe('eta');
|
|
32
30
|
expect(decodeResult.formatted.items[0].code).toBe('ETA');
|
|
33
31
|
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
|
|
34
|
-
|
|
32
|
+
// Check for the minutes as typescript doesn't have a UTC time string method
|
|
33
|
+
// so the hour will depend on the test host timezone.
|
|
34
|
+
expect(decodeResult.formatted.items[0].value.includes('40')).toBe(true);
|
|
35
35
|
expect(decodeResult.formatted.items[1].type).toBe('destination');
|
|
36
36
|
expect(decodeResult.formatted.items[1].code).toBe('DST');
|
|
37
37
|
expect(decodeResult.formatted.items[1].label).toBe('Destination');
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DecoderPlugin } from '../DecoderPlugin';
|
|
2
|
+
export declare class Label_30_Slash_EA extends DecoderPlugin {
|
|
3
|
+
name: string;
|
|
4
|
+
qualifiers(): {
|
|
5
|
+
labels: string[];
|
|
6
|
+
preambles: string[];
|
|
7
|
+
};
|
|
8
|
+
decode(message: any, options?: any): any;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: {};
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Label_30_Slash_EA = void 0;
|
|
4
|
+
const DateTimeUtils_1 = require("../DateTimeUtils");
|
|
5
|
+
const DecoderPlugin_1 = require("../DecoderPlugin");
|
|
6
|
+
class Label_30_Slash_EA extends DecoderPlugin_1.DecoderPlugin {
|
|
7
|
+
name = 'label-30-slash-ea';
|
|
8
|
+
qualifiers() {
|
|
9
|
+
return {
|
|
10
|
+
labels: ["30"],
|
|
11
|
+
preambles: ['/EA'],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
decode(message, options = {}) {
|
|
15
|
+
const decodeResult = this.defaultResult;
|
|
16
|
+
decodeResult.decoder.name = this.name;
|
|
17
|
+
decodeResult.formatted.description = 'ETA Report';
|
|
18
|
+
decodeResult.message = message;
|
|
19
|
+
// Style: /EA1830/DSKSFO/SK24
|
|
20
|
+
const results = message.text.split(/\n|\//).slice(1); // Split by / and new line
|
|
21
|
+
if (results) {
|
|
22
|
+
if (options.debug) {
|
|
23
|
+
console.log(`Label 30 EA: results`);
|
|
24
|
+
console.log(results);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
decodeResult.formatted.items.push({
|
|
28
|
+
type: 'eta',
|
|
29
|
+
code: 'ETA',
|
|
30
|
+
label: 'Estimated Time of Arrival',
|
|
31
|
+
value: DateTimeUtils_1.DateTimeUtils.UTCToString(results[0].substr(2, 4)),
|
|
32
|
+
});
|
|
33
|
+
if (results[1].substr(0, 2) === "DS") {
|
|
34
|
+
decodeResult.raw.arrival_icao = results[1].substr(2, 4);
|
|
35
|
+
decodeResult.formatted.items.push({
|
|
36
|
+
type: 'destination',
|
|
37
|
+
code: 'DST',
|
|
38
|
+
label: 'Destination',
|
|
39
|
+
value: decodeResult.raw.arrival_icao,
|
|
40
|
+
});
|
|
41
|
+
// We don't know what the /SK section means. We have seen various numbers
|
|
42
|
+
// after the /SK.
|
|
43
|
+
decodeResult.remaining.text = "/".concat(results[2]);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
decodeResult.remaining.text = "/".concat(results[1], "/", results[2]);
|
|
47
|
+
}
|
|
48
|
+
decodeResult.decoded = true;
|
|
49
|
+
decodeResult.decoder.decodeLevel = 'partial';
|
|
50
|
+
return decodeResult;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.Label_30_Slash_EA = Label_30_Slash_EA;
|
|
54
|
+
exports.default = {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const MessageDecoder_1 = require("../MessageDecoder");
|
|
4
|
+
const Label_30_Slash_EA_1 = require("./Label_30_Slash_EA");
|
|
5
|
+
test('decodes Label 30 sample 1', () => {
|
|
6
|
+
const decoder = new MessageDecoder_1.MessageDecoder();
|
|
7
|
+
const decoderPlugin = new Label_30_Slash_EA_1.Label_30_Slash_EA(decoder);
|
|
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
|
+
const text = '/EA1719/DSKSFO/SK23';
|
|
16
|
+
const decodeResult = decoderPlugin.decode({ text: text });
|
|
17
|
+
console.log(JSON.stringify(decodeResult, null, 2));
|
|
18
|
+
expect(decodeResult.decoded).toBe(true);
|
|
19
|
+
expect(decodeResult.decoder.decodeLevel).toBe('partial');
|
|
20
|
+
expect(decodeResult.decoder.name).toBe('label-30-slash-ea');
|
|
21
|
+
expect(decodeResult.formatted.description).toBe('ETA Report');
|
|
22
|
+
expect(decodeResult.message.text).toBe(text);
|
|
23
|
+
expect(decodeResult.raw.arrival_icao).toBe('KSFO');
|
|
24
|
+
expect(decodeResult.formatted.items.length).toBe(2);
|
|
25
|
+
expect(decodeResult.formatted.items[0].type).toBe('eta');
|
|
26
|
+
expect(decodeResult.formatted.items[0].code).toBe('ETA');
|
|
27
|
+
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
|
|
28
|
+
// This test is a bit rough as typescript doesn't have a UTC time string
|
|
29
|
+
// method so the hour will be depend on the test host timezone.
|
|
30
|
+
expect(decodeResult.formatted.items[0].value.includes('19')).toBe(true);
|
|
31
|
+
expect(decodeResult.formatted.items[1].type).toBe('destination');
|
|
32
|
+
expect(decodeResult.formatted.items[1].code).toBe('DST');
|
|
33
|
+
expect(decodeResult.formatted.items[1].label).toBe('Destination');
|
|
34
|
+
expect(decodeResult.formatted.items[1].value).toBe('KSFO');
|
|
35
|
+
});
|
package/dist/plugins/Label_8E.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Label_8E = void 0;
|
|
4
|
+
const DateTimeUtils_1 = require("../DateTimeUtils");
|
|
4
5
|
const DecoderPlugin_1 = require("../DecoderPlugin");
|
|
5
6
|
// ETA
|
|
6
7
|
class Label_8E extends DecoderPlugin_1.DecoderPlugin {
|
|
@@ -24,19 +25,11 @@ class Label_8E extends DecoderPlugin_1.DecoderPlugin {
|
|
|
24
25
|
console.log(`Label 8E ETA: groups`);
|
|
25
26
|
console.log(results.groups);
|
|
26
27
|
}
|
|
27
|
-
decodeResult.raw.arrival_eta = new Date();
|
|
28
|
-
decodeResult.raw.arrival_eta.setUTCHours(results.groups.arrival_eta.substr(0, 2), results.groups.arrival_eta.substr(2, 2));
|
|
29
|
-
if (new Date().getUTCHours() > decodeResult.raw.arrival_eta.getUTCHours()) { // Check if ETA is in the past, which would imply it is for the next day
|
|
30
|
-
if (options.debug) {
|
|
31
|
-
console.log("Label 8E: Moving ETA to subsequent day");
|
|
32
|
-
}
|
|
33
|
-
decodeResult.raw.arrival_eta.setDate(decodeResult.raw.arrival_eta.getDate() + 1);
|
|
34
|
-
}
|
|
35
28
|
decodeResult.formatted.items.push({
|
|
36
29
|
type: 'eta',
|
|
37
30
|
code: 'ETA',
|
|
38
31
|
label: 'Estimated Time of Arrival',
|
|
39
|
-
value:
|
|
32
|
+
value: DateTimeUtils_1.DateTimeUtils.UTCToString(results.groups.arrival_eta),
|
|
40
33
|
});
|
|
41
34
|
decodeResult.raw.arrival_icao = results.groups.arrival_icao;
|
|
42
35
|
decodeResult.formatted.items.push({
|
|
@@ -17,14 +17,14 @@ test('decodes Label 8E sample 1', () => {
|
|
|
17
17
|
expect(decodeResult.decoder.name).toBe('label-8e');
|
|
18
18
|
expect(decodeResult.formatted.description).toBe('ETA Report');
|
|
19
19
|
expect(decodeResult.message.text).toBe('EGSS,1618');
|
|
20
|
-
expect(decodeResult.raw.arrival_eta.getUTCHours()).toBe(16);
|
|
21
|
-
expect(decodeResult.raw.arrival_eta.getUTCMinutes()).toBe(18);
|
|
22
20
|
expect(decodeResult.raw.arrival_icao).toBe('EGSS');
|
|
23
21
|
expect(decodeResult.formatted.items.length).toBe(2);
|
|
24
22
|
expect(decodeResult.formatted.items[0].type).toBe('eta');
|
|
25
23
|
expect(decodeResult.formatted.items[0].code).toBe('ETA');
|
|
26
24
|
expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
|
|
27
|
-
|
|
25
|
+
// Check for the minutes as typescript doesn't have a UTC time string method
|
|
26
|
+
// so the hour will depend on the test host timezone.
|
|
27
|
+
expect(decodeResult.formatted.items[0].value.includes('18')).toBe(true);
|
|
28
28
|
expect(decodeResult.formatted.items[1].type).toBe('destination');
|
|
29
29
|
expect(decodeResult.formatted.items[1].code).toBe('DST');
|
|
30
30
|
expect(decodeResult.formatted.items[1].label).toBe('Destination');
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './Label_5Z';
|
|
2
2
|
export * from './Label_15';
|
|
3
|
+
export * from './Label_16_N_Space';
|
|
3
4
|
export * from './Label_20_POS';
|
|
5
|
+
export * from './Label_30_Slash_EA';
|
|
4
6
|
export * from './Label_44_ETA';
|
|
5
7
|
export * from './Label_44_IN';
|
|
6
8
|
export * from './Label_44_OFF';
|
package/dist/plugins/official.js
CHANGED
|
@@ -16,7 +16,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./Label_5Z"), exports);
|
|
18
18
|
__exportStar(require("./Label_15"), exports);
|
|
19
|
+
__exportStar(require("./Label_16_N_Space"), exports);
|
|
19
20
|
__exportStar(require("./Label_20_POS"), exports);
|
|
21
|
+
__exportStar(require("./Label_30_Slash_EA"), exports);
|
|
20
22
|
__exportStar(require("./Label_44_ETA"), exports);
|
|
21
23
|
__exportStar(require("./Label_44_IN"), exports);
|
|
22
24
|
__exportStar(require("./Label_44_OFF"), exports);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@airframes/acars-decoder",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.5",
|
|
4
4
|
"description": "ACARS Message Decoder for TypeScript/JavaScript",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -20,8 +20,17 @@
|
|
|
20
20
|
"url": "https://github.com/airframesio/acars-decoder-typescript/issues"
|
|
21
21
|
},
|
|
22
22
|
"homepage": "https://github.com/airframesio/acars-decoder-typescript#readme",
|
|
23
|
-
"
|
|
24
|
-
|
|
23
|
+
"keywords": [
|
|
24
|
+
"acars",
|
|
25
|
+
"decoder",
|
|
26
|
+
"airframes",
|
|
27
|
+
"airframes.io",
|
|
28
|
+
"airframesio",
|
|
29
|
+
"ts",
|
|
30
|
+
"typescript"
|
|
31
|
+
],
|
|
32
|
+
"author": "Kevin Elliott <kevin@airframes.io>",
|
|
33
|
+
"license": "MIT",
|
|
25
34
|
"dependencies": {
|
|
26
35
|
"@types/node": "^14.14.22"
|
|
27
36
|
},
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class DateTimeUtils {
|
|
2
|
+
|
|
3
|
+
// Expects a four digit UTC time string (HHMM)
|
|
4
|
+
public static UTCToString(UTCString: string) {
|
|
5
|
+
let utcDate = new Date();
|
|
6
|
+
utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
|
|
7
|
+
return utcDate.toTimeString();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Expects a six digit date string and a four digit UTC time string
|
|
11
|
+
// (DDMMYY) (HHMM)
|
|
12
|
+
public static UTCDateTimeToString(dateString: string, timeString: string) {
|
|
13
|
+
let utcDate = new Date();
|
|
14
|
+
utcDate.setUTCDate(+dateString.substr(0, 2));
|
|
15
|
+
utcDate.setUTCMonth(+dateString.substr(2, 2));
|
|
16
|
+
if (dateString.length === 6) {
|
|
17
|
+
utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));
|
|
18
|
+
}
|
|
19
|
+
utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
|
|
20
|
+
return utcDate.toUTCString();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default {
|
|
25
|
+
DateTimeUtils,
|
|
26
|
+
};
|