Skip to content

Commit f347e7f

Browse files
authored
Adding Label 58 decoding (#200)
fixes #148
1 parent 0b5c8ae commit f347e7f

File tree

4 files changed

+113
-0
lines changed

4 files changed

+113
-0
lines changed

lib/MessageDecoder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export class MessageDecoder {
5656
this.registerPlugin(new Plugins.Label_H1_Slash(this));
5757
this.registerPlugin(new Plugins.Label_H1_StarPOS(this));
5858
this.registerPlugin(new Plugins.Label_HX(this));
59+
this.registerPlugin(new Plugins.Label_58(this));
5960
this.registerPlugin(new Plugins.Label_80(this));
6061
this.registerPlugin(new Plugins.Label_83(this));
6162
this.registerPlugin(new Plugins.Label_8E(this));

lib/plugins/Label_58.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { MessageDecoder } from '../MessageDecoder';
2+
import { Label_58 } from './Label_58';
3+
4+
describe('Label_58', () => {
5+
let plugin: Label_58;
6+
7+
beforeEach(() => {
8+
const decoder = new MessageDecoder();
9+
plugin = new Label_58(decoder);
10+
});
11+
12+
test('matches qualifiers', () => {
13+
expect(plugin.decode).toBeDefined();
14+
expect(plugin.name).toBe('label-58');
15+
expect(plugin.qualifiers).toBeDefined();
16+
expect(plugin.qualifiers()).toEqual({
17+
labels: ['58'],
18+
});
19+
});
20+
21+
test('decodes variant 1', () => {
22+
const text = 'OG0704/06/230942/N39.214/W76.106/22683/N/'
23+
const decodeResult = plugin.decode({ text: text });
24+
25+
expect(decodeResult.decoded).toBe(true);
26+
expect(decodeResult.decoder.decodeLevel).toBe('partial');
27+
expect(decodeResult.raw.flight_number).toBe('OG0704');
28+
expect(decodeResult.raw.day).toBe(6);
29+
expect(decodeResult.raw.time_of_day).toBe(83382);
30+
expect(decodeResult.raw.position.latitude).toBe(39.214);
31+
expect(decodeResult.raw.position.longitude).toBe(-76.106);
32+
expect(decodeResult.raw.altitude).toBe(22683);
33+
expect(decodeResult.formatted.items.length).toBe(5);
34+
expect(decodeResult.formatted.items[0].label).toBe('Flight Number');
35+
expect(decodeResult.formatted.items[0].value).toBe('OG0704');
36+
expect(decodeResult.formatted.items[1].label).toBe('Day of Month');
37+
expect(decodeResult.formatted.items[1].value).toBe('6');
38+
expect(decodeResult.formatted.items[2].label).toBe('Message Timestamp');
39+
expect(decodeResult.formatted.items[2].value).toBe('23:09:42');
40+
expect(decodeResult.formatted.items[3].label).toBe('Aircraft Position');
41+
expect(decodeResult.formatted.items[3].value).toBe('39.214 N, 76.106 W');
42+
expect(decodeResult.formatted.items[4].label).toBe('Altitude');
43+
expect(decodeResult.formatted.items[4].value).toBe('22683 feet');
44+
expect(decodeResult.remaining.text).toBe('N/');
45+
});
46+
47+
test('does not decode <invalid>', () => {
48+
49+
const text = 'Bogus/message';
50+
const decodeResult = plugin.decode({ text: text });
51+
52+
expect(decodeResult.decoded).toBe(false);
53+
expect(decodeResult.decoder.decodeLevel).toBe('none');
54+
expect(decodeResult.decoder.name).toBe('label-58');
55+
expect(decodeResult.formatted.description).toBe('Position Report');
56+
expect(decodeResult.message.text).toBe(text);
57+
});
58+
});

lib/plugins/Label_58.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { DateTimeUtils } from '../DateTimeUtils';
2+
import { DecoderPlugin } from '../DecoderPlugin';
3+
import { DecodeResult, Message, Options } from '../DecoderPluginInterface';
4+
import { CoordinateUtils } from '../utils/coordinate_utils';
5+
import { ResultFormatter } from '../utils/result_formatter';
6+
7+
// General Aviation Position Report
8+
export class Label_58 extends DecoderPlugin {
9+
name = 'label-58';
10+
11+
qualifiers() { // eslint-disable-line class-methods-use-this
12+
return {
13+
labels: ['58'],
14+
};
15+
}
16+
17+
decode(message: Message, options: Options = {}): DecodeResult {
18+
const decodeResult = this.defaultResult();
19+
decodeResult.decoder.name = this.name;
20+
decodeResult.formatted.description = 'Position Report';
21+
decodeResult.message = message;
22+
23+
const data = message.text.split('/');
24+
if (data.length === 8) {
25+
ResultFormatter.flightNumber(decodeResult, data[0]);
26+
ResultFormatter.day(decodeResult, Number(data[1]));
27+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(data[2]));
28+
const lat = data[3];
29+
const lon = data[4];
30+
ResultFormatter.position(decodeResult, {
31+
latitude: CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),
32+
longitude:CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1))
33+
});
34+
ResultFormatter.altitude(decodeResult, Number(data[5]));
35+
ResultFormatter.unknown(decodeResult, data[6], '/');
36+
ResultFormatter.unknown(decodeResult, data[7], '/');
37+
} else {
38+
if (options.debug) {
39+
console.log(`Decoder: Unknown 58 message: ${message.text}`);
40+
}
41+
ResultFormatter.unknown(decodeResult, message.text);
42+
decodeResult.decoded = false;
43+
decodeResult.decoder.decodeLevel = 'none';
44+
return decodeResult;
45+
}
46+
47+
decodeResult.decoded = true;
48+
decodeResult.decoder.decodeLevel = 'partial';
49+
return decodeResult;
50+
}
51+
}
52+
53+
export default {};

lib/plugins/official.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export * from './Label_4A_Slash_01';
3232
export * from './Label_4J_POS';
3333
export * from './Label_4N';
3434
export * from './Label_4T_AGFSR';
35+
export * from './Label_58';
3536
export * from './Label_4T_ETA';
3637
export * from './Label_80';
3738
export * from './Label_83';

0 commit comments

Comments
 (0)