forked from airframesio/acars-decoder-typescript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLabel_4N.ts
More file actions
83 lines (77 loc) · 2.74 KB
/
Label_4N.ts
File metadata and controls
83 lines (77 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { DecoderPlugin } from '../DecoderPlugin';
import { DecodeResult, Message, Options } from '../DecoderPluginInterface';
import { CoordinateUtils } from '../utils/coordinate_utils';
import { ResultFormatter } from '../utils/result_formatter';
export class Label_4N extends DecoderPlugin {
name = 'label-4n';
qualifiers() {
return {
labels: ['4N'],
};
}
decode(message: Message, options: Options = {}): DecodeResult {
const decodeResult = this.defaultResult();
decodeResult.decoder.name = this.name;
decodeResult.message = message;
decodeResult.formatted.description = 'Airline Defined';
decodeResult.decoded = true;
const text = message.text;
const fields = text.split(',');
if (text.length === 51) {
// variant 1
decodeResult.raw.day = text.substring(0, 2);
ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));
ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));
ResultFormatter.position(
decodeResult,
CoordinateUtils.decodeStringCoordinatesDecimalMinutes(
text.substring(30, 45).replace(/^(.)0/, '$1'),
),
);
ResultFormatter.altitude(
decodeResult,
Number(text.substring(48, 51)) * 100,
);
ResultFormatter.unknownArr(
decodeResult,
[text.substring(2, 4), text.substring(19, 29)],
' ',
);
} else if (fields.length === 33) {
// variant 2
decodeResult.raw.date = fields[3];
if (fields[1] === 'B') {
ResultFormatter.position(decodeResult, {
latitude: Number(fields[4]),
longitude: Number(fields[5]),
});
ResultFormatter.altitude(decodeResult, Number(fields[6]));
}
ResultFormatter.departureAirport(decodeResult, fields[8]);
ResultFormatter.arrivalAirport(decodeResult, fields[9]);
ResultFormatter.alternateAirport(decodeResult, fields[10]);
ResultFormatter.arrivalRunway(decodeResult, fields[11].split('/')[0]);
if (fields[12].length > 1) {
ResultFormatter.alternateRunway(decodeResult, fields[12].split('/')[0]);
}
ResultFormatter.checksum(decodeResult, parseInt(fields[32], 16));
ResultFormatter.unknownArr(
decodeResult,
[...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(
(f) => f != '',
),
);
} else {
decodeResult.decoded = false;
ResultFormatter.unknown(decodeResult, text);
}
if (decodeResult.decoded) {
if (!decodeResult.remaining.text)
decodeResult.decoder.decodeLevel = 'full';
else decodeResult.decoder.decodeLevel = 'partial';
} else {
decodeResult.decoder.decodeLevel = 'none';
}
return decodeResult;
}
}