@airframes/acars-decoder 1.4.4 → 1.4.6

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.
Files changed (66) hide show
  1. package/dist/DateTimeUtils.d.ts +8 -0
  2. package/dist/DateTimeUtils.js +27 -0
  3. package/dist/DecoderPlugin.d.ts +3 -1
  4. package/dist/DecoderPlugin.js +3 -1
  5. package/dist/IcaoDecoder.d.ts +3 -1
  6. package/dist/IcaoDecoder.js +3 -1
  7. package/dist/MessageDecoder.d.ts +3 -1
  8. package/dist/MessageDecoder.js +29 -2
  9. package/dist/bin/acars-decoder-test.js +9 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.js +20 -0
  12. package/dist/plugins/Label_16_N_Space.d.ts +11 -0
  13. package/dist/plugins/Label_16_N_Space.js +80 -0
  14. package/dist/plugins/Label_16_N_Space.test.d.ts +1 -0
  15. package/dist/plugins/Label_16_N_Space.test.js +84 -0
  16. package/dist/plugins/Label_1M_Slash.js +2 -4
  17. package/dist/plugins/Label_1M_Slash.test.js +3 -3
  18. package/dist/plugins/Label_30_Slash_EA.d.ts +11 -0
  19. package/dist/plugins/Label_30_Slash_EA.js +54 -0
  20. package/dist/plugins/Label_30_Slash_EA.test.d.ts +1 -0
  21. package/dist/plugins/Label_30_Slash_EA.test.js +35 -0
  22. package/dist/plugins/Label_8E.js +2 -9
  23. package/dist/plugins/Label_8E.test.js +3 -3
  24. package/dist/plugins/official.d.ts +2 -0
  25. package/dist/plugins/official.js +2 -0
  26. package/package.json +12 -3
  27. package/src/DateTimeUtils.ts +26 -0
  28. package/src/DecoderPlugin.ts +83 -0
  29. package/src/DecoderPluginInterface.ts +9 -0
  30. package/src/IcaoDecoder.ts +137 -0
  31. package/src/MessageDecoder.ts +117 -0
  32. package/src/bin/acars-decoder-test.ts +67 -0
  33. package/src/bin/acars-decoder.ts +23 -0
  34. package/{index.d.ts → src/index.d.ts} +1 -0
  35. package/src/index.ts +4 -0
  36. package/src/plugins/Label_15.ts +45 -0
  37. package/src/plugins/Label_16_N_Space.test.ts +94 -0
  38. package/src/plugins/Label_16_N_Space.ts +91 -0
  39. package/src/plugins/Label_1M_Slash.test.ts +45 -0
  40. package/src/plugins/Label_1M_Slash.ts +69 -0
  41. package/src/plugins/Label_20_CFB.01.ts +81 -0
  42. package/src/plugins/Label_20_POS.ts +68 -0
  43. package/src/plugins/Label_30_Slash_EA.test.ts +37 -0
  44. package/src/plugins/Label_30_Slash_EA.ts +60 -0
  45. package/src/plugins/Label_44_ETA.ts +81 -0
  46. package/src/plugins/Label_44_IN.ts +81 -0
  47. package/src/plugins/Label_44_OFF.ts +88 -0
  48. package/src/plugins/Label_44_ON.ts +81 -0
  49. package/src/plugins/Label_44_POS.ts +96 -0
  50. package/src/plugins/Label_5Z.ts +125 -0
  51. package/src/plugins/Label_80.ts +215 -0
  52. package/src/plugins/Label_8E.test.ts +34 -0
  53. package/src/plugins/Label_8E.ts +55 -0
  54. package/src/plugins/Label_B6.ts +28 -0
  55. package/src/plugins/Label_ColonComma.ts +32 -0
  56. package/src/plugins/Label_H1.ts +18 -0
  57. package/src/plugins/Label_H1_M1BPOS.ts +60 -0
  58. package/src/plugins/Label_H1_M1BPRG.ts +40 -0
  59. package/src/plugins/Label_QP.ts +54 -0
  60. package/src/plugins/Label_QQ.ts +54 -0
  61. package/src/plugins/Label_QR.ts +54 -0
  62. package/src/plugins/Label_QS.ts +54 -0
  63. package/src/plugins/Label_SQ.ts +111 -0
  64. package/src/plugins/official.ts +22 -0
  65. package/tsconfig.json +2 -2
  66. package/index.ts +0 -4
@@ -0,0 +1,60 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+
3
+ export class Label_H1_M1BPOS extends DecoderPlugin { // eslint-disable-line camelcase
4
+ name = 'label-h1-m1bpos';
5
+
6
+ qualifiers() { // eslint-disable-line class-methods-use-this
7
+ return {
8
+ labels: ['H1'],
9
+ preambles: ['#M1BPOS'],
10
+ };
11
+ }
12
+
13
+ decode(message: any, options: any = {}) : any {
14
+ const decodeResult: any = this.defaultResult;
15
+ decodeResult.decoder.name = this.name;
16
+
17
+ if (options.debug) {
18
+ console.log('DECODER: #M1BPOS detected');
19
+ }
20
+ const parts = message.text.replace('#M1BPOS', '').split('/');
21
+ const firstHalf = parts[0];
22
+ const secondHalf = parts[1];
23
+ const items = firstHalf.split(',');
24
+
25
+ const coordsRegex = /(?<lac>[NS])(?<la>.+)\s*(?<lnc>[EW])(?<ln>.+)/;
26
+ const results = items[0].match(coordsRegex);
27
+
28
+ if (results && results.length >= 4) {
29
+ decodeResult.raw.position = {
30
+ latitudeDirection: results.groups.lac,
31
+ latitude: (results.groups.la / 1000) * (results.groups.lac === 'S' ? -1 : 1),
32
+ longitudeDirection: results.groups.lnc,
33
+ longitude: (results.groups.ln / 1000) * (results.groups.lnc === 'W' ? -1 : 1),
34
+ };
35
+
36
+ let route = items.slice(1).filter((part: any) => !/^\d(.+)$/.test(part));
37
+ route = route.map((hop: any) => hop || '?');
38
+ decodeResult.raw.route = route;
39
+
40
+ decodeResult.formatted.description = 'Position Report';
41
+ decodeResult.formatted.items = {
42
+ coordinates: {
43
+ label: 'Position',
44
+ value: this.coordinateString(decodeResult.raw.position),
45
+ },
46
+ route: {
47
+ label: 'Route',
48
+ value: `${route.join(' > ')}`,
49
+ },
50
+ };
51
+ decodeResult.decoded = true;
52
+ decodeResult.decodeLevel = 'partial';
53
+ }
54
+ decodeResult.remaining.text = secondHalf;
55
+
56
+ return decodeResult;
57
+ }
58
+ }
59
+
60
+ export default {};
@@ -0,0 +1,40 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+
3
+ export class Label_H1_M1BPRG extends DecoderPlugin { // eslint-disable-line camelcase
4
+ name = 'label-h1-m1bprg';
5
+
6
+ qualifiers() { // eslint-disable-line class-methods-use-this
7
+ return {
8
+ labels: ['H1'],
9
+ preambles: ['#M1BPRG'],
10
+ };
11
+ }
12
+
13
+ decode(message: any, options: any = {}) : any {
14
+ const decodeResult: any = this.defaultResult;
15
+ decodeResult.decoder.name = this.name;
16
+
17
+ // console.log('DECODER: H1 #M1BPRG detected');
18
+ const parts = message.text.split('/');
19
+ for (const part of parts) { // eslint-disable-line no-restricted-syntax
20
+ if (part.includes('#M')) {
21
+ const regex = /#M(?<fms>\w+)PRG/;
22
+ }
23
+
24
+ if (part.includes('DT')) {
25
+ const regex = /DT(?<dest>\w+),(?<rway>.+),(?<fuel>.+),(?<eta>.+),(?<rem>.+)/;
26
+ const result = message.text.match(regex);
27
+ // console.log('DT result');
28
+ // console.log(result);
29
+ }
30
+
31
+ if (part.includes('FN')) {
32
+ const regex = /FN(?<flight>\w+)/;
33
+ }
34
+ }
35
+
36
+ return decodeResult;
37
+ }
38
+ }
39
+
40
+ export default {};
@@ -0,0 +1,54 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+
3
+ export class Label_QP extends DecoderPlugin {
4
+ name = 'label-qp';
5
+
6
+ qualifiers() { // eslint-disable-line class-methods-use-this
7
+ return {
8
+ labels: ['QP'],
9
+ };
10
+ }
11
+
12
+ decode(message: any, options: any = {}) : any {
13
+ const decodeResult: any = this.defaultResult;
14
+ decodeResult.decoder.name = this.name;
15
+
16
+ decodeResult.raw.origin = message.text.substring(0, 4);
17
+ decodeResult.raw.destination = message.text.substring(4, 8);
18
+ decodeResult.raw.gate_out = message.text.substring(8, 12);
19
+ decodeResult.remaining.text = message.text.substring(12);
20
+
21
+ decodeResult.formatted.description = 'OUT Report';
22
+
23
+ decodeResult.formatted.items = [
24
+ {
25
+ type: 'origin',
26
+ code: 'ORG',
27
+ label: 'Origin',
28
+ value: decodeResult.raw.origin,
29
+ },
30
+ {
31
+ type: 'destination',
32
+ code: 'DST',
33
+ label: 'Destination',
34
+ value: decodeResult.raw.destination,
35
+ },
36
+ {
37
+ type: 'gate_out',
38
+ code: 'GOUT',
39
+ label: 'Gate OUT',
40
+ value: decodeResult.raw.gate_out,
41
+ }
42
+ ];
43
+
44
+ decodeResult.decoded = true;
45
+ if(decodeResult.remaining.text === "")
46
+ decodeResult.decoder.decodeLevel = 'full';
47
+ else
48
+ decodeResult.decoder.decodeLevel = 'partial';
49
+
50
+ return decodeResult;
51
+ }
52
+ }
53
+
54
+ export default {};
@@ -0,0 +1,54 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+
3
+ export class Label_QQ extends DecoderPlugin {
4
+ name = 'label-qq';
5
+
6
+ qualifiers() { // eslint-disable-line class-methods-use-this
7
+ return {
8
+ labels: ['QQ'],
9
+ };
10
+ }
11
+
12
+ decode(message: any, options: any = {}) : any {
13
+ const decodeResult: any = this.defaultResult;
14
+ decodeResult.decoder.name = this.name;
15
+
16
+ decodeResult.raw.origin = message.text.substring(0, 4);
17
+ decodeResult.raw.destination = message.text.substring(4, 8);
18
+ decodeResult.raw.wheels_off = message.text.substring(8, 12);
19
+ decodeResult.remaining.text = message.text.substring(12);
20
+
21
+ decodeResult.formatted.description = 'OFF Report';
22
+
23
+ decodeResult.formatted.items = [
24
+ {
25
+ type: 'origin',
26
+ code: 'ORG',
27
+ label: 'Origin',
28
+ value: decodeResult.raw.origin,
29
+ },
30
+ {
31
+ type: 'destination',
32
+ code: 'DST',
33
+ label: 'Destination',
34
+ value: decodeResult.raw.destination,
35
+ },
36
+ {
37
+ type: 'wheels_off',
38
+ code: 'WOFF',
39
+ label: 'Wheels OFF',
40
+ value: decodeResult.raw.wheels_off,
41
+ }
42
+ ];
43
+
44
+ decodeResult.decoded = true;
45
+ if(decodeResult.remaining.text === "")
46
+ decodeResult.decoder.decodeLevel = 'full';
47
+ else
48
+ decodeResult.decoder.decodeLevel = 'partial';
49
+
50
+ return decodeResult;
51
+ }
52
+ }
53
+
54
+ export default {};
@@ -0,0 +1,54 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+
3
+ export class Label_QR extends DecoderPlugin {
4
+ name = 'label-qr';
5
+
6
+ qualifiers() { // eslint-disable-line class-methods-use-this
7
+ return {
8
+ labels: ['QR'],
9
+ };
10
+ }
11
+
12
+ decode(message: any, options: any = {}) : any {
13
+ const decodeResult: any = this.defaultResult;
14
+ decodeResult.decoder.name = this.name;
15
+
16
+ decodeResult.raw.origin = message.text.substring(0, 4);
17
+ decodeResult.raw.destination = message.text.substring(4, 8);
18
+ decodeResult.raw.wheels_on = message.text.substring(8, 12);
19
+ decodeResult.remaining.text = message.text.substring(12);
20
+
21
+ decodeResult.formatted.description = 'ON Report';
22
+
23
+ decodeResult.formatted.items = [
24
+ {
25
+ type: 'origin',
26
+ code: 'ORG',
27
+ label: 'Origin',
28
+ value: decodeResult.raw.origin,
29
+ },
30
+ {
31
+ type: 'destination',
32
+ code: 'DST',
33
+ label: 'Destination',
34
+ value: decodeResult.raw.destination,
35
+ },
36
+ {
37
+ type: 'wheels_on',
38
+ code: 'WON',
39
+ label: 'Wheels ON',
40
+ value: decodeResult.raw.wheels_on,
41
+ }
42
+ ];
43
+
44
+ decodeResult.decoded = true;
45
+ if(decodeResult.remaining.text === "")
46
+ decodeResult.decoder.decodeLevel = 'full';
47
+ else
48
+ decodeResult.decoder.decodeLevel = 'partial';
49
+
50
+ return decodeResult;
51
+ }
52
+ }
53
+
54
+ export default {};
@@ -0,0 +1,54 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+
3
+ export class Label_QS extends DecoderPlugin {
4
+ name = 'label-qs';
5
+
6
+ qualifiers() { // eslint-disable-line class-methods-use-this
7
+ return {
8
+ labels: ['QS'],
9
+ };
10
+ }
11
+
12
+ decode(message: any, options: any = {}) : any {
13
+ const decodeResult: any = this.defaultResult;
14
+ decodeResult.decoder.name = this.name;
15
+
16
+ decodeResult.raw.origin = message.text.substring(0, 4);
17
+ decodeResult.raw.destination = message.text.substring(4, 8);
18
+ decodeResult.raw.gate_in = message.text.substring(8, 12);
19
+ decodeResult.remaining.text = message.text.substring(12);
20
+
21
+ decodeResult.formatted.description = 'IN Report';
22
+
23
+ decodeResult.formatted.items = [
24
+ {
25
+ type: 'origin',
26
+ code: 'ORG',
27
+ label: 'Origin',
28
+ value: decodeResult.raw.origin,
29
+ },
30
+ {
31
+ type: 'destination',
32
+ code: 'DST',
33
+ label: 'Destination',
34
+ value: decodeResult.raw.destination,
35
+ },
36
+ {
37
+ type: 'gate_in',
38
+ code: 'GIN',
39
+ label: 'Gate IN',
40
+ value: decodeResult.raw.gate_in,
41
+ }
42
+ ];
43
+
44
+ decodeResult.decoded = true;
45
+ if(decodeResult.remaining.text === "")
46
+ decodeResult.decoder.decodeLevel = 'full';
47
+ else
48
+ decodeResult.decoder.decodeLevel = 'partial';
49
+
50
+ return decodeResult;
51
+ }
52
+ }
53
+
54
+ export default {};
@@ -0,0 +1,111 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+
3
+ export class Label_SQ extends DecoderPlugin {
4
+ name = 'label-sq';
5
+
6
+ qualifiers() { // eslint-disable-line class-methods-use-this
7
+ return {
8
+ labels: ['SQ'],
9
+ };
10
+ }
11
+
12
+ decode(message: any, options: any = {}) : any {
13
+ const decodeResult: any = this.defaultResult;
14
+ decodeResult.decoder.name = this.name;
15
+
16
+ decodeResult.raw.preamble = message.text.substring(0, 4);
17
+ decodeResult.raw.version = message.text.substring(1, 2);
18
+ decodeResult.raw.network = message.text.substring(3, 4);
19
+
20
+ if (decodeResult.raw.version === '2') {
21
+ const regex = /0(\d)X(?<org>\w)(?<iata>\w\w\w)(?<icao>\w\w\w\w)(?<station>\d)(?<lat>\d+)(?<latd>[NS])(?<lng>\d+)(?<lngd>[EW])V(?<vfreq>\d+)\/.*/;
22
+ const result = message.text.match(regex);
23
+
24
+ if (result && result.length >= 8) {
25
+ decodeResult.raw.groundStation = {
26
+ number: result.groups.station,
27
+ iataCode: result.groups.iata,
28
+ icaoCode: result.groups.icao,
29
+ coordinates: {
30
+ latitude: (Number(result.groups.lat) / 100) * (result.groups.latd === 'S' ? -1 : 1),
31
+ longitude: (Number(result.groups.lng) / 100) * (result.groups.lngd === 'W' ? -1 : 1)
32
+ }
33
+ }
34
+ decodeResult.raw.vdlFrequency = result.groups.vfreq / 1000.0;
35
+ }
36
+ }
37
+
38
+ decodeResult.formatted.description = 'Ground Station Squitter';
39
+
40
+ var formattedNetwork = 'Unknown';
41
+ if (decodeResult.raw.network == 'A') {
42
+ formattedNetwork = 'ARINC';
43
+ } else if (decodeResult.raw.network == 'S') {
44
+ formattedNetwork = 'SITA';
45
+ }
46
+ decodeResult.formatted.items = [
47
+ {
48
+ type: 'network',
49
+ label: 'Network',
50
+ value: formattedNetwork,
51
+ },
52
+ {
53
+ type: 'version',
54
+ label: 'Version',
55
+ value: decodeResult.raw.version,
56
+ }
57
+ ];
58
+
59
+ if (decodeResult.raw.groundStation) {
60
+ if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
61
+ decodeResult.formatted.items.push({
62
+ type: 'ground_station',
63
+ label: 'Ground Station',
64
+ value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,
65
+ });
66
+ }
67
+ if (decodeResult.raw.groundStation.iataCode) {
68
+ decodeResult.formatted.items.push({
69
+ type: 'iataCode',
70
+ label: 'IATA',
71
+ value: decodeResult.raw.groundStation.iataCode,
72
+ });
73
+ }
74
+ if (decodeResult.raw.groundStation.icaoCode) {
75
+ decodeResult.formatted.items.push({
76
+ type: 'icaoCode',
77
+ label: 'ICAO',
78
+ value: decodeResult.raw.groundStation.icaoCode,
79
+ });
80
+ }
81
+ if (decodeResult.raw.groundStation.coordinates.latitude) {
82
+ decodeResult.formatted.items.push({
83
+ type: 'coordinates',
84
+ label: 'Ground Station Location',
85
+ value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,
86
+ });
87
+ }
88
+ if (decodeResult.raw.groundStation.airport) {
89
+ decodeResult.formatted.items.push({
90
+ type: 'airport',
91
+ label: 'Airport',
92
+ value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,
93
+ });
94
+ }
95
+ }
96
+
97
+ if (decodeResult.raw.vdlFrequency) {
98
+ decodeResult.formatted.items.push({
99
+ type: 'vdlFrequency',
100
+ label: 'VDL Frequency',
101
+ value: `${decodeResult.raw.vdlFrequency} MHz`
102
+ });
103
+ }
104
+ decodeResult.decoded = true;
105
+ decodeResult.decoder.decodeLevel = 'full';
106
+
107
+ return decodeResult;
108
+ }
109
+ }
110
+
111
+ export default {};
@@ -0,0 +1,22 @@
1
+ export * from './Label_5Z';
2
+ export * from './Label_15';
3
+ export * from './Label_16_N_Space';
4
+ export * from './Label_20_POS';
5
+ export * from './Label_30_Slash_EA';
6
+ export * from './Label_44_ETA';
7
+ export * from './Label_44_IN';
8
+ export * from './Label_44_OFF';
9
+ export * from './Label_44_ON';
10
+ export * from './Label_44_POS';
11
+ export * from './Label_80';
12
+ export * from './Label_8E';
13
+ export * from './Label_B6';
14
+ export * from './Label_ColonComma';
15
+ export * from './Label_H1_M1BPOS';
16
+ export * from './Label_H1_M1BPRG';
17
+ export * from './Label_1M_Slash';
18
+ export * from './Label_SQ';
19
+ export * from './Label_QR';
20
+ export * from './Label_QP';
21
+ export * from './Label_QS';
22
+ export * from './Label_QQ';
package/tsconfig.json CHANGED
@@ -4,11 +4,11 @@
4
4
  "module": "commonjs",
5
5
  "declaration": true,
6
6
  "outDir": "./dist",
7
+ "esModuleInterop": true,
7
8
  "strict": true
8
9
  },
9
10
  "include": [
10
- "lib/*.ts",
11
- "lib/**/*.ts",
11
+ "src",
12
12
  ],
13
13
  "exclude": [
14
14
  "node_modules"
package/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './lib/DateTimeUtils';
2
- export * from './lib/DecoderPlugin';
3
- export * from './lib/IcaoDecoder';
4
- export * from './lib/MessageDecoder';