@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.
Files changed (131) hide show
  1. package/.github/FUNDING.yml +1 -1
  2. package/.github/workflows/yarn-test.yml +11 -4
  3. package/README.md +32 -0
  4. package/index.d.ts +17 -0
  5. package/index.ts +2 -0
  6. package/package.json +5 -13
  7. package/tsconfig.json +2 -2
  8. package/yarn-error.log +3354 -0
  9. package/coverage/clover.xml +0 -1799
  10. package/coverage/coverage-final.json +0 -24
  11. package/coverage/lcov-report/base.css +0 -224
  12. package/coverage/lcov-report/block-navigation.js +0 -87
  13. package/coverage/lcov-report/favicon.png +0 -0
  14. package/coverage/lcov-report/index.html +0 -131
  15. package/coverage/lcov-report/prettify.css +0 -1
  16. package/coverage/lcov-report/prettify.js +0 -2
  17. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  18. package/coverage/lcov-report/sorter.js +0 -196
  19. package/coverage/lcov.info +0 -2278
  20. package/dist/DateTimeUtils.d.ts +0 -8
  21. package/dist/DateTimeUtils.js +0 -27
  22. package/dist/DecoderPlugin.d.ts +0 -18
  23. package/dist/DecoderPlugin.js +0 -71
  24. package/dist/DecoderPluginInterface.d.ts +0 -7
  25. package/dist/DecoderPluginInterface.js +0 -3
  26. package/dist/IcaoDecoder.d.ts +0 -10
  27. package/dist/IcaoDecoder.js +0 -111
  28. package/dist/MessageDecoder.d.ts +0 -14
  29. package/dist/MessageDecoder.js +0 -129
  30. package/dist/bin/acars-decoder-test.d.ts +0 -2
  31. package/dist/bin/acars-decoder-test.js +0 -53
  32. package/dist/bin/acars-decoder.d.ts +0 -2
  33. package/dist/bin/acars-decoder.js +0 -20
  34. package/dist/index.d.ts +0 -4
  35. package/dist/index.js +0 -20
  36. package/dist/plugins/Label_15.d.ts +0 -11
  37. package/dist/plugins/Label_15.js +0 -40
  38. package/dist/plugins/Label_16_N_Space.d.ts +0 -11
  39. package/dist/plugins/Label_16_N_Space.js +0 -80
  40. package/dist/plugins/Label_16_N_Space.test.d.ts +0 -1
  41. package/dist/plugins/Label_16_N_Space.test.js +0 -84
  42. package/dist/plugins/Label_1M_Slash.d.ts +0 -11
  43. package/dist/plugins/Label_1M_Slash.js +0 -61
  44. package/dist/plugins/Label_1M_Slash.test.d.ts +0 -1
  45. package/dist/plugins/Label_1M_Slash.test.js +0 -43
  46. package/dist/plugins/Label_20_CFB.01.d.ts +0 -11
  47. package/dist/plugins/Label_20_CFB.01.js +0 -69
  48. package/dist/plugins/Label_20_POS.d.ts +0 -11
  49. package/dist/plugins/Label_20_POS.js +0 -62
  50. package/dist/plugins/Label_30_Slash_EA.d.ts +0 -11
  51. package/dist/plugins/Label_30_Slash_EA.js +0 -54
  52. package/dist/plugins/Label_30_Slash_EA.test.d.ts +0 -1
  53. package/dist/plugins/Label_30_Slash_EA.test.js +0 -35
  54. package/dist/plugins/Label_44_ETA.d.ts +0 -11
  55. package/dist/plugins/Label_44_ETA.js +0 -69
  56. package/dist/plugins/Label_44_IN.d.ts +0 -11
  57. package/dist/plugins/Label_44_IN.js +0 -69
  58. package/dist/plugins/Label_44_OFF.d.ts +0 -11
  59. package/dist/plugins/Label_44_OFF.js +0 -74
  60. package/dist/plugins/Label_44_ON.d.ts +0 -11
  61. package/dist/plugins/Label_44_ON.js +0 -69
  62. package/dist/plugins/Label_44_POS.d.ts +0 -11
  63. package/dist/plugins/Label_44_POS.js +0 -81
  64. package/dist/plugins/Label_5Z.d.ts +0 -11
  65. package/dist/plugins/Label_5Z.js +0 -120
  66. package/dist/plugins/Label_80.d.ts +0 -12
  67. package/dist/plugins/Label_80.js +0 -203
  68. package/dist/plugins/Label_8E.d.ts +0 -10
  69. package/dist/plugins/Label_8E.js +0 -48
  70. package/dist/plugins/Label_8E.test.d.ts +0 -1
  71. package/dist/plugins/Label_8E.test.js +0 -32
  72. package/dist/plugins/Label_B6.d.ts +0 -11
  73. package/dist/plugins/Label_B6.js +0 -26
  74. package/dist/plugins/Label_ColonComma.d.ts +0 -10
  75. package/dist/plugins/Label_ColonComma.js +0 -28
  76. package/dist/plugins/Label_H1.d.ts +0 -9
  77. package/dist/plugins/Label_H1.js +0 -18
  78. package/dist/plugins/Label_H1_M1BPOS.d.ts +0 -11
  79. package/dist/plugins/Label_H1_M1BPOS.js +0 -54
  80. package/dist/plugins/Label_H1_M1BPRG.d.ts +0 -11
  81. package/dist/plugins/Label_H1_M1BPRG.js +0 -36
  82. package/dist/plugins/Label_QP.d.ts +0 -10
  83. package/dist/plugins/Label_QP.js +0 -49
  84. package/dist/plugins/Label_QQ.d.ts +0 -10
  85. package/dist/plugins/Label_QQ.js +0 -49
  86. package/dist/plugins/Label_QR.d.ts +0 -10
  87. package/dist/plugins/Label_QR.js +0 -49
  88. package/dist/plugins/Label_QS.d.ts +0 -10
  89. package/dist/plugins/Label_QS.js +0 -49
  90. package/dist/plugins/Label_SQ.d.ts +0 -10
  91. package/dist/plugins/Label_SQ.js +0 -104
  92. package/dist/plugins/official.d.ts +0 -22
  93. package/dist/plugins/official.js +0 -38
  94. package/src/DateTimeUtils.ts +0 -26
  95. package/src/DecoderPlugin.ts +0 -83
  96. package/src/DecoderPluginInterface.ts +0 -9
  97. package/src/IcaoDecoder.ts +0 -137
  98. package/src/MessageDecoder.ts +0 -117
  99. package/src/bin/acars-decoder-test.ts +0 -67
  100. package/src/bin/acars-decoder.ts +0 -23
  101. package/src/index.d.ts +0 -15
  102. package/src/index.ts +0 -4
  103. package/src/plugins/Label_15.ts +0 -45
  104. package/src/plugins/Label_16_N_Space.test.ts +0 -94
  105. package/src/plugins/Label_16_N_Space.ts +0 -91
  106. package/src/plugins/Label_1M_Slash.test.ts +0 -45
  107. package/src/plugins/Label_1M_Slash.ts +0 -69
  108. package/src/plugins/Label_20_CFB.01.ts +0 -81
  109. package/src/plugins/Label_20_POS.ts +0 -68
  110. package/src/plugins/Label_30_Slash_EA.test.ts +0 -37
  111. package/src/plugins/Label_30_Slash_EA.ts +0 -60
  112. package/src/plugins/Label_44_ETA.ts +0 -81
  113. package/src/plugins/Label_44_IN.ts +0 -81
  114. package/src/plugins/Label_44_OFF.ts +0 -88
  115. package/src/plugins/Label_44_ON.ts +0 -81
  116. package/src/plugins/Label_44_POS.ts +0 -96
  117. package/src/plugins/Label_5Z.ts +0 -125
  118. package/src/plugins/Label_80.ts +0 -215
  119. package/src/plugins/Label_8E.test.ts +0 -34
  120. package/src/plugins/Label_8E.ts +0 -55
  121. package/src/plugins/Label_B6.ts +0 -28
  122. package/src/plugins/Label_ColonComma.ts +0 -32
  123. package/src/plugins/Label_H1.ts +0 -18
  124. package/src/plugins/Label_H1_M1BPOS.ts +0 -60
  125. package/src/plugins/Label_H1_M1BPRG.ts +0 -40
  126. package/src/plugins/Label_QP.ts +0 -54
  127. package/src/plugins/Label_QQ.ts +0 -54
  128. package/src/plugins/Label_QR.ts +0 -54
  129. package/src/plugins/Label_QS.ts +0 -54
  130. package/src/plugins/Label_SQ.ts +0 -111
  131. 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 {};