@airframes/acars-decoder 1.4.7 → 1.6.1

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 (135) hide show
  1. package/README.md +40 -1
  2. package/dist/index.d.mts +2 -0
  3. package/dist/index.d.ts +2 -4
  4. package/dist/index.js +2869 -19
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +2832 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +15 -18
  9. package/.github/FUNDING.yml +0 -12
  10. package/.github/workflows/yarn-test.yml +0 -21
  11. package/SECURITY.md +0 -18
  12. package/babel.config.js +0 -6
  13. package/coverage/clover.xml +0 -1799
  14. package/coverage/coverage-final.json +0 -24
  15. package/coverage/lcov-report/base.css +0 -224
  16. package/coverage/lcov-report/block-navigation.js +0 -87
  17. package/coverage/lcov-report/favicon.png +0 -0
  18. package/coverage/lcov-report/index.html +0 -131
  19. package/coverage/lcov-report/prettify.css +0 -1
  20. package/coverage/lcov-report/prettify.js +0 -2
  21. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  22. package/coverage/lcov-report/sorter.js +0 -196
  23. package/coverage/lcov.info +0 -2278
  24. package/dist/DateTimeUtils.d.ts +0 -8
  25. package/dist/DateTimeUtils.js +0 -27
  26. package/dist/DecoderPlugin.d.ts +0 -18
  27. package/dist/DecoderPlugin.js +0 -71
  28. package/dist/DecoderPluginInterface.d.ts +0 -7
  29. package/dist/DecoderPluginInterface.js +0 -3
  30. package/dist/IcaoDecoder.d.ts +0 -10
  31. package/dist/IcaoDecoder.js +0 -111
  32. package/dist/MessageDecoder.d.ts +0 -14
  33. package/dist/MessageDecoder.js +0 -129
  34. package/dist/bin/acars-decoder-test.d.ts +0 -2
  35. package/dist/bin/acars-decoder-test.js +0 -53
  36. package/dist/bin/acars-decoder.d.ts +0 -2
  37. package/dist/bin/acars-decoder.js +0 -20
  38. package/dist/plugins/Label_15.d.ts +0 -11
  39. package/dist/plugins/Label_15.js +0 -40
  40. package/dist/plugins/Label_16_N_Space.d.ts +0 -11
  41. package/dist/plugins/Label_16_N_Space.js +0 -80
  42. package/dist/plugins/Label_16_N_Space.test.d.ts +0 -1
  43. package/dist/plugins/Label_16_N_Space.test.js +0 -84
  44. package/dist/plugins/Label_1M_Slash.d.ts +0 -11
  45. package/dist/plugins/Label_1M_Slash.js +0 -61
  46. package/dist/plugins/Label_1M_Slash.test.d.ts +0 -1
  47. package/dist/plugins/Label_1M_Slash.test.js +0 -43
  48. package/dist/plugins/Label_20_CFB.01.d.ts +0 -11
  49. package/dist/plugins/Label_20_CFB.01.js +0 -69
  50. package/dist/plugins/Label_20_POS.d.ts +0 -11
  51. package/dist/plugins/Label_20_POS.js +0 -62
  52. package/dist/plugins/Label_30_Slash_EA.d.ts +0 -11
  53. package/dist/plugins/Label_30_Slash_EA.js +0 -54
  54. package/dist/plugins/Label_30_Slash_EA.test.d.ts +0 -1
  55. package/dist/plugins/Label_30_Slash_EA.test.js +0 -35
  56. package/dist/plugins/Label_44_ETA.d.ts +0 -11
  57. package/dist/plugins/Label_44_ETA.js +0 -69
  58. package/dist/plugins/Label_44_IN.d.ts +0 -11
  59. package/dist/plugins/Label_44_IN.js +0 -69
  60. package/dist/plugins/Label_44_OFF.d.ts +0 -11
  61. package/dist/plugins/Label_44_OFF.js +0 -74
  62. package/dist/plugins/Label_44_ON.d.ts +0 -11
  63. package/dist/plugins/Label_44_ON.js +0 -69
  64. package/dist/plugins/Label_44_POS.d.ts +0 -11
  65. package/dist/plugins/Label_44_POS.js +0 -81
  66. package/dist/plugins/Label_5Z.d.ts +0 -11
  67. package/dist/plugins/Label_5Z.js +0 -120
  68. package/dist/plugins/Label_80.d.ts +0 -12
  69. package/dist/plugins/Label_80.js +0 -203
  70. package/dist/plugins/Label_8E.d.ts +0 -10
  71. package/dist/plugins/Label_8E.js +0 -48
  72. package/dist/plugins/Label_8E.test.d.ts +0 -1
  73. package/dist/plugins/Label_8E.test.js +0 -32
  74. package/dist/plugins/Label_B6.d.ts +0 -11
  75. package/dist/plugins/Label_B6.js +0 -26
  76. package/dist/plugins/Label_ColonComma.d.ts +0 -10
  77. package/dist/plugins/Label_ColonComma.js +0 -28
  78. package/dist/plugins/Label_H1.d.ts +0 -9
  79. package/dist/plugins/Label_H1.js +0 -18
  80. package/dist/plugins/Label_H1_M1BPOS.d.ts +0 -11
  81. package/dist/plugins/Label_H1_M1BPOS.js +0 -54
  82. package/dist/plugins/Label_H1_M1BPRG.d.ts +0 -11
  83. package/dist/plugins/Label_H1_M1BPRG.js +0 -36
  84. package/dist/plugins/Label_QP.d.ts +0 -10
  85. package/dist/plugins/Label_QP.js +0 -49
  86. package/dist/plugins/Label_QQ.d.ts +0 -10
  87. package/dist/plugins/Label_QQ.js +0 -49
  88. package/dist/plugins/Label_QR.d.ts +0 -10
  89. package/dist/plugins/Label_QR.js +0 -49
  90. package/dist/plugins/Label_QS.d.ts +0 -10
  91. package/dist/plugins/Label_QS.js +0 -49
  92. package/dist/plugins/Label_SQ.d.ts +0 -10
  93. package/dist/plugins/Label_SQ.js +0 -104
  94. package/dist/plugins/official.d.ts +0 -22
  95. package/dist/plugins/official.js +0 -38
  96. package/jest.config.ts +0 -195
  97. package/src/DateTimeUtils.ts +0 -26
  98. package/src/DecoderPlugin.ts +0 -83
  99. package/src/DecoderPluginInterface.ts +0 -9
  100. package/src/IcaoDecoder.ts +0 -137
  101. package/src/MessageDecoder.ts +0 -117
  102. package/src/bin/acars-decoder-test.ts +0 -67
  103. package/src/bin/acars-decoder.ts +0 -23
  104. package/src/index.d.ts +0 -15
  105. package/src/index.ts +0 -4
  106. package/src/plugins/Label_15.ts +0 -45
  107. package/src/plugins/Label_16_N_Space.test.ts +0 -94
  108. package/src/plugins/Label_16_N_Space.ts +0 -91
  109. package/src/plugins/Label_1M_Slash.test.ts +0 -45
  110. package/src/plugins/Label_1M_Slash.ts +0 -69
  111. package/src/plugins/Label_20_CFB.01.ts +0 -81
  112. package/src/plugins/Label_20_POS.ts +0 -68
  113. package/src/plugins/Label_30_Slash_EA.test.ts +0 -37
  114. package/src/plugins/Label_30_Slash_EA.ts +0 -60
  115. package/src/plugins/Label_44_ETA.ts +0 -81
  116. package/src/plugins/Label_44_IN.ts +0 -81
  117. package/src/plugins/Label_44_OFF.ts +0 -88
  118. package/src/plugins/Label_44_ON.ts +0 -81
  119. package/src/plugins/Label_44_POS.ts +0 -96
  120. package/src/plugins/Label_5Z.ts +0 -125
  121. package/src/plugins/Label_80.ts +0 -215
  122. package/src/plugins/Label_8E.test.ts +0 -34
  123. package/src/plugins/Label_8E.ts +0 -55
  124. package/src/plugins/Label_B6.ts +0 -28
  125. package/src/plugins/Label_ColonComma.ts +0 -32
  126. package/src/plugins/Label_H1.ts +0 -18
  127. package/src/plugins/Label_H1_M1BPOS.ts +0 -60
  128. package/src/plugins/Label_H1_M1BPRG.ts +0 -40
  129. package/src/plugins/Label_QP.ts +0 -54
  130. package/src/plugins/Label_QQ.ts +0 -54
  131. package/src/plugins/Label_QR.ts +0 -54
  132. package/src/plugins/Label_QS.ts +0 -54
  133. package/src/plugins/Label_SQ.ts +0 -111
  134. package/src/plugins/official.ts +0 -22
  135. package/tsconfig.json +0 -16
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { MessageDecoder } from '../MessageDecoder';
4
-
5
- const decoder = new MessageDecoder();
6
- const message = {
7
- label: process.argv[2],
8
- text: process.argv[3]
9
- };
10
-
11
- console.log("Original Message:");
12
- console.log(message.text);
13
- console.log();
14
-
15
- const result = decoder.decode(message, { debug: true });
16
-
17
- console.log("Decoded Message:");
18
- console.log(result.formatted.description);
19
- if (result.formatted.items && result.formatted.items.length > 0) {
20
- result.formatted.items.forEach((item: any) => {
21
- console.log(`${item.label} - ${item.value}`);
22
- });
23
- }
package/src/index.d.ts DELETED
@@ -1,15 +0,0 @@
1
-
2
- interface DecoderPlugin {
3
- decode: (data: string) => string;
4
- coordinateString: (coords: any) => string;
5
- }
6
-
7
- interface MessageDecoder {
8
- constructor(): MessageDecoder;
9
- registerPlugin(plugin: DecoderPlugin): boolean;
10
- decode: (data: string, options: any) => string;
11
- lookupAirportByIata: (iata: string) => string;
12
- name: string;
13
- plugins: Array<DecoderPlugin>;
14
- debug: boolean;
15
- }
package/src/index.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './DateTimeUtils';
2
- export * from './DecoderPlugin';
3
- export * from './IcaoDecoder';
4
- export * from './MessageDecoder';
@@ -1,45 +0,0 @@
1
- import { DecoderPlugin } from '../DecoderPlugin';
2
-
3
- // General Aviation Position Report
4
- export class Label_15 extends DecoderPlugin {
5
- name = 'label-5z';
6
-
7
- qualifiers() { // eslint-disable-line class-methods-use-this
8
- return {
9
- labels: ['15'],
10
- preambles: ['(2'],
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
-
19
- const twoZeeRegex = /^\(2(?<between>.+)\(Z$/;
20
- const results = message.text.match(twoZeeRegex);
21
- if (results) {
22
- // Style: (2N38111W 82211266 76400-64(Z
23
- // console.log(`Label 15 Position Report: between = ${results.groups.between}`);
24
-
25
- decodeResult.raw.latitude_direction = results.groups.between.substr(0, 1);
26
- decodeResult.raw.latitude = Number(results.groups.between.substr(1, 5)) / 1000;
27
- decodeResult.raw.longitude_direction = results.groups.between.substr(6, 1);
28
- decodeResult.raw.longitude = Number(results.groups.between.substr(7, 6)) / 1000;
29
- decodeResult.remaining.text = results.groups.between.substr(13);
30
-
31
- decodeResult.formatted.items.push({
32
- type: 'coordinates',
33
- label: 'Coordinates',
34
- value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
35
- });
36
- }
37
-
38
- decodeResult.decoded = true;
39
- decodeResult.decoder.decodeLevel = 'partial';
40
-
41
- return decodeResult;
42
- }
43
- }
44
-
45
- export default {};
@@ -1,94 +0,0 @@
1
- import { MessageDecoder } from '../MessageDecoder';
2
- import { Label_16_N_Space } from './Label_16_N_Space';
3
-
4
- test('decodes Label 16 variant 1', () => {
5
- const decoder = new MessageDecoder();
6
- const decoderPlugin = new Label_16_N_Space(decoder);
7
-
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
-
16
- const text = 'N 44.203,W 86.546,31965,6, 290';
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-16-n-space');
23
- expect(decodeResult.formatted.description).toBe('Position Report');
24
- expect(decodeResult.message.text).toBe(text);
25
- expect(decodeResult.raw.latitude_direction).toBe('N');
26
- expect(decodeResult.raw.latitude).toBe(44.203);
27
- expect(decodeResult.raw.longitude_direction).toBe('W');
28
- expect(decodeResult.raw.longitude).toBe(86.546);
29
- expect(decodeResult.raw.flight_level).toBe(31965);
30
- expect(decodeResult.formatted.items.length).toBe(2);
31
- expect(decodeResult.formatted.items[0].type).toBe('aircraft_position');
32
- expect(decodeResult.formatted.items[0].code).toBe('POS');
33
- expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
34
- expect(decodeResult.formatted.items[0].value).toBe('44.203 N, 86.546 W');
35
- expect(decodeResult.formatted.items[1].type).toBe('flight_level');
36
- expect(decodeResult.formatted.items[1].code).toBe('FL');
37
- expect(decodeResult.formatted.items[1].label).toBe('Flight Level');
38
- expect(decodeResult.formatted.items[1].value).toBe(31965);
39
- });
40
-
41
- test('decodes Label 16 variant 2', () => {
42
- const decoder = new MessageDecoder();
43
- const decoderPlugin = new Label_16_N_Space(decoder);
44
-
45
- expect(decoderPlugin.decode).toBeDefined();
46
- expect(decoderPlugin.name).toBe('label-16-n-space');
47
- expect(decoderPlugin.qualifiers).toBeDefined();
48
- expect(decoderPlugin.qualifiers()).toEqual({
49
- labels: ['16'],
50
- preambles: ['N '],
51
- });
52
-
53
- const text = 'N 28.177/W 96.055';
54
- const decodeResult = decoderPlugin.decode({ text: text });
55
- console.log(JSON.stringify(decodeResult, null, 2));
56
-
57
- expect(decodeResult.decoded).toBe(true);
58
- expect(decodeResult.decoder.decodeLevel).toBe('full');
59
- expect(decodeResult.decoder.name).toBe('label-16-n-space');
60
- expect(decodeResult.formatted.description).toBe('Position Report');
61
- expect(decodeResult.message.text).toBe(text);
62
- expect(decodeResult.raw.latitude_direction).toBe('N');
63
- expect(decodeResult.raw.latitude).toBe(28.177);
64
- expect(decodeResult.raw.longitude_direction).toBe('W');
65
- expect(decodeResult.raw.longitude).toBe(96.055);
66
- expect(decodeResult.formatted.items.length).toBe(1);
67
- expect(decodeResult.formatted.items[0].type).toBe('aircraft_position');
68
- expect(decodeResult.formatted.items[0].code).toBe('POS');
69
- expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
70
- expect(decodeResult.formatted.items[0].value).toBe('28.177 N, 96.055 W');
71
- });
72
-
73
- test('decodes Label 16 variant <invalid>', () => {
74
- const decoder = new MessageDecoder();
75
- const decoderPlugin = new Label_16_N_Space(decoder);
76
-
77
- expect(decoderPlugin.decode).toBeDefined();
78
- expect(decoderPlugin.name).toBe('label-16-n-space');
79
- expect(decoderPlugin.qualifiers).toBeDefined();
80
- expect(decoderPlugin.qualifiers()).toEqual({
81
- labels: ['16'],
82
- preambles: ['N '],
83
- });
84
-
85
- const text = 'N Bogus message';
86
- const decodeResult = decoderPlugin.decode({ text: text });
87
- console.log(JSON.stringify(decodeResult, null, 2));
88
-
89
- expect(decodeResult.decoded).toBe(false);
90
- expect(decodeResult.decoder.decodeLevel).toBe('none');
91
- expect(decodeResult.decoder.name).toBe('label-16-n-space');
92
- expect(decodeResult.formatted.description).toBe('Position Report');
93
- expect(decodeResult.message.text).toBe(text);
94
- });
@@ -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 {};