Skip to content

Commit c71734c

Browse files
authored
Adding H1 *POS parsing (#183)
1 parent 8baf2f9 commit c71734c

File tree

4 files changed

+101
-1
lines changed

4 files changed

+101
-1
lines changed

lib/MessageDecoder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export class MessageDecoder {
4949
this.registerPlugin(new Plugins.Label_H1_OHMA(this));
5050
this.registerPlugin(new Plugins.Label_H1_WRN(this));
5151
this.registerPlugin(new Plugins.Label_H1(this));
52+
this.registerPlugin(new Plugins.Label_H1_StarPOS(this));
5253
this.registerPlugin(new Plugins.Label_HX(this));
5354
this.registerPlugin(new Plugins.Label_80(this));
5455
this.registerPlugin(new Plugins.Label_83(this));
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { MessageDecoder } from '../MessageDecoder';
2+
import { Label_H1_StarPOS } from './Label_H1_StarPOS';
3+
4+
describe('Label H1 *POS', () => {
5+
6+
let plugin: Label_H1_StarPOS;
7+
8+
beforeEach(() => {
9+
const decoder = new MessageDecoder();
10+
plugin = new Label_H1_StarPOS(decoder);
11+
});
12+
13+
test('decodes variant 1', () => {
14+
15+
const text = '*POS10300950N3954W07759363312045802M5230175';
16+
const decodeResult = plugin.decode({ text: text });
17+
18+
expect(decodeResult.decoded).toBe(true);
19+
expect(decodeResult.decoder.decodeLevel).toBe('partial');
20+
expect(decodeResult.message.text).toBe(text);
21+
expect(decodeResult.raw.day_of_month).toBe(30);
22+
expect(decodeResult.raw.month).toBe(10);
23+
expect(decodeResult.raw.time_of_day).toBe(35400);
24+
expect(decodeResult.raw.position.latitude).toBe(39.900000);
25+
expect(decodeResult.raw.position.longitude).toBe(-77.98333333333333);
26+
expect(decodeResult.raw.altitude).toBe(36331);
27+
expect(decodeResult.formatted.items.length).toBe(3);
28+
expect(decodeResult.formatted.items[0].label).toBe('Message Timestamp');
29+
expect(decodeResult.formatted.items[0].value).toBe('09:50:00');
30+
expect(decodeResult.formatted.items[1].label).toBe('Aircraft Position');
31+
expect(decodeResult.formatted.items[1].value).toBe('39.900 N, 77.983 W');
32+
expect(decodeResult.formatted.items[2].label).toBe('Altitude');
33+
expect(decodeResult.formatted.items[2].value).toBe('36331 feet');
34+
35+
expect(decodeResult.remaining.text).toBe('2045802M5230175');
36+
});
37+
38+
39+
test('does not decode <invalid>', () => {
40+
41+
const text = '*POS Bogus message';
42+
const decodeResult = plugin.decode({ text: text });
43+
44+
expect(decodeResult.decoded).toBe(false);
45+
expect(decodeResult.decoder.decodeLevel).toBe('none');
46+
expect(decodeResult.formatted.description).toBe('Position Report');
47+
expect(decodeResult.formatted.items.length).toBe(0);
48+
});
49+
});

lib/plugins/Label_H1_StarPOS.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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+
export class Label_H1_StarPOS extends DecoderPlugin {
8+
name = 'label-h1-star-pos';
9+
qualifiers() { // eslint-disable-line class-methods-use-this
10+
return {
11+
labels: ['H1'],
12+
preambles: ['*POS'],
13+
};
14+
}
15+
16+
decode(message: Message, options: Options = {}) : DecodeResult {
17+
let decodeResult = this.defaultResult();
18+
decodeResult.decoder.name = this.name;
19+
decodeResult.formatted.description = 'Position Report';
20+
decodeResult.message = message;
21+
22+
const msg = message.text;
23+
// assuming fixed length until other variants found
24+
if (msg.length !== 43 || !msg.startsWith('*POS')) {
25+
if (options.debug) {
26+
console.log(`Decoder: Unknown H1 message: ${msg}`);
27+
}
28+
ResultFormatter.unknown(decodeResult, msg);
29+
decodeResult.decoded = false;
30+
decodeResult.decoder.decodeLevel = 'none';
31+
return decodeResult;
32+
}
33+
34+
decodeResult.raw.month = Number(msg.substring(4, 6));
35+
decodeResult.raw.day_of_month = Number(msg.substring(6, 8));
36+
ResultFormatter.time_of_day(decodeResult, DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12) + '00'));
37+
ResultFormatter.position(decodeResult, { // Deg Min, no sec
38+
latitude: CoordinateUtils.getDirection(msg.substring(12,13)) * (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17))/60),
39+
longitude: CoordinateUtils.getDirection(msg.substring(17,18)) * (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23))/60)
40+
});
41+
ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));
42+
ResultFormatter.unknown(decodeResult, msg.substring(28));
43+
decodeResult.decoded = true;
44+
decodeResult.decoder.decodeLevel = 'partial';
45+
return decodeResult;
46+
}
47+
}
48+
49+
export default {};

lib/plugins/official.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@ export * from './Label_83';
3434
export * from './Label_8E';
3535
export * from './Label_B6';
3636
export * from './Label_ColonComma';
37+
export * from './Label_H1';
3738
export * from './Label_H1_FLR';
3839
export * from './Label_H1_OHMA';
40+
export * from './Label_H1_StarPOS';
3941
export * from './Label_H1_WRN';
40-
export * from './Label_H1';
4142
export * from './Label_HX';
4243
export * from './Label_SQ';
4344
export * from './Label_QR';

0 commit comments

Comments
 (0)